最短路径算法
Abstract
This article ism't finished yet...
顶点标号法¶
Dantzig 算法,1959 年,旦捷希(Dantzig)发现了在赋权图中求由点 a 到点 b 的最短路好算法,称为顶点标号法。
和弗洛伊德算法非常非常像... ,在这里补充一下 Floyid 算法对邻接矩阵求最短距离矩阵过程,这个过程和 Dantzig 几乎一致(完全一致好吧,考试可能会考?):
- 按顺序一列一列看,看第
列时: - 按顺序一行一行看,看第
行时,若 则:- 看第
列,看 是否是新的 到 的最短距离
- 看第
数据结构¶
:点 的标号值, 表示点 到 的最短路长度 : 已经标号的顶点集合 : 到 的最短路上的边集合
算法步骤¶
-
记:
-
, , ,-
; -
若已经得到
, 且对于 , 已知 对每一个 , 求一点:
$$ b_n^{(i)}\in N(a_n)-A_i=B_n^{(i)} $$
使得:
$$ l(a_n b_n^{(i)})=\min_{v\in B_n^{(i)}}l(a_n v) $$
!!! abstract
这里
:::
-
设有
, , 而 是使 取最小值 , 令: -
; ;-
; -
- 若
, 停止 ;
- 若
- 否则,记
, 转(2)
时间复杂度¶
对第
- 步骤 (2) 要进行
次比较运算 - 步骤 (3) 要进行
次加法与 次比较运算
所以,该次循环运算量为
所以,在最坏的情况下,运算量为
完备性证明¶
定理 1:算法中的函数
时结论显然成立;- 设对所有的
, 时, ; - 考虑
:
于是
又令
因为
记 P 中
由归纳假设有:
算法中,当第
だから:
又由算法最终对点
另一方面,由算法可知存在一条长度为
从而得到
应用举例¶
分酒¶
某两人有一只 8 升的酒壶装满了酒,还有两只空酒壶,分别为 5 升和 3 升,求最少的操作次数能均分酒
解:设
容易算出
每种组合用一个点表示,两点连线,当且仅当可通过倒酒的方式相互变换。若各边赋权为 1,则问题转化为在该图中求
Abstract
这个问题给定了初始状态和目标状态,也可以转化为人工智能中的智能规划问题
狼羊过河¶
在一河岸有狼,羊和卷心菜。摆渡人要将它们渡过河去,由于船太小,每次只能载一样东西。由于狼羊,羊卷心菜不能单独相处。问摆渡人至少要多少次才能将其渡过河?
人,狼,羊,菜所有组合形式为:
但是以下组合不能允许出现: 狼羊菜,羊菜,狼羊,人,人狼,人菜,共 6 种;
岸上只能允许出现 10 种组合: 人狼羊菜,人狼羊,人狼菜,人羊,空,菜,羊,狼,狼菜,人羊菜;
每种情况用点表示,两点连线,当且仅当两种情况可用载人(或加一物) 的渡船相互转变,每条边赋权为 1 。于是,问题转化为求由顶点 “人狼羊菜” 到顶点 “空” 的一条最短路问题。结果为: