PettingZooEnv¶
- torchrl.envs.PettingZooEnv(*args, **kwargs)[源代码]¶
PettingZoo 环境。
要安装 petting zoo,请遵循此处的指南 <https://github.com/Farama-Foundation/PettingZoo#installation>__。
此类是所有 PettingZoo 环境的通用 torchrl 包装器。它可以包装
pettingzoo.AECEnv
和pettingzoo.ParallelEnv
。让我们更详细地了解一下
要包装
pettingzoo.ParallelEnv
,请在task
参数中提供您的 petting zoo 任务名称,并指定parallel=True
。这将创建该任务的pettingzoo.ParallelEnv
版本(如果 petting zoo 支持),并将其包装为 torchrl。在包装的pettingzoo.ParallelEnv
中,所有代理将在每个环境步骤中进行操作。如果任务中的代理数量可变,请设置use_mask=True
。"mask"
将作为每个组的输出提供,并可用于屏蔽掉死亡的代理。除非done_on_any
为False
,否则环境将在一个代理完成后立即重置。要包装
pettingzoo.AECEnv
,请在task
参数中提供您的 petting zoo 任务名称,并指定parallel=False
。这将创建该任务的pettingzoo.AECEnv
版本,并将其包装为 torchrl。在包装的pettingzoo.AECEnv
中,每次只有一个代理会执行操作。因此,对于此类环境,必须设置use_mask=True
。"mask"
将作为每个组的输出提供,并可用于屏蔽掉未执行操作的代理。除非done_on_any
为True
,否则环境将在所有代理都完成后才会重置。如果代理有任何不可用操作,环境还将自动更新其
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 并行 API)。分组有助于在数据通过同一神经网络的代理之间利用向量化。
- 参数:
task (str) – 要创建的 pettingzoo 任务的名称,格式为“<env>/<task>”(例如,“sisl/multiwalker_v9”)或“<task>”格式(例如,“multiwalker_v9”)。
parallel (bool) – 是创建任务的
pettingzoo.ParallelEnv
版本还是pettingzoo.AECEnv
。return_state (bool, optional) – 是否从 pettingzoo 返回全局状态(并非所有环境中都可用)。默认为
False
。group_map (MarlGroupMapType 或 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 键是通过聚合代理键(当
True
时使用any()
)还是(当False
时使用all()
)来设置的。默认值(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)