1. 程式人生 > >圖論09—MATLAB自帶最短路函式

圖論09—MATLAB自帶最短路函式

一、寫出稀疏矩陣

  • 方法一    a.起點為行,終點為列,寫出行向量R和列向量C
                        b.對應於起點和終點寫出邊權W
  • 方法二   a.寫出權值矩陣或已知權值矩陣W
                       b.用稀疏矩陣轉換函式sparse轉換為含inf項的稀疏矩陣G

                       c.當G(i,j)==inf時刪除,即構成最終的稀疏矩陣

二、最短路演算法命令格式

view(biograph(G));

graphallshortestpath(G);

[dist path]=graphshortest(G,s,t);

[M,F,C]=graphmaxflow(G,s,t);

例:

(1)構造下圖的稀疏矩陣(注意方向)。

(2)使用MATLAB依據稀疏矩陣畫出該圖的結構圖。

(3)求出各點之間的最短距離。

(4)求出點v1到點v8的最短距離和路徑,並在拓撲圖中用紅色標記,路徑加粗顯示。

(5)若用邊權代表通過能力(假設),求出最大流的分配方案。


解:(1)稀疏矩陣

方法一:

>> R=[1 1 2 4 1 2 3 3 5 7 3 4 5 6 7];
>> C=[2 3 3 3 4 5 5 6 6 6 7 7 8 8 8];
>>W=[2 8 6 7 1 1 5 1 3 4 2 9 8 6 3];
>> G1=sparse(R,C,W)

G1 =


   (1,2)        2
   (1,3)        8
   (2,3)        6
   (4,3)        7
   (1,4)        1
   (2,5)        1
   (3,5)        5
   (3,6)        1
   (5,6)        3
   (7,6)        4
   (3,7)        2
   (4,7)        9
   (5,8)        8
   (6,8)        6
   (7,8)        3

即該圖的稀疏矩陣為G1.

方法二:

>> W =[

     0     2     8     1   Inf   Inf   Inf   Inf
   Inf     0     6   Inf     1   Inf   Inf   Inf
   Inf   Inf     0   Inf     5     1     2   Inf
   Inf   Inf     7     0   Inf   Inf     9   Inf
   Inf   Inf   Inf   Inf     0     3   Inf     8
   Inf   Inf   Inf   Inf   Inf     0   Inf     6
   Inf   Inf   Inf   Inf   Inf     4     0     3
   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf];

>> G=sparse(W);

>> for i=1:length(W)
for j=1:length(W)
if G(i,j)==inf
G(i,j)=0;
end
end
end

>> G2=G


G2 =


   (1,2)        2
   (1,3)        8
   (2,3)        6
   (4,3)        7
   (1,4)        1
   (2,5)        1
   (3,5)        5
   (3,6)        1
   (5,6)        3
   (7,6)        4
   (3,7)        2
   (4,7)        9
   (5,8)        8
   (6,8)        6
   (7,8)        3

即稀疏矩陣為G2,顯然G1=G2.

(2)結構圖

>> view(biograph(G2,[],'ShowW','ON'))


(3)任意點之間的最短距離

>> graphallshortestpaths(G2)

ans =

     0     2     8     1     3     6    10    11
   Inf     0     6   Inf     1     4     8     9
   Inf   Inf     0   Inf     5     1     2     5
   Inf   Inf     7     0    12     8     9    12
   Inf   Inf   Inf   Inf     0     3   Inf     8
   Inf   Inf   Inf   Inf   Inf     0   Inf     6
   Inf   Inf   Inf   Inf   Inf     4     0     3
   Inf   Inf   Inf   Inf   Inf   Inf   Inf     0

說明:第1行為點V1到其他點的距離,到v2為2,v3為8……v8為11。第i行為vi到其他點的距離向量。

(4)求v1到v8的最短距離和路徑並畫圖顯示。

[dist path]=graphshortestpath(G2,1,8)

dist =
    11

path =
     1     2     5     8

即最短距離為11,路徑為1->2->5->8.

>> h=view(biograph(G2,[],'showW','on'));

>> edges=getedgesbynodeid(h,get(h.Nodes(path),'ID'));

>> set(h.Nodes(path),'color',[1 0 0])

>> set(edges,'LineColor',[1 0 0])
>> set(edges,'LineWidth',1.5)

%則圖片更改為:


(5)最大流

>> [M,F,C]=graphmaxflow(G2,1,8)

M =

    10

F =

   (1,2)        2
   (1,3)        7
   (2,3)        1
   (1,4)        1
   (2,5)        1
   (3,5)        5
   (3,6)        1
   (3,7)        2
   (4,7)        1
   (5,8)        6
   (6,8)        1
   (7,8)        3

C =

     1     1     1     0     0     0     0     0

>> m=view(biograph(F,[],'showW','ON'))


即最大流為10,方案如上圖。最小割為1 2 3,如下圖.