AEC API¶
默认情况下,PettingZoo 将游戏建模为 Agent Environment Cycle (AEC) 环境。这使得 PettingZoo 可以表示多智能体强化学习可以考虑的任何类型的游戏。
更多信息,请参阅关于 AEC 或 PettingZoo: A Standard API for Multi-Agent Reinforcement Learning。
PettingZoo 包装器 可用于在 Parallel 和 AEC 环境之间进行转换,但有一些限制(例如,AEC 环境必须在每个周期结束时只更新一次)。
示例¶
PettingZoo 经典环境 提供了回合制游戏的标准 AEC 环境示例,其中许多实现了 非法动作掩码。
我们提供了一个教程,用于创建简单的石头剪刀布 AEC 环境,展示了如何用 AEC 环境表示具有同时动作的游戏。
用法¶
可以按如下方式与 AEC 环境交互
from pettingzoo.classic import rps_v2
env = rps_v2.env(render_mode="human")
env.reset(seed=42)
for agent in env.agent_iter():
observation, reward, termination, truncation, info = env.last()
if termination or truncation:
action = None
else:
action = env.action_space(agent).sample() # this is where you would insert your policy
env.step(action)
env.close()
动作掩码¶
AEC 环境通常包含动作掩码,用于标记智能体的有效/无效动作。
要使用动作掩码采样动作
from pettingzoo.classic import chess_v6
env = chess_v6.env(render_mode="human")
env.reset(seed=42)
for agent in env.agent_iter():
observation, reward, termination, truncation, info = env.last()
if termination or truncation:
action = None
else:
# invalid action masking is optional and environment-dependent
if "action_mask" in info:
mask = info["action_mask"]
elif isinstance(observation, dict) and "action_mask" in observation:
mask = observation["action_mask"]
else:
mask = None
action = env.action_space(agent).sample(mask) # this is where you would insert your policy
env.step(action)
env.close()
注意:动作掩码是可选的,可以通过 observation
或 info
实现。
PettingZoo 经典环境 将动作掩码存储在
observation
字典中mask = observation["action_mask"]
Shimmy 的 OpenSpiel 环境 将动作掩码存储在
info
字典中mask = info["action_mask"]
要在自定义环境中实现动作掩码,请参阅自定义环境:动作掩码
关于动作掩码的更多信息,请参阅 A Closer Look at Invalid Action Masking in Policy Gradient Algorithms (Huang, 2022)
关于 AEC¶
Agent Environment Cycle (AEC) 模型被设计为一种 Gym 风格的 MARL API,支持所有可能的用例和环境类型。这包括具有以下特征的环境:
大量智能体(参阅 Magent2)
可变数量的智能体(参阅 Knights, Archers, Zombies)
任何类型的动作和观察空间(例如,Box, Discrete, MultiDiscrete, MultiBinary, Text)
支持动作掩码(参阅 经典 环境)
随时间变化并因智能体而异的动作和观察空间(参阅 generated_agents 和 variable_env_test)
变化的行动顺序和不断演变的环境动态(例如,具有多个阶段、回合反转的游戏)
在 AEC 环境中,智能体顺序行动,在采取动作之前接收更新的观察和奖励。环境在每个智能体行动后更新,这使得它成为表示国际象棋等顺序游戏的自然方式。AEC 模型足够灵活,可以处理多智能体强化学习可以考虑的任何类型的游戏。

这与我们的 Parallel API 中表示的部分可观察随机博弈 (POSG) 模型形成对比,在 POSG 模型中,智能体同时行动,并且只能在周期结束时接收观察和奖励。这使得表示顺序游戏变得困难,并导致竞态条件——智能体选择采取相互排斥的动作。如果环境未能捕获和处理哪怕一个竞态条件(例如,通过打破平局),则环境行为会因智能体顺序的内部解析而异,从而导致难以检测的 bug。
AEC 模型类似于 DeepMind 的 OpenSpiel 中使用的广义博弈 (EFGs) 模型。EFGs 将顺序游戏表示为树,显式地将每个可能的动作序列表示为树中的根到叶路径。EFGs 的一个局限性在于其形式化定义特定于博弈论,并且只允许在游戏结束时获得奖励,而在强化学习中,学习通常需要频繁的奖励。
EFGs 可以通过添加一个代表环境的玩家(例如,OpenSpiel 中的机会节点)来扩展以表示随机游戏,该玩家根据给定的概率分布采取动作。然而,这要求用户在与环境交互时手动采样和应用机会节点动作,这会留下用户错误和潜在的随机种子问题空间。
相比之下,AEC 环境在每个智能体行动后在内部处理环境动态,从而产生一个更简单的环境心智模型,并允许任意和不断演变的环境动态(与静态的机会分布不同)。AEC 模型也更接近于计算机游戏在代码中的实现方式,可以被认为是类似于游戏编程中的游戏循环。
有关 AEC 模型和 PettingZoo 设计理念的更多信息,请参阅PettingZoo: A Standard API for Multi-Agent Reinforcement Learning。
AECEnv¶
属性¶
- AECEnv.agents: list[AgentID]¶
所有当前智能体名称的列表,通常是整数。这些可能随环境的进展而改变(即可以添加或移除智能体)。
- 类型:
List[AgentID]
- AECEnv.num_agents¶
agents 列表的长度。
- AECEnv.possible_agents: list[AgentID]¶
环境可能生成的所有 possible_agents 的列表。等同于观察空间和动作空间中的智能体列表。这不能通过游戏或重置来改变。
- 类型:
List[AgentID]
- AECEnv.max_num_agents¶
possible_agents 列表的长度。
- AECEnv.agent_selection: AgentID¶
环境的一个属性,对应于当前选择的可以采取动作的智能体。
- 类型:
AgentID
- AECEnv.terminations: dict[AgentID, bool]¶
- AECEnv.truncations: dict[AgentID, bool]¶
- AECEnv.rewards: dict[AgentID, float]¶
一个字典,包含调用时每个当前智能体的奖励,按名称键控。奖励是上次行动后生成的即时奖励。请注意,可以从此属性中添加或移除智能体。last() 不直接访问此属性,而是将返回的奖励存储在内部变量中。rewards 结构如下所示:
{0:[first agent reward], 1:[second agent reward] ... n-1:[nth agent reward]}
- 类型:
Dict[AgentID, float]
- AECEnv.infos: dict[AgentID, dict[str, Any]]¶
一个字典,包含每个当前智能体的信息,按名称键控。每个智能体的信息也是一个字典。请注意,可以从此属性中添加或移除智能体。last() 访问此属性。返回的字典如下所示:
infos = {0:[first agent info], 1:[second agent info] ... n-1:[nth agent info]}
- 类型:
Dict[AgentID, Dict[str, Any]]
- AECEnv.observation_spaces: dict[AgentID, Space]¶
一个字典,包含每个智能体的观察空间,按名称键控。这不能通过游戏或重置来改变。
- 类型:
Dict[AgentID, gymnasium.spaces.Space]
- AECEnv.action_spaces: dict[AgentID, Space]¶
一个字典,包含每个智能体的动作空间,按名称键控。这不能通过游戏或重置来改变。
- 类型:
Dict[AgentID, gymnasium.spaces.Space]