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