1. 程式人生 > >【最短路】求最大可靠路的算法及其matlab實現

【最短路】求最大可靠路的算法及其matlab實現

war for 文件 輸出 jvm spa zeros 頂點 代碼

內容來源:《圖論算法及其matlab實現》(北京航空航天出版社)

P34

【算法用途】

求圖中兩頂點間的最大可靠路。

技術分享

代碼如下:

 1 %最大可靠路的算法
 2 %調用Floyd文件
 3 function [P p f]=p_pathf(A)
 4 %f=0表示找到路,否則f=1
 5 %初始化
 6 
 7 [m n]=size(A);
 8 f=0;
 9 B=zeros(m,n);
10 %對原矩陣進行轉換
11 for i=1:m
12     for j=1:n
13         if A(i,j)>0
&A(i,j)<1 14 B(i,j)=-log(A(i,j)); 15 elseif A(i,j)==0 16 B(i,j)=inf; 17 end 18 end 19 end 20 %利用Warshall-Floyd算法求最短路 21 22 [P d]=Floyd(B); 23 if d<inf 24 p=1; 25 for i=1:(length(P)-1) 26 p=p*A(P(i),P(i+1));%計算最短路的完好概率 27 end 28
p; 29 else 30 p=0; 31 P=0; 32 f=1; 33 end 34

其中,函數Floyd代碼如下:

 1 function [P,u ] = Floyd(W)
 2 %W表示權值矩陣
 3 %P表示最短路徑
 4 %u表示最短路的權和
 5 n=length(W);
 6 U=W;
 7 m=1;
 8 
 9 while m<=n   %判斷是否滿足停止條件
10     for i=1:n
11         for j=1:n
12             if U(i,j)>U(i,m)+U(m,j)
13 U(i,j)=U(i,m)+U(m,j); %更新dij 14 end 15 end 16 end 17 m=m+1; 18 end 19 u=U(1,n); 20 21 %輸出最短路的頂點 22 P1=zeros(1,n); 23 k=1; 24 P1(k)=n; 25 V=ones(1,n)*inf; 26 kk=n; 27 while kk~=1 28 for i=1:n 29 V(1,i)=U(1,kk)-W(i,kk); 30 if V(1,i)==U(1,i) 31 P1(k+1)=i; 32 kk=i; 33 k=k+1; 34 end 35 end 36 end 37 k=1; 38 wrow=find(P1~=0); 39 for j=length(wrow):(-1):1 40 P(k)=P1(wrow(j)); 41 k=k+1; 42 end 43 44 end

檢驗一下:

A=[1 0.8 0 0 0.2 ;
    0.4 1 0.7 0 0;
    0 0.8 1 0.5 0;
    0.6 0 0 1 0.4;
    0.3 0 0.7 0.5 1];

[P p f]=p_pathf(A)

運行結果:

P =

     1     5


p =

    0.2000


f =

     0

技術分享

【最短路】求最大可靠路的算法及其matlab實現