【最短路】求最大可靠路的算法及其matlab實現
阿新 • • 發佈:2017-09-10
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 28p; 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實現