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

版权声明:博主文章可以被非商用转载,但请务必注明出处,因水平有限,难免出错,在此免责。 https://blog.csdn.net/LZX19901012/article/details/53785361

一、问题描述

在道路网中,已知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

========================================================================
                      《基于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.数据整理

路段流量表
路段 a1 a2 a3 a4 a5
流量 1347.7 1652.3 304.8 1042.9 1957.1


五、结论及展望

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


六、代码下载

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



展开阅读全文

没有更多推荐了,返回首页