You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SUMO仿真中编写Python代码防止公交串车(Bus Bunching)问题

SUMO 公交串车问题Python实现方案(入门级)

核心思路

采用交通工程领域最常用的驻站时间动态调整策略,无需复杂算法,仅通过调整后车驻站时长拉大车距,规避串车现象:

  • 预设线路标准发车间隔
  • 仿真过程中实时获取同线路两车的实时位置、站点停靠状态
  • 当后车与前车间隔小于预设阈值时,延长后车在当前站点的停留时间,直到间隔恢复到合理范围再放行

前置依赖

使用SUMO官方Python控制接口traci,安装命令:
pip install traci

可直接复用的示例代码

以下代码针对2台公交的单线场景编写,所有可配置参数均做了标注,你只需修改对应参数适配自己的仿真场景即可:

import traci

# ========== 以下参数根据你的仿真场景修改 ==========
BUS_ROUTE_ID = "bus_line_01"  # 你的公交线路对应的route ID
STANDARD_HEADWAY = 600  # 线路预设发车间隔,单位:秒,示例为10分钟
MIN_ALLOWED_HEADWAY_RATIO = 0.7  # 最小允许间隔占标准间隔的比例,小于该值触发调整
MAX_EXTRA_DWELL = 120  # 单站最多额外停留时间,单位:秒,避免后车无限驻站
SUMOCFG_PATH = "your_sim_config.sumocfg"  # 你的sumocfg配置文件路径
# =================================================

# 启动仿真
traci.start(["sumo-gui", "-c", SUMOCFG_PATH])

# 仿真主循环
while traci.simulation.getMinExpectedNumber() > 0:
    # 执行单步仿真
    traci.simulationStep()
    
    # 获取当前线路上的所有运营公交
    all_vehicles = traci.vehicle.getIDList()
    line_buses = [v for v in all_vehicles if traci.vehicle.getRouteID(v) == BUS_ROUTE_ID]
    # 按车辆在线路上的前进位置排序,排在前面的是先发车的前车
    line_buses.sort(key=lambda x: traci.vehicle.getDistance(x), reverse=True)
    
    # 当线路上同时有2台公交在运营时执行控制逻辑
    if len(line_buses) == 2:
        front_bus, rear_bus = line_buses[0], line_buses[1]
        # 仅在后车处于站点停靠状态时执行调整
        if traci.vehicle.isStopped(rear_bus):
            # 计算两车当前实际发车间隔
            front_last_depart_time = traci.vehicle.getLastStopDeparture(front_bus)
            rear_arrive_time = traci.simulation.getTime() - traci.vehicle.getStopWaitingTime(rear_bus)
            current_headway = front_last_depart_time - rear_arrive_time
            
            # 间隔过小触发驻站延长
            if current_headway < STANDARD_HEADWAY * MIN_ALLOWED_HEADWAY_RATIO:
                need_extra_dwell = (STANDARD_HEADWAY * MIN_ALLOWED_HEADWAY_RATIO) - current_headway
                # 控制额外驻站时间不超过上限
                need_extra_dwell = min(need_extra_dwell, MAX_EXTRA_DWELL)
                # 更新后车的驻站时长
                current_remaining_dwell = traci.vehicle.getStopRemainingDuration(rear_bus)
                traci.vehicle.setStop(
                    vehID=rear_bus,
                    stopID=traci.vehicle.getStopID(rear_bus),
                    duration=current_remaining_dwell + need_extra_dwell
                )

# 关闭仿真
traci.close()

场景调优提示

  • 首次测试可以将MIN_ALLOWED_HEADWAY_RATIO设置在0.6~0.8区间,数值越高防串车效果越强,但可能会略微降低后车的准点率
  • 若仿真场景中社会车辆干扰较大,可以适当调高STANDARD_HEADWAY的数值,预留足够的容错空间
  • MAX_EXTRA_DWELL可根据站点实际运营限制调整,避免后车在站点停留时间过长影响乘客体验

内容的提问来源于stack exchange,提问作者Ifezue Obiako

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 11:27:00