3. Label Correcting Algorithms
本章将围绕Label Correcting Algorithms展开。首先,3.1小节介绍了最短路径最优性条件,这些条件允许我们评估一组距离标签是否达到最优,以及什么时候我们应该结束算法。基于这一最优性条件,3.2-3.5小节介绍了基本的Label Correcting Algorithms用于求解不含有负环的单源最短路径问题。对于多源最短路径问题将在3.6小节进行讨论,3.7小节将对本章内容进行总结。(小编注:限于篇幅原因,本章将分为三期,详细介绍相关算法)
在正式介绍内容之前我们做一下约定:①本文以有向图作为研究对象;②网络中不含有负环;③网络弧长均为整数;④在实现相应算法时以表格3-1为输入文件。
表3-1 算法输入文件格式
3.1 最优性判别条件最优性定理1
对于任意节点,设表示从源节点到节点的某条有向路径的长度,则当且仅当满足以下最短路径最优性条件时为源节点到节点最短路径距离(3):
式(3)对于网络中任意弧,源点到节点的最短路径长度始终小于等于源点到节点的最短路径长度与弧的长度之和。反之,如果存在某些弧满足,那么我们就可以把节点加到源节点到节点的路径中去,从而降低源节点到节点的最短路径长度,这与是最短路径长度的命题相矛盾。
接下来我们从数学的角度再次证明上述定理的正确性。假设源点到任意节点的某条有向路径为
由式(3)可得(4):
注把上述不等式相加可得到(5):
式(5)说明是从源节点到节点的任意有向路径长度的下界,又因为是源节点到节点的临时有向路径长度,因此它又是最短路径的上界,所以即为源节点到节点的最短路径长度。
在此,我们对定理1做进一步拓展:定义表示弧关于距离标签的缩短距离,其计算公式为:关于有以下三条性质:
1.在任意有向环W中,;
2.对于从节点到节点的任意有向路径,;
3.如果是网络中的一条最短路径,则;
接下来思考:如果网络中存在负环,上述三条性质是否还成立?假设W是网络G中的一个有向环,由上述性质3可推出性质1中,因此W不可能是负环。由此得出:含有负环的网络不满足定理1。此外,本文所介绍的最优性判别条件与动态规划中的Bellman Optimality Condition是一致的。
3.2 Generic Label Correcting Algorithm3.2.1 算法介绍
如上文所介绍的最优性判断法则,本文所介绍的Generic Label Correcting Algorithm可以认为是Bellman Optimality Condition的具体实现。在Generic Label Correcting Algorithm中以距离标签来表示源节点到任意节点的最短路径长度,但与Label Setting Algorithms不同的是:这里不区分永久距离标签和临时距离标签,在算法迭代中距离标签是连续变化的,当所有距离标签都满足最优性条件时算法结束,此时距离标签即为源节点到任意节点的最短路径长度。Generic Label Correcting Algorithm步骤如下:
表3-2 Generic Label Correcting Algorithm
我们可以看出Generic Label Correcting Algorithm的伪代码很简洁,核心就是逐个检查不满最优性条件的距离标签,并根据更新距离标签,同时前向节点也随之更新,直到所有的距离标签都满足最优性条件。这里以附录2为例,求解节点1到其他节点的最短路径:
①令节点1的距离标签,前向节点pred(1)=0,其他节点的距离标签设为无穷大,如3-1(a);②检查弧(1,3),(1,2)是否满足最优性条件,并更新相应距离标签及前向节点,如图3-1(b);③检查弧(3,4),(3,5)是否满足最优性条件,并更新相应距离标签及前向节点,如图3-1(c);④检查弧(5,6),(5,4)是否满足最优性条件,并更新相应距离标签及前向节点,如图3-1(d)。
至此图3-1(d)中的所有弧都满足最优性条件,我们可以通过前向节点集合来生成节点1到其他节点的最短路径,例如,节点5的前向节点为3,节点3的前向节点为1,因此节点1到节点5的最短路径为1-3-5。通过这种方法我们可以得到一颗以节点1为根的前向节点树(如图3-2),此前向节树记录了根节点到其他子节点的最短路径。
图3-1 Generic Label-Correcting Algorithm 计算流程
图3-2 前向树
这里需要说明的是前向节点集合并不一定会形成一棵以源节点为根的树。如图3-3(a)所示,假设弧(4,1)满足d(1)>d(4)+c41,我们将节点1的前向节点由0更改为4,得到图3-3(b),此时前向节点不再构成一棵树。之所以会发生这种情况是因为网络中含有负环,在3.1小节我们已经讨论过,含有负环的网络不符合最优性定理。
图3-3 含有环的前向图
算法复杂度分析
接下来我们对Generic Label Correcting Algorithm的收敛性进行分析。通过伪代码我们得知算法只有一个while循环,但这个循环并没有明确指出迭代次数的值。我们假设为最大的弧长值,那么源节点到其他节点的路径长度上界为(该路径含有n-1条弧,每条弧的长度为),路径长度下界为,所以对于任意距离标签的最大更新次数为(假设每次更新距离标签只减少1单位),网络中节点数目为,因此距离标签总的更新次数为。因为每次迭代只更新一个距离标签,因此总的迭代次数为。
3.2.2 算法实现
首先给出Python版本的Generic Label Correcting Algorithm实现(求解附录2中源节点1到其他节点的最短路径)
"""导入相关基础包,定义全局变量"""
import pandas as pd
import numpy as np
import copy