4. 换道模型
换道模型,说白了就是回答一个问题:“我该不该变道?”
做交通仿真这么多年,我见过太多人把换道模型想得太简单。有人觉得“前车太慢就变道呗”,有人觉得“旁边车道空就钻过去”。但实际跑起来,你会发现——一个不合理的换道模型,能让整个仿真变成车祸现场。
今天咱们就聊两个经典模型:MOBIL 和 LC2013。我个人习惯把前者叫“利己模型”,后者叫“博弈模型”。为什么?往下看你就明白了。
4.1 MOBIL模型:最小化制动,最大化收益
MOBIL 的全称是 Minimizing Overall Braking Induced by Lane Changes。名字很长,但核心就一句话:变道不能坑后车。
我在项目中遇到过一种情况:仿真里所有车都在频繁变道,但整体车速反而下降了。后来一查,是 MOBIL 的参数没调好——每辆车变道时只考虑自己爽,后车被迫急刹车,结果整个路段形成“幽灵堵车”。
4.1.1 决策逻辑
MOBIL 的决策分两步:
- 安全条件:变道后,目标车道后车的减速度不能超过某个阈值。
- 收益条件:变道后,自己加上目标车道后车的总加速度提升,要大于当前车道的损失。
公式长这样(别怕,我帮你拆开看):
# 安全条件:后车减速度 < 安全阈值
a_target_follower > -b_safe
# 收益条件:变道收益 > 不变道收益 + 激励项
(a_ego_new + a_target_follower_new) - (a_ego_old + a_ego_follower_old) > Δa_threshold + a_bias
嗯,这里要注意:Δa_threshold 是“变道门槛”。你想想看,如果门槛设成0,那只要有一丁点好处车就变道,仿真里会乱成一锅粥。我一般设成 0.1~0.3 m/s²,具体看场景。
4.1.2 参数调优经验
| 参数 | 含义 | 我常用的值 | 坑点 |
|---|---|---|---|
| b_safe | 后车最大允许减速度 | -2.0 m/s² | 设太小(如-0.5)会导致变道过于保守 |
| Δa_threshold | 变道收益门槛 | 0.2 m/s² | 设太大(如1.0)车几乎不变道 |
| a_bias | 车道偏好偏置 | 0.1 m/s²(靠右行驶) | 靠左行驶的国家要取负值 |
4.2 LC2013模型:博弈论视角下的换道
LC2013 模型,全称是 Lane Change Model 2013,由德国宇航中心提出。它跟 MOBIL 最大的区别是:引入了博弈论。
我曾经用 LC2013 模拟高速匝道汇入场景。结果发现,当主路车流密度高时,LC2013 的汇入成功率比 MOBIL 高了将近 30%。为什么?因为 LC2013 会“谈判”——后车如果愿意让行,前车才变道。
4.2.1 决策逻辑
LC2013 把换道看成一场 “合作博弈”:
- 发起方(想变道的车)评估变道后的收益。
- 响应方(目标车道后车)评估是否让行。
- 如果双方都能获益(或至少不亏),变道发生。
代码实现上,LC2013 会计算一个 “合作指数”:
def lc2013_decision(ego, target_follower):
# 计算变道后的速度变化
ego_gain = ego.speed_after - ego.speed_before
follower_loss = target_follower.speed_before - target_follower.speed_after
# 合作条件:双方都不亏
if ego_gain > 0 and follower_loss < 0.5: # 后车损失小于0.5 m/s
return True
elif ego_gain > 2.0 and follower_loss < 2.0: # 自己收益大,可接受后车一定损失
return True
else:
return False
4.3 两个模型的对比与选择
你可能会问:到底用哪个?
我的建议是:
- 城市道路、低速场景:用 MOBIL。它计算快,参数少,调起来省心。
- 高速公路、高速场景:用 LC2013。它能模拟出“让行”和“抢行”的博弈,更真实。
- 混合场景:两个都用。我习惯让 MOBIL 负责“是否想变道”,LC2013 负责“能否变道成功”。
下面这张图是我自己总结的决策流程,你可以参考:
4.4 实战:如何调参
最后分享一点实战经验。调换道模型,我一般按这个顺序来:
- 先调安全条件:把 b_safe 从 -1.0 开始,每次减 0.5,直到仿真里不再出现“后车急刹”的情况。
- 再调收益门槛:Δa_threshold 从 0.1 开始,每次加 0.1,直到车流密度和换道频率达到平衡。
- 最后调博弈参数:LC2013 的“合作指数”阈值,我一般从 0.5 开始,根据仿真结果微调。
好了,换道模型就聊到这儿。下次你写仿真代码时,不妨试试把 MOBIL 和 LC2013 结合起来——一个负责“想不想”,一个负责“能不能”,效果往往比单用任何一个都好。