迁移指南 - v0.21 到 v1.0.0

Gymnasium 是 OpenAI Gym v0.26 的一个分支,它引入了与 Gym v0.21 相比的重大更改。在本指南中,我们简要概述了从 Gym v0.21(许多教程都是针对此版本编写的)到 Gym v0.26 的 API 更改。对于仍然停留在 v0.21 API 的环境,请参阅 指南

v0.21 的示例代码

import gym
env = gym.make("LunarLander-v3", options={})
env.seed(123)
observation = env.reset()

done = False
while not done:
    action = env.action_space.sample()  # agent policy that uses the observation and info
    observation, reward, done, info = env.step(action)

    env.render(mode="human")

env.close()

v0.26 的示例代码

import gym
env = gym.make("LunarLander-v3", render_mode="human")
observation, info = env.reset(seed=123, options={})

done = False
while not done:
    action = env.action_space.sample()  # agent policy that uses the observation and info
    observation, reward, terminated, truncated, info = env.step(action)

    done = terminated or truncated

env.close()

种子和随机数生成器

Env.seed() 已从 Gym v0.26 环境中删除,取而代之的是 Env.reset(seed=seed)。这允许仅在环境重置时更改种子。删除 seed 的决定是由于一些环境使用无法在情节中更改随机数生成器的模拟器,必须在新的情节开始时进行更改。我们知道在某些情况下控制随机数生成器很重要,在这种情况下,如果环境使用内置随机数生成器,用户可以使用属性 np_random 手动设置种子。

Gymnasium v0.26 更改为使用 numpy.random.Generator 而不是自定义随机数生成器。这意味着一些函数,例如 randint,已被删除,取而代之的是 integers。虽然一些环境可能使用外部随机数生成器,但我们建议使用属性 np_random,包装器和外部用户可以访问和使用该属性。

环境重置

在 v0.26 中,reset() 接受两个可选参数并返回一个值。这与 v0.21 形成对比,后者不接受任何参数并返回 None。这两个参数是用于设置随机数生成器的 seed 和允许在重置时将额外数据传递到环境的 options。例如,在经典控制中,options 参数现在允许用户修改状态边界的范围。有关更多详细信息,请参阅原始 PR

reset() 进一步返回 info,类似于 step() 返回的 info。这很重要,因为 info 可以包含用于或保存在下一步的指标或有效动作掩码。

为了更新旧环境,我们强烈建议在 reset() 的第一行调用 super().reset(seed=seed)。这将自动使用种子值更新 np_random

环境步进

在 v0.21 中,step() 的类型定义是 tuple[ObsType, SupportsFloat, bool, dict[str, Any],表示下一个观察结果、步进的奖励、情节是否完成以及步进的额外信息。由于可重复性问题(将在即将发布的博客文章中扩展讨论),我们已将类型定义更改为 tuple[ObsType, SupportsFloat, bool, bool, dict[str, Any]],添加了一个额外的布尔值。这个额外的布尔值对应于旧的 done,现在更改为 terminatedtruncated。这些更改是在 Gym v0.26 中引入的(在 v25 中默认情况下关闭)。

对于希望更新的用户,在大多数情况下,将 done 替换为 terminated 以及 truncated=Falsestep() 中应该可以解决大多数问题。但是,对于在情节截断而不是终止方面有原因的环境,应该阅读相关的 PR。对于循环遍历环境的用户,他们应该修改 done = terminated or truncated,如示例代码所示。对于训练库,主要区别在于将 done 更改为 terminated,指示是否应该执行引导。

时间限制包装器

在 v0.21 中,TimeLimit 包装器在 info 字典 TimeLimit.truncated 中添加了一个额外的键,每当代理在没有达到终止状态的情况下达到时间限制时。

在 v0.26 中,此信息改由上一节中描述的 truncated 返回值进行通信,如果代理在达到终止状态与否的情况下达到时间限制,则此返回值为 True。旧字典条目等效于 truncated and not terminated

环境渲染

在 v0.26 中,引入了新的渲染 API,使得渲染模式在初始化时固定,因为一些环境不允许动态更改渲染模式。因此,用户现在应该在 gym.make 中指定 render_mode,如上面的 v0.26 示例代码所示。

有关更改的更完整解释,请参阅此 总结

删除的代码

  • GoalEnv - 已被删除,需要它的用户应该重新实现环境或使用包含此环境实现的 Gymnasium Robotics。

  • from gym.envs.classic_control import rendering - 已被删除,取而代之的是用户实现自己的渲染系统。Gymnasium 环境使用 pygame 编写。

  • 机器人环境 - 机器人环境已移至 Gymnasium Robotics 项目。

  • 监控包装器 - 此包装器已被两个独立的包装器 RecordVideoRecordEpisodeStatistics 替换。