8.7 KiB
8.7 KiB
CTM-DQN: 基于深度强化学习的动态限速控制系统
基于深度Q网络(DQN)和元胞传输模型(CTM)的高速公路动态限速控制系统。
声明:本 Readme 由AI辅助生成,进行了人工校对并调整了小部分内容
项目结构
ctm/
├── config.yaml # 配置文件
├── main.py # 主入口
├── ctm_model.py # 元胞传输模型实现
├── dqn_agent.py # DQN智能体与经验回放
├── environment.py # 训练环境
├── vectorized_env.py # 并行环境包装器
├── demand_loader.py # CSV流量数据加载器
├── train.py # 训练脚本
├── test.py # 测试/评估脚本
├── utils.py # 工具函数
├── checkpoints/ # 模型检查点(自动创建)
└── logs/ # 训练日志和图表(自动创建)
主要特性
- CTM交通模型: 真实的高速公路交通流仿真
- DQN智能体: 基于深度强化学习的限速控制
- 灵活配置: 通过YAML配置文件轻松调整参数
- 训练与测试: 独立的训练和评估模式
- 可视化: 自动生成训练结果和交通模式图表
- 检查点保存: 训练过程中定期保存模型
- 并行训练: 支持多环境并行训练,显著提升训练效率
- CSV流量输入: 支持从CSV文件读取真实交通流量数据
- 随机种子固定: 确保训练结果可重复
- 最佳模型保存: 自动保存效果最好的模型
安装
- 使用 uv 安装依赖:
uv sync
或手动安装:
pip install torch numpy matplotlib pyyaml tqdm pandas
快速开始
训练
使用默认配置训练DQN智能体:
python main.py --mode train
使用自定义配置训练:
python main.py --mode train --config custom_config.yaml
测试
测试训练好的模型:
python main.py --mode test
使用特定检查点测试:
python main.py --mode test --model checkpoints/model_best.pt
配置说明
所有参数都可以在 config.yaml 中调整。主要配置部分:
环境参数
num_cells: 道路单元数量(默认:10)cell_length: 每个单元长度,单位米(默认:500.0)free_flow_speed: 自由流速度,单位m/s(默认:30.0)demand_pattern: 交通需求模式 - "constant"、"sine"、"random"、"csv"demand_csv_path: CSV流量文件路径(当使用csv模式时)num_speed_actions: 离散限速动作数量(默认:5)episode_length: 每个episode的时间步数(默认:360)
DQN智能体参数
hidden_layers: 神经网络架构(默认:[256, 256])learning_rate: 学习率(默认:0.0001)gamma: 折扣因子(默认:0.99)epsilon_start/end/decay: 探索参数buffer_size: 经验回放缓冲区容量(默认:100000)batch_size: 训练批量大小(默认:128)target_update_freq: 目标网络更新频率(默认:10)
训练参数
num_episodes: 训练episode数量(默认:500)save_freq: 模型检查点保存频率(默认:50)log_freq: 日志记录频率(默认:10)random_seed: 随机种子(默认:42)num_parallel_envs: 并行环境数量(默认:4)
奖励函数权重
throughput_weight: 通行量奖励权重(默认:1.0)speed_weight: 平均速度奖励权重(默认:0.5)density_weight: 密度惩罚权重(默认:-0.3)action_change_weight: 动作变化惩罚权重(默认:-0.1)
高级功能
1. 并行环境训练
系统支持多环境并行训练,可显著提高训练效率。
配置方法
在 config.yaml 中设置:
training:
num_parallel_envs: 4 # 使用4个并行环境
推荐配置
- CPU训练: 2-4个并行环境
- GPU训练: 4-8个并行环境
- 高性能GPU: 8-16个并行环境
性能对比
| 并行环境数 | 相对速度 | 内存占用 | 推荐场景 |
|---|---|---|---|
| 1 | 1x | 低 | 调试、小规模实验 |
| 2 | ~1.8x | 中 | CPU训练 |
| 4 | ~3.5x | 中高 | 标准训练 |
| 8 | ~6.5x | 高 | GPU训练 |
使用示例
training:
num_episodes: 500
num_parallel_envs: 4
agent:
batch_size: 128 # 建议增加批量大小
buffer_size: 100000
运行训练:
python main.py --mode train
输出示例:
Random seed set to: 42
Created 4 parallel environments
Using 4 parallel environments
Starting training for 500 episodes...
2. CSV流量输入
系统支持从CSV文件读取真实交通流量数据。
CSV文件格式
格式1:单列格式(推荐)
demand
1500
1600
1700
1800
格式2:带时间列
time,demand
0,1500
10,1600
20,1700
注意事项:
- 流量单位:车辆/小时 (vehicles/hour)
- 每行代表一个时间步的流量需求
- 流量值必须为非负数
- 如果episode长度超过CSV数据长度,数据会循环使用
配置方法
在 config.yaml 中设置:
environment:
demand_pattern: "csv"
demand_csv_path: "demand_example.csv"
demand_csv_column: "demand"
使用示例
使用提供的示例文件:
environment:
demand_pattern: "csv"
demand_csv_path: "demand_example.csv"
使用自定义CSV文件:
environment:
demand_pattern: "csv"
demand_csv_path: "data/my_traffic_data.csv"
demand_csv_column: "flow"
切换回内置流量模式:
environment:
demand_pattern: "sine" # 或 "constant"、"random"
模型架构
DQN智能体
- 状态: 所有单元的交通密度和限速值的拼接
- 动作: 离散的限速值(在最小和最大限速之间均匀分布)
- 网络: 全连接层 + ReLU激活函数
- 训练: 经验回放 + 目标网络,实现稳定学习
CTM模型
元胞传输模型基于以下原理模拟交通流:
- 发送流: 受密度和限速限制
- 接收流: 受下游容量限制
- 守恒性: 车辆在单元边界守恒
- 基本图: 密度、流量和速度之间的关系
输出文件
训练和测试后会生成以下文件:
checkpoints/model_episode_*.pt: 训练过程中保存的模型检查点checkpoints/model_best.pt: 效果最好的模型(基于episode奖励)checkpoints/model_final.pt: 最终训练的模型logs/training_results.png: 训练曲线(奖励、损失、通行量)logs/test_results.png: 测试可视化(密度热图和限速控制)
使用示例工作流
- 调整配置: 根据你的场景修改
config.yaml - 训练模型:
python main.py --mode train - 监控进度: 查看控制台输出和
logs/training_results.png - 测试模型:
python main.py --mode test - 分析结果: 查看
logs/test_results.png - 迭代优化: 根据需要调整参数并重新训练
故障排查
训练相关
问题:CUDA内存不足
agent:
batch_size: 64 # 减小批量大小
device: "cpu" # 或切换到CPU
问题:训练速度慢
training:
num_parallel_envs: 4 # 启用并行环境
num_episodes: 200 # 减少episode数量
environment:
episode_length: 180 # 减少episode长度
问题:训练不稳定
agent:
learning_rate: 0.00005 # 降低学习率
target_update_freq: 20 # 增加目标网络更新频率
问题:性能不佳
reward:
throughput_weight: 2.0 # 调整奖励权重
speed_weight: 1.0
agent:
hidden_layers: [256, 256, 128] # 增加网络容量
并行训练相关
问题:并行训练速度提升不明显
- 检查GPU利用率是否已经很高
- 瓶颈可能在网络训练而非数据收集
- 尝试减少训练频率
问题:内存不足
training:
num_parallel_envs: 2 # 减少并行环境数
agent:
buffer_size: 50000 # 减小缓冲区
CSV流量输入相关
问题:找不到CSV文件
- 检查文件路径是否正确(相对路径或绝对路径)
- 确保文件存在于指定位置
问题:CSV数据格式错误
- 确保CSV文件包含指定的列名
- 检查数据是否为非负数
- 验证CSV文件编码(建议使用UTF-8)
技术细节
随机种子固定
系统在训练开始时会固定所有随机种子(Python、NumPy、PyTorch),确保:
- 训练结果可重复
- 便于调试和对比实验
- 默认种子值为42,可在配置文件中修改
最佳模型保存
训练过程中会自动跟踪并保存效果最好的模型:
- 基于episode总奖励评估
- 保存为
checkpoints/model_best.pt - 训练结束时显示最佳奖励值
许可证
本项目仅供学术研究使用。