综合算法03—FrankWolfe_BPR配流算法

%% 算法符号及程序说明
%说明:本程序为采用美国联邦公路阻抗函数BPR时的frankwolfe算法,考虑了换乘(已经将等待时
%间考虑在内并在K短路的确定过程中计算)及拥挤附加时间,在路网情况已知时配流并求出费用值。
%计算条件:根据K短路算法计算出考虑换乘的路径-路段关系矩阵和边权。
%缺点:BPR函数或许不能准确的描述轨道交通系统的路段阻抗,列车的能力也不能用程序中那么简单
%代替(但是,这无关紧要,暂时可以认为是正确的,后续可以用已知的路段函元胞和能力矩阵替换)
%下一步研究方向:网络配流--所有OD对之间的配流。
%==============================================================================
%符号体系:
%   Q-OD需求量
%  Cs-路段额定能力(列车座位数)
%Cmax-路段极限能力(列车座位数+人均面积达标的时的站立人数)
%   t-路段阻抗函数(值)
%numf-起点到终点的路径数量(自己按照K短路算法进行定义)
%numx-网络中的路段数量(直接连接两节点的边数,包含所有路段)
%   W-边权(0流量时的阻抗),在该程序中,通过调用K短路换乘算法自动标号索引得出。
%Transfer_time-某路径的路段换乘时间
%   G-路段拥挤附加时间
%   A-一般拥挤放大系数(介于0到等车时间之间),可以看作一个综合系数,指部分人选择挤车,部分人选择下趟列车。
%   B-特别拥挤放大系数(等车时间,与发车频率对应),如果过度拥挤,则无法乘车的人必须等待后车到来,等1趟时间加B,等2趟,时间加2B,等几趟由无法乘车人数与极限能力决定。
%   L-路网路线矩阵(0-1矩阵,表示路线与路段的关系,1为包含,0为不包含)
% Mxf-路径与路段的关系矩阵(每一行表示一个路径,矩阵值为1表示经过该路段,否则不经过该路段)
%cont-当前配流次数
%Ckrs-路径配流结果(更新后的阻抗值)
%  X1-当前配流结果
%  Y1-辅助流量
%   S-搜索方向
%lmbda-搜索步长
%  X2-新的迭代点
%   Z-目标函数(通用配流目标函数,可认为是费用)
%==============================================================================
clear all
format
clc
warning off
disp('========================================================================');
disp('                           《FrankWolfe_BPR配流算法》');
disp('运行环境:MATLAB 8.3.0.532 ');
disp('制 作 人:兰州交通大学   刘志祥');
disp('完成时间:2015-12-30');
disp('Q      Q:531548824');
disp('请提出宝贵的意见!');
disp('=========================================================================');

disp('----------------------------------------------------------------------')
fprintf('问题描述:已知路网数据(Road_Net)和线路数据(Line_Station)及OD需求(Q),\n求指定OD对的配流结果.\n\n');
disp('--------------------------------------------
  • 14
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
根据提供的引用内容,可以使用Python采用BPR函数实现Frank-Wolfe交通配流算法。具体步骤如下: 1. 导入所需的库和模块: ```python import numpy as np ``` 2. 定义BPR函数: ```python def bpr_function(x, alpha, beta): return alpha * x + beta * x**2 ``` 3. 定义Frank-Wolfe交通配流算法: ```python def frank_wolfe_traffic_assignment(network, demand, alpha, beta, max_iter=100): num_nodes = len(network) num_edges = np.sum(network) # 初始化流量分配矩阵 flow = np.zeros((num_nodes, num_nodes)) for iter in range(max_iter): # 计算路阻函数的梯度 gradient = np.zeros((num_nodes, num_nodes)) for i in range(num_nodes): for j in range(num_nodes): if network[i][j] > 0: gradient[i][j] = bpr_function(flow[i][j], alpha, beta) - demand[i][j] # 计算最小流量分配矩阵 min_flow = np.zeros((num_nodes, num_nodes)) for i in range(num_nodes): for j in range(num_nodes): if network[i][j] > 0: min_flow[i][j] = min(flow[i][j], demand[i][j]) # 计算最小流量分配矩阵的总和 min_flow_sum = np.sum(min_flow) # 计算步长 step_size = 2 / (iter + 2) # 更新流量分配矩阵 flow = (1 - step_size) * flow + step_size * min_flow return flow ``` 4. 调用Frank-Wolfe交通配流算法并输出结果: ```python network = np.loadtxt('network.txt') demand = np.loadtxt('ODPairs.txt') alpha = 0.15 beta = 4 flow = frank_wolfe_traffic_assignment(network, demand, alpha, beta) print(flow) ``` 以上代码实现了使用BPR函数的Frank-Wolfe交通配流算法,并输出了每条路段上的流量。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值