Floyd算法理解及逐步执行分析

一、前言

题主最近在复习《数学分析与建模》课程,在复习图论部分时接触到了Dijkstra算法和Floyd这两个用来求解最短路径的经典算法,在理解Floyd算法时查阅好多其他人的理解,终于大概是弄懂这个算法的工作过程了,把自己的理解写下来作为记录,希望对后来者有所帮助。

二、Floyd算法工作流程分析

和Dijkstra算法不同,Floyd算法用来求解两点间的最短路径问题。它的工作过程如下:

(1)构造初始路径举例矩阵D^{(0)}_{n\times n},路线矩阵P^{(0)}_{n\times n}

这里直接引用https://blog.csdn.net/qq_42518956/article/details/116705635里面的最短路径问题,图片是里面的初始问题

 于是我们首先构造一个5\times5的两两点之间的距离矩阵,d^{(0)}_{ij}表示i点到j点的距离,距离矩阵如下:

tip:由于疏忽,这里我把两点之间当作双向了

D^{(0)}_{5\times5}=\begin{bmatrix} 0&2&4&\infty&10\\ 2&0&3&\infty&7\\ 4&3&0&4&3\\ \infty&\infty&4&0&5\\ 10&7&3&5&0\\ \end{bmatrix}          

初始路径矩阵为:

P^{(0)}_{5\times5}=\begin{bmatrix} 1&2&3&4&5\\ 1&2&3&4&5\\ 1&2&3&4&5\\ 1&2&3&4&5\\ 1&2&3&4&5\\ \end{bmatrix},每行都是从1到最后一个点

(2)Floyd算法的关键过程,从第一个点开始,一直到最后一个点,依次将点插入。插入第k个点时,使d^{(k)}_{ij}=min\left\{d^{(k-1)}_{ij},d^{k-1}_{ik}+d^{k-1}_{kj}\right\},当d^{(k)}_{ij}\neq d^{(k-1)}_{ij}时,对路径中相应位置进行修正,用k代替该处的值。

首先进行第一次插点,计算d1(i,j)=d^{k-1}_{ik}+d^{k-1}_{kj},计算结果如下:

 将d1每一项值与d^{(0)}_{ij}进行比较,选择更小的值作为d^{(1)}_{ij},第一次插点值无变化,原来值均不大于d1中的值,得到D^{(1)}_{5\times5}=\begin{bmatrix} 0&2&4&\infty&10\\ 2&0&3&\infty&7\\ 4&3&0&4&3\\ \infty&\infty&4&0&5\\ 10&7&3&5&0\\ \end{bmatrix}   P^{(1)}_{5\times5}=\begin{bmatrix} 1&2&3&4&5\\ 1&2&3&4&5\\ 1&2&3&4&5\\ 1&2&3&4&5\\ 1&2&3&4&5\\ \end{bmatrix}

进行第二次插点,计算d2(i,j)=d^{(1)}_{i2}+d^{(1)}_{2j},计算结果如下:

 标红部分值更小:

 于是更改距离矩阵D^{(2)}_{5\times5}=\begin{bmatrix} 0&2&4&\infty&9\\ 2&0&3&\infty&7\\ 4&3&0&4&3\\ \infty&\infty&4&0&5\\ 9&7&3&5&0\\ \end{bmatrix},路线矩阵为P^{(2)}_{5\times5}=\begin{bmatrix} 1&2&3&4&2\\ 1&2&3&4&5\\ 1&2&3&4&5\\ 1&2&3&4&5\\ 2&2&3&4&5\\ \end{bmatrix}

进行第三次插点,d3=d^{(2)}_{i3}+d^{(2)}_{3j},所得结果如下

进行值的比较,标红部分更小:

 于是D^{(3)}_{5\times5}=\begin{bmatrix} 0&2&4&8&7\\ 2&0&3&7&6\\ 4&3&0&4&3\\ 8&7&4&0&5\\ 7&6&3&5&0\\ \end{bmatrix},路线矩阵P^{(3)}_{5\times5}=\begin{bmatrix} 1&2&3&3&3\\ 1&2&3&3&3\\ 1&2&3&4&5\\ 3&3&3&4&5\\ 3&3&3&4&5\\ \end{bmatrix}

进行第四次插点,d4=d^{(3)}_{i4}+d^{(3)}_{4j},得到结果如下

 矩阵不发生变化,D^{(4)}_{5\times5}=\begin{bmatrix} 0&2&4&8&7\\ 2&0&3&7&6\\ 4&3&0&4&3\\ 8&7&4&0&5\\ 7&6&3&5&0\\ \end{bmatrix}P^{(4)}_{5\times5}=\begin{bmatrix} 1&2&3&3&3\\ 1&2&3&3&3\\ 1&2&3&4&5\\ 3&3&3&4&5\\ 3&3&3&4&5\\ \end{bmatrix}

进行第五次插点,过程与前面一样,所得矩阵如下:

 数值不是很好,矩阵依然没有变化。

D^{(5)}_{5\times5}=\begin{bmatrix} 0&2&4&8&7\\ 2&0&3&7&6\\ 4&3&0&4&3\\ 8&7&4&0&5\\ 7&6&3&5&0\\ \end{bmatrix}P^{(5)}_{5\times5}=\begin{bmatrix} 1&2&3&3&3\\ 1&2&3&3&3\\ 1&2&3&4&5\\ 3&3&3&4&5\\ 3&3&3&4&5\\ \end{bmatrix}

于是我们就得到的最后的距离矩阵和路线矩阵,比如我们求从1点到4点的最短路径,D^{(5)}_{14}=8,P^{(5)}_{14}=3,表示路径为1->3->4,距离为8.

三、Floyd算法Matlab简单实现过程

主要是一个三次迭代的执行,算法中初始距离矩阵和路线矩阵根据前面的方式生成。

clc,clear;  %清空工作区和命令行窗口
D0=[];  %初始距离矩阵
P=[];   %路径矩阵
d=[];
m=size(D0);
for n=1:m   %m次迭代
    for i=1:m
        for j=1:m
            d(i,j)=D0(i,n)+D0(n,j);
            if(d(i,j)<D0(i,j))  %判断值的大小
                D0(i,j)=d(i,j);
                P(i,j)=n;
            end
        end
    end
end      

四、关于两点之间不止间隔一个点的最短路径

比如从1到6中间间隔点为4,而1和6都不与4直接连通。那么我们就去找1到4和4到6的最短路径,依次分解下去,就能得到最短的路线。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值