一、问题描述
在道路网中,已知OD需求,路段走行时间,路段能力和路径路段关系,求流量的均衡分配结果。
二、算法描述
此处只给出大的步骤,精确的算法描述见第三节——算法程序。
step1:给定路网数据,OD需求,路段能力
step2:自动求出路径和路段数量,根据路段数量定义路段名,给定初始数据
step3:构造阻抗函数并求出初始阻抗,此处用BPR函数
step4:全有全无配流
step5:数据更新
step6:求目标函数值
step7:输出计算结果
三、算法程序
clear clc disp('========================================================================'); 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 real for i=1:numx syms x(i) real; end cont=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)); %对每一个路径积分 end Z=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
3.数据整理======================================================================== 《基于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 *************************************************************************
路段流量表 路段 a1 a2 a3 a4 a5 流量 1347.7 1652.3 304.8 1042.9 1957.1
五、结论及展望
基于BPR函数的FW算法是科学有效的配流算法,可以看到最终3条路径的阻抗基本相等,这符合均衡配流的预期结果。
六、代码下载
代码下载地址:待更新...