当前位置:文档之家› 最短路径学年论文

最短路径学年论文

摘要:主要介绍最短路径问题中的经典算法——迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法,以及在实际生活中的运用。

关键字:Dijkstra算法、Floyd算法、赋权图、最优路径、Matlab目录摘要 (1)1引言 (1)2最短路 (2)2.1 最短路的定义 (2)2.2最短路问题常见算法 (2)3 Dijkstra算法 (2)3.1Dijkstra算法描述 (2)3.2 Dijkstra算法举例 (3)3.3算法的正确性和计算复杂性 (5)3.3.1贪心选择性质 (5)3.3.2最优子结构性质 (6)3.3.3 计算复杂性 (7)4 Floyd算法 (7)4.1Floyd算法描述 (8)4.2 Floyd算法步骤 (11)4.3 Floyd算法举例 (11)5 Dijkstra算法和Floyd算法在求最短路的异同 (11)6 利用计算机程序模拟算法 (11)7 附录 (11)8 论文总结 (13)9 参考文献 (13)1 引言最短路问题是图论理论的一个经典问题。

寻找最短路径就是在指定网络中两结点间找一条距离最小的路。

最短路不仅仅指一般地理意义上的距离最短,还可以引申到其它的度量,如时间、费用、线路容量等。

最短路径算法的选择与实现是通道路线设计的基础,最短路径算法是计算机科学与地理信息科学等领域的研究热点,很多网络相关问题均可纳入最短路径问题的范畴之中。

经典的图论与不断发展完善的计算机数据结构及算法的有效结合使得新的最短路径算法不断涌现。

2 最短路2.1 最短路的定义对最短路问题的研究早在上个世纪60年代以前就卓有成效了,其中对赋权图 的有效算法是由荷兰著名计算机专家E.W.Dijkstra 在1959年首次提出的,该算法能够解决两指定点间的最短路,也可以求解图G 中一特定点到其它各顶点的最短路。

后来海斯在Dijkstra 算法的基础之上提出了海斯算法。

但这两种算法都不能解决含有负权的图的最短路问题。

因此由Ford 提出了Ford 算法,它能有效地解决含有负权的最短路问题。

但在现实生活中,我们所遇到的问题大都不含负权,所以我们在的()0ij w ≥的情况下选择Dijkstra 算法。

定义1若图G=G(V,E)中各边e 都赋有一个实数W(e),称为边e 的权,则称这种图为赋权图,记为G=G(V,E,W)。

定义2若图G=G(V,E)是赋权图且()0W e ≥,()e E G ∈,假设[i,j] 的权记为()i j W ,,若i 与j 之间没有边相连接,那么()i j =W ∞,。

路径P 的定义为路径中各边的长度之和,记W (P )。

