3、换道模型:MOBIL模型、LC2013模型原理与Python实现
换道模型,说白了就是模拟司机怎么决定「我要不要换到旁边那条道」。
我刚开始做交通仿真时,觉得换道嘛,不就是看旁边空不空、速度够不够快?后来发现,这里面门道深着呢。不同司机的决策逻辑、安全顾虑、甚至「礼貌程度」都不一样。
今天咱们就聊两个经典模型:MOBIL 和 LC2013。一个偏「理性经济人」,一个偏「安全第一」。我个人习惯把 MOBIL 用在高速公路场景,LC2013 用在城市道路——当然,这只是经验之谈。
3.1 MOBIL 模型:换道的「经济学」
MOBIL 的全称是 Minimizing Overall Braking Induced by Lane Changes。名字很长,但核心思想很简单:换道要「利己不损人」。
怎么理解?
- 利己:换道后,我自己的加速度要明显提升。
- 不损人:换道后,目标车道后车的减速度不能太大(不能逼得人家急刹车)。
MOBIL 模型有两个关键参数:
- a_thr:换道阈值。只有换道后我的加速度提升超过这个值,才考虑换道。
- b_safe:安全减速度。目标车道后车的减速度不能低于这个值(负值越大越危险)。
我在项目中遇到过一种情况:参数设得太激进(a_thr 很小),结果仿真里车辆频繁换道,像「蛇形走位」一样。后来把 a_thr 调到 0.2 m/s² 以上,才正常。
MOBIL 的决策逻辑
- 计算当前车道的加速度 a_ego_current。
- 计算换到目标车道后的加速度 a_ego_target。
- 计算目标车道后车的加速度变化 Δa_follower。
- 判断:如果 (a_ego_target - a_ego_current) > a_thr,且 Δa_follower > -b_safe,则换道。
嗯,这里要注意:加速度的计算依赖于跟驰模型(比如 IDM)。所以 MOBIL 和 IDM 是「黄金搭档」。
Python 实现(核心逻辑)
def mobil_decision(ego, target_lane, vehicles, a_thr=0.2, b_safe=2.0):
"""
ego: 当前车辆对象
target_lane: 目标车道编号
vehicles: 所有车辆列表
"""
# 计算当前车道加速度(假设已有跟驰模型)
a_current = ego.calc_acceleration(ego.lane)
# 计算目标车道加速度
a_target = ego.calc_acceleration(target_lane)
# 计算目标车道后车的加速度变化
follower = get_follower(ego, target_lane, vehicles)
if follower:
a_follower_before = follower.calc_acceleration(follower.lane)
# 假设 ego 换道后,follower 的跟驰目标变为 ego
a_follower_after = follower.calc_acceleration_with_new_leader(ego)
delta_a_follower = a_follower_after - a_follower_before
else:
delta_a_follower = 0 # 没有后车,不造成影响
# 判断
if (a_target - a_current) > a_thr and delta_a_follower > -b_safe:
return True # 执行换道
else:
return False
3.2 LC2013 模型:安全第一,效率第二
LC2013 模型是 2013 年提出的,全称我记不太清了,但核心思想我记得很清楚:先确保安全,再考虑是否换道。
它和 MOBIL 最大的区别是什么?
MOBIL 是「收益导向」——换道后我爽不爽?LC2013 是「风险导向」——换道后会不会撞?
LC2013 模型把换道决策分为两步:
- 安全判断:目标车道是否有足够的间隙?
- 收益判断:换道后速度是否提升?
安全判断是硬约束,不满足绝对不换。收益判断是软约束,满足才换。
安全间隙的计算
LC2013 用了一个很直观的公式:
- 目标车道前车距离 d_front
- 目标车道后车距离 d_rear
- 安全间隙要求:d_front > v_ego * t_safe 且 d_rear > v_rear * t_safe
其中 t_safe 是安全时距,一般取 1.5~2.0 秒。
我曾经在仿真里把 t_safe 设成 1.0 秒,结果车辆换道时经常「擦着边」过去,看着就吓人。后来改成 1.8 秒,舒服多了。
Python 实现(核心逻辑)
def lc2013_decision(ego, target_lane, vehicles, t_safe=1.8):
"""
LC2013 换道决策
"""
# 获取目标车道前车和后车
leader = get_leader(ego, target_lane, vehicles)
follower = get_follower(ego, target_lane, vehicles)
# 安全间隙判断
if leader:
d_front = leader.position - ego.position
if d_front < ego.speed * t_safe:
return False # 前车太近,不安全
if follower:
d_rear = ego.position - follower.position
if d_rear < follower.speed * t_safe:
return False # 后车太近,不安全
# 收益判断:换道后速度是否提升
speed_gain = leader.speed - ego.speed if leader else 5.0 # 如果没前车,默认收益大
if speed_gain > 0:
return True
else:
return False
3.3 两个模型的对比
| 特性 | MOBIL | LC2013 |
|---|---|---|
| 核心思想 | 利己不损人 | 安全第一 |
| 决策依据 | 加速度变化 | 安全间隙 + 速度收益 |
| 参数数量 | 2 个(a_thr, b_safe) | 1 个(t_safe) |
| 适用场景 | 高速公路、自由流 | 城市道路、拥堵 |
| 计算复杂度 | 中等(需计算加速度) | 低(只需距离和速度) |
你想想看,MOBIL 更适合「理性司机」,LC2013 更适合「谨慎司机」。实际仿真中,我经常把两者结合:先用 LC2013 做安全过滤,再用 MOBIL 做收益判断。
3.4 知识体系总览
下面这张图是我自己画的,把两个模型的核心逻辑串起来了。你看一眼就能明白它们的关系。
核心总结:MOBIL 和 LC2013 不是互斥的,而是互补的。我个人的最佳实践是:先用 LC2013 筛掉不安全的换道,再用 MOBIL 从安全的候选里选收益最大的。这样既安全又高效。
好了,换道模型这块就聊到这儿。代码我已经贴出来了,你拿去跑跑看,调调参数,感受一下不同参数对换道行为的影响。仿真这东西,光看理论没用,得动手。
可可精品资料库