最短路问题及其应用——最短路径
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最短路问题及应用
摘要:主要介绍最短路的两种算法,迪杰斯特拉(Dijkstra)及弗罗伊德(Floyd)算法以及这两种算法在实际问题中的应用和比较。
关键词:最短路获克斯特拉(Dijkstra),弗罗伊德(Floyd)算法
1.引言
图论是应用数学的一个分支,它的概念和结果来源非常广泛,最早起源于一些数学游戏的难题研究,如欧拉所解决的哥尼斯堡七桥问题,以及在民间广泛流传的一些游戏难题,如迷宫问题、博弈问题、棋盘上马的行走路线问题等。这些古老的难题,当时吸引了很多学者的注意。在这些问题研究的基础上又继续提出了著名的四色猜想和汉米尔顿(环游世界)数学难题。
1847年,图论应用于分析电路网络,这是它最早应用于工程科学,以后随着科学的发展,图论在解决运筹学,网络理论,信息论,控制论,博弈论以及计算机科学等各个领域的问题时,发挥出越来越大的作用在实践中,图论已成为解决自然科学、工程技术、社会科学、军事等领域中许多问题的有力工具之一。
最短路问题是图论理论的一个经典问题。寻找最短路径就是在指定网络中两结点间找一条距离最小的路。最短路不仅仅指一般地理意义上的距离最短,还可以引申到其它的度量,如时间、费用、线路容量等。
最短路径算法的选择与实现是通道路线设计的基础,最短路径算法是计算机科学与地理信息科学等领域的研究热点,很多网络相关问题均可纳入最短路径问题的范畴之中。经典的图论与不断发展完善的计算机数据结构及算法的有效结合使得新的最短路径算法不断涌现。
2.最短路算法
2.1 最短路的定义
对最短路问题的研究早在上个世纪60年代以前就卓有成效了,其中对赋权图()0
w≥的有效算法是由荷兰著名计算机专家E.W.Dijkstra在1959年首次提出的,该ij
算法能够解决两指定点间的最短路,也可以求解图G中一特定点到其它各顶点的最短
路。后来海斯在Dijkstra 算法的基础之上提出了海斯算法。但这两种算法都不能解决含有负权的图的最短路问题。因此由Ford 提出了Ford 算法,它能有效地解决含有负权的最短路问题。但在现实生活中,我们所遇到的问题大都不含负权,所以我们在
()0ij
w
≥的情况下选择Dijkstra 算法。
若图(,)G V E =中各边e 都赋有一个实数()W e ,称为边e 的权,则称这种图为赋权图,记为(,,)G V E W .
设G 是带权图,,s t v v 是G 的两个顶点,P 是G 中从s v 到t v 的一条通路,定义路P 的权为P 中所有边的权之和,记为()W P 。最短路就是在所有从s v 到t v 的路中,求一条权最小的路,即求一条从s v 到t v 的路0P ,使
0()min ()P
W P W P =
上式中对G 中所有从s v 到t v 的路P 取最小,称0P 为从s v 到t v 的最短路。
2.2 最短路问题算法的基本思想及基本步骤
在求解网络图上节点间最短路径的方法中,目前国内外一致公认的较好算法有迪杰斯特拉(Dijkstra)及弗罗伊德(Floyd)算法。这两种算法中,网络被抽象为一个图论中定义的有向或无向图,并利用图的节点邻接矩阵记录点间的关联信息。在进行图的遍历以搜索最短路径时,以该矩阵为基础不断进行目标值的最小性判别,直到获得最后的优化路径。
Dijkstra 算法是图论中确定最短路的基本方法,也是其它算法的基础。为了求出赋权图中任意两结点之间的最短路径,通常采用两种方法。一种方法是每次以一个结点为源点,重复执行Dijkstra 算法n 次。另一种方法是由Floyd 于1962年提出的Floyd 算法,其时间复杂度为()3O n ,虽然与重复执行Dijkstra 算法n 次的时间复杂度相同,但其形式上略为简单,且实际运算效果要好于前者。
2.2.1 Dijkstra 算法
Dijkstra 算法基本步骤: 令:{}{}23,1,,,,i n S v i S v v v ===
并令:()()10
j j W v v S T v ⎧=⎨
∈=∞
⎩
1、对j v S ∈,求()(){}
()min ,j i ij j T v W v W T v +=.
2、求(){}min j j v S
T v ∈得()k T v ,使()(){}
min j k j v S
T v T v ∈=,令()()k k W v T v =.
3、若k n v v =则已找到1v 到n v 的最短路距离()k W v ,否则令i k =从S 中删去i v 转1这样经过有限次迭代则可以求出1v 到n v 的最短路线,可以用一个流程图来表示:
第一步,先取()10W v =意即1v 到1v 的距离为0,而()j T v 是对()j T v 所赋的初值。 第二步,利用()1W v 已知,根据()(){}
min ,j i ij T v W v w +对()j T v 进行修正。 第三步,对所有修正后的()j T v 求出其最小者()k T v .其对应的点k v 是1v 所能一步到达的点j v 中最近的一个,由于所有()0W u ≥.因此任何从其它点j v 中转而到达k v 的通路上的距离都大于1v 直接到k v 的距离()k T v ,因此()k T v 就是1v 到k v 的最短距离,所以在算法中令()()k k W v T v =并从S 中删去k v ,若k n =则()()k n W v W v =就是1v 到n v 的最短路线,计算结束。否则令i k v v =回到第二步,继续运算,直到k n =为止。
这样每一次迭代,得到1v 到一点k v 的最短距离,重复上述过程直到k n v v =.
2.2.2 Floyd 算法的基本原理和实现
Floyd 算法的基本原理和实现方法为:如果一个矩阵ij D d ⎡⎤=⎣⎦其中0ij d >表示i 与
2,3,,n ,,}n S v =
(),j T v v ⇒