配流08—基于有效路径的Dial算法改进

来源:互联网 发布:拍拍网和淘宝网哪个好 编辑:程序博客网 时间:2024/04/29 06:07

《基于有效路径的Dial算法改进》

[1]刘志祥,陈明明,顾金伟. 基于有效路径的Dial算法改进[J]. 徐州工程学院学报(自然科学版),2017,(01):49-53.

说明:此文为《基于有效路径的Dial算法改进》的程序实现过程,参照原文请按以下连接下载。

下载地址:点击此处


1 经典Dial算法程序及算例

fprintf('                                     《经典Dial算法》\n');disp('=========================================================================================');%% 数据输入T=[   0    20    18    19   Inf    Inf     0     5   Inf    20    Inf   Inf     0     5    20    Inf   Inf   Inf     0    27    Inf   Inf   Inf   Inf     0];Q=1;thita=1;r=1;s=5;n=size(T,1);fprintf('起点: r=%2d\n终点: s=%2d\n',r,s);%% 初始化L=zeros(n,n);W=zeros(n,n);X=zeros(n,n);%% 求最短距离矩阵disp('step1->:求最短距离,其中');disp('------------------------------------------------------------------------------------------');disp('   R—起点r到其他点的最短距离');disp('   S—其他点到终点s的最短距离');for i=1:n    for j=1:n        if T(i,j)==inf            T(i,j)=0;        end    endendT=sparse(T);Tmin=graphallshortestpaths(T);[dist,path]=graphshortestpath(T,r,s);disp('------------------------------------------------------------------------------------------');R=Tmin(r,:)S=Tmin(:,s)'%% 求上下游节点矩阵for i=1:n    for j=1:n        if T(i,j)~=0&&T(i,j)~=inf            down(i,j)=1;            up(j,i)=1;        else            down(i,j)=0;            up(j,i)=0;        end    endend%% 计算边权disp('step2->:计算边权似然值');disp('------------------------------------------------------------------------------------------');for i=1:n    for j=1:n        if down(i,j)~=0            if R(i)<R(j)&&S(i)>S(j)                P=1;            else                P=0;            end            L(i,j)=P*exp(thita*(R(j)-R(i)-T(i,j)));        end    endendL%% 计算路权disp('step3->:计算路权');disp('------------------------------------------------------------------------------------------');for i=1:n    for j=1:n        if R(i)<R(j)&&S(i)>S(j)            if down(i,j)~=0                if i==r                    W(i,j)=L(i,j);                else                    W(i,j)=L(i,j)*(up(i,:)*W(:,i));                end            end        end    endendW%% 配流disp('step4->:配流');disp('------------------------------------------------------------------------------------------');for i=n:-1:1    for j=n:-1:1        if R(i)<R(j)&&S(i)>S(j)            if down(i,j)~=0                if j==s                    X(i,j)=Q*W(i,j)/((up(j,:)*W(:,j)));                else                    X(i,j)=X(j,:)*down(j,:)'*W(i,j)/(up(j,:)*W(:,j));                end            end        end    endendXdisp('==========================================================================================');


2 基于有效路径改进的Dial算法程序及算例

