【最短路】求最大可靠路的算法及其matlab实现

内容来源:《图论算法及其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

 

 

posted @ 2017-09-10 15:47  这是小魔仙的账户  阅读(466)  评论(0编辑  收藏  举报