- 目标:构建一个带固定配时信号控制的四进口十字路口 SUMO 仿真环境,并生成24小时的时变交通需求,用于后续实验(如信号配时对通行效率/排队的影响、不同需求水平下的拥堵演化等)。
- 核心输出:车辆行程统计(
tripinfo.xml)、排队统计(queue.xml)、全局汇总(summary.xml)、入口检测器流量统计(detector_*.xml)。
-
网络/几何与控制
intersection.nod.xml:节点定义(中心节点C为信号控制;四端点N/S/E/W为边界)。intersection.edg.xml:道路边定义(每个方向 3 车道;速度上限 13.89 m/s)。intersection.con.xml:车道连接关系(约定:0=右转,1=直行,2=左转)。intersection.tll.xml:信号控制逻辑(tlLogic id="C",固定配时)。intersection.net.xml:由netconvert生成的综合网络文件(仿真实际读取;包含 lane 几何、internal edge、tlLogic、linkIndex映射等)。
-
需求/车辆
generate_routes.py:生成intersection.rou.xml(24小时、分时变流量、泊松到达)。intersection.rou.xml:路由与车辆出发事件(由脚本生成;仿真读取)。
-
仿真配置与附加设备
intersection.sumocfg:SUMO 配置入口(指定 net/rou/add、输出、时间参数、seed 等)。intersection.add.xml:附加设备(入口感应线圈检测器 E1)。
-
脚本
build_network.bat:生成intersection.net.xml+ 调用generate_routes.py生成intersection.rou.xml+ 快速验证。run_simulation.bat:交互式选择命令行/GUI运行。run_gui.bat:快速 GUI 启动。
- 仿真时间:
begin=0,end=86400(24小时),step-length=1(1秒步长)。 - 随机种子:
seed=42(确保可复现)。 - 传送机制:
time-to-teleport=-1(禁用 teleport;拥堵会真实积累,但可能导致长时间阻塞)。 - 输出:
output/summary.xml:每秒汇总(系统级:loaded/inserted/running/meanSpeed/meanWaitingTime/...)。output/tripinfo.xml:每车行程统计(depart/arrival/duration/waitingTime/timeLoss/...)。output/queue.xml:排队导出(按 timestep 记录车道队列)。
- 中心交叉口:
C(0,0),类型:traffic_light。 - 边界节点:
N(0,300)、S(0,-300)、E(300,0)、W(-300,0)。
- 四个进口:
N2C、S2C、E2C、W2C(均numLanes=3)。 - 四个出口:
C2N、C2S、C2E、C2W(均numLanes=3)。 - 速度上限:13.89 m/s(约 50 km/h)。
intersection.net.xml中可见进口/出口边长度约 286.4 m(几何由netconvert内部计算得到)。
intersection.con.xml 的注释明确约定:
- fromLane=0:右转
- fromLane=1:直行
- fromLane=2:左转
并在四个方向都按此规则连接到相应出口(例如 W2C:0→C2S,1→C2E,2→C2N)。
tlLogic 的 state 字符串长度为 12,对应 12 个受控连接(linkIndex=0..11):
| linkIndex | 来向边 | fromLane | 转向 | 说明(与 state 位置一致) |
|---|---|---|---|---|
| 0 | N2C | 0 | 右转 | N右 |
| 1 | N2C | 1 | 直行 | N直 |
| 2 | N2C | 2 | 左转 | N左 |
| 3 | E2C | 0 | 右转 | E右 |
| 4 | E2C | 1 | 直行 | E直 |
| 5 | E2C | 2 | 左转 | E左 |
| 6 | S2C | 0 | 右转 | S右 |
| 7 | S2C | 1 | 直行 | S直 |
| 8 | S2C | 2 | 左转 | S左 |
| 9 | W2C | 0 | 右转 | W右 |
| 10 | W2C | 1 | 直行 | W直 |
| 11 | W2C | 2 | 左转 | W左 |
一个周期由 4 组“绿+黄+全红”组成(其中黄灯 3 秒,全红 2 秒):
- 南北左转保护:10s 绿 + 3s 黄 + 2s 全红
- 南北直行+右转:25s 绿 + 3s 黄 + 2s 全红
- 东西左转保护:10s 绿 + 3s 黄 + 2s 全红
- 东西直行+右转:25s 绿 + 3s 黄 + 2s 全红
周期总时长:((10+3+2) + (25+3+2) + (10+3+2) + (25+3+2) = 90) 秒。
- 随机种子:
RANDOM_SEED = 42,并np.random.seed(42)。 - 只要代码与输入参数不变,每次生成的
intersection.rou.xml在统计意义与序列上都可复现。
- 仿真时长:
SIMULATION_DURATION = 86400秒(24小时) - 需求更新步长:
TIME_STEP = 300秒(每 5 分钟更新一次流量水平) - 转向比例(对每个进口方向的基础流量进行拆分):
- 直行
0.60 - 左转
0.25 - 右转
0.15
- 直行
- 主方向增益:若路线以
N或S开头,则额外乘以direction_factor = 1.2(南北方向更大流量)。
备注:
generate_routes.py顶部注释里的“流量分布区间”是“设计意图描述”,而实际仿真以代码里的base_flow与分段函数为准(当前base_flow=300,早晚高峰叠加幅度为 600)。
脚本用分段规则 get_hourly_flow_rate(hour) 表示一天内变化:
- 早高峰 7–9:以 8 点为峰值,线性形状(通过
peak_factor) - 晚高峰 17–19:以 18 点为峰值
- 白天 9–17:
base_flow + 200 - 晚间 19–23:逐步衰减
- 深夜/凌晨 23–7:
base_flow * 0.3
对每个 TIME_STEP 时间窗、每条路线独立生成车辆出发时刻:
- 将每条路线对应的目标小时流量(veh/h)按转向比例折算为该路线流量;
- 换算为每秒到达率 (\lambda = \frac{\text{veh/h}}{3600});
- 车辆间隔服从指数分布:
np.random.exponential(1 / lambda_rate); - 将所有路线/时段生成的车辆汇总后按
depart排序输出到intersection.rou.xml。
- vType(当前生成文件中):
accel=2.6decel=4.5sigma=0.5length=5maxSpeed=16.67m/s
- 出发车道选择:
departLane="best"(SUMO 自行选择“最佳”车道,允许换道策略影响入道车道) - 出发速度:
departSpeed="max"(尽可能以允许的最大速度出发) - 车辆总数:当前
intersection.rou.xml含<vehicle ...>39256 辆(按文件统计)。
- 每个进口 3 条车道均布置检测器(共 12 个):
N2C_0/1/2、S2C_0/1/2、E2C_0/1/2、W2C_0/1/2
- 位置:
pos=250(沿车道距离起点 250m,靠近交叉口) - 统计周期:
freq=300秒(与TIME_STEP一致,便于对齐需求) - 输出文件:
output/detector_*.xml(例如output/detector_W2C.xml)
常见字段示例(每 300 秒一个 interval):flow、occupancy、speed、nVehEntered 等。
output/summary.xml:每秒系统级指标(插入、运行、到达、平均速度/平均等待等)。output/tripinfo.xml:每辆车行程级指标(行程时间、等待时间、timeLoss 等)。output/queue.xml:每秒队列信息(按车道聚合;文件可能非常大)。
- 构建网络 + 生成需求 + 快速验证:运行
build_network.bat- 调用
netconvert生成intersection.net.xmlnetconvert --node-files=intersection.nod.xml --edge-files=intersection.edg.xml --connection-files=intersection.con.xml --tllogic-files=intersection.tll.xml --output-file=intersection.net.xml --no-turnarounds=true --offset.disable-normalization=true
- 调用
python generate_routes.py生成intersection.rou.xml - 调用
sumo -c intersection.sumocfg ... -e 10做短时验证
- 调用
- 运行仿真:运行
run_simulation.bat- 交互选择命令行或 GUI 模式
- 直接 GUI:运行
run_gui.bat
- 需求独立性假设:各路线在每个 5 分钟窗内独立泊松到达(无 platoon、无相关性)。
- 车道分配:车辆出发采用
departLane="best",会引入换道与车道选择策略影响(对“每车道流量”会有偏差)。 - 固定配时:信号为 static,不会根据检测器自适应调整。
- 无行人/非机动车:当前网络与需求未定义行人或自行车流。
- 禁用 teleport:拥堵严重时不会“清除”车辆,可能导致极端队列堆积与仿真耗时上升。