PettingZooEnv¶
- torchrl.envs.PettingZooEnv(...args, **kwargs)[source]¶
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 多代理功能的一項特性,您可以控制環境中代理的 agrupamento。您可以將代理分組(堆疊它們的張量)以在將它們透過相同的神經網路時利用向量化。您可以將代理分割成不同的組,其中它們是異構的或應該由不同的神經網路處理。要進行分組,您只需在環境構造時傳遞一個
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 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)