图论最短路径选址问题[图文运用]_第1页
图论最短路径选址问题[图文运用]_第2页
图论最短路径选址问题[图文运用]_第3页
图论最短路径选址问题[图文运用]_第4页
免费预览已结束,剩余5页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、姓 名: 学 号: 专 业: 图论的实际应用蔬菜批发市场选址问题摘要:在现实生活和生产实践中,有许多管理、组织与计划中的优化问题,都可借助图论知识得以解决,而最短路问题是利用图论解决的一个典型的实际问题。图论中最典型的两种求最短路径的算法分别为Dijkstra算法和Floyd算法,其中Floyd算法广泛应用于求任意两点间的最短路径。本文介绍了利于Floyd算法来解决城市蔬菜批发市场选址的问题。关键词:最短路;Floyd算法;选址问题 0引言对于许多地理问题,当它们被抽象为图论意义下的网络图时,问题的核心就变成了网络图上的优化计算问题。其中,最为常见的是关于路径和顶点的优选计算问题5。在路径的优

2、选计算问题中,最常见的是最短路径问题,最短路径可能是给定两点间的最短路径,也可能是任意各点间的最短路径。而在顶点的优选计算问题中,最为常见的是选址问题,所谓选址问题就是在某一地理区域构成的网络中选择一个顶点,建立服务设施,为该网络中的各个点提供服务,使得服务效率最高3。选址问题,在规划建设中经常可以碰到,这里所谓的服务设施,可以是某些公共服务设施,如医院,消防站,物流中心等。也可以是生产服务设施,如仓库,转运站等等。可以认为,选址问题,就是把服务设施与服务对象,反映与统一的网络中,便于对问题进行研究4。尽管对选址的目标、要求有不同的评判标准,但是要求服务对象与服务设施之间易于沟通、易于达到,这

3、是一个最基本的要求。1 最短路径问题 最短路径问题是图论研究的一个经典算法问题,其目的是求出给定两点之间的长最短的路径,这里所说的长具有广泛意义,即可指普通意义的距离,也可是时间或费用等2。因此,最短路径问题通常可以归纳为三类:(1)距离意义上的最短路径,即求两点间距离最短的路径;(2)经济意义上的最短路径,即为两点间的费用最少的路径;(3)时间意义上的最短路径,即选择两点间最节省时间的路径。以上三类问题,都可以抽象为同一类问题,即带权图上的最短路径问题。不同意义下的距离都可以被抽象为网络图中边的权值,权值既可以代表“纯距离”,又可以代表“经济距离”,还可以代表“时间距离”。1.1 Dijks

4、tra算法Dijkstra算法是一种求解最短路径方法。它是一个按路径长度递增的顺序产生最短路径的算法,其基本思想是:设图中所有顶点集合为V,另设置两个顶点集合S和T=V- S,集合S中存放已找到最短路径的顶点,集合T存放当前还未找到最短路径的顶点。初始状态时,集合S中只包含源点V1,然后不断从集合T中选取到顶点V1 的路径长度最短顶点Vi 加入到集合S中,集合S每加入一个新的顶点Vi,都要修改顶点V1到集合T中剩余顶点的最短路径长度值,此过程不断重复,直到集合T中的顶点全部加入到S中为止。这样,就可以求出一点到其它的任一顶点的最短路径。Dijkstra算法简单易懂,在求给定两点间的最短距离时效

5、率很高,但是其只能求图中一个特定结点到其他各个结点的最短路1。当需要求出图中任意两顶点的最短路径时,就需要以图中的每个顶点为起点,依次求出到另外顶点的最短路径,在顶点数目比较多的情况下,其效率将非常低下。1.2 Floyd算法Floyd算法为另外一种求最短路径的算法。在某些问题中,需要求出图中任意两顶点之间的最短路径,这时,Floyd算法将比Dijkstra算法具有明显优势。Floyd算法借助于权矩阵的运算直接可以求出任意两点之间的最短路径2。Floyd算法的实现思路为:首先定义赋权图的边权矩D =dij)n x n,即dij=w(i,j),若结点i到j无边相连时,则去dij=。然后依次计算出

6、矩阵D2,D3,Dn。其中D2=D*D=(d2ij)n x n,d2ij=mindi1+d1j,di2+d2j,din+dnj表示从vi出发两步可以到达vj的道路中距离最短者;Dk=(dkij)n x n,dkij表示从vi出发k步可以到达vj的道路距离中最短路径。 Dn = Dn-1*D = (dnij)n x n S = DD2D3Dn = (Sij)n x n由定义可知d表示从结点i到j经过k边的路(在有向图中即为有向路)中的长度最短者,而Sij为结点i到j的所有路中的长度最短者。2.最短路径问题在蔬菜批发市场中的应用河南某城市市政管理部门决定新建一个蔬菜批发市场,为周边的几个小区的菜市

7、场集中供应新鲜蔬菜。由于蔬菜水果容易变质,小区菜市场的商贩必须在每天早晨把蔬菜从批发市场运送回店铺,这就要求批发市场的地址不能距离小区太远。该城市管理部门经过征求意见后,决定将批发市场建在其中的一个小区旁边,现在的问题是该将此批发市场建在那个小区才能使最远的小区距离该批发市场距离最短。2.1 分析问题并建立模型 已知该城市的小区位置及相互连通道路分布示意图如图1所示,其中结点v1,v2,v3,v4,v5,v6,v7表示七个小区,结点间的数字表示小区间的距离。V1V2V6V3V5V7V4306020151518253020图1 小区位置分布示意图由上面的小区位置及道路分布图可知,若找一个合适的小

