包装器

包装器是一种方便的方式,可以在不直接修改底层代码的情况下修改现有环境。

使用包装器将使您避免大量样板代码,并使您的环境更具模块化。重要的是,包装器可以链接以组合它们的效果,并且大多数通过 :meth: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)

你可以通过使用 :attr:gymnasium.Wrapper.env 属性来访问 第一个 包装器下的环境。由于 :class:gymnasium.Wrapper 类继承自 :class:gymnasium.Env ,因此 :attr:gymnasium.Wrapper.env 可以是另一个包装器。

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

如果你想访问 所有 包装层之下的环境,你可以使用 :attr:gymnasium.Wrapper.unwrapped 属性。如果环境已经是一个裸环境,:attr:gymnasium.Wrapper.unwrapped 属性将直接返回自身。

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

你可能希望一个包装器执行的三种常见操作是:

  • 在将操作应用于基础环境之前对其进行转换

  • 转换由基础环境返回的观察结果

  • 转换由基础环境返回的奖励

这种包装器可以通过继承 :class:gymnasium.ActionWrapper、:class:gymnasium.ObservationWrapper 或 :class:gymnasium.RewardWrapper 并实现相应的转换来轻松实现。如果你需要一个执行更复杂任务的包装器,你可以直接继承 :class:gymnasium.Wrapper 类。

如果你想实现自己的自定义包装器,请查看 相应的教程 <../../tutorials/implementing_custom_wrappers>_。

class gymnasium.Wrapper(env: Env[ObsType, ActType])[源代码]

包装一个 :class:gymnasium.Env 以允许对 :meth:step 和 :meth:reset 方法进行模块化转换。

此类是所有包装器的基类,用于改变底层环境的行为。继承自此类包装器可以修改 :attr:action_space 、 :attr:observation_space 、 :attr:reward_range 和 :attr:metadata 属性,而不会改变底层环境的属性。此外, :meth:step 和 :meth:reset 方法的行为可以通过这些包装器进行改变。

一些属性(:attr:spec、:attr:render_mode、:attr:np_random)将指向包装器的环境(即指向 :attr:env 的相应属性)。

备注

如果你继承自 :class:Wrapper,别忘了调用 super().__init__(env)

参数:

env – 要包装的环境

方法

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

使用可以被覆盖的 :attr:env 的 :meth:step 方法来改变返回的数据。

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

使用可以被覆盖以改变返回数据的 :attr:env 的 :meth:reset

Wrapper.render() RenderFrame | list[RenderFrame] | None[源代码]

使用 :attr:env 的 :meth:render 方法,该方法可以被重写以改变返回的数据。

Wrapper.close()[源代码]

关闭包装器和 :attr:env

classmethod Wrapper.wrapper_spec(**kwargs: Any) WrapperSpec[源代码]

为包装器生成一个 WrapperSpec

Wrapper.get_wrapper_attr(name: str) Any[源代码]

如果 name 不存在于此对象中,则从包装器和较低的环境中获取属性。

参数:

name – 要获取的变量名称

返回:

在包装器或较低环境中的变量名称

Wrapper.set_wrapper_attr(name: str, value: Any)[源代码]

如果 name 已经定义,则在当前包装器或更低的环境中设置一个属性。

参数:
  • name – 变量名

  • value – 新变量的值

属性

Wrapper.env

这个包装器的环境(下一级)。

这本身可能是一个包装的环境。要获取所有包装层下的环境,请使用 :attr:gymnasium.Wrapper.unwrapped

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

返回 :attr:Env :attr:action_space,除非被覆盖,否则使用包装器 :attr:action_space

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

返回 :attr:Env :attr:observation_space,除非被覆盖,否则使用包装器 :attr:observation_space

property Wrapper.spec: EnvSpec | None

返回 :attr:Env :attr:spec 属性,如果包装器继承自 EzPickle,则带有 WrapperSpec

property Wrapper.metadata: dict[str, Any]

返回 :attr:Env :attr:元数据

property Wrapper.np_random: Generator

返回 :attr:Env 的 :attr:np_random 属性。

property Wrapper.np_random_seed: int | None

返回基础环境的 :attr:np_random_seed

property Wrapper.unwrapped: Env[ObsType, ActType]

返回包装器的基环境。

这将是裸露的 :class:gymnasium.Env 环境,在所有包装层之下。