交通分配之用户均衡分配模型二(matlab源码)
- 格式:doc
- 大小:57.00 KB
- 文档页数:3
tt =[0 0 0 ];xx= [0 0 0]t1 = 10 * (1 + 0.15 *(xx(1,1)/2)^4);t2 = 20 * (1+ 0.15 * (xx(1,2)/4)^4) ;t3 = 25 * (1 + 0.15 * (xx(1,3)/3)^4);%一个OD对,起点到终点的三条路段的走行时间函数Q = 10;N=8 ; % 迭代次数,本例只设置最大迭代次数。
也可另外设置收敛条件tt(1,1)= t1 ;tt(1,2) = t2;tt(1,3) = t3 ;y = [0 0 0]; %置初值Min = 50000;for j = 1 : 3if tt(1 ,j) <Min %计算最小走行时间的路段,用全有全无法分配流量Min = tt(1,j);index = j;endendxx(1,index) =Q;for i =1 :Ny = [0 0 0];t1 = 10 * (1 + 0.15 *(xx(1,1)/2)^4);t2 = 20 * (1+ 0.15 * (xx(1,2)/4)^4) ;t3 = 25 * (1 + 0.15 * (xx(1,3)/3)^4);tt(1,1)= t1 ;tt(1,2) = t2;tt(1,3 ) = t3 ;fprintf('第%d 次迭代的路径时间值:' , i);ttMin = 50000;for j = 1 : 3if tt(1 ,j) <Min %计算最小走行时间的路段,用全有全无法分配流量Min = tt(1,j);index = j;endendy(1,index) = Q; % 分配流量给辅助流fprintf('第%d 次迭代的辅助流量值是:' , i);yzz = xx + lambda * (y-xx); % 按方向(y-xx)进行一维搜索,步长为lamda t1 = 10 * (1 + 0.15 *(zz(1,1)/2)^4);t2 = 20 * (1+ 0.15 * (zz(1,2)/4)^4) ;t3 = 25 * (1 + 0.15 * (zz(1,3)/3)^4);f =( y(1,1) -xx(1,1)) * t1 + (y(1,2) -xx(1,2))* t2 +(y(1,3) -xx(1,3))* t3 ;lambda1 =double( solve(f)) ; %求解方程,确定步长。
科技与创新┃Science and Technology&Innovation ·40·2019年第03期文章编号:2095-6835(2019)03-0040-02用户均衡模型(UE)与随机用户均衡模型(SUE)在交通流分配阶段的适用性分析王晓璠(中铁第四勘察设计院集团有限公司,湖北武汉430063)摘要:“交通流分配”作为交通规划“四阶段法”的最后一个阶段,对公路项目交通量分析与预测的准确性起到至关重要的作用。
针对交通流分配的不同模型与实际交通量观测数据存在精度不高的问题,结合具体实例,在交通补充调查的基础上,比较了用户均衡模型(UE)与随机用户均衡模型(SUE)的分配精度。
从TransCAD软件的交通规划建模结果来看,应用后者的模型在基础路网上进行交通流分配较前者的模型在不同路段的分配精度上均有不同程度的上升。
这说明了随机用户均衡模型(SUE)更加具有适用性,也为今后相关报告的编制提供了实例验证和数据支撑。
关键词:交通规划建模;交通流分配;用户均衡模型;随机用户均衡模型中图分类号:U491文献标识码:A DOI:10.15913/ki.kjycx.2019.03.040作为国内外道路工程交通预测通行的方法,“四阶段法”已被国内公路项目“工程可行性研究”及“交通影响评价”等报告的编制广泛应用。
而“交通流分配”作为交通规划“四阶段法”的最后一个阶段,对公路项目交通量分析与预测的准确性起到至关重要的作用。
目前,国内大多公路项目工程可行性研究报告将用户均衡模型(UE)和随机用户均衡模型(SUE)作为“交通流分配”阶段的主要应用模型,将各交通小区间的OD数据分配到已知的道路网模型上。
而现有文献缺乏对上述两个模型对于路网真实交通流量情况模拟的准确性以及对未来年道路网交通量分析和预测的适用性分析。
本报告在对大量公路项目交通量观测和OD调查和数据分析的基础上,利用宏观交通规划和需求预测软件TransCAD建立路网模型,并分别利用上述两个模型进行交通流分配,将分配结果与道路网真实交通量数据进行对比分析,为公路项目交通量分析和预测所利用的模型比选提供参考。
纳什均衡(Nash Equilibrium)是博弈论中的一个重要概念,描述了在非合作博弈中,所有玩家在选择策略时达到的一种均衡状态,其中任一玩家无法通过单独改变策略来增加自己的收益。
以下是一个简单的MATLAB代码示例,用于计算2x2非合作博弈的纳什均衡。
这里假定有一个支付矩阵,我们将寻找纯策略纳什均衡。
```matlabfunction nash_equilibrium_example()% 定义博弈的支付矩阵 (这是玩家1的支付矩阵, 玩家2的支付是它的转置)payoffMatrix = [1, -1; -1, 1]; % 这是一个零和博弈的示例% 检查纯策略纳什均衡[strategies1, strategies2, value1, value2] = find_pure_strategy_nash_equilibria(payoffMatrix);% 输出结果if isempty(strategies1)disp('没有找到纯策略纳什均衡。
')elsedisp('找到了纯策略纳什均衡:')disp(['玩家1的策略: ', num2str(strategies1)])disp(['玩家2的策略: ', num2str(strategies2)])disp(['玩家1的支付: ', num2str(value1)])disp(['玩家2的支付: ', num2str(value2)])endendfunction [strategies1, strategies2, value1, value2] = find_pure_strategy_nash_equilibria(payoffMatrix)numStrategies1 = size(payoffMatrix, 1);numStrategies2 = size(payoffMatrix, 2);strategies1 = [];strategies2 = [];value1 = [];value2 = [];for i = 1:numStrategies1for j = 1:numStrategies2isEquilibrium = true;% 检查玩家1是否无法通过更改策略而获得更多收益for k = 1:numStrategies1if k ~= i && payoffMatrix(k, j) > payoffMatrix(i, j)isEquilibrium = false;break;endif ~isEquilibriumcontinue;end% 检查玩家2是否无法通过更改策略而获得更多收益% 注意:这里我们假设博弈是零和的,所以玩家2的支付矩阵是玩家1支付矩阵的负值for l = 1:numStrategies2if l ~= j && -payoffMatrix(i, l) > -payoffMatrix(i, j)isEquilibrium = false;break;endendif isEquilibriumstrategies1 = [strategies1, i];strategies2 = [strategies2, j];value1 = [value1, payoffMatrix(i, j)];value2 = [value2, -payoffMatrix(i, j)]; % 对于零和博弈break; % 如果找到一个均衡,就跳出内层循环(可能有多个均衡,但这个简单的例子只有一个)endif ~isempty(strategies1)break; % 如果找到一个均衡,就跳出外层循环endendend```这段代码首先定义了一个名为`nash_equilibrium_example`的函数,它设定了一个2x2的支付矩阵,并调用`find_pure_strategy_nash_equilibria`函数来寻找纯策略纳什均衡。
例
总流量为100,走行函数为:
⎪⎭⎫ ⎝⎛+=40)(6.04)(111t x x c ⎪⎭
⎫ ⎝⎛+=40)(9.06)(222t x x c ⎪⎭
⎫ ⎝⎛+=60)(3.02)(333t x x c ⎪⎭⎫ ⎝⎛+=40)(75.05)(444t x x c ⎪⎭
⎫ ⎝⎛+=40)(45.03)(555t x x c 模型求解的Matlab 源码:
syms lambda ;
tt =[0 0 0 ];
xx = [0 0 0 0 0] ;
t1 = 4 + (0.6/40)*xx(1,1);
t2 =6 + (0.9/40) *xx(1,2);
t3 = 2 + (0.3/60) *xx(1,3);
t4 = 5 + (0.75/40) *xx(1,4) ;
t5 = 3 + (0.45/40) *xx(1,5) ;
Q = 100;
N=8 ; % 迭代次数 ,本例只设置最大迭代次数。
也可另外设置收敛条件
tt(1,1)= t1 +t4 ;
tt(1,2) = t2 + t5 ;
tt(1,3) =t1+ t3 +t5 ;
y = [0 0 0]; %置初值
Min = 50000;
for j = 1 : 3
if tt(1 ,j) <Min %计算最小走行时间的路段 ,用全有全无法分配流量 Min = tt(1,j);
index = j;
end
end
% y(1,index) = Q;
if index ==1
xx(1,1)= Q;
xx(1,4)=Q;
elseif index ==2
xx(1,2)= Q;
xx(1,5)=Q;
else
xx(1,1)= Q;
xx(1,3)=Q;
xx(1,5)=Q;
end
for i =1 :N
y = [0 0 0 0 0 ];
t1 = 4 + (0.6/40)*xx(1,1);
t2 =6 + (0.9/40) *xx(1,2);
t3 = 2 + (0.3/60) *xx(1,3);
t4 = 5 + (0.75/40) *xx(1,4) ;
t5 = 3 + (0.45/40) *xx(1,5) ;
tt(1,1)= t1 +t4 ;
tt(1,2) = t2 + t5 ;
tt(1,3) =t1+ t3 +t5 ;
fprintf('第%d 次迭代的路径时间值:' , i);
tt
Min = 50000;
for j = 1 : 3
if tt(1 ,j) <Min %计算最小走行时间的路段,用全有全无法分配流量Min = tt(1,j);
index = j;
end
end
if index ==1
y(1,1)= Q;
y(1,4)=Q;
elseif index ==2
y(1,2)= Q;
y(1,5)=Q;
else
y(1,1)= Q;
y(1,3)=Q;
y(1,5)=Q;
end % 分配流量给辅助流
fprintf('第%d 次迭代的辅助流量值是:' , i);
y
zz = xx + lambda * (y-xx); % 按方向(y-xx)进行一维搜索,步长为lamda
t1 = 4 + (0.6/40)*zz(1,1);
t2 =6 + (0.9/40) *zz(1,2);
t3 = 2 + (0.3/60) *zz(1,3);
t4 = 5 + (0.75/40) *zz(1,4) ;
t5 = 3 + (0.45/40) *zz(1,5) ;
f =( y(1,1) -xx(1,1)) * t1 + (y(1,2) -xx(1,2))* t2 +(y(1,3) -xx(1,3))* t3 +(y(1,4) -xx(1,4))* t4 +(y(1,5) -xx(1,5))* t5 ;
lambda1 =double( solve(f)) ; %求解方程,确定步长。
k = length(lambda1); % 如步长lambda1的解不唯一,取实数,且大于0 小于1;
if k == 1
lambda2 =lambda1;
else
for m=1: k
if lambda1(m,1) > 0 && lambda1(m,1) < 1 && isreal(lambda1(m,1))
lambda2 =lambda1(m,1);
end
end
end
fprintf('第%d 次迭代的最优步长值是:' , i);
lambda2
fprintf('第%d 次迭代的路段流量值是:' , i);
xx = xx + lambda2*(y - xx ) % 得到下一步的流量值,且进行下一次迭代
end。