# 环境、信息条件与 baseline

本章以 v3.4 已完成训练的冻结配置和当前 DelivCoal 代码为依据。配置中的研究字段已抽取为 [research_settings.csv](evidence/research_settings.csv)；环境接口尺寸通过实际构造核对。[核对记录](evidence/implementation_checks.json)

## DelivCoal 的物理对象

| 对象 | v3.4 实际设置与工作方式 | 代码依据 |
|---|---|---|
| 地图 | 连续二维正方形，边长 1000；任务和机器人位置随机采样 | [初始化](code_view/envs/delivcoal/env_core.py.html#L721) |
| 智能体 | 总数 12；配置 num_uav=4、num_ugv=8 相加得到总数，Agent 构造时随机采样 Drone/Vehicle 类型 | [Agent](code_view/envs/delivcoal/env_core.py.html#L144)、[生成](code_view/envs/delivcoal/env_core.py.html#L733) |
| 异构能力 | 四个 [0,1) 随机分量分别决定感知半径、移动速度、载荷上限和电量 | [能力映射](code_view/envs/delivcoal/env_core.py.html#L144) |
| 配送任务 | 10 个，位置固定于本回合；初始需求为整数 100–499，初始隐藏 | [任务生成](code_view/envs/delivcoal/env_core.py.html#L750) |
| 任务价值 | priority∈[0.5,1)，deadline fraction∈[0.45,0.95)；通过奖励影响任务服务价值 | [生成](code_view/envs/delivcoal/env_core.py.html#L765)、[奖励](code_view/envs/delivcoal/env_core.py.html#L2036) |
| 危险区 | 10 个随机圆心；本轮默认半径 1.0，路径安全余量 0.5 | [地图](code_view/envs/delivcoal/env_core.py.html#L721)、[绕行函数](code_view/envs/delivcoal/env_core.py.html#L34) |
| 补给站 | 原点 (0,0)，抵达后恢复个体载荷和电量上限 | [补给任务](code_view/envs/delivcoal/env_core.py.html#L791)、[补给](code_view/envs/delivcoal/env_core.py.html#L217) |

若能力向量为 u_i，实际感知半径为 50u_i[0]，每步移动距离为 10+10u_i[1]，初始载荷为 30+floor(70u_i[2])，初始电量为 500+floor(500u_i[3])。存活机器人每个物理步耗电 1。类型标记进入观测，当前这些物理公式由能力分量决定。配置中的 UAV/UGV 感知区间字段被保留，实际发现检查使用上述 `agent.perception`。[Agent 与 discover_along_segment](code_view/envs/delivcoal/env_core.py.html#L144)

机器人沿已规划路径移动。路径规划器读取全部危险圆位置，尝试直线连接，并在圆形危险区附近插入绕行点；actor 读取的状态通过下文的观测接口提供。探测沿实际移动线段检查目标到线段的距离，减少高速移动时漏检目标的情况。[路径与探测](code_view/envs/delivcoal/env_core.py.html#L1004)

## 任务如何完成与联盟如何形成

每名机器人保存当前任务编号 coalition。选择同一 Deliver 槽的存活机器人构成当前配送联盟。机器人抵达任务位置后，一次交付 `min(当前载荷, 剩余需求)`；交付后任务需求下降，需求降至零时标记完成，并向同联盟成员发出完成事件。不同成员可以先后抵达、分次供货；补给后可再次服务任务。[step 配送分支](code_view/envs/delivcoal/env_core.py.html#L1347)

DelivCoal 的任务 `req_vec` 被设为 `[priority,0,0,0]`，四维机器人能力用于感知、移动、携带和续航，任务完成按上述标量交付过程判断。deadline 是软时间要求：它用于紧迫度成本与及时完成奖励；超期任务继续保留到完成或回合结束。[生成与 shaped reward](code_view/envs/delivcoal/env_core.py.html#L765)

这一设定适合研究资源承诺、分次配送与任务服务顺序。多技能同时到达的联合服务要求属于 CFM 原环境的另一种物理设定，参见 [CFM 原文](https://marmotlab.org/publications/73-RAL2025-HetMRTA.pdf)。

## 高层动作与执行过程

| 动作槽 | 数量 / ID | 环境执行 |
|---|---|---|
| Deliver | 10，0–9 | 选择对应任务并沿路径前往配送 |
| Explore | 8，10–17 | 以当前机器人为起点，选择八个方向之一；标称步长 200，方向扰动参数 0.1，目标裁剪到地图边界 |
| Idle | 1，18 | 原地等待，仍参与时间与电量推进 |
| Resupply | 1，19 | 前往原点补给 |

动作合法性由 `available_actions[12,20]` 表示。已发现且尚未完成的配送任务可选；Idle/Resupply 通常可选；过短的边界探索方向被逐机器人屏蔽。[动作掩码](code_view/envs/delivcoal/env_core.py.html#L862)

训练使用 event 重决策：新任务发现或任意任务完成会让存活机器人重新获得任务选择机会；个体动作完成也触发该个体重决策；全体停住时激活存活机器人。其余时间继续执行已有动作。这里的环境事件日程与网络中的 AA sigmoid 权重分别作用于“何时决策”和“如何编码关系”。[事件条件](code_view/envs/delivcoal/env_core.py.html#L902)、[key_event](code_view/envs/delivcoal/env_core.py.html#L1412)

## 一个 episode 的流程

```text
full_random reset：重采样地图、任务、机器人 → 全部机器人获得首次决策机会
      ↓
构造共享已发现任务、队友状态、各自探索候选 → actor 输出合法任务动作
      ↓
更新联盟归属 → 按需规划路径 → 移动、探测、耗电
      ↓
抵达后的交付 / 补给 → 更新任务需求和完成事件
      ↓
计算个体 shaped reward、下一步观测、active mask、终止/截断标志
      ↓
未结束时进入下一物理步；结束后向量环境自动 reset
```

所有配送任务完成、所有机器人死亡或达到 750 步时结束。自然结束与时间截断通过 `bad_mask` 区分，供训练回报处理使用。初始配送任务在 reset 时生成，普通回合中的“新任务”指它被发现；优先级专项实验通过事件注入控制任务揭示时刻。[reset](code_view/envs/delivcoal/env_core.py.html#L813)、[终止处理](code_view/envs/delivcoal/env_core.py.html#L1412)

## Actor 观测与 critic 状态

每个机器人 actor 使用以下 Dict。全部机器人一起推理时，在每个形状前增加一个大小为 12 的 observer 维。

| 字段 | 单个 observer 的形状 | 有效字段 |
|---|---|---|
| ego | [11] | 位置/1000 两维、四维能力、当前联盟编号/19、当前任务类型/3、load/init_load、已发现任务比例、battery/1000 |
| others | [12,11] | 队友位置、四维能力、载荷比、电量、联盟编号、机器人类型、生存标记；observer 自身那一行置零 |
| tasks | [20,6] | 每个动作槽的类型条件化特征；隐藏和已完成配送任务置零 |
| available_actions | [20]，独立输入 | 当前可选任务掩码 |

配送槽六列为 `[x/1000,y/1000,demand/500,剩余deadline比例,priority,type/3]`。开启 coverage 后，探索槽六列为 `[目标x/1000,目标y/1000,候选新增覆盖比例,移动段长度/200,全局未探索比例,type/3]`。Idle、Resupply 使用相同槽宽，类型列说明其语义。任务矩阵因此有 observer 特定的探索行，v3.4 设置 `hatt_shared_task_obs=false`。[观测构造](code_view/envs/delivcoal/env_core.py.html#L1547)

覆盖信息由 20×20 网格中心点近似。移动线段的感知带更新共享覆盖图，候选探索方向估计沿该方向新增的覆盖比例。它是环境维护的探索历史摘要。[coverage](code_view/envs/delivcoal/env_core.py.html#L646)

集中式 critic 使用 `agents[12,11]、tasks[20,8]、global[1]、focal[12,1]`，展平后 305 维。任务状态含全部配送任务及发现/完成标记；global 保存归一化时间；focal 是当前机器人 one-hot。它是环境提供的集中状态特征，完整模拟快照还保存路径、覆盖位图、随机数状态等内部量。[全局状态](code_view/envs/delivcoal/env_core.py.html#L1756)、[focal 构造](code_view/runner/shared/macf_runner.py.html#L570)

## 通信与信息共享假设

DelivCoal 的 actor 可以读取团队所有机器人的状态；任何机器人发现的配送任务进入共享任务状态；覆盖图由团队共同维护。这对应理想的团队信息共享条件。当前 DelivCoal 动作是任务选择，AA 消息在网络前向中计算，观测接口直接提供共享信息。真实通信距离、传输时延和带宽可作为后续环境变量。GymRT2A 使用自己的局部观察与路径意图共享接口，其参数见下一节。[DelivCoal 观测代码](code_view/envs/delivcoal/env_core.py.html#L1665)、[GymRT2A 适配器](code_view/envs/gymrt2a/env_discrete.py.html)

## 奖励与评价

v3.4 调用 `shaped` 奖励。每个机器人获得自己的奖励，包含发现、配送、补给与联盟完成事件，以及共享配送进展、剩余需求和时间成本。代表项为：个体正交付 `0.04×交付量`；共享进展 `25×本步总交付/初始总需求`；联盟完成 `8×priority+8×及时完成项`；剩余需求/紧迫度持续成本；回合全部完成奖励 15，结束时扣除剩余需求及未完成任务成本。该分支的系数直接定义于环境函数。[完整奖励实现](code_view/envs/delivcoal/env_core.py.html#L2036)

Success 表示整个 episode 的配送任务全部完成；任务完成率为完成任务数/10；配送比例为总交付/初始总需求；episode length 是实际物理步数。联盟变化数和 response time 为行为诊断，前者统计归属变化，后者记录任务发现到首次有存活机器人加入的时间。[诊断与记录](code_view/envs/delivcoal/env_core.py.html#L945)、[评估 runner](code_view/runner/shared/macf_runner.py.html)

## 补充环境与迁移方式

| 环境组 | 实际设置 | 已完成工作与对应证据 |
|---|---|---|
| CapCoal 中规模 | 30 个机器人、25 任务、1500 步、nearest 探索、legacy 重决策、random_demand 四维任务需求特征、原 CapCoal 奖励；训练 5000 episodes | HATT v2.0 与 MAPPO64 各 3 seed，独立 128 场景旧 selector 评估，见 E08 |
| GymRT2A 原环境 | 网格地图、不同等级目标、局部视野、邻居通信范围、路径意图共享、A* 运动控制；已复现实验采用 20×20 地图、10 个机器人、100 步回合 | 官方 MARL-MRT2A 5 seed；HATT 空间候选适配 2 seed，见 E09 |
| CFM 官方环境 | 异构技能、任务技能要求、任务持续时间、联合到达与调度，原始 RALTestSet | 官方 checkpoint 50 场景验证及小规模重新训练，见 E10 |

CapCoal 的 `random_demand` 将随机四维任务向量与标量 demand 相关联，实际交付仍按载荷扣减需求。nearest 探索的底层控制器读取最近未发现任务位置。此组与 DelivCoal 的 sector 搜索分开统计。模型在各环境分别训练；GymRT2A 通过专用空间候选 actor 接口迁移。[CapCoal 代码](code_view/envs/capcoal/env_core.py.html)、[GymRT2A 网络](code_view/algorithms/algorithm/HATTGyMRT2ANetwork.py.html)

## Baseline 选取与比较角色

| 方法 | 实际实现 | 比较角色与固定条件 |
|---|---|---|
| MAPPO64 | 展平相同 Dict 输入的 MLP actor，共享 PPO 与集中式 critic | 同训练框架、观测、动作、奖励与 event 日程的结构对照 |
| MAPPO288 | 加宽 actor 的 MAPPO | 对 v2.0 的参数规模控制；v2.0 actor 262,341 参数，MAPPO288 250,530 参数 |
| HATT v2.0 | 独立实体编码、AA 上下文、任务联盟聚合与共享解码 | 有完整五 seed 数据的历史关系模型参照 |
| PCFA-DelivCoal | 优先级/紧迫度排序、载荷承诺、规则联盟组建、探索和补给 | 任务分布一致的确定性规则参照；当前记录为一个 RNG 流顺序生成 128 回合 |
| QMIX / VDN | 共享 recurrent individual-Q，分别采用单调 mixer / utility 求和，团队均值奖励 | 同一批次比较值分解方式；奖励归并与 PPO 个体信用设置分别注明 |
| CFM-DelivCoal | 官方 AttentionNet + pointer、序贯分配、REINFORCE/POMO 训练适配 | 比较序贯分配机制；POMO 副本计入训练交互预算 |
| MARL-MRT2A-DelivCoal | 官方 CNN actor/critic、MAPPO learner、目标修正；任务映射到21×21网格 | 比较空间策略表示；legacy20 和 full27 输入布局按实验分组 |

来源：[PPO](https://arxiv.org/abs/1707.06347)、[MAPPO](https://arxiv.org/abs/2103.01955)、[QMIX](https://arxiv.org/abs/1803.11485)、[VDN](https://arxiv.org/abs/1706.05296)、[CFM](https://marmotlab.org/publications/73-RAL2025-HetMRTA.pdf)、[MARL-MRT2A](https://arxiv.org/html/2412.20397v2)，本地对应文件均在 [代码索引](05_code.md)。PCFA 的 DelivCoal 版本按本项目任务过程适配，规则细节以复制的 `pcfa.py` 为准。
