# 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文件读取真实交通流量数据 - **随机种子固定**: 确保训练结果可重复 - **最佳模型保存**: 自动保存效果最好的模型 ## 安装 1. 使用 uv 安装依赖: ```bash uv sync ``` 或手动安装: ```bash pip install torch numpy matplotlib pyyaml tqdm pandas ``` ## 快速开始 ### 训练 使用默认配置训练DQN智能体: ```bash python main.py --mode train ``` 使用自定义配置训练: ```bash python main.py --mode train --config custom_config.yaml ``` ### 测试 测试训练好的模型: ```bash python main.py --mode test ``` 使用特定检查点测试: ```bash 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` 中设置: ```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训练 | #### 使用示例 ```yaml training: num_episodes: 500 num_parallel_envs: 4 agent: batch_size: 128 # 建议增加批量大小 buffer_size: 100000 ``` 运行训练: ```bash 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:单列格式(推荐)** ```csv demand 1500 1600 1700 1800 ``` **格式2:带时间列** ```csv time,demand 0,1500 10,1600 20,1700 ``` **注意事项:** - 流量单位:车辆/小时 (vehicles/hour) - 每行代表一个时间步的流量需求 - 流量值必须为非负数 - 如果episode长度超过CSV数据长度,数据会循环使用 #### 配置方法 在 `config.yaml` 中设置: ```yaml environment: demand_pattern: "csv" demand_csv_path: "demand_example.csv" demand_csv_column: "demand" ``` #### 使用示例 使用提供的示例文件: ```yaml environment: demand_pattern: "csv" demand_csv_path: "demand_example.csv" ``` 使用自定义CSV文件: ```yaml environment: demand_pattern: "csv" demand_csv_path: "data/my_traffic_data.csv" demand_csv_column: "flow" ``` 切换回内置流量模式: ```yaml 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`: 测试可视化(密度热图和限速控制) --- ## 使用示例工作流 1. **调整配置**: 根据你的场景修改 `config.yaml` 2. **训练模型**: `python main.py --mode train` 3. **监控进度**: 查看控制台输出和 `logs/training_results.png` 4. **测试模型**: `python main.py --mode test` 5. **分析结果**: 查看 `logs/test_results.png` 6. **迭代优化**: 根据需要调整参数并重新训练 --- ## 故障排查 ### 训练相关 **问题:CUDA内存不足** ```yaml agent: batch_size: 64 # 减小批量大小 device: "cpu" # 或切换到CPU ``` **问题:训练速度慢** ```yaml training: num_parallel_envs: 4 # 启用并行环境 num_episodes: 200 # 减少episode数量 environment: episode_length: 180 # 减少episode长度 ``` **问题:训练不稳定** ```yaml agent: learning_rate: 0.00005 # 降低学习率 target_update_freq: 20 # 增加目标网络更新频率 ``` **问题:性能不佳** ```yaml reward: throughput_weight: 2.0 # 调整奖励权重 speed_weight: 1.0 agent: hidden_layers: [256, 256, 128] # 增加网络容量 ``` ### 并行训练相关 **问题:并行训练速度提升不明显** - 检查GPU利用率是否已经很高 - 瓶颈可能在网络训练而非数据收集 - 尝试减少训练频率 **问题:内存不足** ```yaml 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` - 训练结束时显示最佳奖励值 --- ## 许可证 本项目仅供学术研究使用。