BellmanFord算法、多源最短路与矩阵相乘
BellmanFord算法、多源最短路与矩阵相乘BellmanFord算法与动态规划相信看到这篇的读者已经对BellmanFord算法有了详细的认识。在这里我就不再赘述了,直接讨论与动态规划的关系。我们定义lxml_{x}^{m}lxm为从源节点到节点x且最多经过m条边的最短路径的距离,为了构建动态规划的状态转移方程,我们必须分析lxm−1l_{x}^{m-1}lxm−1与lxml_{x}^{
BellmanFord算法、多源最短路与矩阵相乘
BellmanFord算法与动态规划
相信看到这篇的读者已经对BellmanFord算法有了详细的认识。在这里我就不再赘述了,直接讨论与动态规划的关系。
我们定义lxml_{x}^{m}lxm为从源节点到节点x且最多经过m条边的最短路径的距离,为了构建动态规划的状态转移方程,我们必须分析lxm−1l_{x}^{m-1}lxm−1与lxml_{x}^{m}lxm的关系。
为了从lxm−1l_{x}^{m-1}lxm−1递推到lxml_{x}^{m}lxm,我们有两个选择。第一,继承上一个状态的值,即lxm−1l_{x}^{m-1}lxm−1就是lxml_{x}^{m}lxm。第二,存在一个中间节点k,使得lkm−1+wkxl_{k}^{m-1}+w_{kx}lkm−1+wkx是最小路径距离。两者取最小值即可。最后,我们构建出动态规划方程:
lxm=min1≤k≤n{lkm−1+wkx} l_{x}^{m} = \min_{1 \leq k \leq n}\{ l_{k}^{m-1} + w_{kx} \} lxm=1≤k≤nmin{lkm−1+wkx}
其中wkxw_{kx}wkx指的是边(k,x)(k,x)(k,x)的权值。
接下来我们就可以自底向上的进行递推了,我们定义l0l^{0}l0这个数组为,除了ls0l_{s}^{0}ls0为0外其余均为∞\infty∞,这也符合最多经过0条边的定义。那我们递推多少次呢,我们来考虑一个最坏情况,那就是一条最短路径包含了图中的所有节点,又因为最短路是一条简单路,因此最多含有∣V∣−1|V|-1∣V∣−1条边。因此,我们只需要递推到l∣V∣−1l^{|V|-1}l∣V∣−1即可,即递推∣V∣−1|V|-1∣V∣−1次。
怎么样?是不是对BellmanFord的理解又近了一步。我们继续往下分析。
BellmanFord算法与矩阵向量相乘
BellmanFord与矩阵向量相乘有什么关系呢?我们做一个替换,把lml^{m}lm看成是一个向量,把wijw_{ij}wij看成是一个矩阵,我们得到lml^{m}lm的过程就是向量lm−1l^{m-1}lm−1与矩阵wijw_{ij}wij的操作。我们再进行一次替换,把算子min\minmin替换成加法算子,把加法算子+++替换成乘法算子×\times×,我们改写我们的动态规划方程:
lxm=∑1≤k≤nlkm−1×wkx l_{x}^{m} = \sum_{1 \leq k \leq n} l_{k}^{m-1} \times w_{kx} lxm=1≤k≤n∑lkm−1×wkx
怎么样,是不是就是矩阵与向量相乘了。
因此,我们定义向量lml^{m}lm叫最短距离向量,我们把矩阵wijw_{ij}wij称为权值矩阵。把l0l^{0}l0称为零最短距离向量,把l1l^{1}l1称为单位最短距离向量。
多源最短路与动态规划
我们继续BellmanFord的算法的思想,能不能扩展到多源最短路呢?答案是肯定的,聪明的读者已经想到了,把向量lxml_{x}^{m}lxm改为矩阵lijml_{ij}^{m}lijm表示从节点i到节点j最多经过m条边的最短路径。有了上面的经验,我们的动态规划方程就很好写出了:
lijm=min1≤k≤n{likm−1+wkj} l_{ij}^{m} = \min_{1 \leq k \leq n}\{ l_{ik}^{m-1} + w_{kj} \} lijm=1≤k≤nmin{likm−1+wkj}
有了这个方程,我们就可以递推了。同理,定义lij0l_{ij}^{0}lij0为当i=ji=ji=j时为000,否则为∞\infty∞。特别的,lij1=Gijl_{ij}^{1} = G_{ij}lij1=Gij,其中GijG_{ij}Gij是我们的邻接矩阵。因此,如果我们知道我们的邻接矩阵,就可以从lij1l_{ij}^{1}lij1开始递推,而不必从lij0l_{ij}^{0}lij0开始。同样的分析方式,也是递推∣V∣−1|V|-1∣V∣−1次。
多源最短路与矩阵相乘
我们也做一个替换,把lml^{m}lm看成是一个矩阵,把wijw_{ij}wij看成是一个矩阵,我们得到lml^{m}lm的过程就是矩阵lm−1l^{m-1}lm−1与矩阵wijw_{ij}wij的操作。我们再进行一次替换,把算子min\minmin替换成加法算子,把加法算子+++替换成乘法算子×\times×,我们改写我们的动态规划方程:
lijm=∑1≤k≤n{likm−1×wkj} l_{ij}^{m} = \sum_{1 \leq k \leq n}\{ l_{ik}^{m-1} \times w_{kj} \} lijm=1≤k≤n∑{likm−1×wkj}
怎么样?是不是就变成矩阵相乘了。因此,我们定义向量lml^{m}lm叫最短距离矩阵,我们把矩阵wijw_{ij}wij称为权值矩阵。把l0l^{0}l0称为零最短距离矩阵,把l1=Gijl^{1} = G_{ij}l1=Gij称为单位最短距离矩阵。
最终,我们给出松弛的概念,像上面这样,通过一个最短距离矩阵(向量)和权值矩阵进行计算得出下一个状态的最短距离矩阵(向量),我们称这个计算为松弛。
多源最短路与矩阵快速幂
可以由数学证明,算子松弛也具矩阵相乘的线性相关性。因此我们能不能使用矩阵快速幂的思维,改进我们的算法呢?
我们通过归纳总结得出:(定义算子⋅\cdot⋅为松弛算子而不是矩阵相乘)
l1=Wl2=W⋅l1=W⋅W=W2l3=l2⋅W=W3l4=l2⋅l2=W4… l^{1} = W \\ l^{2} = W \cdot l^{1} = W \cdot W = W^{2} \\ l^{3} = l^{2} \cdot W = W^{3} \\ l^{4} = l^{2} \cdot l^{2} = W^{4} \\ \dots l1=Wl2=W⋅l1=W⋅W=W2l3=l2⋅W=W3l4=l2⋅l2=W4…
因此,我们就可以通过矩阵快速幂的思维改进我们的算法了。
总结
由此可见,线性代数中矩阵乘法与图论中最短路问题有着抽象的关系,给出我最喜欢的名言总结此文:
Abstractness is the price of generality.
更多推荐
所有评论(0)