Matlab 圖論最短路問題模型代碼


最短路問題的基本內容

最短路問題研究的是,在一個點與點之間連接形成的網絡圖中,對應路徑賦予一定的權重(可以理解為兩點之間的距離),計算任意兩點之間如何和走,路徑最短的問題。在這里的距離可以理解成各種兩點之間某種任務的開銷。

image

網絡圖

模型調用

解決最短路問題,一般可采取 dijkstra 或者floyd 這兩種模型,模型調用形式如下:

[mydist,mypath]=mydijkstra(a,sb,db) % dijkstra模型
[mydist,mypath]=myfloyd(a,sb,db) % floyd模型

其中,

  • a 為鄰接矩陣
  • sb 為起點標號
  • db 為終點標號
  • mydist 為最短路徑長度
  • mypath 為最短路徑

模型完整代碼

Dijkstra 模型代碼

function [mydistance,mypath]=mydijkstra(a,sb,db);
% 輸入:a—鄰接矩陣,a(i,j)是指i到j之間的距離,可以是有向的
% sb—起點的標號, db—終點的標號
% 輸出:mydistance—最短路的距離, mypath—最短路的路徑
n=size(a,1); visited(1:n) = 0;
distance(1:n) = inf; distance(sb) = 0; %起點到各頂點距離的初始化
visited(sb)=1; u=sb;  %u為最新的P標號頂點
parent(1:n) = 0; %前驅頂點的初始化
for i = 1: n-1
     id=find(visited==0); %查找未標號的頂點
     for v = id           
         if  a(u, v) + distance(u) < distance(v)
             distance(v) = distance(u) + a(u, v);  %修改標號值 
             parent(v) = u;                                    
         end            
     end
     temp=distance;
     temp(visited==1)=inf;  %已標號點的距離換成無窮
     [t, u] = min(temp);  %找標號值最小的頂點 
     visited(u) = 1;       %標記已經標號的頂點
 end
mypath = [];
if parent(db) ~= 0   %如果存在路!
    t = db; mypath = [db];
    while t ~= sb
        p = parent(t);
        mypath = [p mypath];
        t = p;      
    end
end
mydistance = distance(db);

Floyd 模型代碼

function [dist,mypath]=myfloyd(a,sb,db);
% 輸入:a—鄰接矩陣,元素(aij)是頂點i到j之間的直達距離,可以是有向的
% sb—起點的標號;db—終點的標號
% 輸出:dist—最短路的距離;% mypath—最短路的路徑
n=size(a,1); path=zeros(n);
for k=1:n
    for i=1:n
        for j=1:n
            if a(i,j)>a(i,k)+a(k,j)
                a(i,j)=a(i,k)+a(k,j);
                path(i,j)=k;
            end
        end
    end
end
dist=a(sb,db);
parent=path(sb,:); %從起點sb到終點db的最短路上各頂點的前驅頂點
parent(parent==0)=sb; %path中的分量為0,表示該頂點的前驅是起點
mypath=db; t=db;
while t~=sb
        p=parent(t); mypath=[p,mypath];
        t=p;
end

案例演示

對於上面的網絡圖,求解從 A 到 D 的最短路徑。

image

整理鄰接矩陣

首先整理出點與點之間連接關系,得出鄰接矩陣。

假設點的排序為:

點位 A B1 B2 C1 C2 C3 D
序號 1 2 3 4 5 6 7

整理出 7*7 鄰接矩陣:

image

完整代碼

% 構造鄰接矩陣
a = zeros(7);
a(1,2) = 2; a(1,3) = 4;
a(2,4) = 3; a(2,5) = 3; a(2,6) = 1;
a(3,4) = 2; a(3,5) = 3; a(3,6) = 1;
a(4,7) = 1;
a(5,7) = 3;
a(6,7) = 4;
a = a + a';
a(a==0) = inf; % 零元素換成inf
a(eye(7,7)==1)=0; % 對角線換成 0 

[mydist1,mypath1]=mydijkstra(a,1,7) % dijkstra模型求解
[mydist2,mypath2]=myfloyd(a,1,7) % floyd 模型求解

運行結果

mydist1 =

     6


mypath1 =

     1     2     4     7


mydist2 =

     6


mypath2 =

     1     2     4     7

將序號還原成點位,即最短路徑為 A → B1 → C1 → D


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM