迁移指南 - v0.21 到 v1.0.0¶
Gymnasium 是 OpenAI Gym v0.26 的一个分支,它从 Gym v0.21 引入了一个大的破坏性更改。在本指南中,我们简要概述了从 Gym v0.21(为此编写了许多教程)到 Gym v0.26(以及后来的版本,包括 1.0.0)的 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 及更高版本(包括 v1.0.0)的示例代码¶
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
的决定是因为某些环境使用模拟器,这些模拟器无法在一个 episode 内更改随机数生成器,并且必须在新 episode 开始时完成。我们意识到在某些情况下控制随机数生成器很重要,在这些情况下,如果环境使用内置随机数生成器,用户可以使用属性 np_random
手动设置种子。
Gymnasium v0.26 更改为使用 numpy.random.Generator
而不是自定义随机数生成器。这意味着移除了几个函数,例如 randint
,取而代之的是 integers
。虽然某些环境可能使用外部随机数生成器,但我们建议使用属性 np_random
,wrappers 和外部用户可以访问和使用它。
环境重置¶
在 v0.26+ 中,reset()
接受两个可选参数并返回一个值。这与 v0.21 形成对比,v0.21 不接受任何参数并返回 None
。这两个参数是用于设置随机数生成器的 seed
和允许在重置时将其他数据传递到环境的 options
。例如,在经典控制中,options
参数现在允许用户修改状态边界的范围。有关更多详细信息,请参阅原始 PR。
reset()
进一步返回 info
,类似于 step()
返回的 info
。这很重要,因为 info
可以包含在下一步中使用或保存的指标或有效动作掩码。
要更新旧环境,我们强烈建议在 reset()
的第一行调用 super().reset(seed=seed)
。这将使用种子值自动更新 np_random
。
环境 Step¶
在 v0.21 中,step()
的类型定义是 tuple[ObsType, SupportsFloat, bool, dict[str, Any]
,表示下一步的观察、来自 step 的奖励、episode 是否完成以及来自 step 的其他信息。由于再现性问题将在即将发布的博客文章中展开,我们将类型定义更改为 tuple[ObsType, SupportsFloat, bool, bool, dict[str, Any]]
,添加了一个额外的布尔值。这个额外的布尔值对应于旧的 done,现在更改为 terminated 和 truncated。这些更改在 Gym v0.26 中引入(在 v25 中默认关闭)。
对于希望更新的用户,在大多数情况下,在 step()
中将 done
替换为 terminated
和 truncated=False
应该可以解决大多数问题。但是,由于 episode 截断而不是终止的原因的环境应仔细阅读相关的 PR。对于循环遍历环境的用户,他们应修改 done = terminated or truncated
,如示例代码所示。对于训练库,主要区别是将 done
更改为 terminated
,指示是否应进行引导。
TimeLimit Wrapper¶
在 v0.21 中,TimeLimit
wrapper 在 info
字典 TimeLimit.truncated
中添加了一个额外的键,每当智能体在未达到终端状态的情况下达到时间限制时。
在 v0.26+ 中,此信息改为通过上一节中描述的 truncated 返回值进行通信,如果智能体达到时间限制(无论是否达到终端状态),则该值为 True。旧的字典条目等效于 truncated and not terminated
环境 Render¶
在 v0.26 中,引入了一个新的 render API,这样 render 模式在初始化时是固定的,因为某些环境不允许即时 render 模式更改。因此,用户现在应在 gym.make
中指定 render_mode
,如上面的 v0.26+ 示例代码所示。
有关更改的更完整说明,请参阅此摘要。
已删除的代码¶
GoalEnv - 这已删除,需要它的用户应重新实现环境或使用包含此环境实现的 Gymnasium Robotics。
from gym.envs.classic_control import rendering
- 这已删除,改为用户实现自己的渲染系统。Gymnasium 环境使用 pygame 编码。Robotics 环境 - Robotics 环境已移至 Gymnasium Robotics 项目。
Monitor wrapper - 此 wrapper 已替换为两个单独的 wrapper,
RecordVideo
和RecordEpisodeStatistics