如何在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
相关产品推荐
相关产品推荐

