最短路径学年论文_第1页
最短路径学年论文_第2页
最短路径学年论文_第3页
最短路径学年论文_第4页
最短路径学年论文_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、-. z-. z摘要:主要介绍最短路径问题中的经典算法迪杰斯特拉(Dijkstra)算法和弗洛伊德Floyd算法,以及在实际生活中的运用。关键字:Dijkstra算法、Floyd算法、赋权图、最优路径、Matlab目录摘要11引言12最短路22.1 最短路的定义22.2最短路问题常见算法23 Dijkstra算法23.1 Dijkstra算法描述23.2 Dijkstra算法举例33.3算法的正确性和计算复杂性5贪心选择性质5最优子构造性质63.3.3 计算复杂性74 Floyd算法74.1Floyd算法描述84.2 Floyd算法步骤114.3 Floyd算法举例115 Dijkstra算法

2、和Floyd算法在求最短路的异同116 利用计算机程序模拟算法117 附录118 论文总结139 参考文献131 引言最短路问题是图论理论的一个经典问题。寻找最短路径就是在指定网络中两结点间找一条距离最小的路。最短路不仅仅指一般地理意义上的距离最短,还可以引申到其它的度量,如时间、费用、线路容量等。最短路径算法的选择与实现是通道路线设计的根底,最短路径算法是计算机科学与地理信息科学等领域的研究热点,很多网络相关问题均可纳入最短路径问题的畴之中。经典的图论与不断开展完善的计算机数据构造及算法的有效结合使得新的最短路径算法不断涌现。2 最短路2.1 最短路的定义对最短路问题的研究早在上个世纪60年

3、代以前就卓有成效了,其中对赋权图的有效算法是由荷兰著名计算机专家在1959年首次提出的,该算法能够解决两指定点间的最短路,也可以求解图G中一特定点到其它各顶点的最短路。后来海斯在Dijkstra算法的根底之上提出了海斯算法。但这两种算法都不能解决含有负权的图的最短路问题。因此由Ford提出了Ford算法,它能有效地解决含有负权的最短路问题。但在现实生活中,我们所遇到的问题大都不含负权,所以我们在的的情况下选择Dijkstra算法。定义1假设图G=G(V,E)中各边e都赋有一个实数W(e),称为边e的权,则称这种图为赋权图,记为G=G(V,E,W)。定义2假设图G=G(V,E)是赋权图且,假设i

4、,j 的权记为,假设i与j之间没有边相连接,则。路径P的定义为路径中各边的长度之和,记WP。图G的结点u到结点v距离记为,则u、v间的最短路径可定义为。2.2 最短路问题常见算法在求解网络图上节点间最短路径的方法中,目前国外一致公认的较好算法有迪杰斯特拉(Dijkstra)及弗罗伊德(Floyd)算法。这两种算法中,网络被抽象为一个图论中定义的有向或无向图,并利用图的节点邻接矩阵记录点间的关联信息。在进展图的遍历以搜索最短路径时,以该矩阵为根底不断进展目标值的最小性判别,直到获得最后的优化路径。Dijkstra算法是图论中确定最短路的根本方法,也是其它算法的根底。为了求出赋权图中任意两结点之间

5、的最短路径,通常采用两种方法。一种方法是每次以一个结点为源点,重复执行Dijkstra算法n次。另一种方法是由Floyd于1962年提出的Floyd算法,其时间复杂度为,虽然与重复执行Dijkstra算法n次的时间复杂度一样,但其形式上略为简单,且实际运算效果要好于前者。3 Dijkstra算法3.1 Dijkstra算法描述Dijkstra算法是解但愿最短路径问题的一个贪心算法。其根本思想是,设置顶点集合S并不断地做贪心选择来扩大这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度。初始时,S中仅含有源。设u是图G的*一顶点,把从源到u且中间只经过S中顶点的路称为源到u的特殊路径,

