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

Gymnasium 是 OpenAI Gym v0.26 <https://github.com/openai/gym/releases/tag/0.26.2>_ 的一个分支,它从 Gym v0.21 <https://github.com/openai/gym/releases/tag/v0.21.0>_ 引入了大量重大变更。在本指南中,我们简要概述了从 Gym v0.21(许多教程以此为基础编写)到 Gym v0.26 的 API 变化。对于仍停留在 v0.21 API 的环境,请参阅 指南 </content/gym_compatibility>_。

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 的原因是,某些环境使用无法在单个剧集中更改随机数生成器的模拟器,必须在新剧集开始时进行更改。我们意识到在某些情况下控制随机数生成器非常重要,在这些情况下,如果环境使用内置的随机数生成器,用户可以通过属性 :attr:np_random 手动设置种子。

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

环境重置

在 v0.26 中,:meth:reset 接受两个可选参数并返回一个值。这与不接受任何参数并返回 None 的 v0.21 形成对比。这两个参数是用于设置随机数生成器的 seed 和允许在重置时向环境传递额外数据的 options。例如,在经典控制中,options 参数现在允许用户修改状态边界范围。更多详情请参见原始 PR <https://github.com/openai/gym/pull/2921>_。

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

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

环境步骤

在 v0.21 中,:meth:step 的类型定义为 tuple[ObsType, SupportsFloat, bool, dict[str, Any],表示下一个观察值、步骤中的奖励、是否完成该集以及步骤中的附加信息。由于即将在博客文章中详细讨论的可重复性问题,我们将类型定义更改为 tuple[ObsType, SupportsFloat, bool, bool, dict[str, Any]],增加了一个额外的布尔值。这个额外的布尔值对应于旧的 done,现在改为 terminatedtruncated。这些更改在 Gym v0.26 <https://github.com/openai/gym/releases/tag/0.26.0>_ 中引入(在 v25 <https://github.com/openai/gym/releases/tag/0.25.0>_ 中默认关闭)。

对于希望更新的用户,在大多数情况下,将 done 替换为 terminated 并在 :meth:step 中使用 truncated=False 应该能解决大多数问题。然而,对于那些有理由进行剧集截断而不是终止的环境,应该阅读相关的 PR <https://github.com/openai/gym/pull/2752>_。对于在环境中循环的用户,他们应该按照示例代码所示修改 done = terminated or truncated。对于训练库,主要区别是将 done 更改为 terminated,以指示是否应该或不应该进行引导。

TimeLimit 包装器

在v0.21中,:class:TimeLimit 包装器在代理达到时间限制而未达到终止状态时,在 info 字典中添加了一个额外的键 TimeLimit.truncated

在v0.26中,这一信息通过上一节中描述的 truncated 返回值来传达,如果代理达到时间限制,无论是否达到终止状态,该值均为 True。旧的字典条目等同于 truncated and not terminated

环境渲染

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

如需更全面的变更解释,请参阅此 总结 <https://younis.dev/blog/render-api/>_。

已移除代码

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

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

  • 机器人环境 - 机器人环境已迁移到 Gymnasium Robotics <https://robotics.farama.org/>_ 项目。

  • 监视器包装器 - 这个包装器被替换为两个独立的包装器,:class:RecordVideo 和 :class:RecordEpisodeStatistics