配流07—基于BPR函数的Frank Wolfe算法

来源:互联网 发布:linux上最好的输入法 编辑:程序博客网 时间:2024/06/08 18:38

一、问题描述

在道路网中,已知OD需求,路段走行时间,路段能力和路径路段关系,求流量的均衡分配结果。


二、算法描述

此处只给出大的步骤,精确的算法描述见第三节——算法程序。

step1:给定路网数据,OD需求,路段能力

step2:自动求出路径和路段数量,根据路段数量定义路段名,给定初始数据

step3:构造阻抗函数并求出初始阻抗,此处用BPR函数

step4:全有全无配流

step5:数据更新

step6:求目标函数值

step7:输出计算结果


三、算法程序


clearclcdisp('========================================================================');disp('                      《基于BPR函数的Frank Wolfe算法》');disp('运行环境:MATLAB 8.3.0.532 ');disp('制 作 人:兰州交通大学   刘志祥');disp('Q      Q:531548824');disp('=========================================================================');%% 1 给定路网数据,OD需求,路段能力%算例1%==========================================================================% Q=1000;% W=[5 6 6 8 3];% Cmax=[600 500 600 500 700];% Mxf=[1 0 0 1 0;1 0 1 0 1;0 1 0 0 1];%==========================================================================%算例2%==========================================================================Q=3000;                                 %OD需求W=[5 9 6 7 1];                          %路段初始阻抗Cmax=700*ones(1,5);                     %路段能力Mxf =[1 0 0 1 0;0 1 0 0 1;1 0 1 0 1];   %路径路段0-1关系%==========================================================================%% 2 自动求出路径和路段数量,根据路段数量定义路段名,给定初始数据%==========================================================================numf=size(Mxf,1);numx=size(Mxf,2);syms lambda realfor i=1:numx    syms x(i) real;endcont=0;e=inf;x=x(1:numx);X0=zeros(1,numx);t=zeros(1,numx);%==========================================================================%% 3 构造阻抗函数并求出初始阻抗,此处用BPR函数%==========================================================================t=W.*(1+0.15*(x./Cmax).^4);            %路段走行时间函数tt=t;t=W.*(1+0.15*(X0./Cmax).^4);Ckrs=(Mxf*t')';                        %路径的走行时间初值%==========================================================================%% 4 全有全无配流%==========================================================================[Min,index]=min(Ckrs);X1=Mxf(index,:).*Q;                    %全有全无法为最短路径上的路段分配流量%==========================================================================%% 5 数据更新%==========================================================================while e>1e-3                           %精度判断    cont=cont+1;                       %迭代次数更新    t=(W).*(1+0.15*(X1./Cmax).^4);     %路段时间跟新    Ckrs=(Mxf*t')';                    %路径时间更新    [Min,index]=min(Ckrs);    Y1=Mxf(index,:).*Q;                %全有全无法求辅助流量    S=Y1-X1;                           %搜索方向    X2=X1+lambda*S;                    %先将X2用X1和lambda进行表达    t=(W).*(1+0.15*(X2./Cmax).^4);     %含lambda的阻抗表达    f=sum(S.*t,2);                     %2表示按行求和    lambda1=double(solve(f));          %求解方程,确定步长。    k=length(lambda1);                 %如步长lambda1的解不唯一,取实数,且大于0小于1;    for m=1:k        if lambda1(m,1)>=0&&lambda1(m,1)<=1            lambda2=lambda1(m,1);        end    end    X2=X1+lambda2*S;                   %得到下一步的流量值,且进行下一次迭代    e=sqrt(sum((X2-X1).^2))/sum(X1);   %精度计算    X1=X2;                             %流量更新end%==========================================================================%% 6 求目标函数值%==========================================================================Xx=zeros(numx,1);                      %积分下界Xn=X1;                                 %积分上界Zf=zeros(numx,1);                      %目标值元素初始化for i=1:numx    Zf(i)=int(tt(i),Xx(i),Xn(i));      %对每一个路径积分endZ=sum(Zf);                             %总目标=各路径阻抗求和%==========================================================================%% 7 输出计算结果%==========================================================================disp('*************************************************************************')disp(['     迭代次数:',num2str(cont)]);disp(['     误 差 值:',num2str(e)]);disp(['     配流结果:',num2str(Xn)]);disp(['     路径阻抗:',num2str(Ckrs)]);disp(['     目 标 值:',num2str(Z)]);disp('*************************************************************************')%==========================================================================

四、算例及运行结果

1.算例

路网如图1,已知起点v1,终点v4,路段编号如图1所示,路段初始阻抗为W=[5 9 6 7 1],对应的路段能力为Cmax=[500 700 800 600 700],求流量分配结果。


2.运行结果

>> Frank_wolfe_BPR_jingdian

========================================================================                      《基于BPR函数的Frank Wolfe算法》运行环境:MATLAB 8.3.0.532 制 作 人:兰州交通大学   刘志祥Q      Q:531548824=========================================================================*************************************************************************     迭代次数:13     误 差 值:0.00083827     配流结果:1347.6659      1652.3341      304.76636      1042.8996      1957.1004     路径阻抗:61.5966      60.7377      61.0709     目 标 值:62802.3986*************************************************************************
3.数据整理

路段流量表路段a1a2a3a4a5流量1347.71652.3304.81042.91957.1

五、结论及展望

基于BPR函数的FW算法是科学有效的配流算法,可以看到最终3条路径的阻抗基本相等,这符合均衡配流的预期结果。


六、代码下载

代码下载地址:待更新...



1 0
原创粉丝点击