PettingZooEnv¶
- torchrl.envs.PettingZooEnv(*args, **kwargs)[source]¶
PettingZoo 環境。
請遵循此處的指南安裝 petting zoo here <https://github.com/Farama-Foundation/PettingZoo#installation>__。
此類是所有 PettingZoo 環境的通用 torchrl 封裝器。它可以封裝
pettingzoo.AECEnv和pettingzoo.ParallelEnv。讓我們進一步詳細瞭解
要封裝
pettingzoo.ParallelEnv,請提供您的 petting zoo 任務名稱(在task引數中),並指定parallel=True。這將構建該任務的pettingzoo.ParallelEnv版本(如果在 pettingzoo 中支援),並將其封裝供 torchrl 使用。在封裝的pettingzoo.ParallelEnv中,所有智慧體將在每個環境步中進行操作。如果在任務期間智慧體數量發生變化,請設定use_mask=True。"mask"將作為每個組的輸出提供,應用於遮蔽已完成/失效的智慧體。環境將在任一智慧體完成後重置(除非done_on_any為False)。要封裝
pettingzoo.AECEnv,請提供您的 petting zoo 任務名稱(在task引數中),並指定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 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)