Rerouter

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" 强制重定向器关闭道路段 。通常会通过该道路段的车辆,在到达重定向器声明中 edges 属性给出的道路段之一时,将获得新的路线。选择新路线的算法与 分配新目的地 中描述的相同,但附加了必须避开已关闭道路段的约束。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 关闭的预计结束时间(可选)。如果绕行所需时间比等待关闭结束的时间长,车辆将保持在原路线上并等待。

当使用没有 allowdisallow 属性的 <closingReroute> 时,无法通过替代路线到达目的地的车辆将简单地继续沿原路线行驶,并实际上忽略道路段的关闭。当使用 allowdisallow 属性(同一定义中只能使用其中一个)时,无法改变路线的车辆将在关闭的道路段前停止,直到定义的时间间隔结束。这可用于模拟由突发道路关闭引起的交通拥堵。

Caution

当使用修改后的权限时,可能需要使用选项 --ignore-route-errors,因为在关闭期间插入的车辆可能会引发路线错误。此外,权限可能导致紧急制动。这可以通过在关闭处前方放置 VariableSpeedSigns 并在关闭前短暂减慢交通流来缓解。

Caution

当将修改后的权限与选项/参数 device.rerouting.mode=8 一起使用时,模拟中任何时刻最多只能有一个包含所有关闭的重定向器定义。否则,车辆可能会在两个关闭的道路段之间无限循环(因为忽略了当前重定向器之外的所有关闭)。

关闭车道 (Closing a Lane)#

"closingLaneReroute" 强制重定向器通过将其权限设置为 authority(可自定义)来关闭车道 。通过该路线并配备了 重定向设备 的车辆,在到达重定向器声明中 edges 属性给出的道路段之一时,可能会计算出新的路线。closingLaneReroute 定义如下所示:

<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 定义来模拟可逆车道,方法如下:

要为特定持续时间改变其方向,可以使用以下重定向器:

<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.setAllowedsetDisallowed

分配新目的地 (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 算法计算,起点是车辆所在的位置,终点是新的目的地。路由时考虑以下行程时间(使用第一个适用的值):

destProbReroute 中使用的属性如下:

属性名称 (Attribute Name) 值类型 (Value Type) 描述 (Description)
id id (string) 新目的地的 id;该 id 必须是网络中某个道路段的 id,或者是特殊值 keepDestinationterminateRoute
probability float (应在 0 和 1 之间) 车辆将给定道路段作为目的地的概率;概率会自动归一化,使其总和为 1

Note

可以在同一时间间隔内组合 closingReroutedestProbReroute。在这种情况下,只有无法到达原始目的地的车辆才会从概率分布中抽取新目的地。

特殊目的地值#

  • 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"
    • 其当前目的地停车区已满

定义如下所示:

   <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 自动生成。

停车搜索指的是车辆遇到已被占用的停车区,必须从替代目的地列表中进行选择,但不知道其占用状态的情况。车辆必须迭代地驶向替代目的地,直到找到空闲停车位。之前访问过(且被占用)的停车区可能会被合理地再次访问,期望自上次访问以来已清空。默认情况下,车辆在 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 parkingAreaRerouteprobability 属性的影响
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)#

通常,重定向到新停车区的车辆在完成停靠后将继续前往其原始目的地。在以下特殊情况下:

  1. 原始路线在原始停车区道路段结束,并且
  2. 到达位置 (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 .../> 影响的道路段(其他车辆不会直接受影响)。

  1. 关闭样式
    • a) 硬关闭:<closingReroute> 使用属性 'allow' 或 'disallow' 来禁止车辆
    • b) 软关闭:未使用属性(道路段使用被劝阻但未被禁止)
  2. 替代方案
    • a) 存在替代路线
    • b) 不存在替代路线
  3. 绕行标志
    • a) 在替代路线分支之前遇到了重定向器道路段
    • b) 在替代路线分支之前没有遇到重定向器道路段
  4. 车辆样式
    • a) 车辆定义了起点和终点,受影响的道路段位于首选路线上(即 <trip from="..." to="...">
    • b) 车辆定义了固定路线
  5. 关闭时间与出发时间
    • a) 车辆在关闭生效后出发
    • b) 车辆在关闭生效前出发(关闭发生在途中)
  6. 车辆的路由模式(通过 --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,车辆将被丢弃并发出警告。