|
|
||
|---|---|---|
| sumo_resource | ||
| .gitignore | ||
| .python-version | ||
| README.md | ||
| appo_sumo_agent.py | ||
| config_sumo_vsl.yaml | ||
| create_optimized_routes.py | ||
| dqn_agent.py | ||
| evaluate_models.py | ||
| filter_routes_by_detectors.py | ||
| filter_routes_optimized.py | ||
| plot_actions.py | ||
| plot_density_from_csv.py | ||
| plot_global_variance.py | ||
| plot_speed_heatmap.py | ||
| ppo_agent.py | ||
| pyproject.toml | ||
| show_ppo_decisions.py | ||
| sumo_edge_vsl_environment.py | ||
| sumo_network_parser.py | ||
| sumo_vsl_environment.py | ||
| train_sumo_appo.py | ||
| train_sumo_dqn.py | ||
| train_sumo_ppo.py | ||
| training_logger.py | ||
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?
- 动作空间大:125维动作空间,PPO的策略梯度更高效
- 稳定性:PPO的裁剪机制避免训练崩溃
- 样本效率:多次优化同一批数据,效率更高
- 连续性:交通控制策略需要平滑过渡
分区控制的优势
- 降维:从10个cell降到3个zone
- 空间差异:上游、中游、下游不同策略
- 实际可行:现实中VSL标志有限
事故随机性
- 位置随机:适应不同瓶颈位置
- 持续时间随机:学习短期/长期应对
- 车道随机:处理不同车道场景
- 每集1次:明确的事故-恢复周期
注意事项
- 训练时间:500 episodes约需30-60分钟(CPU)
- GPU加速:有GPU时会自动使用CUDA
- 随机种子:配置中
random_seed: null表示真随机 - 收敛判断:观察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