Gymnasium
OpenAI Gym 的后继标准:定义强化学习环境的
reset/step/render/ 空间接口,是自定义 env 与算法库(如 Stable Baselines3)之间的契约层。
简介
Gymnasium 是 Python 强化学习社区的主流环境接口库。它规定了智能体与环境交互的标准形状:观测空间与动作空间声明、回合初始化、单步转移与奖励、终止与截断标志、可选渲染。算法库只需针对该接口编程,即可在不同任务间复用训练代码。
与「随便写一个模拟器」相比,Gymnasium 的价值在于可检查、可组合、可对接:spaces.Box / Discrete / Dict 等声明让算法知道输入输出结构;check_env 能在训练前抓接口错误;terminated 与 truncated 分离任务结束与时间截断,避免把超时当成「到达目标」类失败。
在自定义任务(如 GridWorld悬崖行走)中,实现一个 gym.Env 子类并正确填写 metadata、空间与五元 step 返回值,是从「懂 RL 概念」到「能训出策略」的关键工程步骤。
关键信息
- 类型:工具 / 标准库
- 领域:强化学习、仿真接口
- 官方网站/地址:https://gymnasium.farama.org/(社区 Farama Foundation 维护)
- 定价/开源状态:开源(Python 包
gymnasium) - 相关概念:PPO、Stable Baselines3、GridWorld悬崖行走、势能奖励塑形
核心特性
工具类必填项
- 安装方式:
pip install gymnasium(教程中常与numpy、stable-baselines3、pygame、tensorboard一并安装) - 基本用法:
- 子类化
gym.Env,设置observation_space/action_space - 实现
reset(seed=...)→(obs, info),step(action)→(obs, reward, terminated, truncated, info) - 可选
render/close;metadata声明render_modes与render_fps
- 子类化
- 关键参数/配置:
- 空间类型:
Box(连续/归一化坐标)、Discrete(离散动作或 flag)、Dict(多模态结构化观测) - 五元 step:
terminated(任务结束)vstruncated(步数上限等截断)——混用会导致算法对 bootstrap 处理错误 - 随机源:必须用
self.np_random,否则seed不生效
- 空间类型:
- 适用场景:网格世界、机器人仿真包装、课程实验、对接 SB3/CleanRL 等训练栈;不适合把业务逻辑全塞进 env 却不做空间声明与检查
概念侧要点(接口语义)
- Dict 观测:把 agent 坐标、目标、障碍地图、边界 flag 按语义拆分,而不是展平为一维向量;便于网络分路处理与扩展传感器字段
- 归一化:坐标除以
(size-1)落到 [0,1],降低不同尺度对梯度的冲击 - info 字典:可携带
termination_reason、is_success、pos等,供评估失败模式分布(撞墙 / 坠崖 / 超时)
不同素材中的观点
- 2026-07-19-juejin-gridworld-cliff-ppo:以完整
GridWorldEnv示范 Gymnasium 自定义环境——metadata支持 human/ansi;Dict 观测四字段;出界硬终止;check_env作为训练前防线;强调 render 只读无副作用、奖励绝对值建议落在 [-10,10]。作者结论:从零建环境的核心是任务语义清晰 + 结构化观测 + 奖励工程,而不是堆算法超参。
实用信息
- 快速上手步骤:
pip install gymnasium numpy stable-baselines3- 写
class MyEnv(gym.Env),填空间与 cliff/goal 配置 check_env(MyEnv())无报错后再PPO(...).learn(...)
- 常用命令/片段:
- 空间:
spaces.Dict({...})、spaces.Discrete(4) - 检查:
from stable_baselines3.common.env_checker import check_env
- 空间:
- 注意事项/避坑指南:
- 不要用全局
np.random做 reset 采样 - 超时用
truncated=True,不要写成terminated - 撞墙若设计为失败,应明确惩罚幅度并终止,避免 agent 卡边无限蹭步
- 奖励塑形系数过大(见 势能奖励塑形)会扭曲主任务信号
- 不要用全局