generateRailSignalConstraints.py#
生成用于强制执行给定铁路时刻表的约束。 示例:
<SUMO_HOME>/tools/generateRailSignalConstraints.py -r <input-route-file> -n <input-net-file> -a <input-stop-file> -o <output-file>
生成的约束#
在不同情况下会生成不同类型的约束:
1. predecessor (前驱)#
当两辆车随后在同一 busStop (trainStop) 停车,并且它们通过不同的路线到达该站点时,系统会识别出两条路线合并的道岔,并为守卫该合并道岔的铁路信号创建约束: 稍后到达站点的车辆 B 必须(在其信号 Y 处)等待先到达的车辆 A(通过其各自的信号 X)。 这使用了车辆停站的 'arrival' 属性。
如果第一辆车的信号被其他正在前往另一站点的列车通过,则会出现复杂情况。这使得需要在模拟中记录大量通过的车辆(由 limit 属性控制)。该脚本试图通过识别在 A 和 B 到达各自信号的时间之间(基于 "arrival" 从下一站倒推)经过信号 X 前往其他站点的所有车辆,来确定必要的 limit 值。为了考虑延误,可以使用选项 --delay 和 --limit 来覆盖 limit 值。
当合并道岔后的下一站对两列火车来说不同时,会出现更复杂的情况,即使它们的路线相同。在这种情况下,列车的顺序必须从它们下一个共同站点推导出来,算法会在道岔后直接添加一个 "virtual" intermediateStop (虚拟中间站) 以“规范化”输入。
2. insertionPredecessor (插入前驱)#
每当车辆 B 在站点出发时(假定与其第一个站点的 "until" 属性重合),系统会识别出离开该站点的前一列火车 A(同样基于 "until")。然后创建一个约束,防止插入 B,直到火车 A 已通过位于该站点之外的下一个信号。
在停车站点 (parking-stops) 的背景下也需要这些约束,因为它们有可能改变列车顺序:
如果车辆 A 有一个带 'ended' 时间的停车站点,而车辆 B 在同一位置有一个没有 'ended'(只有 'until' 时间)的停车站点,则会为 B 创建一个 insertionPredecessor 约束,以确保 A 先离开。这是因为 'ended' 值的可用性意味着该事件发生在过去,而缺少该值则表明该站点仍在将来。
如果 intermediateStop(见上文)也是一个停车站点,并且停车车辆被安排在第二个出发,则会添加 insertionPredecessor 约束。
3. foeInsertion (敌对插入)#
每当车辆 A 在站点出发时(假定与其第一个站点的 "until" 属性重合),系统会识别出进入该站点的后一列火车 B(同样基于 "until")。然后创建一个约束,防止 B 进入包含该站点的路段,直到 A 已通过位于该站点之外的下一个信号。
4. insertionOrder (插入顺序)#
每当两辆车在同一站点出发,并且它们在该站点的 until/ended 时间顺序与它们的出发时间顺序不同时,会添加一个 insertionOrder 约束以延迟插入,从而实现所需的顺序。 如果出发时间反映了时刻表,但 until/ended 时间反映了事后计时(见下文),则可能发生这种情况。
5. bidiPredecessor (双向前驱)#
每当两列火车从不同方向接近同一轨道段时,可以选择生成 bidiPredecessor 约束,以根据各自侧紧随该路段之后的站点到达时间来强制进入该路段的顺序。 (站点到达时间必须根据冲突路段末端与站点之间的估计行驶时间进行校正)
不一致性#
不一致的约束可能由不一致的输入引起,并导致模拟死锁。为了避免这种情况,可以使用选项 --abort-unordered 来避免生成可能不一致的约束。 当设置了该选项时,车辆的顺序会根据到达时间和 until 时间进行交叉检查:
假设两辆车 A 和 B 在同一位置停靠,如果 A 比 B 晚到达站点,但 A 也比 B 早离开,则 B 被 A "超车"。B 的所有后续站点将被标记为无效,并且不会参与约束生成。如果发生超车的站点没有 'started' 值(这意味着原始时刻表不一致),则该站点也会被标记为无效。
如果两辆车在同一位置有一个 'parking'-stop 且具有相同的 'until' 时间,它们的站点也将被标记为无效,因为模拟无法在此情况下强制执行顺序(并且局部期望顺序是模糊的)。
另一种不一致性是由 'ended' 时间显著领先于相应站点的 'until' 时间(--)所指示的。 这种情况可能对应于现实生活中的调度员操作。在这种情况下,必须不再施加任何约束,因为它不再按照时刻表运行。
事后站点计时#
当模拟过去(即预测未来)时,除了计划的到达和 until 时间外,可能还有额外的计时数据,并包含在每个站点的 'started' 和 'ended' 属性中。 它们可用于检测实际列车运行期间发生的列车顺序变化,在约束生成期间必须考虑这些变化以避免死锁。 如果列车 A 对某个站点有 'started' 信息,而列车 B 没有,这意味着 A 在 B 之前到达了该站点。 同样,两列列车可能都有 'started' 信息,但顺序与时刻表相反。 对于所有具有完整的 started, ended 信息的站点,这些时间可以用作更新后的时刻表(替换 arrival 和 until)。但是,如果检测到列车顺序反转,则不应再基于旧时刻表生成任何约束(在 started, ended 信息结束后的站点将被忽略)。
更多选项#
如果需要在模拟期间修改约束 (traci.trafficlight.swapConstraints),添加额外的约束可能是有用的,否则这些约束将是冗余的。这可以通过设置选项 --redundant 并指定一个时间范围来实现。设置后,在给定时间范围内跟随受约束列车的列车(通常会被其前导列车隐式约束)也将获得一个约束。在这种情况下,必须使用选项 --limit 以确保在模拟期间记录所有约束敌对车辆。
scheduleStats.py#
比较输入时刻表 (route-file) 和模拟输出 (stop-output) 之间的站点到达和出发情况。结果将打印在命令行上。
示例:
<SUMO_HOME>/tools/output/scheduleStats.py -r <input-route-file> -s <stop-file>
选项:
- --xml-output FILE (-o): 将统计信息以 xml 格式写入 FILE
- --statistic-type (-t): 选择要计算的统计类型
- 'd' : 站点出发延误
- 'a' : 站点到达延误
- 's' : 站点持续时间差异
- 'de' : 站点出发延误(与输入中的 'ended' 比较)
- 'as' : 站点到达延误(与输入中记录的 'started' 比较)
- 't' : 根据时刻表的行驶时间与模拟中的行驶时间(站点之间)
- 'T' : 根据记录的行驶时间与模拟中的行驶时间(站点之间)
- --group-by (-g): 按一个或多个属性对结果进行分组 (vehID,tripId,stopID,priorStop)
- --group-statistic-type (-T): 选择对组值进行统计的类型(即通过平均出发延误来比较组)。允许的值为 mean, median, min, max
- --histogram FLOAT (-i): 添加具有给定箱宽的直方图
- --group-histogram FLOAT (-I): 对组值添加直方图(使用 -g 时),具有给定的箱宽
示例:
<SUMO_HOME>/tools/output/scheduleStats.py -r <input-route-file> -s <stop-file> -t d -i 50
<SUMO_HOME>/tools/output/scheduleStats.py -r <input-route-file> -s <stop-file> -t a -g stopID -T median -I 10
checkReversals.py#
此工具计算每辆车的反转次数以及每条边发生的反转次数。
示例:
<SUMO_HOME>/tools/route/checkReversals.py -n <input-net-file> -r <input-route-file> -o reversals.xml
plotStops.py#
绘制公共交通时刻表(计划的或实际的时间)。此脚本是 plotXMLAttributes.py 的包装器,其主要优势在于定义沿指定线路的站点顺序,并按人类可读的站点名称而不是特定轨道的站点位置聚合数据。 有几个选项直接传递给 plotXMLAttributes.py
以下示例展示了如何处理由 osmWebWizard.py 创建的文件(后台使用 ptlines2fows.py)。输入文件可以在 SUMO 2025 User Conference Tutorial 中找到。
以下参数是必需的:
- -r, --route-file: 定义沿 x 轴站点顺序的文件
- -i, --veh-id: route-file 中车辆、行程或流的 id,用于选择要绘制的路线
还建议设置选项 -a,--stop-file** 及公共交通站点的定义,以便读取它们的名称。
示例:加载模拟输入
<SUMO_HOME>/tools/visualization/plotStops.py -r osm_pt.rou.xml -a osm_stops.add.xml -i pt_light_rail_S46:1 -v --legend --filter-ids \*S46\*

示例:使用 --vehroute-output vehroutes.xml 运行模拟后
<SUMO_HOME>/tools/visualization/plotStops.py -r vehroutes.xml -a osm_stops.add.xml -i pt_light_rail_S46:1.0 -v --legend --filter-ids \*S46\*
Note
这里,选项 -i 引用的是车辆 id,而不是前面示例中的流 id

示例:使用 --stop-output stopinfos.xml 运行模拟后以读取实际时间。 通过在前面的选项中添加选项 -s, --stopinfo-file 来加载此类文件。
<SUMO_HOME>/tools/visualization/plotStops.py -r vehroutes.xml -a osm_stops.add.xml -i pt_light_rail_S46:1.0 -s stopinfos.xml -v --legend --filter-ids \*S46\*

