交通需求生成:车辆类型、车辆流、路径与随机交通流

各位同学,今天我们来聊聊交通需求生成。说白了,就是告诉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。

知识体系总览

下面这张图,是我自己总结的交通需求生成的核心逻辑:

交通需求生成核心流程 路网文件 (.net.xml) vType 定义 flow 定义 route 定义 randomTrips.py 生成 交通需求文件 (.rou.xml)

你看,整个流程其实很清晰。先准备好路网,然后定义车辆类型、车流和路径,最后用randomTrips.py一键生成。嗯,就是这么简单。

小技巧:如果你需要生成多种车型混合的交通流,可以先用randomTrips.py生成基础车流,然后手动修改rou.xml文件,把不同比例的车分配不同的vType。我经常这么干,效果很好。

好了,这一章的内容就到这里。记住:vType是基础,flow是骨架,route是路线,randomTrips.py是加速器。把这四个东西搞明白,交通需求生成这块你就拿下了。

可可精品资料库