随机性是模拟场景中再现现实的一个重要方面。有多种方法可以为模拟添加随机性。下文将对此进行描述。
随机数生成 (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>] 上均匀分布。
具有随机车辆数量的流#
二项分布#
通过定义具有属性 end 和 probability 的 <flow>(而不是 vehsPerHour,number 或 period),车辆将以给定的概率每秒随机发射,直到达到结束时间。
以此方式插入的车辆数量将服从 二项分布。
当在多车道道路上模拟此类流时,建议为每条单独的车道定义一个 <flow>,因为插入率限制为每秒最多 1 辆车。
当使用亚秒级时间分辨率进行模拟时,插入的随机决策在每个模拟步骤中进行,并且插入概率随步长缩放,使得每秒插入概率与步长无关。
Note
在较低的步长下,有效流可能会更高,因为离散化误差减小(由于安全约束,车辆通常不能在随后的秒内插入,并且在每隔一秒插入无法达到最大流)。
对于低概率,插入车辆的分布近似于 泊松分布。
泊松分布#
自版本 1.13.0 起,流也可以用属性 end 和 period="exp(X)" 定义,其中 X 是一个正值。
这将导致车辆插入之间的时间间隔遵循速率为 X 的 指数分布。有效地每秒插入期望值为 X 的车辆。
以此方式插入的车辆数量将遵循 泊松分布。
Note
有效的 插入率 受网络容量和其他流属性(如 departSpeed 和 departLane)的限制。
具有固定车辆数量的流#
以下 2 节描述了适用于 duarouter 和 sumo 的随机流属性。它们与具有随机车辆数量的流非常相似,但用 number 属性代替了 end 属性。
伯努利过程#
通过定义具有属性 number 和 probability 的 <flow>(而不是 vehsPerHour,number 或 period),车辆将以给定的概率每秒随机发射,直到达到指定的数量。
泊松过程#
通过定义具有属性 number 和 period="exp(X)" 的 <flow>(而不是 vehsPerHour,number 或 period),车辆将以遵循指数分布的随机时间间隔发射,直到达到指定的数量。
路由器选项#
duarouter, dfrouter 和 jtrrouter 应用程序支持选项 --randomize-flows。
当使用此选项时,由 <flow> 元素定义的每辆车将被赋予一个随机出发时间,该时间在流的时间间隔内均匀分布。(默认情况下,流中的车辆在时间上是等间距的)。以此方式计算的出发时间也实现了 泊松过程。
出发和到达属性#
<flow>, <trip> 和 <vehicle> 元素支持其属性 departLane, departPos, departSpeed 和 arrivalPos 的值为 "random"。该值将在每次插入尝试时(对于出发属性)或每当需要重新验证到达值时(例如在重新路由后)随机选择。属性 departPosLat 也支持值 "random"。
出发时的横向偏移仅在使用亚车道模型时影响模拟行为,但在没有此模型的情况下也可见。
横向变化#
当将车道变更模式属性 lcSigma 设置为正值时,车辆将表现出一些随机的横向漂移。
随机性的其他来源#
- 工具 randomTrips.py 允许在随机边之间生成交通。它还支持随机化到达率。
- od2trips 在分解 O/D 矩阵时随机选择每次行程的出发边和到达边,它还在可配置的时间间隔内随机化出发时间。
- duarouter 在执行 Demand/Dynamic_User_Assignment 时添加随机性。
- duarouter 可以通过设置选项 --weights.random-factor 来随机扰动最快路径。
- 模拟路由可以随机化 以确保使用替代路线。
可重复性#
通常,所有 SUMO 应用程序和工具在使用相同的参数和输入重复运行相同版本时,预期会产生相同的结果。这也包括在不同平台(Windows/Linux/Mac)上运行。
有一些已知会违反此规则的情况(无论是由于设计原因还是技术原因),下面列出了这些情况。
由于设计原因违反可重复性#
许多应用程序(sumo, duarouter, ...)和工具(randomTrips.py, ...)支持选项 --random。它随机化随机种子,从而每次运行都给出不同的随机行为。
由于其他原因违反可重复性#
以下差异要么是由于 SUMO 使用的库中的错误,要么是由于难以解决的问题。
