[MATLAB]最短路徑Floyd演算法

9heyunanquan發表於2021-08-02

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 協議》,轉載必須註明作者和本文連結

相關文章