版权声明:未经许可,请勿转载 https://blog.csdn.net/glpaichiyu/article/details/82811222
[数学建模]数学建模算法和模型(B站视频)(五)
图论模型-Floyd算法
算法简介
Floyd算法的作用是求出一个图之间任意两点的最短距离,被认为是一个经典的动态规划。
算法原理
从任意节点i到任意节点j的最短路径不外乎2种可能——要么是直接从i到j,要么是从i经过若干个节点k到j。
所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离(这里用邻接矩阵表示图):
对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,如果成立——证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。
例题
代码
tulun2.m
a= [ 0,50,inf,40,25,10;
50,0,15,20,inf,25;
inf,15,0,10,20,inf;
40,20,10,0,10,25;
25,inf,20,10,0,55;
10,25,inf,25,55,0];
[D, path]=floyd(a)
floyd.m
function [D,path,min1,path1]=floyd(a,start,terminal)
D=a;n=size(D,1);path=zeros(n,n);
for i=1:n
for j=1:n
if D(i,j)~=inf
path(i,j)=j;
end,
end,
end
for k=1:n
for i=1:n
for j=1:n
if D(i,k)+D(k,j)<D(i,j)
D(i,j)=D(i,k)+D(k,j);
path(i,j)=path(i,k);
end,
end,
end,
end
if nargin==3
min1=D(start,terminal);
m(1)=start;
i=1;
path1=[ ];
while path(m(i),terminal)~=terminal
k=i+1;
m(k)=path(m(i),terminal);
i=i+1;
end
m(i+1)=terminal;
path1=m;
end
输出结果及含义
上例求证
同样是对于Dijkstra算法中的实例,我们通过Floyd算法来解。构造脚本如下:
weight = [ 0 2 8 1 inf inf inf inf inf inf inf;
2 0 6 inf 1 inf inf inf inf inf inf
8 6 0 7 5 1 2 inf inf inf inf;
1 inf 7 0 inf inf 9 inf inf inf inf;
inf 1 5 inf 0 3 inf 2 9 inf inf;
inf inf 1 inf 3 0 4 inf 6 inf inf;
inf inf 2 9 inf 4 0 inf 3 1 inf;
inf inf inf inf 2 inf inf 0 7 inf 9;
inf inf inf inf 9 6 3 7 0 1 2;
inf inf inf inf inf inf 1 inf 1 0 4;
inf inf inf inf inf inf inf 9 2 4 0;];
[D, path] = floyd(weight)
运行后得到:
D =
0 8 11 16 17 16 7 8 17 19 21
31 0 3 8 9 11 8 23 14 16 18
28 36 0 5 6 8 5 20 11 13 15
23 31 7 0 1 3 12 15 6 8 10
22 30 6 11 0 2 11 14 5 7 9
20 28 8 13 2 0 9 12 3 5 7
29 37 17 22 11 9 0 21 12 14 16
8 16 19 24 16 18 15 0 9 11 13
17 25 13 18 7 9 18 9 0 2 4
19 27 15 20 9 11 20 11 2 0 2
32 40 16 21 10 12 21 24 15 17 0
path =
1 2 2 2 2 7 7 8 8 8 8
3 2 3 3 3 3 3 3 3 3 3
5 5 3 4 5 5 7 5 5 5 5
5 5 5 4 5 5 5 5 5 5 5
6 6 3 3 5 6 3 6 6 6 6
9 9 5 5 5 6 7 9 9 9 9
6 6 6 6 6 6 7 6 6 6 6
1 1 1 1 9 9 1 8 9 9 9
8 8 5 5 5 5 5 8 9 10 10
9 9 9 9 9 9 9 9 9 10 11
对于 D 矩阵,比如实例要求我们得到 1 到 11 的最短路径,那么我们读取 D 矩阵中的元素a1-11=13a1-11=13得到最短距离为13。
对于 path 矩阵,先读取元素b1-11=8,这代表需要途径顶点 8 。接下来读取元素b8-11=9,这代表接下来要途径顶点 9 ……最后读取元素b10-11=11,结束操作,得到路径:1→8→9→10→11
以上两结果与通过Dijkstra算法得到的结果一致。这就体现双算法处理问题的优越性:如果两算法得到结果一致,则可以相互印证;如果结果不一致,则可以及时发现问题以查找原因。