Rerouter (重定向器)#
Rerouter 在车辆驶入指定的道路段 (edge) 时,改变该车辆的路线。
通过在 additional-file 中添加以下声明行,可以将重定向器设置到模拟网络中:<rerouter id="<REROUTER_ID>" edges="<EDGE_ID>[;<EDGE_ID>]*" file="<DEFINITION_FILE>" [probability="<PROBABILITY>"]/>。重定向器可以放置在多个道路段上,但至少需要一个道路段。此外,可以通过在定义中给出一个介于 0(无)和 1(全部)之间的数字来定义车辆重定向的概率。声明值如下:
| 属性名称 (Attribute Name) | 值类型 (Value Type) | 描述 (Description) |
|---|---|---|
| id | id (string) | 重定向器的 id |
| edges | stringList | 需要进行重定向的道路段 id 列表 |
| probability | float | 车辆重定向的概率 (0-1),默认为 1 |
| timeThreshold | time (s) | 重定向器生效前所需的最小累积等待时间(默认为 0,即始终生效) |
| vTypes | stringList | 以空格分隔的 vType ID 列表,该重定向器仅对这些类型的车辆生效(默认为 "",即对所有车辆生效) |
| off | bool | 重定向器是否初始处于非活动状态(可在图形界面中开启),默认值:false |
| optional | bool | 车辆/人员是否需要主动请求重定向,默认值:false |
| pos | float | 在道路段上的位置,默认值:undefined |
| radius | float | 触发重定向器的距离,默认值:infinity |
重定向器可以以几种不同的方式工作。在一段时间内,您可以关闭某条道路段,或为车辆分配新的目的地或预定义的路线。接下来的章节将详细描述这些操作。
定义样式#
有两种声明重定向器的样式。
所有内容在一个文件中#
additional-file 如下所示:
<additional>
<rerouter id="<REROUTER_ID>" edges="<EDGE_ID>[;<EDGE_ID>]*" [probability="<PROBABILITY>"]>
<interval begin="<BEGIN_TIME>" end="<END_TIME>">
... action description ...
</interval>
... further intervals ...
</rerouter>
... further rerouters ...
</additional>
定义在单独的文件中#
additional-file 如下所示:
<additional>
<rerouter id="<REROUTER_ID>" edges="<EDGE_ID>[;<EDGE_ID>]*" [probability="<PROBABILITY>"]>
<include href="definitions.xml"/>
</rerouter>
... further rerouters ...
</additional>
而文件 definitions.xml(描述随时间变化的操作)如下所示:
<interval begin="<BEGIN_TIME>" end="<END_TIME>">
... action description ...
</interval>
... further intervals ...
注意,定义文件没有根级元素。
以下所有示例均使用 everything-in-one-file 语法。
Caution
重定向器属性 file 用于包含附加定义的功能已在 1.13.0 版本中移除。
关闭街道 (Closing a Street)#
"closingReroute" 强制重定向器关闭道路段
<rerouter>
<interval begin="<BEGIN_TIME>" end="<END_TIME>">
<closingReroute id="<EDGE_ID>"/>
</interval>
... further intervals ...
</rerouter>
此类定义中使用的属性如下:
| 属性名称 (Attribute Name) | 值类型 (Value Type) | 描述 (Description) |
|---|---|---|
| id | id (string) | 关闭的道路段 id;该 id 必须是网络中某个道路段的 id |
| allow | vehicle classes list | (可选)以空格分隔的 车辆类别 列表,这些类别的车辆仍被允许在关闭的道路段上行驶。其他所有类别均被禁止。 |
| disallow | vehicle classes list | (可选)以空格分隔的 车辆类别 列表,这些类别的车辆被禁止在关闭的道路段上行驶。其他所有类别均被允许。 |
| until | time | 关闭的预计结束时间(可选)。如果绕行所需时间比等待关闭结束的时间长,车辆将保持在原路线上并等待。 |
当使用没有 allow 和 disallow 属性的 <closingReroute> 时,无法通过替代路线到达目的地的车辆将简单地继续沿原路线行驶,并实际上忽略道路段的关闭。当使用 allow 或 disallow 属性(同一定义中只能使用其中一个)时,无法改变路线的车辆将在关闭的道路段前停止,直到定义的时间间隔结束。这可用于模拟由突发道路关闭引起的交通拥堵。
Caution
当使用修改后的权限时,可能需要使用选项 --ignore-route-errors,因为在关闭期间插入的车辆可能会引发路线错误。此外,权限可能导致紧急制动。这可以通过在关闭处前方放置 VariableSpeedSigns 并在关闭前短暂减慢交通流来缓解。
Caution
当将修改后的权限与选项/参数 device.rerouting.mode=8 一起使用时,模拟中任何时刻最多只能有一个包含所有关闭的重定向器定义。否则,车辆可能会在两个关闭的道路段之间无限循环(因为忽略了当前重定向器之外的所有关闭)。
关闭车道 (Closing a Lane)#
"closingLaneReroute" 强制重定向器通过将其权限设置为 authority(可自定义)来关闭车道
<rerouter>
<interval begin="<BEGIN_TIME>" end="<END_TIME>">
<closingLaneReroute id="<LANE_ID>"/>
</interval>
... further intervals ...
</rerouter>
此类定义中使用的属性如下:
| 属性名称 (Attribute Name) | 值类型 (Value Type) | 描述 (Description) |
|---|---|---|
| id | id (string) | 关闭的车道 id;该 id 必须是网络中某个车道的 id |
| allow | vehicle classes list | (可选)以空格分隔的 车辆类别 列表,这些类别的车辆仍被允许在关闭的道路段上行驶。其他所有类别均被禁止。(默认为 authority) |
| disallow | vehicle classes list | (可选)以空格分隔的 车辆类别 列表,这些类别的车辆被禁止在关闭的道路段上行驶。其他所有类别均被允许。(如果只有少数类别需要被禁止,可以使用此属性代替 allow 以求简洁)。 |
Note
修改后的权限可能导致紧急制动。这可以通过在关闭处前方放置 VariableSpeedSigns 并在关闭前短暂减慢交通流来缓解。
可逆车道 (Reversible Lanes)#
可以使用两个 closingLaneReroute 定义来模拟可逆车道,方法如下:
- 定义两个反向的道路段,每个至少有 2 条车道
- 禁止在其中一条中心车道上行驶 (disallow="all")
- 并修改道路段几何形状,使中心车道占据相同的空间。
要为特定持续时间改变其方向,可以使用以下重定向器:
<rerouter id="example" edges="E1 -E1">
<interval begin="7:0:0" end="8:30:0">
<closingLaneReroute id="E1_1" allow="all"/>
<closingLaneReroute id="-E1_1" disallow="all"/>
</interval>
</rerouter>
除了使用重定向器改变车道权限外,还可以使用 traci 函数 traci.lane.setAllowed 和 setDisallowed。
分配新目的地 (Assigning a new Destination)#
"destProbReroute" 强制重定向器为通过重定向器声明中 edges 属性定义的道路段之一的车辆分配新的路线。使用由相应元素中名称定义的新路线目的地:
<rerouter>
<interval begin="<BEGIN_TIME>" end="<END_TIME>">
<destProbReroute id="<EDGE_ID1>" probability="<PROBABILITY1>"/>
<destProbReroute id="<EDGE_ID2>" probability="<PROBABILITY2>"/>
</interval>
... further intervals ...
</rerouter>
最快的路线会自动使用 Dijkstra 算法计算,起点是车辆所在的位置,终点是新的目的地。路由时考虑以下行程时间(使用第一个适用的值):
- 如果车辆配备了 重定向设备,则使用网络中当前(平滑后的)行程时间
- 如果通过 TraCI 命令 change edge travel time information 设置了主观道路段成本,则使用该成本
- 通过 sumo 选项 --weight-files 加载的道路段权重
- 空网络中的行程时间
destProbReroute 中使用的属性如下:
| 属性名称 (Attribute Name) | 值类型 (Value Type) | 描述 (Description) |
|---|---|---|
| id | id (string) | 新目的地的 id;该 id 必须是网络中某个道路段的 id,或者是特殊值 keepDestination、terminateRoute |
| probability | float (应在 0 和 1 之间) | 车辆将给定道路段作为目的地的概率;概率会自动归一化,使其总和为 1 |
Note
可以在同一时间间隔内组合 closingReroute 和 destProbReroute。在这种情况下,只有无法到达原始目的地的车辆才会从概率分布中抽取新目的地。
特殊目的地值#
- keepDestination:车辆继续沿当前路线行驶
- terminateRoute:车辆立即离开模拟,并在重定向器道路段的当前位置计为已到达
分配新路线 (Assigning a new Route)#
"routeProbReroute" 强制重定向器为通过重定向器声明中 edges 属性定义的道路段之一的车辆分配新的路线。在这种情况下,必须提供完整路线的 id,而不是新的目的地:
<rerouter>
<interval begin="<BEGIN_TIME>" end="<END_TIME>">
<routeProbReroute id="<ROUTE_ID1>" probability="<PROBABILITY1>"/>
<routeProbReroute id="<ROUTE_ID2>" probability="<PROBABILITY2>"/>
</interval>
... further intervals ...
</rerouter>
此类定义中使用的属性如下:
| 属性名称 (Attribute Name) | 值类型 (Value Type) | 描述 (Description) |
|---|---|---|
| id | id (string) | 要分配的新路线的 id;该 id 必须是先前加载的路线的 id |
| probability | float | 车辆将给定道路段作为目的地的概率(默认为 1)。概率会自动针对所有条目进行归一化 |
重复的公共交通路线#
如果重定向器分配的新路线包含停靠点,车辆将使用这些停靠点。如果停靠点使用了 'until' 属性,则路线应使用属性 'cycleTime' 以在每次重复时将 until 时间偏移设定的量。
重定向到替代停车区 (Rerouting to an alternative Parking Area)#
停在 停车区 的车辆可能会遇到停车区已达到容量限制且不允许停车的情况。
在这种情况下,车辆要么在道路上等待直到有停车位,要么可以重定向到替代停车区。对于后一种行为,必须指定 parkingAreaReroute 定义。此重定向器定义了一组可以相互用作替代方案的停车区。在以下两种情况下会触发重定向到另一个停车区:
- 当车辆到达停车区但因缺乏容量而无法停车时
- 当车辆进入重定向器道路段之一,且满足以下所有条件时:
- 其当前目的地停车区属于 parkingAreaReroute 定义集,并且具有属性
visible="true" - 其当前目的地停车区已满
- 其当前目的地停车区属于 parkingAreaReroute 定义集,并且具有属性
定义如下所示:
<rerouter id="myRerouter" edges="a b">
<interval begin="0" end="2000">
<parkingAreaReroute id="ParkAreaA"/>
<parkingAreaReroute id="ParkAreaB"/>
</interval>
</rerouter>
此类定义中使用的属性如下:
| 属性名称 (Attribute Name) | 值类型 (Value Type) | 描述 (Description) |
|---|---|---|
| id | id (string) | 现有停车区的 id |
| probability | float | 每个替代方案被选中的概率(默认为 1)。 |
| visible | bool | 在到达停车区道路段之前是否已知该停车区的占用情况(这模拟了视线以及停车信息系统)。 |
Note
用于模拟停车搜索的 <parkingAreaReroute> 定义可以使用工具 generateParkingAreaRerouters.py 自动生成。
停车搜索中的记忆 (Memory in parking search)#
停车搜索指的是车辆遇到已被占用的停车区,必须从替代目的地列表中进行选择,但不知道其占用状态的情况。车辆必须迭代地驶向替代目的地,直到找到空闲停车位。之前访问过(且被占用)的停车区可能会被合理地再次访问,期望自上次访问以来已清空。默认情况下,车辆在 600 秒内不会再次访问已被占用的停车区。这可以通过车辆参数或 vType 参数修改如下:
<vehicle ...>
<param key="parking.memory" value="300"/>
</vehicle
Caution
在 1.10.0 版本之前,停车记忆为 0,这可能导致车辆仅重复访问一小部分区域。
确定替代停车区 (Determining the alternative parking area)#
替代停车区将在所有可见且至少有 1 个空闲空间的停车区中,根据多个属性的最小加权和进行选择。对于不可见的停车区(属性 visible="false"),占用值取为 [0, capacity] 之间的随机数,这意味着即使已满,它们也始终在替代方案集中。每个属性(即占用率、时间、距离)都归一化为 [0-1],范围是所有具有正剩余容量的候选停车区中的最大值,并在必要时取反。取反意味着取剩余值(1 - 归一化值)而不是归一化值本身。
默认情况下,仅考虑从当前车辆位置到新停车区的距离。下表描述了可以使用 车辆或其 vType 的通用参数 自定义的权重因子:
| 参数名称 (Parameter Name) | 默认值 (Default value) | 描述 (Description) | 反向 (Bigger is better) |
|---|---|---|---|
| parking.probability.weight | 0 | parkingAreaReroute 的 probability 属性的影响 |
是 |
| parking.capacity.weight | 0 | 停车区的总容量 | 是 |
| parking.absfreespace.weight | 0 | 空闲位置的绝对数量 | 是 |
| parking.relfreespace.weight | 0 | 空闲位置的相对数量 | 是 |
| parking.distanceto.weight | 1 | 到停车区的道路距离 | 否 |
| parking.timeto.weight | 0 | 到停车区的假定行程时间 | 否 |
| parking.distancefrom.weight | 0 | 从停车区到车辆目的地的道路距离 | 否 |
| parking.timefrom.weight | 0 | 从停车区到车辆目的地的假定行程时间 | 否 |
当 'parking.probability.weight' 设置为正值时,会为每个候选停车区抽取一个介于 0 和属性 'probability' 之间的随机数。然后,该值通过除以所有 parkingAreaReroute 元素的最大概率值归一化到 [0,1] 范围内。然后,反转的归一化值乘以 parking.probability.weight 以计入候选分数。
影响停车行为的其他参数#
| 参数名称 (Parameter Name) | 默认值 (Default value) | 描述 (Description) |
|---|---|---|
| parking.anywhere | -1 | 在执行不成功的 parkingAreaReroute x 次后,允许使用沿途的任何空闲停车区(-1 禁用此行为) |
| parking.ignoreDest | 0 | 当触发重定向时,无论当前目的地的可见性和占用情况如何,都可以使用任何替代方案 |
| parking.frustration | 100 | 随时间增加对可见空闲停车区的偏好(在 x 次不成功的 parkingAreaReroute 后,占用情况未知的目标将被假定为几乎已满) |
| parking.knowledge | 0 | 让驾驶员以概率 x “猜测”不可见停车区的确切占用情况 |
重定向后的目的地 (Destination after rerouting)#
通常,重定向到新停车区的车辆在完成停靠后将继续前往其原始目的地。在以下特殊情况下:
- 原始路线在原始停车区道路段结束,并且
- 到达位置 (arrivalPos) 在原始停车区的 [startPos, endPos] 范围内
那么新路线也将在新停车区结束,并且新停车区的 endPos 将被设置为新的 arrivalPos。
TraCI 访问 parkingSearch (TraCI access to parkingSearch)#
可以通过调用 traci.vehicle.getParameter 访问 parkingSearch 的当前状态,允许的参数列表见 TraCI/Vehicle_Value_Retrieval。
parkingSearch 示例场景#
测试用例可以在此处下载 here
关闭街道时的车辆行为 (Vehicle Behavior when closing a street)#
车辆与重定向的交互是复杂的,取决于许多不同的因素。下面我们描述了每个因素,然后描述了每个因素组合的行为。
以下假设车辆在其路线上有一条受 <closingReroute .../> 影响的道路段(其他车辆不会直接受影响)。
- 关闭样式
- a) 硬关闭:
<closingReroute>使用属性 'allow' 或 'disallow' 来禁止车辆 - b) 软关闭:未使用属性(道路段使用被劝阻但未被禁止)
- a) 硬关闭:
- 替代方案
- a) 存在替代路线
- b) 不存在替代路线
- 绕行标志
- a) 在替代路线分支之前遇到了重定向器道路段
- b) 在替代路线分支之前没有遇到重定向器道路段
- 车辆样式
- a) 车辆定义了起点和终点,受影响的道路段位于首选路线上(即
<trip from="..." to="...">) - b) 车辆定义了固定路线
- a) 车辆定义了起点和终点,受影响的道路段位于首选路线上(即
- 关闭时间与出发时间
- a) 车辆在关闭生效后出发
- b) 车辆在关闭生效前出发(关闭发生在途中)
- 车辆的路由模式(通过 --device.rerouting.mode 或车辆/vtype
<param key="device.rerouting.mode" value="8"/>设置)- a) 路由模式 0(或通常未设置第 4 位):所有硬关闭在路由期间可见
- b) 路由模式 8(或通常设置了第 4 位):所有硬关闭在路由期间被忽略,并且永远不会导致路线错误
可能的车辆行为如下:
- R:在到达重定向器道路段时使用替代路线
- D:在出发时使用替代路线
- I:忽略已关闭的道路段并继续行驶
- W:在已关闭的道路段前等待,直到其重新开放或达到传送时间(在这种情况下,传送通过已关闭的道路段)
- E:生成错误
发生以下效果:
硬关闭 (Hard closing)#
- 1a-2a-3a-4a-5a: D
- 1a-2a-3a-4a-5b: R
- 1a-2a-3a-4b-5a: R
- 1a-2a-3a-4b-5b: R
- 1a-2a-3b-4a-5a: D
- 1a-2a-3b-4a-5b: W
- 1a-2a-3b-4b-5a: W
- 1a-2a-3b-4b-5b: W
- 1a-2b-3a-4a-5a: E (使用 --ignore-route-errors 或 --device.rerouting.mode 8 时变为 W)
- 1a-2b-3a-4a-5b: W
- 1a-2b-3a-4b-5a: W
- 1a-2b-3a-4b-5b: W
- 1a-2b-3b-4a-5a: E (使用 --ignore-route-errors 或 --device.rerouting.mode 8 时变为 W)
- 1a-2b-3b-4a-5b: W
- 1a-2b-3b-4b-5a: W
- 1a-2b-3b-4b-5b: W
软关闭 (Soft closing)#
- 1b-2a-3a-4a-5a: R
- 1b-2a-3a-4a-5b: R
- 1b-2a-3a-4b-5a: R
- 1b-2a-3a-4b-5b: R
- 1b-2a-3b-4a-5a: I
- 1b-2a-3b-4a-5b: I
- 1b-2a-3b-4b-5a: I
- 1b-2a-3b-4b-5b: I
- 1b-2b-3a-4a-5a: I
- 1b-2b-3a-4a-5b: I
- 1b-2b-3a-4b-5a: I
- 1b-2b-3a-4b-5b: I
- 1b-2b-3b-4a-5a: I
- 1b-2b-3b-4a-5b: I
- 1b-2b-3b-4b-5a: I
- 1b-2b-3b-4b-5b: I
在已关闭的道路段上出发 (Departure on a closed edge)#
当车辆的出发道路段关闭时,对于“软”关闭,车辆将忽略此情况。对于“硬”关闭,模拟将引发错误。如果设置了 --ignore-route-errors,车辆将被丢弃并发出警告。
