配流05—增量配流算法

来源:互联网 发布:尤伦斯艺术海报 淘宝 编辑:程序博客网 时间:2024/06/05 06:54

说明:指定两点间的客流需求总量,建立费用函数(阻抗函数),一般情况下费用是流量的函数,就可以运用增量配流法配流,核心还是全有全无算法,只是该方法把流量等分为N份,每次全有全无配流1份,直至流量全部被加载。

例:简单网络如图所示,路径1,2,3的费用分别为c1,c2,c3。网络总流量为200,请用增量配流法进行配流并计算配流后的总费用。

c1=8+0.1*x1;
c2=10+0.25*x2;
c3=15+0.15*x3;

step1:建立费用函数m文件:feiyong.m

function [C,n]=feiyong
syms x1 x2 x3 real;
c1=8+0.1*x1;
c2=10+0.25*x2;
c3=15+0.15*x3;
C=vpa([c1;c2;c3],3);
n=length(C);


step2:主程序m文件:zlpl_feiyong.m

function zlpl_feiyong
syms x1 x2 x3 real
x=[x1;x2;x3];%为了方便使用矩阵进行符号变量替换
clc
disp('========================================================================');
disp('                           《增量配流算法》');
disp('运行环境:MATLAB 8.3.0.532 ');
disp('制 作 人:兰州交通大学   刘志祥');
disp('Q      Q:531548824');
fprintf('说    明:本程序用于求解增量配流问题,只需要输入交通需求量及配流次数并提前编\n制费用函数(feiyong.m)即可计算出配流结果。其中:\n');
fprintf(' T-交通需求\n N-配流次数\nC-费用函数\n x-路径流量\nX0-更新后的流量(初始为0)\nC0-更新后的费用\nX1-配流结果\nC1-配流后费用\n Z-目标函数值(Z1,Z2)\n');
disp('=========================================================================');
disp('*********************************');
T=input('输入交通需求量T:') ;
N=input('输入配流次数N:');
ZL=T/N;
disp('已知费用函数为:')
[C,n]=feiyong;
C
C0=C;
disp('*********************************');
disp('解:先初始化费用,令初始流量')
X0=zeros(n,1)
disp('则初始费用为:')
C0=subs(C,x,X0)
cont=0;


%增量配流过程,为了清晰演示,我们输出每一步配流过程,理解程序后自行消除不必要的输出。
while cont<N
m=min(C0);
for i=1:n
    if m==C0(i,1)
        k=i;
         fprintf('费用最小的是C0(%d),即路径%d,',k,k);
    end
end
cont=cont+1;
fprintf('进行第%d次全有全无配流:\n',cont);
disp('————————————————————————————');
X0(k)=X0(k)+ZL
C0=vpa(subs(C,x,X0),3)
disp('————————————————————————————');
end
fprintf('流量已完全加载,配流结束,结果为:\n');
X1=X0
C1=subs(C,x,X1);
disp('则路径的费用更新为:')
C1=vpa(C1,3)


Xx=[0;0;0];        %积分下界
Xs=X1;             %积分上界
for i=1:n
    JC(i)=int(C(i),Xx(i),Xs(i));  %对每一个路径积分
end
disp('最小费用值为:')
disp('1.积分算法')
Z1=vpa(sum(JC),5)   %路径费用求和
disp('2.乘积算法')
Z2=vpa(C1'*X1,5)



step3 :运行主程序


说明:关于最后的费用计算,一般采用第积分算法(结果比较可靠)。本例题中,将T=200的流量5次分配,每次分配40,最终有路径1上120,路径2和3均为40.最小费用为3000.









0 0
原创粉丝点击