ctm-dqn/README.md

237 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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