7.5 KiB
分层强化学习(HRL)实施计划 — 2026 高教社杯 B 题第三、四问
0. 现状与复用决策
仓库已有生产级基建,全部复用、不重写:
| 现有组件 | 位置 | 用途 |
|---|---|---|
SimulatorClient(HTTP+JSON、幂等重试、截止时钟、JSONL 日志) |
src/mcm26b/protocol/ |
模拟器对接(prompt 第 1 步已完成) |
| 本地评测机(内存回环,一局秒级) | referee/ + harness.LocalSimTransport |
本地简化环境内核 |
| 网格幸存集滤波(真源保留定理已证明) | src/mcm26b/particles.py |
每频道信念后验 |
| 凸候选集 + 五状态机 | src/mcm26b/belief/ |
频道状态观测 |
| 信息增益选点、TSP 2-opt、六边形覆盖、清除证书、后备清除 | src/mcm26b/planner/ |
候选生成器 + 证书审批兜底 + 启发式基线 |
| 单步 MaskablePPO 全套(特征/掩码/BC/训练/审计) | src/mcm26b/rl/ + scripts/ |
代码模式模板 + 端到端对照基线 |
改进方向(来自 v2 审计文档已知局限):单步 RL 只做选点、学不到全场调度;Q4 后备清除偏多、尾部退化(13778s→11797s,距 4000s 目标远)。HRL 高层正是补跨频道全场调度决策。
已确认的三个决策:① 代码集成到 src/mcm26b/hrl/(README 给出与 prompt 目录树的映射表);② 低层为字面 8 方向 PPO + 直线控制器对照(诚实预期:部署时只提交终点,低层对虚拟时间增益≈0,价值在架构完整性与消融验证);③ 本次跑通全流程 + 短程训练(1–2h),完整课程训练交付脚本由用户自行启动。
1. 新建文件
src/mcm26b/hrl/
├── __init__.py
├── constants.py # HRL 接口常量:N_CANDIDATES=96、观测维度,feature_version=3
├── candidates.py # 高层候选生成:待清除源/信息增益探索点/覆盖验证点/Q4 扇区探测点 + 动作掩码
├── features.py # 高层观测(20 频道×14 统计 + 全局标量 + 96×6 候选特征 ≈864 维)、低层观测
├── policy.py # HighLevelPolicy/LowLevelPolicy 加载器(沿用 PointSelectionPolicy 元数据校验模式)
├── low_level_env.py # 低层训练环境:随机起点→子目标,Discrete(8),逐步计费,奖励=−Δd−转向+到达
├── hierarchical_env.py # 高层整场环境:10–16 源,动作=子目标槽位,内嵌低层执行器,域随机化+课程参数
└── executor.py # 子目标执行器:低层 PPO 步进(本地计费)或直线控制器(可切换),终点提交模拟器
scripts/
├── train_hrl_low.py # 低层:BC 克隆直线控制器热启动 → MaskablePPO 微调;直线对照评估
├── train_hrl_high.py # 高层:4 阶段课程(--stage --resume --timesteps),SubprocVecEnv 并行
├── pretrain_hrl_expert.py # 可选:从 BayesLoop 调度器克隆 (obs, 子目标) 对热启动高层
├── tune_hrl.py # Optuna TPE(prompt §10 搜索空间,预算 15–20 trials,初值复用 bayes 已调参数)
├── benchmark_hrl.py # 配对消融:HRL vs bayes/directional/单步 PPO,dev(700-702)/val(91000-91005)/stress 固定场景
└── ablate_hrl.py # 四项消融:无信息增益奖励/无动作掩码/无课程/无粒子滤波
src/mcm26b/planner/hrl_loop.py # HRLLoop 运行时闭环(Q3/Q4),保留证书审批与异常留痕
src/mcm26b/cli.py # 新增 --strategy hrl / --q4-strategy hrl / --hrl-model
tests/test_hrl.py # 特征布局、掩码、环境形状、奖励恒等式、训练-部署观测一致性
docs/hrl.md # 设计文档 + prompt 目录树映射表
docs/paper/ 增补 # 算法流程图、伪代码、超参表、训练曲线
2. 核心设计
高层动作空间 Discrete(96) + 掩码:槽位按固定顺序填充(已定位待清除源 ≤16 → PF 驱动探索点 → 覆盖网格未验证点 → Q4 扇区探测点),空槽/已清除频道/接收盘外候选掩码 −∞。
高层观测(≈864 维,参照 v2 的 401 维布局模式):20 频道 × 14 特征(六状态 one-hot、MEC μx/μy、σx/σy/ρ、log 幸存格数、期望信息增益、距离、频道号)+ 全局 8 维(位置、时间比例、已清除数、最近检测结果编码/示向度/距离)+ 96×6 候选特征。
step 语义:高层选子目标 → executor 步进(低层 8 方向,每步 ≤100m,本地按 Δd/5 计费;部署时仅终点调模拟器)→ 按子目标类型执行 /measure 或 /clear → belief+PF 更新 → 奖励。
奖励:r = −Δ虚拟耗时/100 + 100·清除 + 5·新检测 + w_info·ΔH − 冗余惩罚,主口径与目标函数(虚拟时间)一致;w_info 可消融。
课程 4 阶段(prompt §7.1):1 源/5 频道/无噪 → 3 源/10 频道/±0.5° → 8 源/16 频道/±1° → 10–16 源/20 频道/±1°;每阶段迁移上阶段权重,Q4 从 Q3 权重微调(定向比例递增),域随机化贯穿(源位置/频道/r_eff/朝向/噪声种子)。
运行时闭环 HRLLoop:初始覆盖相位(快速发现信号)→ 主循环高层决策(证书达标自动 /clear,与 BayesLoop 同语义)→ 全清即 /exit。不触碰候选集更新与清除判定的守恒性(真源保留定理依赖),异常留痕兜底保留。
3. 实施顺序(对应 prompt §12)
constants.py+candidates.py+features.py(候选/掩码/观测)+ 单元测试low_level_env.py+train_hrl_low.py:低层短程训练,验证收敛到近直线(报告与直线最优的差距)hierarchical_env.py+executor.py+hierarchical_env单元测试(奖励恒等式:回合回报 = f(虚拟时间、清除数))train_hrl_high.py+ 课程 + 域随机化 + SubprocVecEnv;pretrain_hrl_expert.pyBC 热启动- 短程课程训练(每阶段 2–5 万步,总计 1–2h),产出训练曲线
hrl_loop.py+ CLI 接入,--local-judge本地演练验证全清正确性benchmark_hrl.py配对对比(沿用 benchmark_rl.py 的 all_valid 有效口径)+ablate_hrl.py四项消融tune_hrl.py受限 Optuna;产出最佳超参表- 本地 referee 演练 ×3/题,表 1 格式结果(案例编码/清除数/平均定位清除时间/程序运行时间),日志 JSONL 原样归档
output/hrl/ docs/hrl.md、README 更新、论文素材(流程图/伪代码/超参表/对比分析,含"为什么分层 PPO、为什么非端到端、为什么非多智能体"论证)
4. 验收标准
- 全部 pytest 通过(现有 243 项 + 新增 HRL 测试)
benchmark_hrl.py输出 all_valid=true(真值全清、缺席无误判、零异常、正常 exit、计时复算一致)- 短程训练下 Q4 HRL 相对 directional 有可测改进方向(对标单步 RL 的 −14.38%);Q3 如实报告与 bayes 的差距(v2 审计口径:Q3 RL 无稳定增益)
- 所有实验固定种子、命令可复现;消融表含均值±方差(≥5 种子)
- 完整训练只需用户执行
scripts/train_hrl_high.py --full级别的命令
5. 风险与对策
- 高层整场回合过长(100–200 决策步)不收敛 → γ=1 + 密集 Δcost 奖励 + BC 从 bayes 调度器热启动
- 低层增益≈0 → 如实消融报告(直线对照差异≈0),论文定位为架构必要性验证而非性能来源
- Q3 可能无增益 → 与 v2 口径一致如实报告,主打 Q4 调度收益;两种策略可共存(HRL 不改默认策略,仅在胜出后由用户决定切换默认)