PettingZooWrapper¶
- torchrl.envs.PettingZooWrapper(*args, **kwargs)[source]¶
PettingZoo 環境封裝器。
要安裝 PettingZoo,請遵循此處的指南 <https://github.com/Farama-Foundation/PettingZoo#installation>__。
此類是適用於所有 PettingZoo 環境的通用 torchrl 封裝器。它能夠封裝
pettingzoo.AECEnv和pettingzoo.ParallelEnv。讓我們更詳細地瞭解
在封裝的
pettingzoo.ParallelEnv中,所有智慧體將在環境的每一步都執行動作。如果在任務期間智慧體的數量發生變化,請將use_mask設定為True。每個分組中將提供"mask"作為輸出,應使用它來遮蔽已結束的智慧體。一旦有智慧體完成,環境將立即重置(除非done_on_any為False)。在封裝的
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)。分組對於利用資料透過同一神經網路的智慧體之間的向量化非常有用。
- 引數:
env (
pettingzoo.utils.env.ParallelEnv或pettingzoo.utils.env.AECEnv) – 要封裝的 PettingZoo 環境。return_state (bool, 可選) – 是否從 PettingZoo 返回全域性狀態(並非所有環境都可用)。預設為
False。group_map (MarlGroupMapType 或 Dict[str, List[str]]], 可選) – 如何在 tensordicts 中對智慧體進行輸入/輸出分組。預設情況下,智慧體將按名稱分組。否則,可以指定分組對映或從一些預設選項中選擇。有關更多資訊,請參閱
torchrl.envs.utils.MarlGroupMapType。use_mask (bool, 可選) – 環境是否應輸出
"mask"。這對於封裝的pettingzoo.AECEnv是強制性的,用於遮蔽非執行動作的智慧體;當智慧體數量可能變化時,也應將其用於pettingzoo.ParallelEnv。預設為False。categorical_actions (bool, 可選) – 如果環境的動作是離散的,是否將其轉換為類別型或獨熱編碼。
seed (int, 可選) – 種子。預設為
None。done_on_any (bool, 可選) – 環境的完成(done)鍵是否透過使用
any()(當為True時)或all()(當為False時)聚合智慧體鍵來設定。預設值(None)是對於並行環境使用any() 馬,對於 AEC 環境使用all()。
示例
>>> # Parallel env >>> from torchrl.envs.libs.pettingzoo import PettingZooWrapper >>> from pettingzoo.butterfly import pistonball_v6 >>> kwargs = {"n_pistons": 21, "continuous": True} >>> env = PettingZooWrapper( ... env=pistonball_v6.parallel_env(**kwargs), ... return_state=True, ... group_map=None, # Use default for parallel (all pistons grouped together) ... ) >>> print(env.group_map) ... {'piston': ['piston_0', 'piston_1', ..., 'piston_20']} >>> env.rollout(10) >>> # AEC env >>> from pettingzoo.classic import tictactoe_v3 >>> from torchrl.envs.libs.pettingzoo import PettingZooWrapper >>> from torchrl.envs.utils import MarlGroupMapType >>> env = PettingZooWrapper( ... env=tictactoe_v3.env(), ... 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)