本教程描述了如何使用控制脚本在循环中执行仿真。目的是根据给定的真实世界数据集对仿真进行标定。本教程可用于进一步研究车辆跟驰模型或优化算法。
假设您已从其他教程中了解路网构建和路线定义,例如 Tutorials/Hello SUMO、Tutorials/quick start 或 Tutorials/Quick Start old style。
此处提到的所有文件都可以在代码库的 <SUMO_HOME>/tests/complex/tutorial/san_pablo_dam/ 目录中找到。
描述#
车辆移动模型通常具有多个控制车辆行为的参数。它们的默认值通常基于假设、测量值或通过使其适应给定数据集来设置。当迁移到不同的场景时,通常需要重新调整它们以使其有效。因此,标定是准备交通仿真场景的关键步骤。
本教程展示了将车辆跟驰模型标定以匹配从现实世界获得的一组数据的一种可能性。我们使用的数据集是在 San Pablo Dam Road 上收集的,"1997年11月18日星期二上午6:45至9:00以及1997年11月20日星期四"([Smilowitz1999])。请查看 这里 (OpenStreetMap) 或 这里 (GoogleMaps) 获取位置。数据集的页面在 这里。它也被用于车辆跟驰模型的基准测试,参见 [Brockfeld2003a]。数据集包含车辆通过计数点的时间,并假定相当干净。
有了车辆的通过时间,我们希望标定我们的车辆跟驰模型,以使所有车辆的真实旅行时间和仿真旅行时间之间的差异最小化。
为了从仿真中获取通过时间,我们使用频率为1秒的感应线圈。它们在 "input_det.add.xml" 中定义。此外,我们使用可变限速标志来限制流出速度,以保留原始(真实世界)路网的流出条件。
先决条件#
要执行本教程,您需要:
- 一个可运行的 SUMO 仿真
- Python 2.x(使用 Python 2.7 测试过)
- SciPy
路网准备#
优化需要多次(很多次)迭代,而 sumo 的执行速度高度依赖于路网构成的边的数量。因此,我们仅使用两条边来模拟 San Pablo Dam Road。我们构建一个边文件和一个节点文件,正如之前的教程(Tutorials/Hello SUMO、Tutorials/Quick Start)中已经讨论过的那样。
需求准备#
我们使用 "runner.py" 中的 genDemand 函数来构建需求。这里,观测点1的时间用作我们的车辆出发时间。路线由路网的两条边组成。所有车辆具有相同的类型。该类型的值——要优化的车辆跟驰参数——记录在 "runner.py" 中的 gof 函数中。请注意,我们将 "minGap" 始终保持为2.5米——对于除使用的 SUMO-Krauß 模型之外的其他模型,应更改此值。如果需要,可以在执行标定之前将它们设置为默认参数值(参见 runner.py 的末尾)。
仿真设置#
我们的配置如下所示:
<configuration>
<input>
<net-file value="spd-road.net.xml"/>
<route-files value="spd-road.rou.xml"/>
<additional-files value="input_vss.add.xml,input_det.add.xml,input_types.add.xml"/>
</input>
<time>
<begin value="24420"/>
</time>
<processing>
<time-to-teleport value="0"/>
</processing>
<report>
<no-duration-log value="true"/>
<no-step-log value="true"/>
</report>
</configuration>
这意味着:我们从 "spd-road.net.xml" 加载路网,从 "spd-road.rou.xml" 加载路线,以及三个附加文件:"input_vss.add.xml" 包含可变限速标志,"input_det.add.xml" 包含要仿真的感应线圈定义,"input_types.add.xml" 包含我们当前车辆类型的定义。开始时间设置为第一辆车的出发时间。我们将 time-to-teleport 设置为0以忽略可能的等待时间,并禁用仿真输出。
请注意,"spd-road.rou.xml" 是在 runner.py 开始时根据输入测量值创建的,"input_types.add.xml" 是在每个仿真循环中使用新参数创建的,所有其他文件都是完全静态的。
标定#
我们使用 SciPy 的 "COBYLA" 实现。它需要用于确定误差的回调函数,我们必须提供这些函数。我们的回调("runner.py" 中的 gof 函数)工作方式如下:
- 将带有优化器支持的参数的当前车辆类型写入名为 "input_types.add.xml" 的文件
- 启动验证脚本 "validate.py" 并返回其计算的误差值
验证步骤在 "validate.py" 中实现,过程并不复杂:
- 执行仿真
- 读取真实世界的观测值和仿真中的车辆通过时间
- 将两者从观测时间转换为旅行时间
- 计算所有车辆和观测点的 RMSE(均方根误差)并返回
执行#
要执行标定,您只需调用:
python runner.py
以下是它的操作过程:
-
首先调用 netconvert -n=spd-road.nod.xml -e=spd-road.edg.xml -o=spd-road.net.xml
使用 "spd-road.nod.xml" 中的节点和 "spd-road.edg.xml" 中的边构建路网;写入 "spd-road.net.xml";生成 "spd-road.net.xml"
-
调用函数 buildVSS
为末端边界构建限速;生成 "spd-road.vss.xml",该文件由 "input_vss.add.xml" 引用
- 开始标定
对于每个标定步骤,应出现以下输出:
# simulation with: vMax:22.000 aMax:2.000 bMax:2.000 lCar:5.000 sigA:0.500 tTau:1.500
Loading configuration... done.
#### yields rmse: 212.6411
当然,值在步骤之间会有所不同。80次迭代大约需要十分钟才能执行完成。
"runner.py" 生成一个名为 "results.csv" 的文件,其中包含每次迭代的参数和误差,逐行记录。
参考文献#
[Smilowitz1999] K. Smilowitz, C. Daganzo, M.J. Cassidy and R.L. Bertini. 1999. Some observations of highway traffic in long queues. Transportation Research Records, 1678, pp. 225-233; available at [1]
[Brockfeld2003a] E. Brockfeld, R. Kühne, A. Skabardonis, P. Wagner. 2003 Towards a benchmarking of Microscopic Traffic Flow Models. Transportation Research Records, 1852 (TRB2003-001164), pp. 124-129; available at [2]
