概述#
从 0.26.0 版本开始,介观模型已包含在 sumo 发行版中(MESO 自 2002 年起就与 SUMO 一起开发,但此前并未公开发布)。 MESO 指的是一种介观仿真模型,它使用与主要 sumo 模型相同的输入数据。 它使用队列计算车辆运动,运行速度比 sumo 的微观模型快 100 倍。 此外,由于在交叉口和换道方面使用了更粗略的模型,它比 sumo 对网络建模错误的容忍度更高。
- 目的: 模拟定义的场景
- 系统: 可移植(已在 Linux/Windows 上测试);在命令行运行
- 输入(必填):
- A) 通过 netconvert 或 netgenerate 生成的道路网络,参见 构建网络
- B) 一组路径(由 duarouter、jtrrouter、dfrouter 或 activitygen 生成,另见 车辆、车辆类型和路径的定义)
- 输入(选填): 交通灯、可变限速标志、输出检测器等的附加定义
- 输出: SUMO 允许生成广泛的输出集;可视化使用 sumo-gui 完成
- 编程语言: C++
使用描述#
介观模型使用相同的输入文件,并生成(几乎)与 sumo 相同的输出。 要使用 MESO,必须设置选项 --mesosim <BOOL>。 其他选项在 sumo#mesoscopic 中描述。
模型描述#
该仿真模型基于 Eissfeldt, Vehicle-based modelling of traffic 的工作。 原始模型侧重于高速公路交通。当前的实现包含重要的扩展以支持异构城市交通的仿真。
使用的 vType 参数#
只有少数 vType 参数影响介观仿真。它们列在下面:
- vClass
- length
- minGap
- maxSpeed
- speedFactor, speedDev (参见 进一步的拥堵效应)
- impatience
- accel, decel (仅当微观交叉口模型激活时,用于计算通过交叉口的时间)
- tau
纵向模型#
车辆被放置在交通队列中,队列的最大长度由选项 --meso-edgelength 指定。 为此,每条边被拆分为 1 个或多个长度相等的队列。 通常,一个队列代表一条边的所有车道,但在设有专用转弯车道的交叉口,会使用多个队列。 车辆通常按照进入队列的顺序离开队列。 模型的核心思想是根据以下标准计算车辆离开队列的时间:
- 当前队列和后续队列的交通状态。
- 基于车辆速度和限速的最短行驶时间
- 根据 #Junction_Model 的配置,边的最后一个队列的交叉口状态
第一点是通过根据交通密度阈值(通过选项 --meso-jam-threshold 配置)将每个队列分类为 拥堵 (jammed) 或 畅通 (free) 来实现的。 然后,车辆之间的最小车头时距会根据四种不同的可能情况分别计算。 每种情况的行为使用以下选项进行配置:
- meso-tauff: 从畅通路段行驶到畅通路段时的最小车头时距(默认 1.13)
- meso-taufj: 从畅通路段行驶到拥堵路段时的最小车头时距(默认 1.13)
- meso-taujf: 从拥堵路段行驶到畅通路段时的最小车头时距(默认 1.73)
- meso-taujj: “空位”在拥堵中向后移动的车头时距。当路段完全被占用时,实际车头时距为 VEHICLE_NUMBER * taujj。(默认 1.4)
车头时距根据车道数的倒数进行缩放(对于三条车道,车头时距除以 3)。
这些值中的每一个都会乘以所考虑车辆的车辆类型 (vType) 中配置的 'tau'(默认 'tau' 为 1)。
Note
值 tauff、taufj 和 taujf 表示净时间间隙(车辆前保险杠到前车后保险杠)。实际的总时间间隙通过考虑车辆长度由此计算得出。
值 taujj 配置了当多路段拥堵清除时,拥堵前沿向上游移动的速度。
由于当 meso-tauff 低于 meso-taujf 时的车头时距效应,向后移动的拥堵是可能的。
meso-jam-threshold#
对于每个队列(在 GUI 中也称为路段),一个占用阈值决定了该队列是 拥堵 还是 畅通。 选项 --meso-jam-threshold <FLOAT> 支持以下数值:
- value = -1: 阈值被计算为以限速行驶的车辆不会发生拥堵。这是默认行为,推荐用于具有不同限速的网络,因为畅通流的占用率取决于速度。
- value < 0: 阈值如上计算,但畅通流占用率是针对 (speedLimit * -value) 计算的。当该值接近 0(从负方向)时,拥堵减少。低于 -1 的值会导致拥堵增加。
- value > 0: 该值直接用作所有队列的阈值分数(即 0.4 表示占用率超过 40% 时队列拥堵)
- value = 1: 禁用拥堵
速度#
介观车辆不模拟其当前速度。因此,涉及加速度、出发速度 (departSpeed) 或到达速度 (arrivalSpeed) 的车辆属性不起作用。
唯一相关的属性是那些涉及最大可能速度的属性:maxSpeed、desiredMaxSpeed、speedFactor、speedDev。
最大速度用于计算沿边行驶时间的下限。当介观模型计算车辆速度时,它会根据离开路段的最早计算时间(可能包括拥堵效应)给出沿当前路段的估计平均速度。如果车辆被阻止离开路段,其速度定义为 0。
进一步的拥堵效应#
另一种在密度和速度之间产生负相关的机制是通过车辆(首选)速度分布实现的。 在较高的交通密度下,由于队列前方有慢速车辆而导致减速的概率会上升。 这种效应的大小可以通过改变速度分布的离散度来控制。 在多车道边上,可以启用超车以减少这种减速效应。
拥堵解除#
选项 --meso-recheck <TIME> 可用于延迟交通流入完全占用的路段。 每当车辆因为下一段已满而无法移动时,给定的值充当在再次检查路段是否有容量接收另一辆车之前的时间延迟。默认情况下,此延迟设置为 0。
横向模型#
横向运动没有被明确模拟。如果启用了选项 --meso-overtaking,车辆可以相互超车(交换位置)。这是一个随机化的过程,取决于车辆速度和密度。
交叉口模型#
有 3 种基本的交叉口控制建模选项:
-
--meso-junction-control false(默认):不进行交叉口控制。这应仅用于高速公路场景或与下面的惩罚选项结合使用。
-
--meso-junction-control true: 交叉口的建模方式与简化微观仿真模型相同(--no-internal-links true)。
-
--meso-junction-control.limited true: 只要目标队列处于未拥堵状态(畅通),就不进行交叉口控制。当尝试进入拥堵队列时,使用情况 2 中的交叉口控制。
可以使用其他选项来控制交叉口延误:
TLS-惩罚#
当设置 --meso-tls-penalty <FLOAT>: 为大于 0 的值(默认为 0)时,会根据平均延误时间(基于红灯相位持续时间)应用行驶时间惩罚。 对于受交通灯控制的交叉口,这优先于上述任何 --meso-junction-control 设置。FLOAT 用作比例因子,大致对应于协调性(1.0 对应于非协调交通灯,而接近 0 的值模拟近乎完美的协调)。(可以通过设置 --meso-junction-control false 来实现无惩罚的极限情况)
对于选项值 p,时间惩罚通过缩放在周期内随机到达的预期等待时间来计算:
travelTimePenalty = p * (redTime * redTime + redTime) / (2 * cycleTime)
Caution
当交通灯前方的边短于 15m 时,使用此选项会导致交通流的不切实际减少,并会发出警告。
要在 netedit 中识别受影响的边,可以使用工具 net/netcheck.py net.net.xml --short-tls-edges --selection-output selection.txt。
TLS-流量惩罚#
当设置 --meso-tls-flow-penalty <FLOAT>: 为大于 0 的值(默认为 0)时,会应用车头时距惩罚,用于减少通过受交通灯控制的交叉口的最大流量(与实际的交叉口控制不同,流量在相位周期内均匀分布,而不是集中在绿灯期间)。 当流量惩罚设置为 1 时,最小车头时距会增加,以根据绿灯时间与周期时间的比例模拟最大容量。 更高的惩罚值可用于进一步降低流量,而较低的值会增加最大流量。后者在绿灯分割未知(因为交通灯程序是启发式猜测的)时很有用。
greenFraction = MIN2(1.0, (cycleTime - redDuration) / cycleTime) / penalty))
headway = defaultHeadway / greenFraction
请注意,无论惩罚值如何,最大流量都不能超过永久绿灯时的值。
部分 TLS 惩罚#
上述两个选项默认应用于网络中的所有交通灯。
通过向 <tlLogic> 定义添加通用参数键 <param key="meso.tls.control" value="true"/>,可以免除单个交通灯的惩罚,而是对其进行详细处理(当选项 --meso-junction-control 也已设置时)。
也可以加载一个仅设置了此选项的附加文件:
<tlLogic id="C" programID="0">
<param key="meso.tls.control" value="true"/>
</tlLogic>
无控制交叉口的惩罚#
--meso-minor-penalty <TIME> 可用于在通过无优先权的链接时应用固定的时间惩罚(当设置了 --meso-junction-control.limited 且该链接的交叉口控制处于活动状态时,此选项被禁用)。
急躁度#
达到急躁度值 1(最大值)的车辆可以无视具有更高优先权的冲突车辆通过交叉口。达到最大急躁度的时间可以通过选项 --time-to-impatience <TIME> 进行配置。
按边类型配置#
上述模型参数可以通过从附加文件加载以下配置,针对每个边类型 id 进行自定义:
<additional>
<type id="highway.motorway" ...>
<meso tauff="1.13" taufj="1.13" taujf="1.73" taujj="1.4" jamThreshold="-1"
multiQueue="true" junctionControl="false" tlsPenalty="0" tlsFlowPenalty="0"
minorPenalty="0" overtaking="false"/>
</type>
</additional>
所有属性都是可选的,默认为具有相应选项名称的选项的值。(即 tauff ~ meso-tauff, tlsPenalty ~ meso-tls-penalty, ...)。
多模式仿真#
默认情况下,meso 用于道路车辆(即汽车和卡车)。要使用自行车和不允许乘用车的边,必须设置选项 --meso-lane-queue。 这将把每条车道变成一个独立的队列,而不是将平行车道视为单个队列。
输出#
支持许多 SUMO 的输出选项,但生成的文件略有不同:
- 不可能有特定于车道的输出。
- <laneData>-output
将被视为
<edgeData>-output。 - netstate-dump 将把车辆报告为
<edge>的子元素,而不是<lane>。
- <laneData>-output
将被视为
- 感应线圈写入的属性类似于
<edgeData>-output 输出
以下输出不支持:
与 SUMO 相比的限制#
以下 SUMO 功能不支持:
- 感应式交通灯
- 电气模型
- 无线模型
- 对向行驶
- 子车道模型
- 乘客登机持续时间
MESO-GUI#
当使用选项 --mesosim 运行时,可以使用 sumo-gui 观察介观仿真。 微观和介观仿真之间的区别从孤立的车辆看不出来。 一旦有多个车辆在队列中等待,由于车辆之间的间距差异,这一点变得更加明显。 并且由于车辆似乎以 100 米的增量“跳跃”(这是默认的路段长度)。 当右键单击车辆或边并选择“显示参数”时,微观和介观模型的参数集是不同的。对于较大的仿真,速度差异也会很明显。由于基于边而不是车道,运行介观模型时一些可视化选项也不同。
