基于Flyod 算法的医院选址实现摘要:以最短距离为最优目标选址的定量技术颇多,其中,最优化规划法及图论方法是研究热点。
本设计中阐述了无向网络中选址问题的Flyod 基本模型及其全部顶点间最短路径算法选址的原理,并通过实例探讨了医院选址算法的步骤及C++语言实现的全过程。
关键词:最优化规划,Flyod 算法,医院选址,图论 0.引言“数据结构”在计算机科学中是一门综合性的专业基础课。
“数据结构”的研究不仅涉及到计算机硬件(特别是编码理论、存储装置和存取方法等)的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。
选址问题,是指为一个和几个服务设施在一定区域内选定它的位置,使某一指标达到最优解。
这类问题,在规划建设中经常可以碰到,这里所谓的服务设施,可以是某些公共服务设施,如医院,消防站,物流中心等。
也可以是生产服务设施,如仓库,转运站等等。
可以认为,选址问题,就是把服务设施与服务对象,反映与统一的网络中,便于对问题进行研究。
尽管对选址的目标、要求有不同的评判标准,但是要求服务对象与服务设施之间易于沟通、易于达到,这是一个最基本的要求。
本课程设计为基于Flyod 算法的医院选址的实现,因此在把实际的问题简化为网络模型后,建立约束函数和最终目标函数,运用Flyod 算法求出最优解。
例如本次设计中医院选址关心的是如何找到一个社区建立医院使所有的社区到医院的路径之和最短,没有约束函数,目标函数则为1,2111min{,,},1,2,,nnnj i j i i i sum V V Vn j n =====∑∑∑ 。
1.需求分析1.1影响医院选址的因素 1.1.1空间距离由于建医院的主要目的是收治病人,方便病人就医,使病人能在最短的时间内到达医院接受医治,因此院方必需调查所在地区各大社区到医院的空间距离,即病人到医院的直接距离。
此距离受地理条件,城市建筑等社会因素的限制。
1.1.2时间距离必需考虑时间距离。
这是病人从发病点到医院所需的时间(最好有80%的病人能在一个小时内到达医院),它受城市交通状况影响较大。
在我国城市当前交通不发达的情况下,应十分重视时间距离。
近年来,某大城市新建几所大医院的地址,虽然环境安静,地形理想,离社区的空间距离不太长,道路也较好,但唯独交通不便,时间距离长,开诊后病人少,并未减轻其他医院的压力,可谓目前城市新建医院选址的教训。
1.1.3其他因素建院选址,除考虑上述要求外,还应做到:纳入城市规划,合理布局;环境安静,利于修养;地形理想,便于绿化;公用设施,尽量利用;地质合适,易防污染;运输方便,运费低廉等到,这些条件也应综合考虑。
2.数据结构设计为了使问题更加具体,更加形象,便于求解,设计了一张网络图如下:图中的每个节点表示一个社区,一共有42个社区,社区与社区之间的数字为社区之间的距离。
要求是要在这42个社区里面选择一个社区建立医院,使其余社区到医院的距离之和最短。
2.1自定义结构体struct Graph{int vexnum;long arcx[M_vexnum][M_arcnum];};其中vexnum为图中的顶点数,在本图中它的值为43(0号单元为用),arcx[M_vexnum][M_arcnum]用来表示任意两个节点之间的距离,初始化的时候把不同顶点间的距离都设为无穷大,相同顶点间的距离设为0。
2.2结点距离矩阵的初始化与赋值for(i=1;i<G.vexnum;i++)for(j=1;j<G.vexnum;j++){if(i==j)G.arcx[i][j]=0;elseG.arcx[i][j]=INFINITY;}在程序运行的时候再对它们赋值,对于上图对其上三角矩阵赋值为:G.arcx[1][2]=40; G.arcx[1][33]=60;G.arcx[1][34]=45;G.arcx[2][3]=35;G.arcx[2][7]=50;G.arcx[2][9]=62;G.arcx[3][10]=42;G.arcx[3][36]=50;G.arcx[4][5]=10;G.arcx[4][6]=30;G.arcx[4][29]=40;G.arcx[4][30]=70;G.arcx[5][6]=28;G.arcx[5][39]=85;G.arcx[5][40]=38;G.arcx[6][11]=32;G.arcx[6][40]=30;G.arcx[6][41]=48;G.arcx[7][10]=48;G.arcx[7][27]=70;G.arcx[8][14]=36;G.arcx[8][15]=38;G.arcx[8][28]=50;G.arcx[9][27]=40;G.arcx[9][31]=52;G.arcx[9][40]=28;G.arcx[10][12]=52;G.arcx[11][15]=56;G.arcx[11][25]=40;G.arcx[11][27]=48;G.arcx[12][13]=80;G.arcx[13][20]=68; G.arcx[13][27]=50;G.arcx[14][17]=56;G.arcx[14] [23]=50;G.arcx[15][18]=58;G.arcx[15] [25]=46;G.arcx[15][42]=28;G.arcx[16][18]=75;G.arcx[16] [21]=58;G.arcx[16][23]=65;G.arcx[17][23]=52;G.arcx[18][19]=22;G.arcx[18] [23]=45;G.arcx[18][25]=30;G.arcx[19][22]=72;G.arcx[19] [26]=28;G.arcx[20][22]=80;G.arcx[20] [24]=50;G.arcx[21][22]=45;G.arcx[24][26]=30;G.arcx[25][26]=18;G.arcx[26][27]=70;G.arcx[27][40]=32;G.arcx[28][29]=60;G.arcx[28] [42]=32;G.arcx[29][30]=62;G.arcx[30][39]=15;G.arcx[31][32]=50;G.arcx[32][31]=50; G.arcx[32][34]=25; G.arcx[32][35]= 98; G.arcx[32][38]=68;G.arcx[32][39]=62;G.arcx[33][36]=40;G.arcx[33][37]=38;]G.arcx[35][39]=102;G.arcx[37][38]=35;G.arcx[41][42]=26;因为是无向图,所以V ij=V ji ,得到图完整的邻接矩阵,语句如下:for(i=1;i<G .vexnum;i++) for(j=1;j<i;j++) G .arcx[i][j]=G .arcx[j][i]; 3.算法设计图论中的最短路径算法包括指定的顶点之间的最短路径算法和全部顶点间的最短路径算法。
前者可用于运输的合理化决策分析,一般用迪杰斯特拉(Dijkstra )算法实现,而后者很适合于选址合理的中心等,使总的路程最短,一般用弗洛伊德(Flyod)算法求解。
3.1 算法的基本思想全部顶点间最短路径算法具有代表性的是1962年有福劳德(Flyod )提出的算法。
它的主要思想是从代表任意2个顶点i V 到j V 的距离带权邻接矩阵开始,每次插入一个顶点k V ,然后将i V 到j V 间的已知最短路径于插入顶点k V 作为中间顶点(一条路径中始点外和终点外的其他顶点)时可能产生的i V 到j V 路径距离比较,取较小值以得到新的距离矩阵。
如此循环迭代下去,依次构造出n 个矩阵D (1),D (2), D (3)…,D (n ),当所有的顶点均作为任意2个顶点i V 到j V 中间顶点时得到的最后带权邻接矩阵D 就反映了所以顶点对之间的最短距离信息,成为图G 的距离矩阵。
最后对G 中各行元素求和值并比较大小,决定单个或多个最佳的中心。
3.2 Flyod 算法构造距离矩阵的原理对一个有n 个顶点的图G ,将顶点用n 个整数(从1到n )进行编号。
把G 的带权邻接矩阵W 作为距离矩阵的初值,即D (0)=(d (0)ij )n*n =W 。
第一步构造D (1)=(d (1)ij )n*n ,其中d ij =min {d (1)i1+d (1)1j }是从i V 到j V 的允许到1V 作为中间点的路径中最短距离长度。
第二步构造D (2)=(d (1)ij )n*n ,其中d ij =min {d (2)ij ,d (2)i2+d (2)2j }是从i V 到j V 的只 许以1V ,2V 作为中间点的路径最短长度。
第n 步构造D (n )=(d (n )ij ),其中d ij =min {d (n )ij ,d (n )in +d (n )nj }是从i V 到j V 的只允许以1V ,2V ,3V ,…,n V 作为中间点的所有路径中最短路的长度,即是从i V 到j V 中间可插入任何顶点的路径中最短路的长度,因此D 即是距离矩阵。
4 .程序实现4.1图的初始化for(i=1;i<G.vexnum;i++)for(j=1;j<G.vexnum;j++){if(i==j)G.arcx[i][j]=0;elseG.arcx[i][j]=INFINITY;}4.2任意两个顶点之间最短距离的计算计算任意两个顶点之间的最短距离的方法有很多,最基本的有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Flyod)算法。
相比之下,Flyod算法比Dijkstra算法更容易理解,算法在一次运算中可以求出任意两个顶点之间的距离,并且它们的时间复杂度都是o(n3)。
以下代码是整个程序中最重要的部分,它将求解出图的距离矩阵。
for(v=1;v<G.vexnum;v++)for(w=1;w<G.vexnum;w++){D[v][w]=G.arcx[v][w];for(u=1;u<G.vexnum;u++)P[v][w][u]=FALSE;if(D[v][w]<INFINITY){P[v][w][u]=TRUE;P[v][w][w]=TRUE;}}for(u=1;u<G.vexnum;u++)for(v=1;v<G.vexnum;v++)for(w=1;w<G.vexnum;w++)if(D[v][u]+D[u][w]<D[v][w]){D[v][w]=D[v][u]+D[u][w];for(i=1;i<G.vexnum;i++)P[v][w][i]=P[v][u][i];}4.3确定医院地址的算法得到图的距离矩阵后,要想从中得到医院的地址。