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:引用前面定义的vTyperoute:引用前面定义的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和route写在一个文件里。后来项目大了,发现这样维护很痛苦。建议把vType单独放一个文件,用
<xinclude> 引入。这样换车型配置时,不用动路线文件。
好了,这一章的内容就这些。记住三个核心:vType定性能、route定路径、flow定数量。下一章咱们会聊怎么用SUMO自带的工具生成更复杂的路网。不过那是后话了,先把今天的三部曲练熟再说。
可可精品资料库