This article ism't finished yet...
# 顶点标号法
Dantzig 算法,1959 年,旦捷希 (Dantzig) 发现了在赋权图中求由点 a 到点 b 的最短路好算法,称为顶点标号法。
和弗洛伊德算法非常非常像... ,在这里补充一下 Floyid 算法对邻接矩阵求最短距离矩阵过程,这个过程和 Dantzig 几乎一致(完全一致好吧,考试可能会考?):
- 按顺序一列一列看,看第 i 列时:
- 按顺序一行一行看,看第 j 行时,若 aji=∞ 则:
- 看第 j 列,看 aji+akj 是否是新的 i 到 k 的最短距离
# 数据结构
- t(an) : 点 an 的标号值,表示点 a1=a 到 an 的最短路长度
- Ai={a1,a2,⋯,ai} : 已经标号的顶点集合
- Ti : a 到 ai 的最短路上的边集合
# 算法步骤
记:
- a=a1 ,
- t(a1)=0 ,
- A1={a1} ,
- T=∅ ;
若已经得到 Ai={a,a2,⋯,ai} , 且对于 1≤n≤i , 已知 t(an) 对每一个 an∈Ai , 求一点:
bn(i)∈N(an)−Ai=Bn(i)
使得:
l(anbn(i))=v∈Bn(i)minl(anv)
这里 i 表示第 i 轮,N(an) 表示与 an 邻接的点组成的集合,N 表示 Neighbour
设有 j , 1≤j≤i , 而 bj(i) 是使 t(aj)+l(ajbj(i)) 取最小值,令:
- ai+1=bj(i) ;
- t(ai+1)=t(aj)+l(ajai+1);
- Ti+1=Ti∪{ajai+1};
- 若 ai+1=b , 停止;
- 否则,记 Ai+1=Ai∪{ai+1}, 转 (2)
# 时间复杂度
对第 i 次循环:
- 步骤 (2) 要进行 i 次比较运算
- 步骤 (3) 要进行 i 次加法与 i 次比较运算
所以,该次循环运算量为 3i。
所以,在最坏的情况下,运算量为 n2 级,是好算法
# 完备性证明
定理 1:算法中的函数 t(an) 给出了 a 与 ai 的距离
证明:对 i 作数学归纳法
- i=1 时结论显然成立;
- 设对所有的 j ,1≤j≤i 时,t(aj)=d(a,aj);
- 考虑 j=i+1:
于是 d=d(a,ai+1)
又令 vn 是 P 中第一个不在 Ai 中的点。由于 ai+1∈/Ai , 所以这样的点存在
因为 v0∈Ai ,所以 n≥1;
记 P 中 a 到 vn+1 一段长为 l , 而 a 到 vn 的一段长为 l1;
由归纳假设有: l1≥t(vn) ,进而有:
d=d(a,ai+1)≥l=l1+l(vnvn+1)≥t(vn)+l(vnvn+1)
算法中,当第 i 轮中已知 Ai={a1,a2,⋯,ai} 要给 ai+1 标号时,其中要选择 bn(i) ,满足:
l(vnbn(i))≤l(vnvn+1)
だから:
d≥t(vn)+l(vnvn+1)≥t(vn)+l(vnbn(i))
又由算法最终对点 ai 的标号值的选择方法知;
d≥t(vn)+l(vnbn(i))≥t(aj)+l(ajai+1)≥t(ai+1)
另一方面,由算法可知存在一条长度为 t(ai) 的联结 a 与 ai 的路,所以:
t(ai+1)≥d(a,ai+1)
从而得到 t(ai+1)≥d(a,ai+1)≥t(ai+1) ,即得到:t(ai+1)=d(a,ai+1)
# 应用举例
# 分酒
某两人有一只 8 升的酒壶装满了酒,还有两只空酒壶,分别为 5 升和 3 升,求最少的操作次数能均分酒
解:设 x1,x2,x3 分别表示 8,5,3 升酒壶中的酒量。则
x1+x2+x3=8, x1≤8,x2≤5,x3≤3
容易算出 (x1,x2,x3) 的组合形式共 24 种
每种组合用一个点表示,两点连线,当且仅当可通过倒酒的方式相互变换。若各边赋权为 1,则问题转化为在该图中求 (8,0,0) 到 (4,4,0) 的一条最短路。结果如下:
(8,0,0)→(3,5,0)→(3,2,3)→(6,2,0)→(6,0,2)→(1,5,2)→(1,4,3)→(4,4,0)
这个问题给定了初始状态和目标状态,也可以转化为人工智能中的智能规划问题
# 狼羊过河
在一河岸有狼,羊和卷心菜。摆渡人要将它们渡过河去,由于船太小,每次只能载一样东西。由于狼羊,羊卷心菜不能单独相处。问摆渡人至少要多少次才能将其渡过河?
人,狼,羊,菜所有组合形式为:
C40+C41+C42+C43+C44=24=16
但是以下组合不能允许出现:狼羊菜,羊菜,狼羊,人,人狼,人菜,共 6 种;
岸上只能允许出现 10 种组合:人狼羊菜,人狼羊,人狼菜,人羊,空,菜,羊,狼,狼菜,人羊菜;
每种情况用点表示,两点连线,当且仅当两种情况可用载人 (或加一物) 的渡船相互转变,每条边赋权为 1 。于是,问题转化为求由顶点 “人狼羊菜” 到顶点 “空” 的一条最短路问题。结果为:
人狼羊菜→狼菜→人狼菜→狼→人狼羊→羊→人羊→空