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

《基于有效路径的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
    end
end
T=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
    end
end
%% 计算边权
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
    end
end
L
%% 计算路权
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
    end
end
W
%% 配流
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
    end
end
X
disp('==========================================================================================');


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('最短路径:'); path
disp('最短路距离:');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
    end
end
%% 计算边权
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
    end
end
L
%% 计算路权
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
    end
end
W
%% 配流
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
    end
end
X
disp('========================================================================================');

3 算例运行结果

3.1 经典算法结果

>> dialsuanfa_jingdian
                                     《经典Dial算法》
=========================================================================================
起点: r= 1
终点: s= 5
step1->:求最短距离,其中
------------------------------------------------------------------------------------------
   R—起点r到其他点的最短距离
   S—其他点到终点s的最短距离
------------------------------------------------------------------------------------------

R =

     0    20    18    19    38


S =

    38    20    20    27     0

step2->:计算边权似然值
------------------------------------------------------------------------------------------

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         0

step3->:计算路权
------------------------------------------------------------------------------------------

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         0

step4->:配流
------------------------------------------------------------------------------------------

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.20
step1->:求最短距离,其中
---------------------------------------------------------------------------------------
   R—起点r到其他点的最短距离
   S—其他点到终点s的最短距离
---------------------------------------------------------------------------------------

R =

     0    20    18    19    38


S =

    38    20    20    27     0

---------------------------------------------------------------------------------------
最短路径:

path =

     1     3     5

最短路距离:

dist =

    38

step2->:计算边权似然值
---------------------------------------------------------------------------------------

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         0

step3->:计算路权
---------------------------------------------------------------------------------------

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         0

step4->:配流
----------------------------------------------------------------------------------------

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算法中,长路径分配流量,短路径不分配流量的错误,更加科学有效。


猜你喜欢

转载自blog.csdn.net/lzx19901012/article/details/69939309