引言#
在以下情况下,在运行的仿真中进行动态路径规划可能是合适的:
- 没有足够的时间/计算能力等待动态用户均衡
- 仿真运行期间路网发生变化
- 车辆在运行过程中需要调整其路径
在这种情况下,可以直接使用 sumo 进行路径规划,输入文件可以是路径文件或行程文件(或两者的混合)。
这种路径规划方法的工作原理是赋予部分或全部车辆定期重新计算其路径的能力。这种路径规划考虑了路网中当前和最近的交通状态,从而能适应拥堵和路网中的其他变化。
下面列出的选项允许配置哪些车辆应配备该设备、应多久做出一次重路由决策以及如何根据当前和最近的知识计算行程时间估计值。
有关路径规划的更多信息。
选项#
与此路径规划相关的选项如下:
| 选项 | 默认值 | 描述 |
|---|---|---|
| --device.rerouting.probability <FLOAT> | -1 | 车辆拥有路径规划设备的概率(此处 -1 等同于 0) |
| --device.rerouting.explicit <STRING> | 为指定名称的车辆分配设备 | |
| --device.rerouting.deterministic | false | 设备的设置是确定性的,使用 1000 的一部分(与定义的概率一起使用) |
| --device.rerouting.period <STRING> | 0 | 车辆进行重路由的周期 |
| --device.rerouting.pre-period <STRING> | 60 | 在插入/出发前的重路由周期 |
| --device.rerouting.adaptation-interval <INT> | 1 | 更新路段权重的间隔。 |
| --device.rerouting.adaptation-weight <FLOAT> | 0.0 (禁用) | 先前路段权重的权重,用于指数平均,范围为 [0, 1]。 |
| --device.rerouting.adaptation-steps <INT> | 180 | 用于平均的适应步数(值 > 0 时启用)。 |
| --device.rerouting.with-taz | false | 使用交通分区 (TAZ/区域)作为路径规划的终点 |
| --device.rerouting.init-with-loaded-weights | false | 在仿真开始时使用 --weight-files 选项初始化路段权重 |
| --device.rerouting.mode | 0 | 配置临时障碍物的处理方式 |
请注意,如果车辆获得了路径规划设备,默认情况下仅在插入前激活重路由。为了激活途中的定期重路由,需要设置 --device.rerouting.period。
路段权重#
如果为任何车辆启用了路径规划,路网中所有路段的平均行程时间将被收集。如果车辆需要进行路径规划(无论是因为它被插入,还是因为通过 ".period" 选项启用了重复路径选择),它将根据当前的路段权重(行驶速度,从而也是行程时间)选择到达其目标路段(或区域)的最快路径。路段权重的更新不是简单地覆盖旧值,而是按照下述方法计算加权平均值。由于在每个仿真步长更新所有路段的权重会导致仿真速度显著减慢,因此可以使用 ".adaptation-interval" 选项更改此间隔。
注意
当使用 TraCI 函数 vehicle.rerouteTraveltime 和 vehicle.changeTarget 时,如果通过 vehicle.setRoutingMode 将路径规划模式设置为 ROUTING_MODE_AGGREGATED,也会使用这些权重。同样,通过将参数 routingMode=ROUTING_MODE_AGGREGATED,函数 simulation.findRoute 也可以切换为使用这些权重。
通过指数平均进行调整#
通过设置选项 --device.rerouting.adaptation-weight <FLOAT>,每个路段的行驶速度计算如下:
FLOAT * priorValue + (1 - FLOAT) * currentMeanSpeed
此平均操作以 --device.rerouting.adaptation-interval 设置的周期进行。
通过移动平均进行调整#
通过设置选项 --device.rerouting.adaptation-steps <INT>,每个路段的行驶速度计算为 INT 个最新的 meanSpeed 值的平均值。此平均操作以 --device.rerouting.adaptation-interval 设置的周期进行。
注意
时间间隔内的速度值会参与平均,该时间间隔回溯的距离为 adaptation-interval 和 adaptation-steps 的乘积。
检查路段权重#
为了理解仿真过程中路段权重的演变,详细查看数值会很有帮助:
- 在 sumo-gui 中使用按路径规划设备假定速度的道路着色
- 使用选项 --device.rerouting.output <FILE> 获取原始数字
- 使用 TraCI 函数 ''vehicle.getParameter("device.rerouting.edge:EDGEID") 来检索单个路段的平均行程时间值
不完整的行程和流量#
所有使用行程作为输入(或具有 "from" 和 "to" 属性的流量)创建的车辆在插入时会自动进行路径规划,无需为它们显式实例化设备。每当在路径规划过程中发生错误,因为找不到包含所有必经路段("from"、"to" 以及所有按正确顺序的停靠点路段)且连通(同时遵守车辆类别权限)的路径时,这是一个致命错误,会停止仿真。可以通过使用 --ignore-route-errors 来关闭此功能,该选项将在错误情况下保持路径不变。如果车辆还没有路径(因为它是使用行程定义的)并且找不到路径,同时使用了 --ignore-route-errors,它将不会被插入。
除了使用 "from" 和 "to" 属性外,也可以使用 "fromTaz" 和 "toTaz",前提是加载了区域文件。
通过参数进行替代声明#
定义配备重路由设备的车辆集合的另一种方法是通过通用参数。
以下参数支持作为 <vType>、<vehicle>、<trip> 或 <flow> 的子元素:
- device.rerouting.period
- device.rerouting.pre-period
- device.rerouting.probability
- device.rerouting.deterministic
- device.rerouting.mode
- has.rerouting.device
TraCI#
可以使用 TraCI 函数 vehicle.getParameter 和 vehicle.setParameter 访问该设备:
getParameter
- device.rerouting.period (以秒为单位返回单独的重路由周期)
- device.rerouting.edge:EDGE_ID (返回用于重路由的假定行程时间,其中 EDGE_ID 是网络路段的 ID)
- has.rerouting.device (根据是否配备了设备返回 "true" 或 "false")
setParameter
- device.rerouting.period (双精度字面量,以秒为单位设置重路由周期)
- device.rerouting.edge:EDGE_ID (双精度字面量,为所有车辆设置重路由的假定行程时间(其中 EDGE_ID 是网络路段的 ID)。此值将在下一个更新间隔 (--device.rerouting.adaptation-interval) 被覆盖。
- has.rerouting.device ("true"):可用于动态启用自动重路由
改进阈值#
默认情况下,如果新路径被认为比旧路径减少的行程时间大于任何数量,定期重路由就会更改车辆的路径。
设 oldTime 为当前路径的估计行程时间,newTime 为最快路径的估计时间:
- 当设置选项 --device.rerouting.threshold.factor FLOAT 时,仅当
oldTime / newTime > FLOAT时才会更改路径。 - 当设置选项 --device.rerouting.threshold.constant FLOAT 时,仅当
oldTime - newTime > FLOAT时才会更改路径。
当两个选项都设置时,必须同时满足两个条件。
随机性#
当设置选项 --weights.random-factor <FLOAT> 时,用于路径规划的路段权重会通过从 [1,<FLOAT>] 均匀抽取的随机因子进行动态扭曲。每次使用路段权重时都会执行此随机化,因此同一车辆在不同时间步进行重路由时可能会选择不同的路径。以这种方式生成的路径可能比最快路径长给定的因子(在最坏情况下)。这种随机性是在网格网络中实现合理路径分布以及在其他有许多相似路径替代方案的情况下的一种好方法。
并行化#
仿真中的路径规划可以并行化。当定期重路由激活时,这尤其有用,因为它可能消耗大量的处理时间。要执行并行路径规划,请将选项 --device.rerouting.threads <INT> 设置为所需的并行线程数。
设置选项 --device.rerouting.synchronize 也可能有帮助,该选项确保所有车辆在同一时间进行重路由(默认情况下,重路由周期与车辆插入时间对齐)。
