AEC API¶

默认情况下,PettingZoo 将游戏建模为 Agent Environment Cycle (AEC) 环境。这使得 PettingZoo 可以表示多智能体强化学习可以考虑的任何类型的游戏。

更多信息,请参阅关于 AECPettingZoo: 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()

注意:动作掩码是可选的,可以通过 observationinfo 实现。

要在自定义环境中实现动作掩码,请参阅自定义环境:动作掩码

关于动作掩码的更多信息,请参阅 A Closer Look at Invalid Action Masking in Policy Gradient Algorithms (Huang, 2022)

关于 AEC¶

Agent Environment Cycle (AEC) 模型被设计为一种 Gym 风格的 MARL API,支持所有可能的用例和环境类型。这包括具有以下特征的环境:

在 AEC 环境中,智能体顺序行动,在采取动作之前接收更新的观察和奖励。环境在每个智能体行动后更新,这使得它成为表示国际象棋等顺序游戏的自然方式。AEC 模型足够灵活,可以处理多智能体强化学习可以考虑的任何类型的游戏。

../../_images/aec_cycle_figure.png

这与我们的 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¶

class pettingzoo.utils.env.AECEnv[source]

AECEnv 一次处理一个智能体。

如果您不确定是否正确实现了 AECEnv,请尝试运行网站开发者文档中描述的 api_test

属性¶

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]

方法¶

AECEnv.step(action: ActionType) None[source]

接受并执行当前 agent_selection 在环境中的动作。

自动将控制权切换到下一个智能体。

AECEnv.reset(seed: int | None = None, options: dict | None = None) None[source]

将环境重置到起始状态。

AECEnv.observe(agent: AgentID) ObsType | None[source]

返回智能体当前可以进行的观察。

last() 调用此函数。

AECEnv.render() None | ndarray | str | list[source]

按照 self.render_mode 指定的方式渲染环境。

渲染模式可以是 human 以显示窗口。默认环境中的其他渲染模式包括 ‘rgb_array’(返回一个 numpy 数组,除经典环境外所有环境都支持)和 ‘ansi’(返回打印的字符串,经典环境特有)。

AECEnv.close()[source]

关闭应释放的任何资源。

关闭渲染窗口、子进程、网络连接或任何其他应释放的资源。