3. 交通需求建模:创建车辆类型、定义路线、生成随机交通流

好了,咱们进入正题。交通需求建模,说白了就是告诉SUMO:路上跑什么车、从哪到哪、车流量多大。这三个问题搞定了,仿真才能动起来。

我个人习惯把这一步叫做「造车三部曲」——先定义车型,再规划路线,最后生成车流。顺序别搞反,不然会报错。嗯,我踩过这个坑。

3.1 车辆类型(vType)——给车贴上标签

你想想看,路上跑的小轿车和公交车,加速能力、最大速度、车身长度能一样吗?所以第一步,我们要用 vType 来定义车辆的行为参数。

代码长这样:

<vType id="私家车" accel="2.6" decel="4.5" sigma="0.5" length="4.5" maxSpeed="50.0" color="1,0,0"/>
<vType id="公交车" accel="1.2" decel="3.0" sigma="0.3" length="12.0" maxSpeed="40.0" color="0,0,1"/>

我来解释一下关键参数:

参数 含义 我的建议值
accel 最大加速度 (m/s²) 轿车2.6,公交1.2
decel 最大减速度 (m/s²) 轿车4.5,公交3.0
sigma 驾驶随机性 (0~1) 0.5表示普通司机
length 车身长度 (m) 轿车4.5,公交12
maxSpeed 最高速度 (m/s) 50 ≈ 180km/h
我的小习惯:颜色用RGB值表示,比如红色是"1,0,0"。仿真时一眼就能区分车型,调试起来特别方便。

3.2 定义路线(route)——画好地图上的轨迹

路线就是车辆从起点到终点的「导航路径」。在SUMO里,路线由一连串的边(edge)组成。注意,这里的边指的是道路段,不是路口。

举个例子,假设我们的路网有三条边:E0、E1、E2,车辆要从E0开到E2,中间经过E1:

<route id="route_01" edges="E0 E1 E2"/>

这里有个坑——边的顺序不能乱。我曾经在项目里把顺序写反了,结果车辆一上路就报错,说找不到路径。排查了半天才发现是E2和E0颠倒了。

避坑指南:我曾经在一条长路网上定义了20个边的路线,结果漏写了一个中间边。车辆走到一半突然消失,仿真数据全废了。所以,建议用netedit可视化工具检查路线,别光靠眼睛看代码。

3.3 生成随机交通流(flow)——让车流自己跑起来

手动一辆一辆定义车辆太傻了。实际仿真中,我们用的是 flow 标签,让SUMO自动生成车流。

基本语法:

<flow id="flow_1" type="私家车" route="route_01" begin="0" end="3600" vehsPerHour="600"/>

参数说明:

  • begin / end:车流开始和结束时间(秒)
  • vehsPerHour:每小时车流量(辆/小时)
  • type:引用前面定义的vType
  • route:引用前面定义的route

你想想看,600辆/小时是什么概念?大概相当于城市主干道的中等流量。如果换成高速,可能到2000辆/小时。

核心要点:flow的生成是随机的,但服从泊松分布。也就是说,车与车之间的时间间隔不是固定的,而是有波动的。这更接近真实交通。

3.4 完整示例——把三部曲串起来

下面是一个完整的 .rou.xml 文件,包含了vType、route和flow:

<routes>
  <!-- 1. 定义车辆类型 -->
  <vType id="私家车" accel="2.6" decel="4.5" sigma="0.5" length="4.5" maxSpeed="50.0" color="1,0,0"/>
  <vType id="公交车" accel="1.2" decel="3.0" sigma="0.3" length="12.0" maxSpeed="40.0" color="0,0,1"/>

  <!-- 2. 定义路线 -->
  <route id="route_main" edges="E0 E1 E2 E3 E4"/>
  <route id="route_branch" edges="E0 E5 E6"/>

  <!-- 3. 生成随机交通流 -->
  <flow id="flow_car" type="私家车" route="route_main" begin="0" end="7200" vehsPerHour="800"/>
  <flow id="flow_bus" type="公交车" route="route_main" begin="300" end="7200" vehsPerHour="60"/>
  <flow id="flow_branch" type="私家车" route="route_branch" begin="0" end="7200" vehsPerHour="200"/>
</routes>

这个文件可以直接被SUMO加载。仿真2小时(7200秒),主路上每小时800辆私家车+60辆公交车,支路上200辆私家车。数据很清晰。

3.5 知识体系总览

下面这张图,是我自己总结的交通需求建模核心逻辑。你看一眼就能明白三者的关系:

vType(车辆类型) accel, decel, length maxSpeed, color, sigma route(路线) edges="E0 E1 E2" 路径顺序不可颠倒 flow(交通流) vehsPerHour, begin, end 泊松分布随机生成 输出:.rou.xml 文件 被SUMO加载,驱动仿真运行 三部曲:先定义类型 → 再规划路线 → 最后生成车流
我的经验:刚开始学的时候,我总喜欢把vType和route写在一个文件里。后来项目大了,发现这样维护很痛苦。建议把vType单独放一个文件,用 <xinclude> 引入。这样换车型配置时,不用动路线文件。

好了,这一章的内容就这些。记住三个核心:vType定性能、route定路径、flow定数量。下一章咱们会聊怎么用SUMO自带的工具生成更复杂的路网。不过那是后话了,先把今天的三部曲练熟再说。

可可精品资料库