奖励包装器¶
- class gymnasium.RewardWrapper(env: Env[ObsType, ActType])[源代码]¶
可以修改步骤返回奖励的包装器的超类。
如果你想在将奖励传递给学习代码之前,对基础环境返回的奖励应用一个函数,你可以简单地继承 :class:
RewardWrapper
并重写 :meth:reward
方法来实现该转换。这种转换可能会改变 :attr:reward_range
;要指定你的包装器的 :attr:reward_range
,你可以在 :meth:__init__
中简单地定义 :attr:self.reward_range
。- 参数:
env – 要包装的环境。
已实现的包装器¶
- class gymnasium.wrappers.TransformReward(env: Env[ObsType, ActType], func: Callable[[SupportsFloat], SupportsFloat])[源代码]¶
将一个函数应用于从环境的
step
中接收到的reward
。存在一个包装器的向量化版本 :class:
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)[源代码]¶
将即时奖励归一化,使得其指数移动平均值具有固定方差。
指数移动平均的方差为 :math:
(1 - \gamma)^2
。属性
_update_running_mean
允许冻结/继续奖励统计的运行均值计算。如果为True
(默认),每次调用self.normalize()
时,RunningMeanStd
都会更新。如果为False
,则使用计算的统计数据,但不再更新;这可能在评估期间使用。存在一个包装器的向量化版本 :class:
gymnasium.wrappers.vector.NormalizeReward
。备注
在v0.27中,NormalizeReward 被更新,因为在 Gym v0.25+ 中前向折扣奖励估计计算错误。更多详情,请阅读 #3154。
备注
缩放取决于过去的轨迹,如果包装器是新实例化的或策略最近被更改,奖励将不会被正确缩放。
- 没有归一化奖励包装器的示例:
>>> 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) 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() >>> # will approach 0.99 with more episodes >>> np.var(episode_rewards) 0.010162116476634746
- 变更日志:
v0.21.0 - 最初添加
v1.0.0 - 添加
update_running_mean
属性以允许禁用更新运行均值 / 标准
- 参数:
env (env) – 应用包装器的环境
epsilon (float) – 一个稳定性参数
gamma (float) – 用于指数移动平均中的折扣因子。
- class gymnasium.wrappers.ClipReward(env: Env[ObsType, ActType], min_reward: float | ndarray | None = None, max_reward: float | ndarray | None = None)[源代码]¶
将环境的奖励值裁剪在上下限之间。
存在一个包装器的向量化版本 :class:
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 0.5
- 变更日志:
v1.0.0 - 最初添加
- 参数:
env (Env) – 要包装的环境
min_reward (Union[float, np.ndarray]) – 要应用的下限
max_reward (Union[float, np.ndarray]) – 应用的上限