奖励包装器¶
- class gymnasium.RewardWrapper(env: Env[ObsType, ActType])[source]¶
可以修改从步骤返回的奖励的包装器的超类。
如果您想在将基本环境返回的奖励传递给学习代码之前对它应用一个函数,您可以简单地继承自
RewardWrapper
并覆盖方法reward()
来实现这种转换。- 参数::
env – 要包装的环境。
已实现的包装器¶
- class gymnasium.wrappers.TransformReward(env: Env[ObsType, ActType], func: Callable[[SupportsFloat], SupportsFloat])[source]¶
将函数应用于从环境的
step
收到的reward
。包装器的向量版本存在于
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]¶
此包装器将缩放奖励,以便折扣回报的平均值为 0,标准差为 1。
简而言之,奖励将除以奖励的滚动折扣总和的标准差。指数移动平均值的方差将为 \((1 - \gamma)^2\)。
属性 _update_running_mean 允许冻结/继续奖励统计数据的运行均值计算。如果为 True(默认值),则每次调用 self.normalize() 时都会更新 RunningMeanStd。如果为 False,则使用计算的统计信息,但不进行更新;这可以在评估期间使用。
包装器的向量版本存在于
gymnasium.wrappers.vector.NormalizeReward
中。- 重要说明
与名称不同,此包装器不会将奖励归一化为平均值为 0,标准差为 1。相反,它会缩放奖励,以便 **折扣回报** 具有近似于单位的方差。有关详细信息,请参阅 [Engstrom 等人] (https://openreview.net/forum?id=r1etN1rtPB) 关于“奖励缩放”。
注意
在 v0.27 中,NormalizeReward 已更新,因为正向折扣奖励估计在 Gym v0.25+ 中计算错误。有关详细信息,请阅读 [#3154](https://github.com/openai/gym/pull/3152)。
注意
缩放取决于过去的轨迹,如果包装器是新实例化的或策略最近更改,则奖励不会正确缩放。
- 没有归一化奖励包装器的示例
>>> 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)
- 使用归一化奖励包装器的示例
>>> 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() >>> # will approach 0.99 with more episodes >>> np.var(episode_rewards) np.float64(0.010162116476634746)
- 更改日志
v0.21.0 - 最初添加
v1.0.0 - 添加 update_running_mean 属性以允许禁用更新运行均值/标准差
- 参数::
env (env) – 要应用包装器的环境
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]¶
将环境的奖励裁剪到上限和下限之间。
该包装器存在一个向量版本
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]) – 要应用的上限