随机性

随机性是模拟场景中再现现实的一个重要方面。有多种方法可以为模拟添加随机性。下文将对此进行描述。

随机数生成 (RNG)#

Sumo 实现了 Mersenne Twister 算法来生成随机数。该随机数生成器 (RNG) 使用一个种子值初始化,默认为(任意)值 23423。这种设置使得所有应用程序在默认情况下都是确定性的,因为对于给定的种子,随机数序列是固定的。可以使用选项 --seed <INT> 更改种子。当使用选项 --random 时,种子将基于当前系统时间选择,从而产生真正随机的行为。

模拟使用多个 RNG 实例来解耦不同的模拟方面:

  • 加载车辆时的随机性(typeDistribution, speed deviation,...)
  • 概率流
  • 车辆驾驶动力学
  • 车辆设备

进行解耦是为了确保加载车辆不会影响早期车辆的模拟行为。所有 RNG 都使用相同的种子。

使用不同种子重复运行#

工具 runSeeds.py 可用于使用多个种子高效地重复模拟。有关如何执行此操作的指南,请参阅 FAQ

路线分布#

车辆可以通过固定路线 (<vehicle>) 或起点-终点对 (<trip>) 添加到模拟中。 第三种替代方法是指定一组路线 (<routeDistribution>),并让车辆从该分布中随机抽取一条路线。有关详细信息,请参阅 路线分布

车辆类型分布#

对异构车流进行建模的一种简单方法是定义一个 <vTypeDistribution>,并让每辆车从该分布中随机选择其类型。有关详细信息,请参阅 车辆类型分布

速度分布#

默认情况下,SUMO 中的车辆遵循其行驶车道定义的最高速度(如果其车辆类型的 maximumSpeed 允许)。可以使用 <vType> 属性 speedFactor 修改此行为,该属性使车辆以当前限速的该因子行驶。该属性还允许指定正态分布的参数(带可选的截止值)。随机值在每辆车创建时为其选择一次。使用速度偏差是获得异构车辆速度混合的推荐方法。默认情况下,标准偏差为 10% 的速度分布处于活动状态。有关详细信息,请参阅 速度分布

车辆跟驰#

默认的 车辆跟驰模型 Krauss 通过 vType 属性 sigma(默认 0.5)支持随机驾驶行为。当此值非零时,驾驶员将根据上述 RNG 随机改变其速度。一些其他车辆跟驰模型也使用此属性。

出发时间#

所有车辆的出发时间可以通过使用选项 --random-depart-offset <TIME> 进行随机变化。当使用此选项时,每辆车都会获得一个随机的出发时间偏移量,在 [0, <TIME>] 上均匀分布。

具有随机车辆数量的流#

以下随机流功能适用于 duaroutersumo

二项分布#

通过定义具有属性 endprobability<flow>(而不是 vehsPerHour,numberperiod),车辆将以给定的概率每秒随机发射,直到达到结束时间。 以此方式插入的车辆数量将服从 二项分布。 当在多车道道路上模拟此类流时,建议为每条单独的车道定义一个 <flow>,因为插入率限制为每秒最多 1 辆车。

当使用亚秒级时间分辨率进行模拟时,插入的随机决策在每个模拟步骤中进行,并且插入概率随步长缩放,使得每秒插入概率与步长无关。

Note

在较低的步长下,有效流可能会更高,因为离散化误差减小(由于安全约束,车辆通常不能在随后的秒内插入,并且在每隔一秒插入无法达到最大流)。

对于低概率,插入车辆的分布近似于 泊松分布

泊松分布#

自版本 1.13.0 起,流也可以用属性 endperiod="exp(X)" 定义,其中 X 是一个正值。 这将导致车辆插入之间的时间间隔遵循速率为 X指数分布。有效地每秒插入期望值为 X 的车辆。 以此方式插入的车辆数量将遵循 泊松分布

Note

有效的 插入率 受网络容量和其他流属性(如 departSpeeddepartLane)的限制。

具有固定车辆数量的流#

以下 2 节描述了适用于 duaroutersumo 的随机流属性。它们与具有随机车辆数量的流非常相似,但用 number 属性代替了 end 属性。

伯努利过程#

通过定义具有属性 numberprobability<flow>(而不是 vehsPerHour,numberperiod),车辆将以给定的概率每秒随机发射,直到达到指定的数量。

泊松过程#

通过定义具有属性 numberperiod="exp(X)"<flow>(而不是 vehsPerHour,numberperiod),车辆将以遵循指数分布的随机时间间隔发射,直到达到指定的数量。

路由器选项#

duarouter, dfrouterjtrrouter 应用程序支持选项 --randomize-flows

当使用此选项时,由 <flow> 元素定义的每辆车将被赋予一个随机出发时间,该时间在流的时间间隔内均匀分布。(默认情况下,流中的车辆在时间上是等间距的)。以此方式计算的出发时间也实现了 泊松过程

出发和到达属性#

<flow>, <trip><vehicle> 元素支持其属性 departLane, departPos, departSpeedarrivalPos 的值为 "random"。该值将在每次插入尝试时(对于出发属性)或每当需要重新验证到达值时(例如在重新路由后)随机选择。属性 departPosLat 也支持值 "random"。 出发时的横向偏移仅在使用亚车道模型时影响模拟行为,但在没有此模型的情况下也可见。

横向变化#

当将车道变更模式属性 lcSigma 设置为正值时,车辆将表现出一些随机的横向漂移。

随机性的其他来源#

可重复性#

通常,所有 SUMO 应用程序和工具在使用相同的参数和输入重复运行相同版本时,预期会产生相同的结果。这也包括在不同平台(Windows/Linux/Mac)上运行。

有一些已知会违反此规则的情况(无论是由于设计原因还是技术原因),下面列出了这些情况。

由于设计原因违反可重复性#

许多应用程序(sumo, duarouter, ...)和工具(randomTrips.py, ...)支持选项 --random。它随机化随机种子,从而每次运行都给出不同的随机行为。

由于其他原因违反可重复性#

以下差异要么是由于 SUMO 使用的库中的错误,要么是由于难以解决的问题。

平台差异#

  • 平台间生成的网络存在差异:当使用地理坐标导入网络数据时,到 x,y(笛卡尔)坐标的转换由 Proj 执行。该库的不同版本之间存在差异,不同平台通常提供不同的库版本。当使用 TraCI 函数进行坐标转换时,也可能出现同样的问题。
  • 使用选项 --device.rerouting.threads --weights.random-factor 时的非确定性车辆路由(Issue #10292
  • 由于使用 log 函数导致不同的模拟行为。在 EIDM 模型(Issue #8921)和使用 DriverState 设备的模拟中观察到差异。原则上也可能影响 Wiedemann 模型和 ToC 设备。