237 lines
5.0 KiB
Markdown
237 lines
5.0 KiB
Markdown
# 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
|