配流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
- 配流07—基于BPR函数的Frank Wolfe算法
- Frank-wolfe算法多OD对matlab实现
- Frank-Wolfe方法
- 线性约束最优化问题的Frank-Wolfe方法
- 数值优化学习——wolfe条件里的线搜索算法
- 数值优化学习——wolfe条件里的线搜索算法
- BPR的真相
- BPR
- 重要BPR——mark
- Git repository of Frank Liu--Frank Liu的Git仓库
- wolfe 算法_最优化课课后作业笔记
- BPR [Bayesian Personalized Ranking] 算法详解及应用实践
- ERP+BPR 是企业管理者探寻的法宝吗(转)
- 融合用户或产品属性的BPR模型
- BPR手术刀
- BPI & BPR
- 1981年的图灵奖获得者-Edgar Frank Codd
- simeon和Frank写的书支持一下
- BAT 批处理脚本教程
- WebRTC中丢包重传NACK实现分析
- 使用cocoapods所遇见问题及解决办法
- CSS DIV高度不确定如何设置高度
- Redis安装
- 配流07—基于BPR函数的Frank Wolfe算法
- Charles 从入门到精通
- php tesseract 不能执行成功
- C#加密方法(AES、MD5)
- Scala 语法基础
- Mybatis类型转换介绍
- Android EditText 输入金额(小数点后两位)
- iOS archive(归档)的总结
- 约瑟夫问题