最短路问题及其应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最短路问题及其应用
顾碧芬 06200103
摘要:主要介绍最短路的两种算法,迪杰斯特拉(Dijkstra)及弗罗伊德(Floyd)算法。以及这两种算法在实际问题中的应用和比较。
1 引言
最短路问题是图论理论的一个经典问题。寻找最短路径就是在指定网络中两结点间找一条距离最小的路。最短路不仅仅指一般地理意义上的距离最短,还可以引申到其它的度量,如时间、费用、线路容量等。
最短路径算法的选择与实现是通道路线设计的基础,最短路径算法是计算机科学与地理信息科学等领域的研究热点,很多网络相关问题均可纳入最短路径问题的范畴之中。经典的图论与不断发展完善的计算机数据结构及算法的有效结合使得新的最短路径算法不断涌现。
2 最短路 2.1 最短路的定义
对最短路问题的研究早在上个世纪60年代以前就卓有成效了,其中对赋权图()
ij w ≥的有效算法是由荷兰著名计算机专家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 ∈,若u 是i v 到j v 的路()W u 的权,则称()W u 为u 的长,长最小的i v 到j v 的路()W u 称为最短路。
若要找出从i v 到n v 的通路u ,使全长最短,即()()min ij e u
W u W e ∈=
∑。
2.2 最短路问题算法的基本思想及基本步骤
在求解网络图上节点间最短路径的方法中,目前国内外一致公认的较好算法有迪杰斯特拉(Dijkstra)及弗罗伊德(Floyd)算法。这两种算法中,网络被抽象为一个图论中定义的有向或无向图,并利用图的节点邻接矩阵记录点间的关联信息。在进行图的遍历以搜索最短路径时,以该矩阵为基础不断进行目标值的最小性判别,直到获得最后的优化路径。
Dijkstra 算法是图论中确定最短路的基本方法,也是其它算法的基础。为了求出赋权图中任意两结点之间的最短路径,通常采用两种方法。一种方法是每次以一个结点为源点,重复执行Dijkstra 算法n 次。另一种方法是由Floyd 于1962年提出的Floyd 算法,其时间复杂度为
()3O n ,虽然与重复执行Dijkstra 算法n 次的时间复杂度相同,但其形式上略为简单,且实际运
算效果要好于前者。
Dijkstra 算法基本步骤③
: 令:{}{}_
23,1,,,,i n s v i s v v v ===
并令:{
()()10,j j W v T v v s
-
==∞∈
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 ,使()k
T v =(){}min j j
v s
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 =。
Floyd 算法的基本原理和实现方法为:如果一个矩阵ij D d ⎡⎤=⎣⎦其中0ij d >表示i 与j 间的距离,若i 与j 间无路可通,则ij d 为无穷大。i 与j 间的最短距离存在经过i 与j 间的k 和不经过
k 两种情况,所以可以令1,2,3,
,k n =,n(n 为节点数)。检查ij d 与ik kj d d +的值,在此,ik d 与
kj d 分别为目前所知的i 到k 与k 到j 的最短距离,因此,ik kj d d +就是i 到j 经过k 的最短距
离。所以,若有ij ik kj d d d >+,就表示从i 出发经k 再到j 的距离要比原来的i 到j 距离短,自然把i 到j 的ij d 重写成ik kj d d +。每当一个k 搜索完,ij d 就是目前i 到j 的最短距离。重复这一过程,最后当查完所有k 时,ij d 就为i 到j 的最短距离。
3 最短路的应用 3.1在运输网络中的应用④
设6个城市126,,
,v v v 之间的一个公路网(图1)每条公路为图中的边,边上的权数表示该
段公路的长度(单位:百公里),设你处在城市1v ,那么从1v 到6v 应选择哪一路径使你的费用最省。
解:首先设每百公里所用费用相同,求1v 到6v 的费用最少,既求1v 到6v 的最短路线。为了方便计算,先作出该网络的距离矩阵,如下:
12345
6123
4560525015921081058025910202520v v v v v v v v L v v v v ⎡
⎤
⎢⎥∞∞∞⎢⎥⎢⎥
∞⎢⎥
=∞⎢⎥⎢⎥
∞⎢⎥
∞⎢⎥⎢⎥∞∞∞⎣⎦
(0)设()(){}1234560,,,,,,j W v T v v s v v v v v -
==∞∈=, (1)第一次迭代
①计算()
,2,3,4,5,6j T v j =如下
()()(){}{}22112min ,min ,055T v T v W v w =+=∞+=