设计多智能体奖励时,先把业务完成条件写出来,再决定奖励给团队还是个体。下面用双人同步搬运的自造小任务:双方同时配合才算交付;一人抢跑导致物品掉落。数字用于说明激励冲突,不是工业机器人实验。
先规定可核对的结果
每个智能体有两个动作:配合、抢跑。双方配合时交付成功;只要有人抢跑就未交付。团队目标是提高有效交付数量,而不是提高移动次数。演示奖励规定成功每人 +5,掉落每人 -3。若另外给“移动一次 +4”,抢跑者可能在失败时仍拿到正分,这会鼓励刷动作。

| A动作 | B动作 | 有效交付 | 团队一致奖励 A/B | 附移动奖励后 A/B |
|---|---|---|---|---|
| 配合 | 配合 | 是 | 5 / 5 | 5 / 5 |
| 抢跑 | 配合 | 否 | -3 / -3 | 1 / -3 |
| 配合 | 抢跑 | 否 | -3 / -3 | -3 / 1 |
| 抢跑 | 抢跑 | 否 | -3 / -3 | 1 / 1 |
表中最后一列刻意暴露问题:动作计数和交付目标不同。若真正业务允许快速单人完成,失败规则就需要重写,不能照搬本例罚分。任务完成、碰撞和超时等事件要定义互斥或明确优先级,避免同一步既判成功又判失败。
把规则变成可检查函数
保存 reward_demo.py,运行 python reward_demo.py。输入只接受约定的动作值,输出每个体奖励和完成标记。函数不读取不可得的未来结果,奖励发生时点也在当前联合动作之后。
from itertools import product
def reward(actions):
if len(actions) != 2 or any(a not in (0, 1) for a in actions):
raise ValueError("two actions required: 0=cooperate, 1=rush")
delivered = actions == (0, 0)
shared = 5 if delivered else -3
return {"A": shared, "B": shared}, delivered
for pair in product((0, 1), repeat=2):
values, done = reward(pair)
print(pair, values, done)
assert (sum(values.values()) == 10) == done
assert reward((1, 0))[0]["A"] == -3
应只有 (0,0) 的 done 为 True、奖励之和为 10,其他三组均为 -6。集成环境前,为成功、失败、超时、非法动作和边界位置分别列一条输入与期望输出,并检查累计回报是否符合规则。先用固定动作策略核对,避免把奖励代码错误误认成训练不收敛。
团队奖励不自动解决责任归因
共享奖励对齐的是目标,不会自动告诉某个体哪一次动作造成失败。个体奖励可以帮助归因,但也可能与团队目标冲突。采用个体进度指标时,检查“重复往返”“等待别人完成”“抢占资源”等策略是否能在未交付时刷分。记录交付率、碰撞率和实际成本,不能只报告奖励增长。
集中训练是否能看到全局状态、执行时每个人能看到哪些信息,也要在环境契约中写清。本例是一步的可枚举规则核对,没有证明任何训练算法会学到协作,也没有给出最优权重。真实连续任务需要按合法数据和明确成本校准奖励尺度,再做消融与独立评估。
资料与核对依据
- https://pettingzoo.farama.org/tutorials/custom_environment/2-environment-logic/
- https://arxiv.org/html/1706.02275v4
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/32979.html