[MATLAB]最短路径Floyd算法

1.Floyed算法
1.1适用范围
∙ \bullet∙ 求每队顶点的最短路径

∙ \bullet∙ 有向图、无向图和混合图

1.2算法思想
直接在图的带权邻接矩阵中用插入顶点的方法依次递推地构造出n个矩阵D(1),D(2)…D(n)(每次加入一个点然后更新最短路径矩阵D),D(n)是图的最短距离矩阵,同时引入一个后继点矩阵path记录两点间的最短路径。

1.3实例

对于如下无向图:

【MATLAB】最短路径Floyd算法

我们可以得如下带权邻接矩阵:

【MATLAB】最短路径Floyd算法

2.代码

2.1floyd函数

function [D,path,min1,path1]=floyd(a,start,terminal)
%D(i,j)表示i到j的最短路径,path(i,j)表示i到j之间的最短路径上顶点i的后继点。
%min1返回start和terminal之间的最短距离,path1返回start和terminal之间的最短路径
%a为带权邻接矩阵,start、terminal分别是起始点和终止点

D=a;n=size(D,1);path=zeros(n,n);
%n为顶点个数,生成D、path矩阵

%遍历一遍矩阵,初始化path矩阵,先将可以直接相连的点的path进行补充
for i=1:n
    for j=1:n
        if D(i,j)~=inf
            path(i,j)=j;
        end  
    end
end

%三重遍历,查找是否有中继点可以使得路径缩短,若有则更新D、path矩阵
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
%这里演示了每一步的调整过程
k,D,path
end

%判断输出参数是否为三个
if nargin==3
    min1=D(start,terminal);
    m(1)=start;
    i=1;
    path1=[ ];   
    %根据path路径一步一步跳转找到具体路径,返回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   

————————————————
原文链接:www.9he.com

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!