# PPO-VSL: 基于PPO的可变限速控制系统 ## 系统概述 基于近端策略优化(PPO)的可变限速(VSL)控制系统,用于优化事故场景下的高速公路交通流管理。 ## 核心特性 - **双车道CTM模型**:元胞传输模型模拟交通流 - **分区VSL控制**:3区域差异化限速策略 - **PPO算法**:稳定的策略梯度优化 - **事故场景**:随机事故位置和持续时间 ## 系统配置 ### 环境参数 ```yaml 车道数: 2 元胞数: 10 (每个1km) 总长度: 10km 控制分区: 3个 速度等级: 5个 (15.0, 18.75, 22.5, 26.25, 30.0 m/s) ``` ### 状态空间 ```python state_dim = num_lanes × num_cells × 2 = 2 × 10 × 2 = 40维 # 每个元胞:[密度(归一化), 限速(归一化)] ``` ### 动作空间 ```python action_dim = num_speed_actions ^ num_control_zones = 5 ^ 3 = 125 # 每个zone可选5个速度等级 ``` ### 事故设置 ```yaml 每集事故数: 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模型 ```bash uv run python train_ppo.py ``` 训练参数: - Episodes: 500 - Episode长度: 150步 (25分钟) - 学习率: 3e-4 - GAE λ: 0.95 - PPO epochs: 10 - Mini-batch: 64 ### 2. 测试模型 ```bash uv run python test_ppo.py ``` 对比测试: - 无控制基线(固定最高限速) - PPO学习策略(动态调整限速) ### 3. 可视化结果 ```bash 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) ``` ### 关键超参数 ```python gamma = 0.99 # 折扣因子 gae_lambda = 0.95 # GAE优势估计 clip_epsilon = 0.2 # PPO裁剪范围 value_coef = 0.5 # 价值损失系数 entropy_coef = 0.01 # 熵正则化系数 ``` ## 奖励函数 ```python # 多目标加权组合 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 ``` 安装依赖: ```bash 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