最短路径学年论文
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要:主要介绍最短路径问题中的经典算法——迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法,以及在实际生活中的运用。
关键字:Dijkstra算法、Floyd算法、赋权图、最优路径、Matlab
目录
摘要··1
1引言··1
2最短路··2
2.1 最短路的定义·2
2.2最短路问题常见算法··2
3 Dijkstra算法··2
3.1 Dijkstra算法描述··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 U {x},更新T ,置T 为T-{x},判断条件:若T=∅,则终止,否则再重复(2)。
3.2 Dijkstra 算法举例
问题的提出,给定一个带权有向图(既有向网)G 和源点Vo ,求Vo 到G 中其他每个顶点的最短路径。限定各边上的权值必须不小于0.如下图所示:
图1 公路网络赋权图
为了方便计算,先作出该网络的距离邻接矩阵,如下:
123456123
456
05250159A 2108105802591020252
0v v v v v v v v v v v v ⎡⎤⎢⎥∞∞∞⎢⎥⎢⎥∞⎢⎥=∞⎢⎥⎢⎥∞⎢⎥∞⎢⎥⎢⎥∞∞∞⎣⎦
设()(){}1234560,,,,,,j W v T v v s v v v v v -
==∞∈=,