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 的决策逻辑

  1. 计算当前车道的加速度 a_ego_current。
  2. 计算换到目标车道后的加速度 a_ego_target。
  3. 计算目标车道后车的加速度变化 Δa_follower。
  4. 判断:如果 (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
小技巧:实际项目中,我建议把 a_thr 和 b_safe 做成可调参数,方便不同场景标定。比如城市拥堵时 a_thr 可以设小一点(0.1),高速上设大一点(0.3)。

3.2 LC2013 模型:安全第一,效率第二

LC2013 模型是 2013 年提出的,全称我记不太清了,但核心思想我记得很清楚:先确保安全,再考虑是否换道。

它和 MOBIL 最大的区别是什么?

MOBIL 是「收益导向」——换道后我爽不爽?LC2013 是「风险导向」——换道后会不会撞?

LC2013 模型把换道决策分为两步:

  1. 安全判断:目标车道是否有足够的间隙?
  2. 收益判断:换道后速度是否提升?

安全判断是硬约束,不满足绝对不换。收益判断是软约束,满足才换。

安全间隙的计算

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
避坑指南:我曾经在 LC2013 里忘了考虑后车速度,结果后车速度很快但距离远,安全判断通过了,换道后后车急刹车。后来我加上了「后车速度 × t_safe」这个条件,才解决。

3.3 两个模型的对比

特性 MOBIL LC2013
核心思想 利己不损人 安全第一
决策依据 加速度变化 安全间隙 + 速度收益
参数数量 2 个(a_thr, b_safe) 1 个(t_safe)
适用场景 高速公路、自由流 城市道路、拥堵
计算复杂度 中等(需计算加速度) 低(只需距离和速度)

你想想看,MOBIL 更适合「理性司机」,LC2013 更适合「谨慎司机」。实际仿真中,我经常把两者结合:先用 LC2013 做安全过滤,再用 MOBIL 做收益判断。

3.4 知识体系总览

下面这张图是我自己画的,把两个模型的核心逻辑串起来了。你看一眼就能明白它们的关系。

换道模型知识体系 换道决策 MOBIL 模型 利己不损人 · 加速度导向 LC2013 模型 安全第一 · 间隙导向 参数:a_thr, b_safe 依赖跟驰模型 参数:t_safe 两步决策 实际应用:LC2013 做安全过滤 + MOBIL 做收益判断

核心总结:MOBIL 和 LC2013 不是互斥的,而是互补的。我个人的最佳实践是:先用 LC2013 筛掉不安全的换道,再用 MOBIL 从安全的候选里选收益最大的。这样既安全又高效。

好了,换道模型这块就聊到这儿。代码我已经贴出来了,你拿去跑跑看,调调参数,感受一下不同参数对换道行为的影响。仿真这东西,光看理论没用,得动手。

可可精品资料库