异构多智能体指各个体可能有不同能力、角色或观察动作空间。最先需要解决的是输入输出契约。下面用车辆和仓库控制器的自造接口,说明为什么直接把同一个动作整数发给两人可能出错;不声称已训练配送系统。
把角色差异写成空间表
| 角色 | 观察示例 | 动作编号 | 含义 |
|---|---|---|---|
| truck | [2, 1, 0.6] | 0..4 | 等待、上、下、左、右 |
| depot | [3, 1] | 0..1 | 暂停派单、允许派单 |
车辆观察是 x、y、剩余电量,仓库观察是待派单数和可用车数;同样编号 1,在两人动作中含义完全不同。PettingZoo Parallel 允许个体拥有不同的观察和动作空间。RLlib 的多智能体配置则需要把个体映射到适当的策略,不能只按 agent 名称数量建一个任意输出层。

先用普通函数检查契约
保存 spaces_check.py 后运行 python spaces_check.py。这不是 Gymnasium 空间对象的替代品,而是接入前最小的形状与取值核对。输入是一个当前观察字典和动作字典,完整训练环境还需检查数据类型、数值边界和动作掩码。
spec = {"truck": (3, 5), "depot": (2, 2)}
observations = {"truck": [2, 1, 0.6], "depot": [3, 1]}
def validate(actions):
assert set(actions) == set(spec)
for agent, (obs_dim, action_count) in spec.items():
assert len(observations[agent]) == obs_dim
action = actions[agent]
assert type(action) is int and 0 <= action < action_count
validate({"truck": 4, "depot": 1})
try:
validate({"truck": 4, "depot": 4})
except AssertionError:
print("rejected: depot action 4 is invalid")
else:
raise RuntimeError("invalid action accepted")
应拒绝 depot 的动作 4。若把车辆五维 logits 直接交给仓库,选择到 4 会违反仓库动作域;截断向量也不自动保留概率分布和动作语义。先确定角色自己的输出和解码器,再考虑共享可兼容的编码层。
三种可讨论的策略组织
不同角色各用一套策略,结构清楚,成本是参数和样本需求增加。共享部分特征编码、再接角色专属输出头,可以复用信息但需要明确输入编码。统一填充观察并加角色标记、动作掩码,也是可设计方案,但填充值不能与真实零值混淆,掩码必须禁止不存在的动作。它们都是建模选择,不是无需验证的通用技巧。
集中训练可以使用联合信息,分散执行时每个角色只能依靠可获得的信息;训练特征不能把执行端没有的全局数据偷偷带入。验证时先各跑一回合合法固定动作,再在角色缺席、退出或数量变化时检查字典键与映射。
本例只演示静态两角色空间检查,没有运行策略优化。真实任务还要验证角色之间的时间同步、通信限制、奖励与目标;输入输出合法也不代表协作策略有效。
资料与核对依据
- https://pettingzoo.farama.org/api/parallel/
- https://docs.ray.io/en/latest/rllib/multi-agent-envs.html
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/32988.html