一、前言
题主最近在复习《数学分析与建模》课程,在复习图论部分时接触到了Dijkstra算法和Floyd这两个用来求解最短路径的经典算法,在理解Floyd算法时查阅好多其他人的理解,终于大概是弄懂这个算法的工作过程了,把自己的理解写下来作为记录,希望对后来者有所帮助。
二、Floyd算法工作流程分析
和Dijkstra算法不同,Floyd算法用来求解两点间的最短路径问题。它的工作过程如下:
(1)构造初始路径举例矩阵,路线矩阵
这里直接引用https://blog.csdn.net/qq_42518956/article/details/116705635里面的最短路径问题,图片是里面的初始问题
于是我们首先构造一个55的两两点之间的距离矩阵,表示i点到j点的距离,距离矩阵如下:
tip:由于疏忽,这里我把两点之间当作双向了
初始路径矩阵为:
=,每行都是从1到最后一个点
(2)Floyd算法的关键过程,从第一个点开始,一直到最后一个点,依次将点插入。插入第k个点时,使,当时,对路径中相应位置进行修正,用k代替该处的值。
首先进行第一次插点,计算d1(i,j)=,计算结果如下:
将d1每一项值与进行比较,选择更小的值作为,第一次插点值无变化,原来值均不大于d1中的值,得到 =
进行第二次插点,计算d2(i,j)=,计算结果如下:
标红部分值更小:
于是更改距离矩阵,路线矩阵为=
进行第三次插点,,所得结果如下
进行值的比较,标红部分更小:
于是,路线矩阵
进行第四次插点,,得到结果如下
矩阵不发生变化,,
进行第五次插点,过程与前面一样,所得矩阵如下:
数值不是很好,矩阵依然没有变化。
,
于是我们就得到的最后的距离矩阵和路线矩阵,比如我们求从1点到4点的最短路径,,表示路径为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的最短路径,依次分解下去,就能得到最短的路线。