学校留了数模作业,让我们用Floyd算法求解最短路径问题,算法本身很简单,但是这个输出路径我看了很多文章都没有好好具体的写出来怎么输出,无非就是给一个路径矩阵放那里了。这里放一个我自己写的算法,能帮助到别人也算好,帮助不到的话也算给自己留个存档。
还有一点是,我是数学专业的学生,所以写代码水平极烂,基本就是只会用for循环,我会把思路尽量写出来,大家看懂就好,我的又长又烂的代码仅供参考。
记N为点的个数,A、B均为NxN的矩阵,其中A为距离矩阵,A(i,j)的值为i城市单向到j城市的距离。
B=zeros(N,N);
for i=1:N
B(:,i)=i;
end
B就是存储路径的矩阵,这里对其进行初始化。
for n=1:N
for i=1:N
for j=1:N
if (A(i,n)+A(n,j))<A(i,j)
A(i,j)=A(i,n)+A(n,j);
B(i,j)= n;
end
end
end
end
Floyd算法最经典的三段循环,这里n不能动,i和j可以互换。B(i,j)记录的是如果进行替换,这步是在哪里做的。比如若我们在n=3时计算出A(1,3)+A(2,3)<A(1,2),那么就记B(1,2)=3。也可以这么理解:对于某一步循环来说,B(i,j)=m指当前我计算出的从i走到j,是通过m这个点走的。
一定要注意的是,这样记录的路径矩阵是不能逆推的!!它会覆盖之前计算过的路径:我们先假设某一条全局最优路径是1->3->2->4;通过代码可以看出,n=2的循环,B(1,4)=2;n=3的循环,B(1,4)=3;最后得到B(1,4)=3。如果直接认为3就是4的前一步这样逆推,我们得到1->3->4这样的路径,但是这显然是错误的,因为3->4还有更短的3->2->4。
所以我的思路是:既然我从B(1,4)=3知