8、区来建造批发市场,使该小区到其它小区的最远距离最短,即求无向简单图图1中的一点,使该点到其它点的最大值为最小。为此,我们可以使用Floyd算法来求解问题。首先根据图1画出对应的权矩阵D: 30 30 20 15 20 20 60 25 D = 20 30 18 7 3 15 25 18 15 15 2.2 Floyd算法求各点间最短路径 通过7阶加权简单图的权矩阵D,分别算出矩阵D2,D3,D4,D5,D6,D7,然后求出最短路矩阵S,S如下:则可得出矩阵S中v1,v2,v3,v4,v5,v6,v7结点到其它个结点的最长距离分别为93,63,50,63,93,48,63,即v6结点到其它结点有

9、最短路径。 由以上结论知,将蔬菜批发市场应该建在小区v6处才最为合理,使得最远的小区菜市场距批发市场的距离最短。3.编程实现 以下为使用C+语言实现的Floyd算法的核心代码:#include#define MaxInt 10000/最大数 const int MaxNumEdges=50; const int MaxNumVertices=10; /最大顶点数 class Graph private: int vNum;/当前顶点数 int eNum;/当前边数 int VertexMaxNumVertices;/顶点数组 int EdgeMaxNumVerticesMaxNumVertic

10、es;/边数组 bool GetVertexPos(const int &vertex,int &i);/给出顶点vertex在图中的位置 public: Graph(const int sz= MaxNumEdges);/构造函数 bool FindVertex(const int &vertex); bool InsertVertex(const int & vertex);/插入一个顶点vertex bool InsertEdge(const int v1,const int v2,const int weight);/插入一条边(v1,v2),该边上的权值为weight void Ho

11、spital();/选址函数; Graph:Graph(const int sz): vNum(0), eNum(0)/构造函数 int n,e; int name,tail,head; int weight; for(int i=0;isz;i+) for(int j=0;jsz;j+) if(i=j) Edgeij=0;/顶点到自身权值为0 else Edgeij=10000;/邻接矩阵初始化为最大值 printf(请输入顶点数,注意本程序最多为10个!n); scanf(%d,&n); printf(请依次输入顶点名称:n); for(int r=0;rn;r+)/依次输入顶点,插入图中

12、 scanf(%d,&name); InsertVertex(name); vNum+; printf(请输入边数:n); scanf(%d,&e); printf(以下输入边信息:n); for(int k=0;ke;k+) printf(请输入第%d边头顶点:n,k+1); scanf(%d,&head); printf(请输入该边尾顶点:n); scanf(%d,&tail); printf(请输入该边权值:n); scanf(%d,&weight); if(!InsertEdge(head,tail,weight) printf(不存在该边,请重输!n); continue; bool

13、 Graph:FindVertex(const int& vertex)/给出顶点vertex在图中的位置 for (int i = 0; i vNum; i+) if (vertex = Vertexi) return true; return false; bool Graph: GetVertexPos(const int &vertex,int &i)/给出顶点vertex在图中的位置 for (i = 0; i vNum; i+) if (vertex = Vertexi) return true; return false; bool Graph:InsertVertex(cons

14、t int & vertex)/插入一个顶点vertex if (FindVertex(vertex) return false; VertexvNum = vertex; return true; bool Graph:InsertEdge(const int v1,const int v2,const int weight)/插入一条边(v1,v2),该边上的权值为weight int k=0,j=0; if(GetVertexPos(v1,k) & GetVertexPos(v2,j) Edgekj=weight; eNum+; Edgejk=weight; eNum+; return

15、true; else return false; void Graph:Hospital() /在以邻接带权矩阵表示的n个小区中,求批发市场建在何处,使离市场距离最远的小区到达市场的路径最短。 int k,i,j,s; for (k=0;kvNum;k+) /求任意两顶点间的最短路径 for (i=0;ivNum;i+) for (j=0;jvNum;j+) if (Edgeik+EdgekjEdgeij) Edgeij=Edgeik+Edgekj; int m=MaxInt; /设定m为机器内最大整数。 printf(*n); /以下为求各小区离批发市场最近的选址 int min=MaxIn

16、t ; /设定机器最大数作小区间距离之和的初值。 k=0; /k设小区位置。 for (j=0;jvNum;j+) m=0 ; for (i=0;im) min=m;k=j; /取顶点间的距离之和的最小值。 /for printf(各小区离批发市场最近的选址,要建批发市场的小区为:%dn,k+1); /输出要建批发市场的小区编号 for(j=0;jvNum;j+) if(j!=k) printf(该小区离%d小区最短距离为:%dn,j+1,Edgekj);/算法结束int main() Graph Town(MaxNumVertices); Town.Hospital(); return 0;运行程序,并将2.1中的加权矩阵D的数值输入程序,得到的程序运行的结果如图2所示:25图2 程序运行结果图 对图2中结果分析知,将批发市场建在V6小区,使得到其它6个小区的最长距离为48。结果和2.2中的矩阵S的计算结果相同。4. 总结 通过利用学习到的Floyd算法解决了一个城市蔬菜批发市场的选址问题,我认识到最短路径问题在现实生活中的巨大作用,它可以广泛应用于建筑物选址,厂区布局等实际问

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论