引言#
交通计数是交通数据的一种常见形式。这些数据可能来自感应线圈或雷达探测器等自动计数设备,也可能来自人工计数。计数针对特定的时间范围,数据可能涵盖多个时间切片。此外,还可以区分不同类型车辆的计数。
SUMO 提供了多种工具来根据此类计数数据生成交通需求。生成的交通需求通常描述车辆及其在路网中的路径,以及它们的出发时间。有时,使用相同路径的车辆会被分组到 <flow> 定义中。
生成的交通显然应与计数数据相匹配,但仅这一要求并不能定义唯一的解决方案。提供的 SUMO 工具在解决歧义并得出特定路径和车辆集合的算法上有所不同。这些工具还可以根据它们所消耗的计数数据类型进行区分:
- dfrouter 使用基于路段的计数
- flowrouter 使用基于路段的计数
- jtcrouter 使用转向计数
- routeSampler 使用转向计数和路段计数(以及起点-终点计数)
此外,还有一套庞大的工具集用于导入和转换不同的计数数据格式。这些工具的概述可在 计数数据元工单 中找到。
选择合适的工具#
上述算法是为解决不同问题而开发的,如果用于错误类型的问题,效果可能不佳。
- dfrouter 要求所有用作交通源和汇的路段都提供交通计数数据。相比之下,flowrouter 可以根据中间位置的测量数据推断这些路段上的交通流量。
- dfrouter 和 jtcrouter 没有能力在所有符合测量数据的路径集合中校准生成的路径。它们在高速公路路网上可以提供良好的结果,但在高度网状的网络(即城市)中会产生不合理的路径。
- flowrouter 可以使用黑名单来避免不合理的路径。工具 implausibleRoutes.py 可用于根据可配置的启发式方法生成对不合理路径的限制。当不合理路径的集合非常大时(由于可能的路径组合爆炸,这种情况经常发生),创建这样的黑名单可能是不可行的。
- routeSampler 具有以下特点:
- 使用白名单来限制可用于构建解决方案的路径集合。生成足够数量的合理路径通常比列出所有不合理的路径更容易。
- 可以同时使用路段计数数据和转向计数数据
- 可以区分路段上的通过计数、出发计数和到达计数
- 支持根据计数构建行人场景
dfrouter#
从 0.9.5 版本开始,SUMO 软件包包含一个名为 dfrouter 的路由模块。该路由器的理念是,如今大多数高速公路都配备了良好的感应线圈,测量高速公路的每个入口和出口流量。鉴于此信息,可以假设高速公路上的流量是完全已知的。dfrouter 直接使用从感应线圈收集的信息来重建车辆数量和路径。这分几个步骤完成,主要是:
- 计算(并可选择保存)检测器类型,即每个感应线圈被设置为源检测器、汇检测器还是中间检测器
- 计算(并可选择保存)检测器之间的路径
- 计算检测器之间的流量
- 保存流量和进一步的控制结构
计算检测器类型#
dfrouter 的理念假设路网被检测器完全覆盖,意味着所有匝道进出口都安装了感应线圈。然而,关于感应线圈是纯源或汇,还是位于两者之间,这些信息最初并未给出。必须进行计算。为此,dfrouter 需要底层路网以及检测器定义列表,每个定义描述一个感应线圈的位置。路网,作为一个预先构建的 SUMO 路网,通常使用 --net-file <SUMO_NET_FILE> (-n) 选项提供给 dfrouter,感应线圈列表使用 --detector-files <DETECTOR_FILE>[,<DETECTOR_FILE>]+ (-d) 提供。检测器文件应如下所示:
<detectors>
<detectorDefinition id="<DETECTOR_ID>" lane="<LANE_ID>" pos="<POS>"/>
... further detectors ...
</detectors>
这意味着每个检测器最初使用其 id、放置的车道以及车道上的位置来描述。具体来说:
- id: 包含检测器 id 的字符串
- lane: 检测器所在车道的 id。必须是路网中的一个车道。
- pos: 检测器应放置在车道上的位置(以米为单位)。该值必须在 -1*车道长度 和 车道长度 之间。如果为负值,则从车道末端(车辆驶向的位置)向后计算位置。
给定一个路网和检测器列表,dfrouter 会为检测器分配类型,并在给出选项 --detectors-output <DETECTOR_OUTPUT_FILE> 时将扩展后的列表保存到文件中。此列表看起来与上述输入类似,只是为每个检测器增加了一个属性 "type",其值可能是以下之一:"source"、"sink"、"between" 和 "discarded"。您还可以生成一个兴趣点(POI)列表,该列表可由 sumo-gui 读取,其中每个 POI 代表一个检测器,并根据检测器类型着色:源检测器为绿色,汇检测器为红色,中间检测器为蓝色,丢弃的检测器为黑色。要强制 dfrouter 执行此操作,请使用 --detectors-poi-output <POI_FILENAME>。
如果需要,例如当其他参数发生变化时,可以将扩展的 <DETECTOR_OUTPUT_FILE> 再次输入到 dfrouter 中,以代替之前的 <DETECTOR_FILE>。在这种情况下,无需重新计算检测器类型。要强制 dfrouter 重新计算类型,请使用 --revalidate-detectors。
计算路径#
现在我们知道了车辆从哪里进入路网以及从哪里离开路网,我们可以为每一对源汇计算路径。dfrouter 使用 --routes-output <ROUTE_OUTPUT_FILE> 来构建和保存路径,其中 <ROUTE_OUTPUT_FILE> 是计算出的路径应写入的文件名。生成的文件仅包含路径,不包含车辆类型定义和车辆。
通常,只计算从源检测器开始到汇检测器结束的路径。使用选项 --routes-for-all 可以强制 dfrouter 也构建从中间检测器开始的路径。选项 --all-end-follower 将使路径不结束于源检测器所在的路段,而是结束于该路段之后的所有路段。--keep-unfinished-routes 也将保留那些找不到汇检测器的路径,如果路网未被感应线圈完全覆盖,可能会出现这种情况。
计算流量#
下一步是使用计算出的路径和来自真实世界检测器的流量数据来计算模拟路网上的流量。流量数据通过 --measure-files <STRING>(或 -f <DETECTOR_FLOWS>[,<DETECTOR_FLOWS>]+)提供给 dfrouter。它们被假定为以 CSV 格式存储,使用 ';' 作为分隔符。文件应如下所示:
Detector;Time;qPKW;qLKW;vPKW;vLKW
myDet1;0;10;2;100;80
... further entries ...
这意味着第一行包含带有列名的标题。它们的顺序不重要,但必须至少包含以下列:
- Detector: 包含此行描述的检测器 id 的字符串;应为 <DETECTOR_FILE> 中使用的 id 之一
- Time: 此条目描述的时间段开始时间(以分钟为单位)
- qPKW: 在此时间段内通过检测器的乘用车数量
- vPKW: 在此时间段内通过检测器的乘用车的平均速度(km/h)
以下列可以可选地包含:
- qLK: 在此时间段内通过检测器的运输车辆数量
- vLKW: 在此时间段内通过检测器的运输车辆的平均速度(km/h)
Caution
使用不同的分隔符字符或更改强制列的名称将导致 dfrouter 跳过数据。
Caution
dfrouter 假设计数每分钟给出一次。要处理具有不同粒度的数据,必须使用选项 --time-step SECONDS。
因为在某些情况下,人们读取从特定时间开始的检测器流量定义,但希望模拟从另一个时间开始,所以可以使用 --time-offset <INT> 添加时间偏移量,这是从读取的时间中减去的秒数。
算法特性#
dfrouter 在所有可能的源和汇路段都提供检测器值,并且这些值在时间上均匀分布时效果最佳。该算法基于以下假设工作:对于每个测量间隔,源流量之和与汇流量之和相匹配(因此在一定程度上忽略了行程时间)。车辆生成 的一些特性:
- 每个测量间隔生成的车辆数量仅由源检测器决定。
- 汇检测器处的多余流量被忽略
- 如果汇检测器测量的流量较少,车辆仍会按测量流量的比例到达那里
- 如果汇检测器根本没有测量到流量,所有车辆将驶向一个(任意的)汇
生成车辆#
如果提供了流量定义,我们可以让 dfrouter 保存计算出的车辆及其路径。车辆将在源检测器处生成,这些检测器位于路网车道的特定位置。dfrouter 使用选项 --emitters-output <EMITTER_OUTPUT_FILE> 生成车辆。此文件将包含每个源检测器的车辆(发射器)声明。如果未给出值,则不会写入车辆。同时,将会有 routeDistributions,每个都与检测器同名。这些反映了具有相同 ID 的检测器处的路径分布。
默认情况下,车辆在每个测量间隔内以均匀的间距插入。这可以通过添加选项 --randomize-flows 来更改。
生成的文件包含单独的车辆,这些车辆被分配了来自 路径输出文件 的路径。
Note
发射器输出还包含每个源检测器的 <routeDistribution>,但此分布未被车辆使用。它是为信息目的而生成的,并显示了整个模拟时间聚合的路径分布(此分布假设源流量数据与汇流量数据相匹配)。
其他输出#
可变限速标志#
由于某些方法使用速度限制来避免开放式边界问题,dfrouter 可以在汇检测器的位置生成一个速度触发器列表(参见“可变限速标志 (VSS)”)。使用选项 --variable-speed-sign-output <VSS_OUTPUT_FILE> 给出保存这些速度触发器声明的名称。相应的可变限速标志定义将写入名为 "vss_<DETECTOR_ID>.def.xml" 的文件中,其中 <DETECTOR_ID> 是相应汇检测器的名称。
重路由器#
为了避免在匝道出口结束车辆路径,也可以在汇检测器的位置放置重路由器(参见“重路由器”)。给出选项 --end-reroute-output <REROUTER_OUTPUT_FILE> 将生成重路由器声明列表。请注意,在这种情况下,不会写入重路由器定义,因为 dfrouter 没有关于检测器覆盖区域之外的可能路径的进一步信息。
验证检测器#
能够检查模拟是否符合预期是很好的。为了验证模拟中是否发现了与现实中相同的流量,选项 --validation-output <SUMO_DETECTORS_OUTPUT> 可能很有用。它会生成一个检测器定义列表(参见“感应线圈检测器”),放置在汇检测器和中间检测器的位置。它们的输出将保存到名为 "validation_det_<DETECTOR_ID>.xml" 的文件中,并且应易于与先前提供给路由器的检测器流量进行比较。选项 --validation-output.add-sources 将让 dfrouter 也为源检测器构建感应线圈检测器,这些检测器放置在真实检测器位置后方 1 米处。
如何包含文件#
dfrouter 在 SUMO 路由应用程序中是独特的,因为它分别输出路径和车辆。您需要确保输入文件列表的顺序正确以解析引用。此外,dfrouter 目前在其发射器输出中返回未排序的车辆。假设 dfrouter 是使用以下选项调用的:
dfrouter --net-file net.net.xml --routes-output routes.rou.xml --emitters-output vehicles.rou.xml --measure-files flows.txt
sumo 必须以以下方式调用:
sumo --net-file net.net.xml --additional-files routes.rou.xml,vehicles.rou.xml
如果您运行工具 Tools/Routes#sort_routes.py 来对车辆进行排序,以下任一方式都将有效:
sumo --net-file net.net.xml --route-files routes.rou.xml,sorted_vehicles.rou.xml
sumo --net-file net.net.xml --route-files sorted_vehicles.rou.xml --additional-files routes.rou.xml
flowrouter.py#
flowrouter 工具 改进了 dfrouter,通过更好地处理缺失数据并找到在计数数据给定的限制内最大化总流量的路径集合。它提供了多种选项来限制生成的路径集合,从而允许校准生成的交通。
jtcrouter.py#
jtcrouter.py 工具(自 1.5.0 版本起可用)可以根据转向计数数据构建交通需求。它通过将计数转换为流量和转向比率,然后将这些文件传递给 jtrrouter 来实现。
routeSampler.py#
routeSampler.py 工具(自 1.5.0 版本起可用)根据转向计数数据以及路段计数数据构建交通需求。它使用一个路径文件作为输入,然后从该路径集合中重复选择以满足给定的计数数据。
可以使用 randomTrips.py 为给定路网生成合适的路径文件。这样的路径文件涵盖了具有最短路径的路网。偏离最短路径的路径也可以在 duarouter 选项 --weights.random-factor 的帮助下生成。
通过更改用作输入的路径文件,可以校准生成的交通。