fprintf('                                     《改进Dial算法》\n');disp('========================================================================================');T =[ 0    20    18    19   Inf   Inf     0     5   Inf    20   Inf   Inf     0     5    20   Inf   Inf   Inf     0    27   Inf   Inf   Inf   Inf     0];n=size(T,1);Q=1;thita=1;r=1;s=5;H=0.2;% H=input('容忍系数=');fprintf('起点: r=%2d\n终点: s=%2d\n容忍系数: H=%.2f\n',r,s,H);%% 初始化L=zeros(n,n);W=zeros(n,n);X=zeros(n,n);%% 求最短距离矩阵及最短路径disp('step1->:求最短距离,其中');disp('---------------------------------------------------------------------------------------');disp('   R—起点r到其他点的最短距离');disp('   S—其他点到终点s的最短距离');T=sparse(T);Tmin=graphallshortestpaths(T);[dist,path]=graphshortestpath(T,r,s);disp('---------------------------------------------------------------------------------------');R=Tmin(r,:)S=Tmin(:,s)'disp('---------------------------------------------------------------------------------------');disp('最短路径:'); pathdisp('最短路距离:');dist%% 找上游节点和下游节点for i=1:n    for j=1:n        if T(i,j)>0 && T(i,j)~=Inf            down(i,j)=1;            up(j,i)=1;        else            down(i,j)=0;            up(j,i)=0;        end    endend%% 计算边权disp('step2->:计算边权似然值');disp('---------------------------------------------------------------------------------------');for i=1:n    for j=1:n        if down(i,j)            if R(i)+T(i,j)+S(j)<=(1+H)*Tmin(r,s)                P=1;            else                P=0;            end            L(i,j)=P*exp(thita*(R(j)-R(i)-T(i,j)));        end    endendL%% 计算路权disp('step3->:计算路权');disp('---------------------------------------------------------------------------------------');for i=1:n    for j=1:n        if down(i,j)~=0            if R(i)+T(i,j)+S(j)<=(1+H)*Tmin(r,s)                if i==r                    W(i,j)=L(i,j);                else                    W(i,j)=L(i,j)*(up(i,:)*W(:,i));                end            end        end    endendW%% 配流disp('step4->:配流');disp('----------------------------------------------------------------------------------------');for i=n:-1:1    for j=n:-1:1        if down(i,j)==1            if R(i)+T(i,j)+S(j)<=(1+H)*Tmin(r,s)                if j==s                    X(i,j)=Q*W(i,j)/((up(j,:)*W(:,j)));                else                    X(i,j)=X(j,:)*down(j,:)'*W(i,j)/(up(j,:)*W(:,j));                end            end        end    endendXdisp('========================================================================================');

3 算例运行结果

3.1 经典算法结果

>> dialsuanfa_jingdian                                     《经典Dial算法》=========================================================================================起点: r= 1终点: s= 5step1->:求最短距离,其中------------------------------------------------------------------------------------------   R—起点r到其他点的最短距离   S—其他点到终点s的最短距离------------------------------------------------------------------------------------------R =     0    20    18    19    38S =    38    20    20    27     0step2->:计算边权似然值------------------------------------------------------------------------------------------L =         0    1.0000    1.0000    1.0000         0         0         0         0         0    0.1353         0         0         0         0    1.0000         0         0         0         0    0.0003         0         0         0         0         0step3->:计算路权------------------------------------------------------------------------------------------W =         0    1.0000    1.0000    1.0000         0         0         0         0         0    0.1353         0         0         0         0    1.0000         0         0         0         0    0.0003         0         0         0         0         0step4->:配流------------------------------------------------------------------------------------------X =         0   71.5006  528.3221    0.1772         0         0         0         0         0   71.5006         0         0         0         0  528.3221         0         0         0         0    0.1772         0         0         0         0         0==========================================================================================

3.2 改进算法结果

>> dialsuanfa_gaijin                                     《改进Dial算法》========================================================================================起点: r= 1终点: s= 5容忍系数: H=0.20step1->:求最短距离,其中---------------------------------------------------------------------------------------   R—起点r到其他点的最短距离   S—其他点到终点s的最短距离---------------------------------------------------------------------------------------R =     0    20    18    19    38S =    38    20    20    27     0---------------------------------------------------------------------------------------最短路径:path =     1     3     5最短路距离:dist =    38step2->:计算边权似然值---------------------------------------------------------------------------------------L =         0    1.0000    1.0000         0         0         0         0    0.0009         0    0.1353         0         0         0         0    1.0000         0         0         0         0         0         0         0         0         0         0step3->:计算路权---------------------------------------------------------------------------------------W =         0    1.0000    1.0000         0         0         0         0    0.0009         0    0.1353         0         0         0         0    1.0009         0         0         0         0         0         0         0         0         0         0step4->:配流----------------------------------------------------------------------------------------X =         0    0.1199    0.8801         0         0         0         0    0.0008         0    0.1191         0         0         0         0    0.8809         0         0         0         0         0         0         0         0         0         0========================================================================================

4.结论

改进DIAL算法避免了经典Dial算法中,长路径分配流量,短路径不分配流量的错误,更加科学有效。


3 0