奖励 Wrappers

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

可以修改从 step 返回的奖励的 wrappers 的超类。

如果您想在将基础环境返回的奖励传递给学习代码之前对其应用函数,您可以简单地继承自 RewardWrapper 并覆盖 reward() 方法来实现该转换。

参数:

env – 要封装的环境。

reward(reward: SupportsFloat) SupportsFloat[source]

返回修改后的环境 reward

参数:

rewardenv step() 奖励

返回:

修改后的 `reward`

已实现的 Wrappers

class gymnasium.wrappers.TransformReward(env: Env[ObsType, ActType], func: Callable[[SupportsFloat], SupportsFloat])[source]

将函数应用于从环境的 step 收到的 reward

存在 wrapper 的向量版本 gymnasium.wrappers.vector.TransformReward

示例

>>> import gymnasium as gym
>>> from gymnasium.wrappers import TransformReward
>>> env = gym.make("CartPole-v1")
>>> env = TransformReward(env, lambda r: 2 * r + 1)
>>> _ = env.reset()
>>> _, rew, _, _, _ = env.step(0)
>>> rew
3.0
变更日志
  • v0.15.0 - 初始添加

参数:
  • env (Env) – 要封装的环境

  • func – (Callable): 应用于奖励的函数

class gymnasium.wrappers.NormalizeReward(env: Env[ObsType, ActType], gamma: float = 0.99, epsilon: float = 1e-8)[source]

标准化即时奖励,使其指数移动平均值具有近似固定的方差。

属性 _update_running_mean 允许冻结/继续奖励统计的运行平均值计算。 如果 True (默认),则每次调用 self.normalize() 时,RunningMeanStd 都会更新。 如果为 False,则使用计算出的统计信息,但不再更新; 这可能在评估期间使用。

存在 wrapper 的向量版本 gymnasium.wrappers.vector.NormalizeReward

注意

在 v0.27 中,NormalizeReward 进行了更新,因为 Gym v0.25+ 中向前折扣奖励估计计算不正确。 有关更多详细信息,请阅读 [#3154](https://github.com/openai/gym/pull/3152)。

注意

缩放取决于过去的轨迹,如果 wrapper 是新实例化的或策略最近更改,则奖励将无法正确缩放。

没有 normalize reward wrapper 的示例
>>> import numpy as np
>>> import gymnasium as gym
>>> env = gym.make("MountainCarContinuous-v0")
>>> _ = env.reset(seed=123)
>>> _ = env.action_space.seed(123)
>>> episode_rewards = []
>>> terminated, truncated = False, False
>>> while not (terminated or truncated):
...     observation, reward, terminated, truncated, info = env.step(env.action_space.sample())
...     episode_rewards.append(reward)
...
>>> env.close()
>>> np.var(episode_rewards)
np.float64(0.0008876301247721108)
带有 normalize reward wrapper 的示例
>>> import numpy as np
>>> import gymnasium as gym
>>> env = gym.make("MountainCarContinuous-v0")
>>> env = NormalizeReward(env, gamma=0.99, epsilon=1e-8)
>>> _ = env.reset(seed=123)
>>> _ = env.action_space.seed(123)
>>> episode_rewards = []
>>> terminated, truncated = False, False
>>> while not (terminated or truncated):
...     observation, reward, terminated, truncated, info = env.step(env.action_space.sample())
...     episode_rewards.append(reward)
...
>>> env.close()
>>> np.var(episode_rewards)
np.float64(0.010162116476634746)
变更日志
  • v0.21.0 - 初始添加

  • v1.0.0 - 添加 update_running_mean 属性以允许禁用更新运行平均值/标准

参数:
  • env (env) – 应用 wrapper 的环境

  • epsilon (float) – 稳定性参数

  • gamma (float) – 指数移动平均中使用的折扣因子。

class gymnasium.wrappers.ClipReward(env: gym.Env[ObsType, ActType], min_reward: float | np.ndarray | None = None, max_reward: float | np.ndarray | None = None)[source]

将环境的奖励裁剪到上限和下限之间。

存在 wrapper 的向量版本 gymnasium.wrappers.vector.ClipReward

示例

>>> import gymnasium as gym
>>> from gymnasium.wrappers import ClipReward
>>> env = gym.make("CartPole-v1")
>>> env = ClipReward(env, 0, 0.5)
>>> _ = env.reset()
>>> _, rew, _, _, _ = env.step(1)
>>> rew
np.float64(0.5)
变更日志
  • v1.0.0 - 初始添加

参数:
  • env (Env) – 要封装的环境

  • min_reward (Union[float, np.ndarray]) – 要应用的下限

  • max_reward (Union[float, np.ndarray]) – 要应用的高限