6、并记录当前每个顶点所对应的特殊路径长度。Dijkstra算法每次从VS中取出具有最短路径长度的顶点u,将u添加到S中,同时对短路径进展修改。一旦S包含了所有V中顶点,则最后记录的最短路径就是源到所有其他顶点之间的最短路径长度。算法要点如下:把V分为两个子集S和T。初始时,S=a,T=V-S,其中a为源点;对T中每一个元素t计算Dt,根据Dt值找出T中距a最短的一结点*,写出a到*的最短路径长度D*;更新S,置S为S*,更新T,置T为T-*,判断条件:假设T=,则终止,否则再重复2。3.2 Dijkstra算法举例问题的提出,给定一个带权有向图既有向网G和源点Vo,求Vo到G中其他每个顶点的最短

7、路径。限定各边上的权值必须不小于0.如下列图所示:12555581022图1 公路网络赋权图为了方便计算,先作出该网络的距离邻接矩阵,如下:设,第一次迭代计算如下取,令由于,令转(1)第二次迭代:算如下取令由于,令转(1)第三次迭代:算如下取由于,令转(1)第四次迭代:算如下取由于,令转(1)第五次迭代:算如下由于。因此已找到到的最短距离为12。计算完毕。对应的迭代表格如下:迭代su115221,332101231,3,23281241,3,2,4328121551,3,2,43281212找最短路线:逆向追踪得最短距离为12,即从城市到城市的距离最短,即费用最省。3.3算法的正确性和计算复杂

8、性贪心选择性质Dijkstra算法是贪心算法策略的一个典型例子。它所做的贪心选择是从VS中选择具有最短特殊路径的顶点u,从而确定从源到u的最短路径长度。这种贪心选择导致最优解在于如果存在一条源到u且长度比更短的路,设这条路初次走出S之外到达的顶点,然后徘徊于S外假设干次,最后离开S到达u,如图2所示。在这条路径上,分别标记,和为顶点v到顶点*,顶点*到顶点u和顶点v到顶点u的路长,则有:u利用权边的非负性,可知,从而推出。此为矛盾。这就证明了是从源点到u的最短路径长度。源 Sv*图2 从源到u的最短路径最优子构造性质要完成Dijkstra算确性的证明,还必须证明最优子构造性质,即算法中确定确实

9、实是当前从源到顶点u的最短特殊路径长度。为此,只要考察算法在添加u到S中后,的值所起的变化。将添加u之前的S成为老S。当添加了u之后,可能出现一条到顶点i的新的特殊路。如果这条新特殊路是先经过老S到达顶点u,然后从u经一条边直接到达顶点i,则这种路的最短的长度是。此时如果,则计算中用作为disti的新值。如果这条新特殊路径经过老S到达u后,不是从u经过一条边直接到达i,而是像图3那样,回到老S中*个顶点*,最后才到达顶点i,则由于*在老S中,因此*比u先参加S,所以图3中从源到*的路的长度比从源到u,再从u到*的路的长度小。于是当前的值小于从源经*到i的路的长度,也小于图中从源经u和*,最后到

10、达i的路的长度。因此,在计算中不必考虑这种路。由此可知,不管算法中的值是否发生变化,它总是关于当前顶点集S到达u的最短特殊路径长度。i老S源*vu图3 非最短路径的特殊路径3.3.3 计算复杂性对于一个具有n个顶点和e条带权边的图来说,如果用带权邻接矩阵表示这个图,则Dijkstra算法的主循环体需要的时间。这个循环体需要执行n-1次,所以完成循环需要时间。算法的其余局部所需要的时间不超过。4 Floyd算法4.1 Floyd算法描述Floyd算法又称距离矩阵法,算法主要是寻找加权图中任意两个结点间最短路径的算法。其根本思想是:两结点间的最短路径要么是相邻时最短,要么是以通过几个中间结点为跳板

11、时距离最短。算法每次以其中一个结点为跳板,如果以该结点为跳板后两结点间路径缩短,则更新这两结点间的路径。算法执行n次完毕,直到测试完每个充当跳板的结点。假设用Dijkstra算法计算任意两点间的最短路径,需要执行n次,且图中含有负权值时不能用Dijkstra算法。Floyd算法只能求出两点间最短路径的长度,无法得到这条最短路径,当然,如果记录了每步更新所经过的中间结点,仍可通过回溯得到两点间的最短路径。4.2 Floyd算法步骤对于图G,如果表示i和j之间的可实现的距离,则表示端i和j之间的最短距离当且仅当对于任意的i, j, k,有。该算法用矩阵形式来表示,并进展系统化的计算,通过迭代来消除

