Description
Go to file
Zihan Ye 288f67ae50 更新热力图绘制 2026-04-17 07:09:09 +08:00
agents 更换奖励函数 2026-04-16 09:37:54 +08:00
envs 更新热力图绘制 2026-04-17 07:09:09 +08:00
scripts 更新热力图绘制 2026-04-17 07:09:09 +08:00
sumo_resource 增加地图相关元素绘制,修复车检器生成逻辑 2026-04-14 06:14:18 +08:00
training 更新更简单的奖励函数 2026-04-16 10:48:36 +08:00
utils 更新热力图绘制 2026-04-17 07:09:09 +08:00
.gitignore 更换奖励函数 2026-04-16 09:37:54 +08:00
.python-version First runnable 2026-01-05 16:15:53 +08:00
README.md APPO第一次提交 2026-03-24 23:55:33 +08:00
config_sumo_vsl.yaml 更新热力图绘制 2026-04-17 07:09:09 +08:00
pyproject.toml 新增DDQN模型,统一各模型参数设置 2026-04-14 04:45:20 +08:00
run_all_training.py 统一模型训练时存储路径 2026-04-10 02:39:05 +08:00

README.md

PPO-VSL: 基于PPO的可变限速控制系统

系统概述

基于近端策略优化PPO的可变限速VSL控制系统用于优化事故场景下的高速公路交通流管理。

核心特性

  • 双车道CTM模型:元胞传输模型模拟交通流
  • 分区VSL控制3区域差异化限速策略
  • PPO算法:稳定的策略梯度优化
  • 事故场景:随机事故位置和持续时间

系统配置

环境参数

车道数: 2
元胞数: 10 (每个1km)
总长度: 10km
控制分区: 3个
速度等级: 5个 (15.0, 18.75, 22.5, 26.25, 30.0 m/s)

状态空间

state_dim = num_lanes × num_cells × 2
         = 2 × 10 × 2 = 40
# 每个元胞:[密度(归一化), 限速(归一化)]

动作空间

action_dim = num_speed_actions ^ num_control_zones
          = 5 ^ 3 = 125
# 每个zone可选5个速度等级

事故设置

每集事故数: 1
事故车道: 随机 (0或1)
事故位置: 后60%-100%路段随机
持续时间: 40-80步 (6.7-13.3分钟)
严重度: severe (容量降低70-90%)

核心文件

文件 功能
ppo_agent.py PPO智能体实现
train_ppo.py PPO训练脚本
test_ppo.py 测试与基线对比
visualize_ppo.py 时空图可视化
incident_vsl_environment.py RL环境
incident_ctm_model.py CTM交通流模型
incident_manager.py 事故管理器
config_incident_vsl.yaml 系统配置

快速开始

1. 训练PPO模型

uv run python train_ppo.py

训练参数:

  • Episodes: 500
  • Episode长度: 150步 (25分钟)
  • 学习率: 3e-4
  • GAE λ: 0.95
  • PPO epochs: 10
  • Mini-batch: 64

2. 测试模型

uv run python test_ppo.py

对比测试:

  • 无控制基线(固定最高限速)
  • PPO学习策略动态调整限速

3. 可视化结果

uv run python visualize_ppo.py

生成时空对比图:

  • 速度分布
  • 限速策略
  • 密度演化
  • 事故影响

PPO网络架构

Actor-Critic结构

                  ┌─→ Actor Head → Policy(125)
Input(40) → FC(256) → ReLU → FC(256) → ReLU ─┤
                  └─→ Critic Head → Value(1)

关键超参数

gamma = 0.99           # 折扣因子
gae_lambda = 0.95      # GAE优势估计
clip_epsilon = 0.2     # PPO裁剪范围
value_coef = 0.5       # 价值损失系数
entropy_coef = 0.01    # 熵正则化系数

奖励函数

# 多目标加权组合
reward = (
    w1 * throughput_normalized +     # 吞吐量 (0.4)
    w2 * (-avg_density_normalized) + # 密度惩罚 (0.3)
    w3 * avg_speed_normalized +      # 平均速度 (0.2)
    w4 * (-speed_variance_penalty)   # 速度方差 (0.1)
)

预期结果

VSL控制效果

理想策略

  • 事故上游:降低限速,减少车辆进入
  • 事故区域:最低限速,最大化安全
  • 事故下游:逐步恢复限速,疏导交通

性能指标

  • 吞吐量相比baseline提升5-15%
  • 平均速度:更平稳,减少激波
  • 密度分布:更均匀,避免局部拥堵

输出文件结构

checkpoints_incident_vsl/
└── YYYYMMDD_HHMMSS/
    ├── config.yaml          # 训练配置
    ├── model_ep100.pt       # 中间checkpoint
    ├── model_ep200.pt
    ├── ...
    └── model_ep500.pt       # 最终模型

logs_incident_vsl/
└── YYYYMMDD_HHMMSS/
    ├── training_curves.png  # 训练曲线
    └── metrics.csv          # 训练指标

ppo_spacetime_comparison.png  # 可视化对比图

环境依赖

python >= 3.8
torch >= 2.0
numpy
matplotlib
pyyaml
tqdm

安装依赖:

uv add torch numpy matplotlib pyyaml tqdm

关键设计

为什么选PPO而非DQN

  1. 动作空间大125维动作空间PPO的策略梯度更高效
  2. 稳定性PPO的裁剪机制避免训练崩溃
  3. 样本效率:多次优化同一批数据,效率更高
  4. 连续性:交通控制策略需要平滑过渡

分区控制的优势

  1. 降维从10个cell降到3个zone
  2. 空间差异:上游、中游、下游不同策略
  3. 实际可行现实中VSL标志有限

事故随机性

  • 位置随机:适应不同瓶颈位置
  • 持续时间随机:学习短期/长期应对
  • 车道随机:处理不同车道场景
  • 每集1次明确的事故-恢复周期

注意事项

  1. 训练时间500 episodes约需30-60分钟CPU
  2. GPU加速有GPU时会自动使用CUDA
  3. 随机种子:配置中random_seed: null表示真随机
  4. 收敛判断观察reward曲线趋于稳定

故障排查

训练不收敛

  • 降低学习率3e-4 → 1e-4
  • 增加训练episodes
  • 检查奖励函数权重

内存不足

  • 减少mini-batch大小64 → 32
  • 减小网络256 → 128
  • 使用CPU训练

加载模型失败

  • 确认model路径正确
  • 检查配置一致性state_dim, action_dim
  • 查看checkpoint目录内容

开发团队

VSL-RL Research Group

许可证

MIT License