包裝器

包裝器是一種方便的方式,可以在不直接修改底層程式碼的情況下修改現有環境。

使用包裝器可以避免大量樣板程式碼,並使您的環境更具模組化。重要的是,包裝器可以被鏈式組合以合併其效果,並且大多數透過 gymnasium.make() 生成的環境預設情況下已經包裝過了。

為了包裝一個環境,您必須首先初始化一個基礎環境。然後,您可以將此環境連同(可能可選的)引數傳遞給包裝器的建構函式。

>>> import gymnasium as gym
>>> from gymnasium.wrappers import RescaleAction
>>> base_env = gym.make("Hopper-v4")
>>> base_env.action_space
Box(-1.0, 1.0, (3,), float32)
>>> wrapped_env = RescaleAction(base_env, min_action=0, max_action=1)
>>> wrapped_env.action_space
Box(0.0, 1.0, (3,), float32)

您可以使用 gymnasium.Wrapper.env 屬性來訪問**第一個**包裝器下的環境。由於 gymnasium.Wrapper 類繼承自 gymnasium.Env,因此 gymnasium.Wrapper.env 可以是另一個包裝器。

>>> wrapped_env
<RescaleAction<TimeLimit<OrderEnforcing<PassiveEnvChecker<HopperEnv<Hopper-v4>>>>>>
>>> wrapped_env.env
<TimeLimit<OrderEnforcing<PassiveEnvChecker<HopperEnv<Hopper-v4>>>>>

如果您想訪問**所有**包裝層下的環境,可以使用 gymnasium.Wrapper.unwrapped 屬性。如果環境本身就是一個裸環境,則 gymnasium.Wrapper.unwrapped 屬性將直接返回自身。

>>> wrapped_env
<RescaleAction<TimeLimit<OrderEnforcing<PassiveEnvChecker<HopperEnv<Hopper-v4>>>>>>
>>> wrapped_env.unwrapped 
<gymnasium.envs.mujoco.hopper_v4.HopperEnv object at 0x7fbb5efd0490>

包裝器通常有以下三種用途:

  • 在將動作應用於基礎環境之前進行轉換

  • 轉換基礎環境返回的觀測值

  • 轉換基礎環境返回的獎勵

此類包裝器可以透過繼承 gymnasium.ActionWrappergymnasium.ObservationWrappergymnasium.RewardWrapper 並實現相應的轉換來輕鬆實現。如果您需要包裝器執行更復雜的任務,可以直接繼承 gymnasium.Wrapper 類。

如果您想實現自己的自定義包裝器,請檢視相應的教程

class gymnasium.Wrapper(env: Env[ObsType, ActType])[source]

包裝一個 gymnasium.Env,以允許對 step()reset() 方法進行模組化轉換。

該類是所有包裝器的基類,用於改變底層環境的行為。繼承自該類的包裝器可以修改 action_spaceobservation_spacemetadata 屬性,而無需更改底層環境的屬性。此外,step()reset() 方法的行為也可以透過這些包裝器進行改變。

某些屬性(specrender_modenp_random)將指向包裝器的環境(即 env 的相應屬性)。

注意

如果您繼承自 Wrapper,請不要忘記呼叫 super().__init__(env)

引數:

env – 要包裝的環境

方法

Wrapper.step(action: WrapperActType) tuple[WrapperObsType, SupportsFloat, bool, bool, dict[str, Any]][source]

使用 envstep() 方法,該方法可以被重寫以改變返回的資料。

Wrapper.reset(*, seed: int | None = None, options: dict[str, Any] | None = None) tuple[WrapperObsType, dict[str, Any]][source]

使用 envreset() 方法,該方法可以被重寫以改變返回的資料。

Wrapper.render() RenderFrame | list[RenderFrame] | None[source]

使用 envrender() 方法,該方法可以被重寫以改變返回的資料。

Wrapper.close()[source]

關閉包裝器和 env

classmethod Wrapper.wrapper_spec(**kwargs: Any) WrapperSpec[source]

為包裝器生成一個 WrapperSpec

Wrapper.get_wrapper_attr(name: str) Any[source]

如果 name 在此物件中不存在,則從包裝器和下層環境中獲取屬性。

引數:

name – 要獲取的變數名

返回:

包裝器或下層環境中的同名變數

Wrapper.set_wrapper_attr(name: str, value: Any, *, force: bool = True) bool[source]

如果 name 已經定義,則在此包裝器或下層環境上設定屬性。

引數:
  • name – 變數名

  • value – 新的變數值

  • force – 如果下層環境上不存在該屬性,是否在此包裝器上建立該屬性,而不是丟擲異常

返回:

如果變數已在此包裝器或下層包裝器中設定。

屬性

Wrapper.env

此包裝器下方的環境(下一層)。

這本身可能是一個被包裝的環境。要獲取所有包裝層下的環境,請使用 gymnasium.Wrapper.unwrapped

property Wrapper.action_space: Space[ActType] | Space[WrapperActType]

返回 Envaction_space,除非被重寫,此時使用包裝器的 action_space

property Wrapper.observation_space: Space[ObsType] | Space[WrapperObsType]

返回 Envobservation_space,除非被重寫,此時使用包裝器的 observation_space

property Wrapper.spec: EnvSpec | None

如果包裝器繼承自 EzPickle,則返回 Envspec 屬性,並附帶 WrapperSpec

property Wrapper.metadata: dict[str, Any]

返回 Envmetadata

property Wrapper.np_random: Generator

返回 Envnp_random 屬性。

property Wrapper.np_random_seed: int | None

返回基礎環境的 np_random_seed

property Wrapper.unwrapped: Env[ObsType, ActType]

返回包裝器的基礎環境。

這將是所有包裝層下的裸 gymnasium.Env 環境。