SaveAndLoad

自 0.18.0 版本起,SUMO 支持加载和保存仿真状态。

保存#

在固定时间保存#

要在仿真期间的指定时间保存状态,请添加选项 --save-state.times

sumo --save-state.times TIME1,TIME2,TIME3

默认情况下,状态将写入名为 <PREFIX>_<TIME><SUFFIX> 的文件,其中 <PREFIX> 可通过选项 --save-state.prefix 设置(默认为 state),<TIME> 为仿真时间,<SUFFIX>.xml.gz.xml,由选项 --save-state.suffix 控制(默认为 .xml.gz)。

Note

文件扩展名 '.xml.gz' 表示 gzip 压缩的 xml,所有 Sumo 应用程序均可直接使用,也可使用标准文件压缩工具解压缩。

使用选项 --save-state.times 时,也可使用选项 --save-state.files 指定输出文件。

sumo --save-state.files FILE1,FILE2,FILE3

以显式设置文件名。特别是,如果需要纯文本 xml 文件作为输出(而不是压缩格式 .xml.gz),则应给出文件名(后缀为 .xml)。

周期性保存#

或者,可以使用选项 --save-state.period <TIME> 来周期性地保存状态。 选项 -save-state.prefix--save-state.suffix 的使用方法如上所述。

选项 --save-state.period.keep N 可用于删除除最后 N 个状态文件之外的所有文件。

手动保存#

sumo-gui 允许使用菜单选项 Simulation -> Save 保存状态文件。

通过 TraCI 保存#

函数 traci.simulation.saveState(FILENAME) 可用于从脚本触发保存。

其他选项#

  • --save-state.rng: 保存随机数生成器状态
  • --save-state.transportables: 保存人员和容器状态
  • --save-state.constraints: 保存铁路信号约束
  • --save-state.precision: 设置保存状态时的小数精度

加载#

选项 --save-state <FILE> 用于使用给定的状态文件初始化仿真。 建议使用保存状态文件时相同的输入文件启动仿真,并将选项 --begin 设置为保存状态时的时间。可以无误地添加其他文件(即更多车辆)。

如果设置了选项 --save-state.offset,从仿真状态加载的所有时间将按给定的量进行偏移。这可用于将午夜后的仿真秒重置为 0,并确保加载的车辆仍能正常运行。

选项 --save-state.remove-vehicles ID1,ID2,... 允许从加载的状态中移除车辆。这为通过再次使用 .rou.xml 文件插入选定车辆来重新定位它们提供了可能性。

通过 TraCI 加载#

有两种通过 TraCI 加载状态的方法:

  • traci.load(['-n', 'net.net.xml', '--load-state', FILENAME]): 重新加载整个仿真(包括重新加载路网)
  • traci.simulation.loadState(FILENAME): 清除路网中的所有车辆和人员,然后加载状态。(避免重新加载路网)

第二种函数比第一种更快(或快得多),具体取决于路网的大小。

详情#

尚未出发的车辆不包含在仿真状态中,必须从输入文件加载。当从输入文件加载已在仿真状态中存在的车辆时,这些车辆会被自动忽略,且加载过程不会报错。

随机数生成器 (RNG)#

默认情况下,随机数生成器 的状态不会被保存。因此,从状态重新加载后,仿真行为将与原始仿真不同。

当设置选项 --save-state.rng 时,所有随机数生成器的状态将包含在状态中,并在加载时恢复。 保存此额外状态会增加约 500Kb 的开销。如果此开销过大,可以通过设置较低的 --thread-rngs 值(默认为 64)来减少。 该值不应低于用于路由或仿真的线程数(--threads--device.rerouting.threads)。

Note

包含 RNG 状态的状态是平台相关的。这意味着您无法在 Linux 上加载 Windows 的 rng 状态,反之亦然。

已知问题#

  • 无法仅从状态文件加载流(必须同时加载原始路径文件)
  • laneChangeModel 的内部状态未保存
  • carFollowModel 的内部状态未保存(并非所有模型都有此状态)。
  • 停车区域内的确切位置 未保存

SUMO 的旧版本#

在 0.18.0 之前的版本中,一种可能的解决方法是在虚拟机 (VM) 中运行 SUMO,因为虚拟机的状态可以随时保存。在 Linux 上使用 VirtualBox 的测试表明,如果为虚拟机分配足够的硬件资源(例如,如果同时运行另一个程序通过 TraCI 与 SUMO 通信,则应为虚拟机分配足够的 CPU 核心),SUMO 在虚拟机中的运行速度不会明显慢于在主机上直接运行。