4. 交通需求生成
各位同学,今天我们来聊聊交通需求生成。说白了,就是告诉SUMO:路上要跑什么样的车?车从哪来、到哪去?怎么走?
我个人习惯把这一章叫做「搭积木」。你想想看,一个完整的交通仿真,无非就是定义好车辆类型,然后告诉它们怎么走、走多少。嗯,咱们一步步来。
1. 车辆类型定义(vType)
先说说vType。这是最基础的东西。我刚开始做仿真时,经常忽略这一步,结果跑出来的车流跟现实完全对不上。
vType定义的是车辆的「性格」:
- id:类型名称,比如"car"、"truck"
- accel:最大加速度(m/s²)
- decel:最大减速度(m/s²)
- length:车身长度(米)
- maxSpeed:最高速度(m/s)
- sigma:驾驶行为的随机性(0=完美驾驶,1=完全随机)
举个例子:
<vType id="car" accel="2.6" decel="4.5" length="4.5" maxSpeed="50" sigma="0.5"/>
<vType id="truck" accel="1.2" decel="3.0" length="12.0" maxSpeed="30" sigma="0.3"/>
我的经验:sigma值别设太大。我曾经设成0.9,结果车在路上像喝醉了酒一样左右摇摆,根本没法用。一般0.3-0.5就够了。
2. 车辆流定义(flow)
有了车辆类型,接下来就是告诉SUMO:什么时候发车?发多少?
flow的定义方式有两种:
- 固定间隔:每X秒发一辆车
- 泊松分布:按概率密度发车,更接近真实交通
看个例子:
<flow id="flow1" type="car" from="edge1" to="edge2" begin="0" end="3600" number="1000"/>
这个flow的意思是:从0秒到3600秒(1小时),在edge1到edge2之间,总共发1000辆小车。
注意:number和period不能同时使用。如果你写了number,SUMO会自动计算间隔。如果你写了period,那就是固定间隔发车。我见过有人两个都写,结果车流乱套了。
3. 路径定义(route)
路径就是告诉车怎么走。最简单的做法是直接指定经过的边序列:
<route id="route1" edges="edge1 edge2 edge3 edge4"/>
但实际项目中,我更推荐用概率路径。什么意思呢?就是给每个路口设置转向概率,让车自己选择怎么走。这样更真实。
举个例子:
<routeDistribution id="routeDist1">
<route id="r1" edges="edge1 edge2 edge3" probability="0.6"/>
<route id="r2" edges="edge1 edge4 edge5" probability="0.4"/>
</routeDistribution>
这样60%的车走第一条路,40%走第二条。嗯,真实世界哪有所有车都走同一条路的?
4. 使用randomTrips.py生成随机交通流
手动写flow和route太累了,尤其是大路网。SUMO提供了一个神器——randomTrips.py。
这个脚本能自动生成随机车流,你只需要告诉它:
- 路网文件(.net.xml)
- 发车时间段
- 车辆总数
- 车辆类型
基本用法:
python tools/randomTrips.py -n mynetwork.net.xml -o trips.trips.xml -e 3600 -p 0.5
参数说明:
| 参数 | 含义 | 示例 |
|---|---|---|
| -n | 路网文件 | mynetwork.net.xml |
| -o | 输出文件 | trips.trips.xml |
| -e | 结束时间(秒) | 3600 |
| -p | 发车间隔(秒) | 0.5 |
| --trip-attributes | 附加属性 | "type=\"car\"" |
避坑指南:我曾经用randomTrips.py生成车流,结果发现所有车都从同一个起点出发。后来才发现,默认情况下它只从路网边缘节点发车。如果你想让车从内部节点出发,需要加参数 --internal。
知识体系总览
下面这张图,是我自己总结的交通需求生成的核心逻辑:
你看,整个流程其实很清晰。先准备好路网,然后定义车辆类型、车流和路径,最后用randomTrips.py一键生成。嗯,就是这么简单。
小技巧:如果你需要生成多种车型混合的交通流,可以先用randomTrips.py生成基础车流,然后手动修改rou.xml文件,把不同比例的车分配不同的vType。我经常这么干,效果很好。
好了,这一章的内容就到这里。记住:vType是基础,flow是骨架,route是路线,randomTrips.py是加速器。把这四个东西搞明白,交通需求生成这块你就拿下了。