12、不满足上述定理的情况,对于n个端,一给定边长的图,顺序计算各个的W阵和R阵,前者代表径长,后者代表转接路由。其步骤如下:置其中和其中:已得和阵,求和阵中的元素如下:,重复;,终止。由上述步骤可见,是计算经转接时是否能缩短经常,如有缩短,更改并在R阵中记下转接的端。最后算得和,就得到了最短径长和转接路由。4.3 Floyd算法实例假设*旅游路线的赋权图如下:7264113541441126699图4 *旅游路线赋权图现在我们以上述生成的图4为考察对象,根据算法流程,设W阵和R阵分别代表路径长和转接路由。则计算结果如下:经过7轮迭代,我们得到了最终的W和R阵,分别包含了径长信息和路由信息。我们可以

13、从和中找到任何两个端点间的最短径长和最短路由,对应着我们所建立的旅行线路模型中的任何两景点间的最短路径长度和路线。假设要求旅游点3到点1的最短路径,则可以从中找到对应的最小值为18,从中找到,就是要经点2转接;再看,此时已经到达目的节点,所以路由是。5 Dijkstra算法和Floyd算法在求最短路径的异同一样:是按路径长度递增的思路进展查找最短路径。都需要借助带权领接矩阵;都引进了辅助数组; Floyd法的替代算法是n次调用Dijkstra法n为图G中结点数目。相异: Dijkstra算法是从一点出发到其余路径的最短路径,而Floyd算法是找图中所有顶点间的最短路径; Dijkstra算法是

14、找到最短后再尝试利用该最短辅助找其余最短的;而Floyd算法是在插入第i-1个顶点的根底上比拟插入第i个后和之前的最短;路径长度递增不一样:Dijkstra算法增的路径是比拟出最短的增,而Floyd算法增的路径是按编号递增;Dijkstra算法从源点出发,而弗法可以从任意点出发;结果不同,Dijkstra算法找到的是从源点到其余顶点的最短路径;Floyd算法则可以求任两点之间的最短路径。6 利用计算机程序模拟算法对于图G来说,如果G中的结点个数较少,可以通过逐步迭代或者通过以上的列表形式算出不同点之间的最短路径,但相对于结点数目较多的图而言,显得力不从心,也大大增加了计算过程中的失误率。这个时

15、候,我们就迫切希望寻求算学工具来解决人工的局限性。为此引入Matlab来简化求解步骤,通过输入邻接矩阵和始末点来快速计算最短路径的值,并导出途经各结点。其中Dijkstra算法中的例子,可以另对应于标号,邻接矩阵为A,通过调用Matlab功能函数可迅速得出最优路径及相关途经点。程序见附录。7 附录Dijkstra算法:function d,path=dijkstra(W,s,t)n,m=size(W);i*=(W=0);W(i*)=inf;if n=m,error(Square W required);endvisited(1:n)=0; dist(1:n)=inf;parent(1:n)=0

16、;dist(s)=0;d=inf;for i=1:(n-1), i*=(visited=0);vec(1:n)=inf;vec(i*)=dist(i*); a,u=min(vec);visited(u)=1;for v=1:n,if (W(u,v)+dist(u)dist(v), dist(v)=dist(u)+W(u,v);parent(v)=u;end;end;endif parent(t)=0,path=t;d=dist(t);while t=s,p=parent(t);path=p path;t=p;end;endFloyd算法:function d,r=floyd(a) n=size(a,1); d=a; for i=1:n for j=1:n r(i,j)=j; end end r for k=1:n for i=1:n for j=1:n if d(i,k)+d(k,j) d(i,j)=d(i,k)+d(k,j); r(i,j)=r(i,k) e

温馨提示

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

最新文档

评论

0/150

提交评论