捷徑

PettingZooEnv

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

PettingZoo 環境。

要安裝 petting zoo,請按照此處 <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 中,每個步驟只會有一個 agent 採取行動。因此,強制設定 use_mask=True 以用於此類環境。"mask" 將會作為每個群組的輸出提供,可用於遮罩 (mask out) 非作用中的 agent。只有當所有 agent 都完成時,環境才會重置 (除非 done_on_anyTrue)。

如果 agent 有任何無法使用的動作,環境也會自動更新其 action_spec 的遮罩,並為每個群組輸出一個 "action_mask" 以反映最新的可用動作。在訓練期間,這應該傳遞到一個遮罩後的分布 (masked distribution)。

作為 torchrl multiagent 的一項功能,您可以控制環境中 agent 的分組。您可以將 agent 分組在一起 (堆疊他們的 tensors),以便在將它們傳遞到同一個神經網路時利用向量化。您可以將 agent 分成不同的群組,因為它們是異質的,或者應該由不同的神經網路處理。要進行分組,您只需要在環境建構時傳遞一個 group_map

預設情況下,pettingzoo 中的 agent 會依名稱分組。例如,對於 agent ["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"]}

否則,可以指定 group map,或從一些預先製作的選項中選擇。有關更多資訊,請參閱 torchrl.envs.utils.MarlGroupMapType。例如,您可以提供 MarlGroupMapType.ONE_GROUP_PER_AGENT,表示每個 agent 應該有自己的 tensordict (類似於 pettingzoo parallel API)。

分組對於利用通過相同神經網路的 agent 之間的向量化非常有用。

參數:
  • task (str) – 要以“<env>/<task>”格式 (例如,“sisl/multiwalker_v9”) 或“<task>”格式 (例如,“multiwalker_v9”) 建立的 Petting Zoo 任務的名稱。

  • parallel (bool) – 是否建構該任務的 pettingzoo.ParallelEnv 版本或 pettingzoo.AECEnv 版本。

  • return_state (bool, optional) – 是否從 pettingzoo 回傳全域狀態 (並非所有環境都可用)。預設為 False

  • group_map (MarlGroupMapType or Dict[str, List[str]]], optional) – 如何在 tensordicts 中分組 agent 以進行輸入/輸出。預設情況下,agent 將依其名稱分組。否則,可以指定 group map,或從一些預先製作的選項中選擇。有關更多資訊,請參閱 torchrl.envs.utils.MarlGroupMapType

  • use_mask (bool, optional) – 環境是否應該輸出一個 "mask"。這是包裝後的 pettingzoo.AECEnv 中強制性的,用於遮罩非作用中的 agent,也應該用於 pettingzoo.ParallelEnv,當 agent 的數量可能有所不同時。預設為 False

  • categorical_actions (bool, optional) – 如果環境的動作是離散的,是否將它們轉換為 categorical 或 one-hot。

  • seed (int, optional) – 隨機種子。預設為 None

  • done_on_any (bool, optional) – 環境的 done keys 是否透過使用 any() (當 True 時) 或 all() (當 False 時) 聚合 agent keys 來設定。預設 (None) 是對於 parallel 環境使用 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)

文件

Access comprehensive developer documentation for PyTorch

View Docs

Tutorials

Get in-depth tutorials for beginners and advanced developers

View Tutorials

Resources

Find development resources and get your questions answered

View Resources