快捷方式

PettingZooEnv

torchrl.envs.PettingZooEnv(*args, **kwargs)[source]

PettingZoo 环境。

请遵循此处的指南安装 petting zoo here <https://github.com/Farama-Foundation/PettingZoo#installation>__

此类是所有 PettingZoo 环境的通用 torchrl 封装器。它可以封装 pettingzoo.AECEnvpettingzoo.ParallelEnv

让我们进一步详细了解

要封装 pettingzoo.ParallelEnv,请提供您的 petting zoo 任务名称(在 task 参数中),并指定 parallel=True。这将构建该任务的 pettingzoo.ParallelEnv 版本(如果在 pettingzoo 中支持),并将其封装供 torchrl 使用。在封装的 pettingzoo.ParallelEnv 中,所有智能体将在每个环境步中进行操作。如果在任务期间智能体数量发生变化,请设置 use_mask=True"mask" 将作为每个组的输出提供,应用于屏蔽已完成/失效的智能体。环境将在任一智能体完成后重置(除非 done_on_anyFalse)。

要封装 pettingzoo.AECEnv,请提供您的 petting zoo 任务名称(在 task 参数中),并指定 parallel=False。这将构建该任务的 pettingzoo.AECEnv 版本,并将其封装供 torchrl 使用。在封装的 pettingzoo.AECEnv 中,每一步只有一个智能体行动。因此,对于这类环境,必须设置 use_mask=True"mask" 将作为每个组的输出提供,可用于屏蔽非行动智能体。环境仅在所有智能体都完成后重置(除非 done_on_anyTrue)。

如果智能体有任何不可用的动作,环境还将自动更新其 action_spec 的掩码,并为每个组输出一个 "action_mask",以反映最新的可用动作。这应在训练期间传递给掩码分布。

作为 torchrl 多智能体的一个特性,您可以控制环境中智能体的分组。您可以将智能体分组(堆叠它们的张量),以便在通过同一神经网络时利用向量化。您可以将异构或应由不同神经网络处理的智能体分成不同的组。要进行分组,您只需在环境构建时传递一个 group_map

默认情况下,pettingzoo 中的智能体将按名称分组。例如,对于智能体 ["agent_0","agent_1","agent_2","adversary_0"],tensordicts 将如下所示

>>> print(env.rand_action(env.reset()))
TensorDict(
    fields={
        agent: TensorDict(
            fields={
                action: Tensor(shape=torch.Size([3, 9]), device=cpu, dtype=torch.int64, is_shared=False),
                action_mask: Tensor(shape=torch.Size([3, 9]), device=cpu, dtype=torch.bool, is_shared=False),
                done: Tensor(shape=torch.Size([3, 1]), device=cpu, dtype=torch.bool, is_shared=False),
                observation: Tensor(shape=torch.Size([3, 3, 3, 2]), device=cpu, dtype=torch.int8, is_shared=False),
                terminated: Tensor(shape=torch.Size([3, 1]), device=cpu, dtype=torch.bool, is_shared=False),
                truncated: Tensor(shape=torch.Size([3, 1]), device=cpu, dtype=torch.bool, is_shared=False)},
            batch_size=torch.Size([3]))},
        adversary: TensorDict(
            fields={
                action: Tensor(shape=torch.Size([1, 9]), device=cpu, dtype=torch.int64, is_shared=False),
                action_mask: Tensor(shape=torch.Size([1, 9]), device=cpu, dtype=torch.bool, is_shared=False),
                done: Tensor(shape=torch.Size([1, 1]), device=cpu, dtype=torch.bool, is_shared=False),
                observation: Tensor(shape=torch.Size([1, 3, 3, 2]), device=cpu, dtype=torch.int8, is_shared=False),
                terminated: Tensor(shape=torch.Size([1, 1]), device=cpu, dtype=torch.bool, is_shared=False),
                truncated: Tensor(shape=torch.Size([1, 1]), device=cpu, dtype=torch.bool, is_shared=False)},
            batch_size=torch.Size([1]))},
    batch_size=torch.Size([]))
>>> print(env.group_map)
{"agent": ["agent_0", "agent_1", "agent_2"], "adversary": ["adversary_0"]}

否则,可以指定或从一些预设选项中选择分组映射。有关详细信息,请参见 torchrl.envs.utils.MarlGroupMapType。例如,您可以提供 MarlGroupMapType.ONE_GROUP_PER_AGENT,这表示每个智能体都应该有自己的 tensordict(类似于 pettingzoo parallel API)。

分组对于在数据通过同一神经网络的智能体之间利用向量化很有用。

参数:
  • task (str) – 要创建的 pettingzoo 任务名称,格式为“/”(例如,“sisl/multiwalker_v9”)或“”(例如,“multiwalker_v9”)。

  • parallel (bool) – 是否构建任务的 pettingzoo.ParallelEnv 版本或 pettingzoo.AECEnv 版本。

  • return_state (bool, optional) – 是否返回 pettingzoo 中的全局状态(并非所有环境都支持)。默认为 False

  • group_map (MarlGroupMapType or Dict[str, List[str]]], optional) – 如何在 tensordicts 中分组智能体以用于输入/输出。默认情况下,智能体将按其名称分组。否则,可以指定或从一些预设选项中选择分组映射。有关详细信息,请参见 torchrl.envs.utils.MarlGroupMapType

  • use_mask (bool, optional) – 环境是否应输出 "mask"。这在封装的 pettingzoo.AECEnv 中是强制性的,用于屏蔽非行动智能体;当智能体数量可能变化时,也应用于 pettingzoo.ParallelEnv。默认为 False

  • categorical_actions (bool, optional) – 如果环境动作为离散型,是否将其转换为类别型或独热编码。

  • seed (int, optional) – 随机种子。默认为 None

  • done_on_any (bool, optional) – 环境的完成 (done) 键是否通过使用 any()(当为 True 时)或 all()(当为 False 时)聚合智能体键来设置。默认值 (None) 是对并行环境使用 any(),对 AEC 环境使用 all()

示例

>>> # Parallel env
>>> from torchrl.envs.libs.pettingzoo import PettingZooEnv
>>> kwargs = {"n_pistons": 21, "continuous": True}
>>> env = PettingZooEnv(
...     task="pistonball_v6",
...     parallel=True,
...     return_state=True,
...     group_map=None, # Use default (all pistons grouped together)
...     **kwargs,
... )
>>> print(env.group_map)
... {'piston': ['piston_0', 'piston_1', ..., 'piston_20']}
>>> env.rollout(10)
>>> # AEC env
>>> from torchrl.envs.libs.pettingzoo import PettingZooEnv
>>> from torchrl.envs.utils import MarlGroupMapType
>>> env = PettingZooEnv(
...     task="tictactoe_v3",
...     parallel=False,
...     use_mask=True, # Must use it since one player plays at a time
...     group_map=None # # Use default for AEC (one group per player)
... )
>>> print(env.group_map)
... {'player_1': ['player_1'], 'player_2': ['player_2']}
>>> env.rollout(10)

文档

访问 PyTorch 的完整开发者文档

查看文档

教程

获取针对初学者和高级开发者的深入教程

查看教程

资源

查找开发资源并获得解答

查看资源