图G 的结点u 到结点v 距离记为d(u,v),则u 、v 间的最短路径可定义为{()min P 0d(u,v)=,u v W =∞(),不可达时。

2.2 最短路问题常见算法在求解网络图上节点间最短路径的方法中,目前国内外一致公认的较好算法有迪杰斯特拉(Dijkstra)及弗罗伊德(Floyd)算法。

这两种算法中,网络被抽象为一个图论中定义的有向或无向图,并利用图的节点邻接矩阵记录点间的关联信息。

在进行图的遍历以搜索最短路径时,以该矩阵为基础不断进行目标值的最小性判别,直到获得最后的优化路径。

Dijkstra 算法是图论中确定最短路的基本方法,也是其它算法的基础。

为了求出赋权图中任意两结点之间的最短路径,通常采用两种方法。

一种方法是每次以一个结点为源点,重复执行Dijkstra 算法n 次。

另一种方法是由Floyd 于1962年提出的Floyd 算法,其时间复杂度为()3O n ,虽然与重复执行Dijkstra 算法n 次的时间复杂度相同,但其形式上略为简单,且实际运算效果要好于前者。

3 Dijkstra 算法 3.1 Dijkstra 算法描述Dijkstra 算法是解但愿最短路径问题的一个贪心算法。

其基本思想是,设置顶点集合S 并不断地做贪心选择来扩充这个集合。

一个顶点属于集合S 当且仅当从源到该顶点的最短路径长度已知。

初始时,S 中仅含有源。

设u 是图G 的某一顶点,把从源到u 且中间只经过S 中顶点的路称为源到u 的特殊路径,并记录当前每个顶点所对应的特殊路径长度。

Dijkstra 算法每次从V —S 中取出具有最短路径长度的顶点u ,将u 添加到S 中,同时对短路径进行修改。

一旦S 包含了所有V 中顶点,那么最后记录的最短路径就是源到所有其他顶点之间的最短路径长度。

算法要点如下:(1) 把V 分为两个子集S 和T 。

初始时,S={a},T=V-S ,其中a 为源点; (2) 对T 中每一个元素t 计算D (t ),根据D (t )值找出T 中距a 最短的一结点x ,写出a 到x 的最短路径长度D (x );(3) 更新S ,置S 为S {x},更新T ,置T 为T-{x},判断条件:若T=∅,则终止,否则再重复(2)。

3.2 Dijkstra 算法举例问题的提出,给定一个带权有向图(既有向网)G 和源点Vo ,求Vo 到G 中其他每个顶点的最短路径。

限定各边上的权值必须不小于0.如下图所示:图1 公路网络赋权图为了方便计算,先作出该网络的距离邻接矩阵,如下:12345612345605250159A 21081058025910202520v v v v v v v v v v v v ⎡⎤⎢⎥∞∞∞⎢⎥⎢⎥∞⎢⎥=∞⎢⎥⎢⎥∞⎢⎥∞⎢⎥⎢⎥∞∞∞⎣⎦设()(){}1234560,,,,,,j W v T v v s v v v v v -==∞∈=,第一次迭代①计算(),2,3,4,5,6j T v j =如下()()(){}{}22112min ,min ,055T v T v W v w =+=∞+= ()()(){}{}33113min ,min ,022T v T v W v w =+=∞+= ()()(){}{}44114min ,min ,0T v T v W v w =+=∞+∞=∞ ()()56,T v T v =∞=∞②取(){}()32min j jv sT v T v ∈==,令()()332W v T v ==③由于()36k n =≠=,令{}2456,,,,3s v v v v i -==转(1) 第二次迭代:①算(),2,4,5,6j T v j =如下()()(){}{}22323min ,min 5,213T v T v W v w =+=+= ()()(){}{}44334min ,min 8,288T v T v W v w =+=+= ()()(){}{}55335min ,min 10,21010T v T v W v w =+=+= ()()(){}{}66336min ,min ,2T v T v W v w =+=∞+∞=∞②取(){}()2min 3j jv sT v T v -∈==令()()223W v T v ==③由于()26k n =≠=,令{}456,,2s v v v i -==转(1) 第三次迭代:①算(),4,5,6j T v j =如下()()(){}{}44224min ,min 8,358T v T v W v w =+=+= ()()(){}{}55225min ,min 10,3910T v T v W v w =+=+= ()6T v =∞②取(){}()()()444min 8,8j jv sT v T v W v T v -∈====③由于()46k n =≠=,令{}56,4s v v i -==转(1) 第四次迭代:①算(),5,6j T v j =如下()()(){}{}55445min ,min 10,2810T v T v W v w =+=+= ()()(){}{}66446min ,min ,8513T v T v W v w =+=∞+=②取(){}()()()555min 10,10j jv sT v T v W v T v -∈====③由于()56k n =≠=,令{}6s v -=转(1) 第五次迭代:①算(),6j T v j =如下()()(){}{}66556min ,min 13,10212T v T v W v w =+=+=②由于6k n ==。

因此已找到1v 到6v 的最短距离为12。

计算结束。

对应的迭代表格如下:找最短路线:逆向追踪得132456v v v v v v →→→→→ 最短距离为12,即从城市1v 到城市6v 的距离最短,即费用最省。

3.3算法的正确性和计算复杂性 3.3.1贪心选择性质Dijkstra 算法是贪心算法策略的一个典型例子。

它所做的贪心选择是从V —S 中选择具有最短特殊路径的顶点u ,从而确定从源到u 的最短路径长度dist[u]。

这种贪心选择导致最优解在于如果存在一条源到u 且长度比dist[u]更短的路,设这条路初次走出S 之外到达的顶点x V S ∈—,然后徘徊于S 内外若干次,最后离开S 到达u ,如图2所示。

在这条路径上,分别标记d(v,x),d(x,u)和d(v,u)为顶点v 到顶点x ,顶点x 到顶点u 和顶点v 到顶点u 的路长,那么有:dist[x]d(v,x)≤d(v,x)+d(x,u)=d(v,u)<dist[u]利用权边的非负性,可知d(v,x)0≥,从而推出dist[x]dist[u]≤。

此为矛盾。

这就证明了dist[u]是从源点到u 的最短路径长度。

图2 从源到u 的最短路径3.3.2最优子结构性质要完成Dijkstra 算法正确性的证明,还必须证明最优子结构性质,即算法中确定的dist[u]确实是当前从源到顶点u 的最短特殊路径长度。

为此,只要考察算法在添加u 到S中后,dist[u]的值所起的变化。

将添加u 之前的S 成为老S 。

当添加了u 之后,可能出现一条到顶点i 的新的特殊路。

如果这条新特殊路是先经过老S 到达顶点u ,然后从u 经一条边直接到达顶点i ,则这种路的最短的长度是dist[u]+c[u][i]。

此时如果dist[u]+c[u][i]<dist[i],则计算中用dist[u]+c[u][i]作为dist[i]的新值。

如果这条新特殊路径经过老S 到达u 后,不是从u 经过一条边直接到达i ,而是像图3那样,回到老S 中某个顶点x ,最后才到达顶点i ,那么由于x 在老S 中,因此x 比u 先加入S ,所以图3中从源到x 的路的长度比从源到u ,再从u 到x 的路的长度小。

于是当前dist[i]的值小于从源经x 到i 的路的长度,也小于图中从源经u 和x ,最后到达i 的路的长度。

相关主题