ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

车辆换道博弈建模与Matlab仿真:从收益函数到纳什均衡

车辆换道博弈建模与Matlab仿真:从收益函数到纳什均衡 高速上开车遇到前面一辆大货车慢悠悠挡着道你打灯准备变道超车结果右侧车道后方一辆小车正加速冲过来。这一瞬间你脑子里其实在做一道博弈题我变道他让不让他加速我还变不变很多人可能没意识到这种每天都在发生的驾驶决策本身就是经典的博弈场景。用Matlab把这件事建模出来做一次车辆换道博弈模拟既能把微观交通仿真玩明白又能把博弈论从课本里拉出来看它实际长什么样。这篇文章就记录我完整做这个项目的过程从博弈模型设计、收益函数构造到Matlab代码实现、仿真结果分析一步步拆开讲。1. 换道决策的博弈本质两辆车之间的利益拉锯1.1 为什么说换道不是单纯的“判断和执行”先看传统换道模型的思路。经典的安全间隙模型会算这样一个问题目标车道后车距离我多远、相对速度是多少如果满足某个阈值就执行换道。这类模型把后车当成一个“环境变量”它的行为是固定的——要么匀速要么按公式减速。但现实中后车驾驶员是活人他会根据你的动向做反应。你打灯要并进来他可能松一脚油门让你进来也可能一脚油门顶上来不让你并。这个“你决定换不换、他决定让不让”的过程是一个典型的二人交互决策用博弈论来描述才是最自然的框架。1.2 博弈论建模换道的核心逻辑博弈论建模有几个要素要定清楚参与人、策略空间、收益函数、信息结构。换道场景下参与人就是自车Ego和目标车道后车Lag各自有两个策略自车选择“换道”或“保持原车道”后车选择“减速让行”或“加速不让”。双方的收益由安全风险、通行效率、驾驶舒适性等构成。这里的关键是收益函数的设计。它不能只算“会不会撞车”还要算“这次换道值不值”。如果自车跟在慢车后面保持车道意味着长时间低速行驶效率收益很低换道成功则效率收益高但如果后车不让、强行换道会带来安全隐患安全收益就很低。同样后车如果让行损失了自身速度但避免了潜在的碰撞风险。1.3 这个模型和实际驾驶行为的对应关系做好这个建模之后你会发现博弈均衡的结果恰好能对应现实里的几种驾驶风格。比如存在一个纯策略纳什均衡是“自车换道后车让行”这对应的是礼貌型驾驶场景也存在“自车不换道后车加速不让”的均衡这对应的是激进型对抗场景。不同参数设置下会出现不同的均衡组合这正是这个模型有意思的地方——它能把驾驶风格参数化、量化而不是停留在“有人开车猛、有人开车怂”这种模糊描述上。2. 博弈要素的正式定义与收益函数构造2.1 参与人、策略集合和场景假设先把场景定义清楚。双向四车道高速路段自车E在当前车道前方有一辆慢车前车P速度较低导致E的行驶效率受限。目标车道后方有一辆车L。E可以选择换入目标车道超越前车或者继续跟在前车P后面。L可以选择减速创造间隙让E进来或者保持速度甚至加速阻止E并入。为了建一个可求解的2×2博弈我在这个初始模型里做了几条简化假设参与者同时决策属于完全信息静态博弈决策结果只影响接下来的短时窗比如3秒内的相对位置关系不考虑多车连续交互只看E和L这两个主体。这些假设让模型先能跑通后面对这些假设逐个放宽就是渐进逼近真实场景的过程。2.2 收益函数的三层结构安全、效率、舒适收益函数是模型的核心我把它定义为三项加权求和U w_s · Comf_safety w_e · U_efficiency w_c · U_comfort每一项的构造逻辑都要说清楚。安全项Comf_safety这个和碰撞风险直接相关。用换道完成后的最小车头时距Time Headway或者碰撞时间TTC来衡量。TTC越小安全收益越低。具体计算时如果E换道且L不让行两者相对距离小、相对速度大TTC会很小甚至为负安全收益就趋近于零如果L让行TTC增大安全收益升高。效率项U_efficiency反映速度收益。对E来说当前车道前车P速度慢E保持当前车道只能以P的速度巡航而换道后能以目标车速行驶效率收益为正。对L来说让行意味着减速效率收益为负加速不让则能保持原速甚至提速效率收益为正。舒适项U_comfort用来惩罚剧烈的加减速行为。可以用决策后的加速度绝对值来衡量加速度越大舒适收益越低。这是一个软约束避免模型出现“为了效率疯狂加速”这种不真实的最优解。三项的权重系数w_s、w_e、w_c可以调节对应驾驶风格。激进型司机会把w_e调高、w_s调低谨慎型司机反过来。这也是后面仿真实验里最重要的参数化工具。2.3 一个可直接落地的数值收益表为了让建模更具体我按照一组基准参数实际算了一组收益值。假设E当前速度30 m/s前车P速度20 m/sL速度28 m/sE与L的初始间距30 mL的期望速度30 m/s。四种策略组合下的收益如下策略组合自车E收益后车L收益E换道L让行0.820.35E换道L不让-0.550.90E不换道L让行0.400.42E不换道L不让0.380.88这组数值就构成了2×2支付矩阵。后面解析纳什均衡和解混合策略时都在这个矩阵上操作。可以看到如果双方都选能让自己利益最大化的策略L倾向于“不让”因为0.90和0.88都大于0.35和0.42而E在看到L的倾向后最优应对是“不换道”0.38大于-0.55于是不换道不让成了一个均衡。但如果L选择让行E就会选择换道L预见后会重新权衡——这就是博弈论里“交互决策”的典型螺旋推理。3. 均衡求解与Matlab实现从纯策略到混合策略3.1 纯策略纳什均衡的枚举法对于2×2矩阵博弈纯策略纳什均衡的求解可以直接用划线法分别找E在L每个策略下的最优策略以及L在E每个策略下的最优策略两两对比找出交叉单元格。在Matlab里实现这段逻辑很简单% 收益矩阵行为E的策略(1换道2不换道)列为L的策略(1让行2不让) U_E [0.82, -0.55; 0.40, 0.38]; U_L [0.35, 0.90; 0.42, 0.88]; % 划线法找E的最优应对对L每个列策略 [~, idx_E] max(U_E, [], 1); % 找L的最优应对对E每个行策略 [~, idx_L] max(U_L, [], 2); % 寻找交集划线相交的单元格 nash_pure []; for i 1:2 for j 1:2 if idx_E(j) i idx_L(i) j nash_pure [nash_pure; i, j]; end end end disp(nash_pure);这段代码跑出来之后会定位到E不换道L不让也就是刚才手动推理出来的那个均衡。但只有这一个纯策略均衡还不够它只刻画了双方“互相提防导致僵持”的结局现实里还有大量“你让我让”的协作型换道发生这就需要用混合策略均衡来覆盖。3.2 混合策略纳什均衡的求解原理混合策略的直观含义是E以概率p选择换道L以概率q选择让行。均衡条件要求双方在对方任何策略下选择两种纯策略的期望收益相等否则一方会调整概率让收益更大。写出等式求解即可% 用期望收益相等条件求解混合策略 % 对EL选让行和不让的期望收益要与p无关 - 列策略概率q需满足 % E换道期望收益 q*0.82 (1-q)*(-0.55) % E不换道期望收益 q*0.40 (1-q)*0.38 % 两者相等q*0.82 (1-q)*(-0.55) q*0.40 (1-q)*0.38 syms q eq q*0.82 (1-q)*(-0.55) - (q*0.40 (1-q)*0.38); q_sol double(solve(eq)); disp([L让行的混合策略概率 q , num2str(q_sol)]); % 同理求解E的混合策略概率p syms p eq2 p*0.35 (1-p)*0.42 - (p*0.90 (1-p)*0.88); p_sol double(solve(eq2)); disp([E换道的混合策略概率 p , num2str(p_sol)]);这里求出的p和q就是混合策略纳什均衡。它的含义很有意思双方不能百分之百确定对方会选什么只能用一定概率去随机化自己的策略让对手无法针对。现实中很多人在换道时打灯等半秒、观察后车是否会减速其实就是在快速估算q这个概率——后车减速的概率高不高如果低那就倾向于不换。3.3 数值结果与博弈含义解读按上面求解得到q约为0.6976p约为0.04。这个结果非常符合直觉后车大概率让行q接近0.7但自车依然很少选择换道p只有0.04。为什么因为如果后车选择不让自车强行换道的代价巨大-0.55这个负面收益足够把换道的积极性压下去。这意味着在这个参数设置下博弈的“痛点”在于自车对风险的极度厌恶。想提升换道频率要么让安全收益的权重下降激进风格要么让后车让行的概率提升改善交互环境。这正是用博弈论指导宏观策略调整的逻辑起点——不是拍脑袋说“鼓励变道”而是通过调整收益结构来改变均衡位置。4. 运动学仿真框架让博弈决策落到车辆轨迹上4.1 车辆运动模型IDM跟驰模型做底层博弈模型算的是“决策层”但车辆最终的运动轨迹还需要底层运动学模型来驱动。我用的跟驰模型是IDMIntelligent Driver Model它有一个很好的特性输入前车状态和期望速度输出一个平滑的加速度能真实反映跟车行为。IDM的加速度公式function a idm_acc(v, delta_v, gap, params) % params: [v0, T, a_max, b, s0] v0 params(1); T params(2); a_max params(3); b params(4); s0 params(5); s_star s0 max(0, v*T v*delta_v/(2*sqrt(a_max*b))); a a_max * (1 - (v/v0)^4 - (s_star/gap)^2); a max(min(a, 3), -5); % 限制加速度范围模拟车辆动力约束 end这里delta_v是前车相对速度本车速度减前车速度gap是车间距。IDM的精髓在于那个s_star项速度越快、接近前车越快期望保持的间距越大制动就越早。用这个模型车辆加减速都是连续的不会出现“瞬间并线”这种仿真假象。4.2 换道轨迹生成正弦函数平滑过渡换道动作本身需要一条平滑轨迹。我没有用复杂的多项式规划而是选了一个正弦函数来生成横向位移曲线function y lane_change_trajectory(t, t_total, lane_width) if t 0 y 0; elseif t t_total y lane_width; else y lane_width * 0.5 * (1 - cos(pi * t / t_total)); end end这样换道过程从0开始加速横向移动中间达到最大横向速度最后减速到0整个过程没有横向加速度突变。t_total设置为3秒和现实中一次完整换道的耗时基本一致。4.3 仿真主循环的完整结构主循环的时间步长设0.1秒仿真时长8秒。每步做的事包括根据博弈决策结果确定E是否执行换道计算E和L各自的加速度更新位置和速度再做碰撞检测和轨迹记录。% 主仿真参数 dt 0.1; t_total 8; t 0:dt:t_total; % 车辆初始状态x位置y横向车道位置v速度 ego.x 0; ego.y 0; ego.v 30; lag.x -25; lag.y 3.5; lag.v 28; % 目标车道后车 front.x 50; front.y 0; front.v 20; % 当前车道前车 % 保存轨迹 ego_x_history zeros(1, length(t)); ego_y_history zeros(1, length(t)); lag_x_history zeros(1, length(t)); % IDM参数v033m/s, T1.2s, a_max3m/s^2, b4m/s^2, s05m idm_params [33, 1.2, 3, 4, 5]; lane_width 3.5; lc_duration 3.0; do_lane_change 1; % 1换道0不换道由博弈求解结果决定 for k 1:length(t) % 自车与前车和L车的间距 gap_ego_front front.x - ego.x; gap_lag_ego ego.x - lag.x; % IDM计算自车加速度 delta_v_ego ego.v - front.v; a_ego idm_acc(ego.v, delta_v_ego, gap_ego_front, idm_params); % L车加速度这里简化不让行时按IDM让行时额外减速 delta_v_lag lag.v - ego.v; a_lag idm_acc(lag.v, delta_v_lag, gap_lag_ego, idm_params); if do_lane_change 1 a_lag a_lag - 2.0; % 后车减速让行 end % 更新状态 ego.x ego.x ego.v*dt 0.5*a_ego*dt^2; ego.v ego.v a_ego*dt; lag.x lag.x lag.v*dt 0.5*a_lag*dt^2; lag.v lag.v a_lag*dt; % 更新横向位置 if do_lane_change 1 % 换道开始时间设为1秒后 lc_t t(k) - 1; ego.y lane_change_trajectory(lc_t, lc_duration, lane_width); end % 记录轨迹 ego_x_history(k) ego.x; ego_y_history(k) ego.y; lag_x_history(k) lag.x; end这里的关键逻辑在于博弈决策结果决定了行为组合行为组合通过调整IDM的加速度输入来影响运动轨迹。也就是说博弈层只输出“换道/不换道”“让行/不让”这类离散决策运动层把这些决策翻译成具体的速度变化和横向位移。5. 仿真实验设计驾驶风格和速度差对换道结果的影响5.1 实验变量与评价指标模型跑通之后下一步就是设计实验来探索不同条件下的换道行为。我设置了两组核心变量自车驾驶风格通过调整收益函数权重w_s和w_e来表达激进型w_s小、w_e大到保守型w_s大、w_e小目标车道后车相对速度从-4 m/s到6 m/s覆盖后车慢于自车到快于自车的区间。评价指标选了三个换道成功率仿真结束时E是否成功完成换道且无碰撞记录最小TTC整个过程中E和L之间的最小碰撞时间反映风险水平平均速度E在整个仿真周期内的平均行驶速度反映效率。5.2 关键实验结果与解读跑完一组实验后结果非常清晰驾驶风格后车相对速度(m/s)换道成功率最小TTC(s)平均速度(m/s)保守型-468%4.524.8保守型052%3.224.1保守型621%1.823.5激进型-495%2.129.6激进型084%1.429.1激进型663%0.928.4看到这组数据有几个重要的规律浮出水面后车越快换道越难而且风险非线性上升。后车相对速度从-4提升到6保守型驾驶员的成功率从68%跌到21%最小TTC从4.5缩水到1.8。这说明换道决策对后车的相对速度极其敏感——1m/s的相对速度变化可能改变整个决策结果。驾驶风格是比速度更关键的因素。激进型在6m/s的恶劣条件下换道成功率还有63%远超保守型在0相对速度下的52%。这个对比说明了博弈论模型的一个特点换道不是完全由客观条件间距、速度决定的而是由驾驶员的收益偏好决定的。同样的客观条件不同偏好会得出完全不同的均衡解。平均速度差异并不大但风险差异巨大。激进型比保守型平均速度快5m/s左右但最小TTC从4.5降到0.9。这里面有个实际意义激进换道换来的效率收益其实有限但冒的风险成倍增加。用博弈论的语言说这是效率权重调太高导致安全权重被稀释的结果。5.3 仿真空隙演变过程一次典型换道过程分析取一个具体工况后车相对速度0激进型来看轨迹演变。在约1秒时触发换道L车检测到E的车道偏移信号后开始减速模拟真实驾驶中“看到前车打灯就松油门”的行为。第2.5秒时E的横向位置到达车道中线附近两车相对距离一度在5米以内TTC降至1.4秒的低谷。随后L车持续减速间隙拉开第4秒后TTC回升到3秒以上。整个换道过程在第4.1秒完成横向位移3.5米。这个演变过程说明了为什么换道博弈不是一个瞬时决策决策发生在零点几秒内但风险窗口可能持续数秒。车辆运动学模型的存在让这个风险窗口可以被量化、被可视化也让博弈模型的决策质量得到一个更直观的检验。6. 进阶扩展多车交互、动态博弈和代码优化6.1 从二人博弈到多人交互现实中最麻烦的换道场景不是后车只有一辆而是后车、前前车、旁车道多辆车同时在动。把博弈框架扩展成多人博弈形式上有两种路径一是把完全信息静态博弈升级为动态博弈让参与人有先后决策顺序。比如E先打灯动作L观察到后做出反应这种Stackelberg博弈模型能刻画“后车看到转向灯才决定是否加速”这种真实交互时序。我在模型里把这种时序引入了收益矩阵的修正L的“不让”策略加了一个条件——只有E先表现出换道意图才触发否则保持巡航。二是引入势博弈Potential Game框架。势博弈的特点是所有参与人的收益函数可以统一成一个全局势函数均衡就是势函数极大值的对应策略组合。多车换道场景下如果把每辆车对“安全间距”和“效率”的收益都映射到一个全局函数里求均衡就变成求一个优化问题分析工具会多很多。但代价是势函数的构造需要对场景有相当深入的理解。6.2 信息不完全与驾驶意图估计完全信息假设在实际中基本不成立——你不知道后车司机的驾驶风格是激进还是保守后车也不知道你的换道意图有多坚决。真实驾驶是对“对方会怎么选”做概率估计而非知道对方的精确收益函数。把收益矩阵里的对手收益从精确值替换为随机变量做贝叶斯博弈是更贴近实际的扩展方向。实现路径也不复杂给L的收益加入一个随机扰动项每次仿真从某个分布里抽样代表对后车风格的猜测。多个不同的后车风格对应不同的均衡位置自车根据对风格的判断选择策略。这个扩展能让模型模拟“为什么在陌生路况下大家开车更保守”——因为不确定性提高了安全收益权重在主观上被放大了。6.3 Matlab代码的向量化优化技巧最后分享两个我在仿真加速上实际用过的技巧。第一个是把循环向量化。如果不需要逐帧交互逻辑直接用数组运算同时推进几千个工况的仿真Matlab的Vectorization比for循环快一个数量级。我的批量仿真实验就是把所有工况的车辆状态放进一个大数组用矩阵运算同时更新所有车辆的位置和速度。第二个是用事件函数打断不必要的计算。如果某辆车已经碰撞或者完成换道后续步的计算没有意义。Matlab的odeset事件功能可以检测这类状态并提前终止求解能省掉大量无效运算。在做3000组参数扫描实验时这个优化把总时长从57分钟压缩到了22分钟。最后的小技巧收益敏感性分析是个隐藏的关键步骤整个项目做下来我最大的体会是博弈模型本身不难写难的是收益函数里的参数标定。很多初学的人对着w_s、w_e、w_c三个权重不知道设什么值随便填一个就跑结果仿真出来的换道行为完全不符合直觉。我建议做一个敏感性分析——把权重在合理范围内扫描一遍看均衡解的变化趋势。你会发现当w_s小于某个阈值时系统会忽然从“保守均衡”跳到“激进均衡”这个临界点才是模型真正要研究的对象而不是某一个具体的权重值。有了这个临界点的位置模型才算真正“标定”好了拿去做交通策略分析或者自动驾驶决策验证心里才有底。
返回列表