Gym 是强化学习(Reinforcement Learning, RL)领域的事实标准仿真环境框架,核心价值是定义了一套统一的环境交互接口,让算法与环境完全解耦 —— 同一套 DQN/PPO 算法,只需修改环境名称,就能在倒立摆、Atari 游戏、机器人控制等数十种场景中无缝切换。
重要说明:原 OpenAI Gym 已于 2022 年停止维护,正式移交 Farama 基金会并更名为 Gymnasium,API 高度兼容且持续迭代。行业内仍习惯统称 “Gym 环境”,本文以最新的 Gymnasium 标准为准,同时标注新旧版本差异。
一、基础认知:定位与安装
1.1 核心定位
Gymnasium 负责封装所有环境的物理规则、状态转移、奖励计算,只对外暴露标准化的交互方法。智能体无需关心环境内部实现,只需通过固定接口发送动作、接收观测和奖励,极大降低了强化学习算法的开发成本。
它主要解决三个问题:
统一接口:所有环境遵循同一套交互规范,算法可跨环境复用
开箱即用:内置数十种经典基准环境,无需自己搭建仿真
可扩展:支持自定义环境、包装器扩展,适配业务场景
1.2 安装方式
根据需求选择对应安装包,推荐直接使用新版 Gymnasium:
#基础版(仅含经典控制环境)
pip install gymnasium
#完整安装(所有内置环境:Atari、MuJoCo、Box2D等)
pip install "gymnasium[all]"
#按需单独安装
pip install "gymnasium[classic_control]" # 经典控制
pip install "gymnasium[atari]" # Atari游戏
pip install "gymnasium[mujoco]" # MuJoCo三维物理
旧版 OpenAI Gym 安装(不推荐,已停止更新):pip install gym==0.26.2,0.26 是最后一个兼容新版 API 的版本,更早版本接口差异较大。
二、核心交互逻辑:标准 API 与执行流程
强化学习的本质是「智能体 – 环境」的循环交互:观测状态 → 执行动作 → 获得奖励与新状态 → 循环至回合结束。Gymnasium 将这个流程封装为 5 个核心方法。
2.1 核心方法总览
| gym.make(环境名) | 创建环境实例 | 环境对象 |
| env.reset(seed=?) | 重置环境,开启新回合 | (初始观测, 额外信息字典) |
| env.step(动作) | 执行一步动作,推进环境 | (新观测, 奖励, 是否终止, 是否截断, 额外信息) |
| env.render() | 渲染环境画面,可视化 | 无 / RGB 图像数组 |
| env.close() | 关闭环境,释放资源 | 无 |
2.2 关键返回值详解(新旧版本核心差异)
env.step() 是最核心的交互方法,新版返回 5 个值,也是新手最容易踩坑的地方:
observation(观测):智能体当前能看到的环境状态,格式由观测空间定义(向量、图像等)。
reward(奖励):当前步获得的标量奖励,是强化学习的优化目标信号。
terminated(自然终止):回合是否达到环境本身的终止条件。比如小车倒下、到达终点、游戏生命耗尽,属于 “自然结束”。
truncated(强制截断):回合是否被人为截断。最常见的是达到最大步数限制,并非环境本身的成功或失败。
info(额外信息):字典格式,存放调试用的内部数据(比如真实状态、隐藏参数),不参与训练。
新旧版本关键区别:旧版 Gym(<0.26)仅返回 (obs, reward, done, info),用done同时表示终止和截断。新版拆分后,可以精准区分 “回合真的结束了” 和 “步数到点了”,对价值估计、优势函数计算至关重要。
2.3 最简交互循环示例
以下是完整可运行的随机策略交互代码,覆盖完整流程:
import gymnasium as gym
import time
# 1. 创建环境,render_mode设置为human可视化
env = gym.make("CartPole-v1", render_mode="human")
# 2. 重置环境,开启第一个回合,固定种子保证可复现
observation, info = env.reset(seed=42)
total_reward = 0
for _ in range(100):
# 3. 随机采样一个合法动作
action = env.action_space.sample()
# 4. 执行动作,获取环境反馈
observation, reward, terminated, truncated, info = env.step(action)
total_reward += reward
# 5. 回合结束条件:自然终止 或 步数截断
if terminated or truncated:
print(f"回合结束,总奖励:{total_reward}")
total_reward = 0
observation, info = env.reset() # 重置开启新回合
time.sleep(0.02) # 控制渲染速度,避免画面过快
#6. 释放资源
env.close()
三、两大核心空间:观测空间与动作空间
所有环境都通过两个属性定义交互的 “格式契约”,是智能体设计的输入输出依据:
-
env.observation_space:观测的格式、维度、取值范围
-
env.action_space:动作的格式、维度、取值范围
3.1 常用空间类型
1. Discrete(离散空间)
-
定义:Discrete(n),包含 n 个可选值,取值为0 ~ n-1的整数。
-
典型场景:离散动作任务(左右推、上下移动、游戏按键)。
-
示例:CartPole 的动作空间是Discrete(2),0 = 向左推小车,1 = 向右推小车。
2. Box(连续空间)
-
定义:Box(low=下界, high=上界, shape=(维度,), dtype=数据类型),n 维连续数值空间。
-
典型场景:连续控制任务(机器人力矩、油门力度、向量观测)、图像观测。
-
示例:
-
CartPole 的观测空间是Box(shape=(4,)),4 个值分别为:小车位置、小车速度、杆的角度、杆的角速度。
-
Pendulum 的动作空间是Box(low=-2, high=2, shape=(1,)),表示连续的力矩大小。
-
3. 其他常用空间
-
MultiDiscrete:多维度离散空间,比如游戏手柄的方向键(4 向)+ 功能键(3 个)组合。
-
MultiBinary:多维度二元空间,适合多个开关控制的场景。
-
Dict:字典空间,组合多种观测,比如同时输入图像 + 向量状态。
实用技巧:调用空间.sample()可以随机生成一个合法值,既可以写随机策略,也可以用来校验空间格式是否符合预期。
四、经典内置环境分类
Gymnasium 内置了上百种基准环境,按场景可分为五大类,覆盖从入门到科研的全需求。
1. 经典控制(Classic Control)
-
特点:轻量二维物理仿真,计算速度极快,是强化学习入门的首选。
-
代表环境:
-
CartPole-v1:倒立摆平衡,最经典的入门环境,测试离散策略算法。
-
MountainCar-v0:山地车爬坡,稀疏奖励场景,适合学习奖励塑形。
-
Pendulum-v1:连续倒立摆,连续控制入门基准,适配 DDPG/PPO/SAC。
-
Acrobot-v1:双节摆起摆任务,欠驱动系统控制。
-
2. Box2D 物理环境
-
特点:基于 Box2D 引擎的二维刚体物理,比经典控制更复杂,接近真实物理场景。
-
代表环境:
-
LunarLander-v2:月球着陆器,需平稳降落到指定区域,有离散 / 连续双版本。
-
BipedalWalker-v3:双足机器人行走,经典连续控制基准算法测试环境。
-
3. Atari 2600 游戏环境
-
特点:像素输入的街机游戏,是深度强化学习(DQN 系列)的标准测试集。
-
代表环境:Breakout(打砖块)、Pong(乒乓球)、SpaceInvaders(太空侵略者)。
-
注意:观测为 210×160 的 RGB 图像,适合基于视觉的策略学习。
4. MuJoCo 三维物理环境
-
特点:基于 MuJoCo 动力学引擎的三维刚体仿真,是机器人连续控制的科研基准。
-
代表环境:HalfCheetah(半猎豹奔跑)、Hopper(单足跳)、Ant(四足机器人)、Humanoid(人形机器人)。
-
适用:验证 SAC、TD3、PPO 等先进连续控制算法的性能。
5. Toy Text 文字环境
-
特点:极简网格世界,无物理引擎,适合入门表格型强化学习(Q-learning、SARSA)。
-
代表环境:FrozenLake-v1(冰湖走迷宫)、CliffWalking-v0(悬崖行走)。
五、进阶核心功能
5.1 环境包装器(Wrapper)
Wrapper 是 Gym 最灵活的扩展机制,可以不修改环境源码,对观测、动作、奖励、终止逻辑进行二次加工,实现功能复用。
三类核心包装器
-
ObservationWrapper:修改观测输出,比如图像灰度化、观测归一化、尺寸缩放。
-
RewardWrapper:修改奖励值,比如奖励缩放、奖励裁剪、稀疏奖励塑形。
-
ActionWrapper:修改输入动作,比如连续动作范围映射、离散动作重映射。
示例:奖励缩放包装器
包装器的核心价值在于不侵入环境源码即可灵活调整交互逻辑。以下是一个自定义奖励缩放包装器的实现示例,它继承自 gym.RewardWrapper,用于按指定比例缩放环境返回的奖励值:
import gymnasium as gym
class ScaleReward(gym.RewardWrapper):
"""按比例缩放奖励值的包装器"""
def __init__(self, env, scale):
super().__init__(env)
self.scale = scale
def reward(self, reward):
# 重写 reward 方法,对原始奖励进行缩放
return reward * self.scale
# 使用方法:将包装器套用在原始环境上
env = gym.make("CartPole-v1")
env = ScaleReward(env, scale=0.1) # 将所有奖励值缩小为原来的十分之一
通过此包装器,原始环境 CartPole-v1 返回的每一步奖励都会被乘以 0.1。这在需要调整奖励尺度以稳定训练(例如防止梯度爆炸)或进行奖励塑形(Reward Shaping)时非常有用。
提示:Gymnasium 已内置了许多常用包装器,例如 TimeLimit(设置最大步数)、ClipAction(自动裁剪动作范围)、ResizeObservation(调整图像观测尺寸)等。在多数情况下,直接使用这些内置包装器即可,无需重复造轮子。
5.2 自定义环境
当内置环境不满足业务需求时,可以通过继承基类快速实现自定义环境,只需 5 步:
继承 gymnasium.Env 基类
定义 self.observation_space 和 self.action_space
实现 reset() 方法:初始化状态,返回初始观测与 info
实现 step(action) 方法:状态转移、计算奖励、判断终止,返回 5 个值
可选实现 render() 方法:可视化
5.3 向量化环境(VectorEnv)
-
作用:同时并行运行多个独立环境,一次性采集多组样本,大幅提升采样效率,是 PPO、A2C 等 on-policy 算法的标配。
-
两种实现:
-
SyncVectorEnv:同步串行执行,简单稳定,适合少量环境。
-
AsyncVectorEnv:异步多进程执行,环境数量多时效率更高。
-
六、实战避坑指南
坑 1:API 版本不兼容,step 返回值解包失败
-
现象:旧代码跑新版环境报错,提示 “too many values to unpack”。
-
原因:0.26 版本后,done拆分为terminated和truncated两个返回值。
-
解决:要么适配新版写法obs, reward, term, trunc, info = env.step(a),要么固定旧版本gym==0.25.2。
坑 2:随机种子不生效,实验不可复现
-
现象:设置了随机种子,但每次训练结果差异很大。
-
正确做法:仅在第一次调用 reset时传入 seed 参数,环境内部会自动维护随机状态;后续 reset 不要重复传 seed,否则会重置随机序列。同时算法侧的神经网络、采样器也要单独设置随机种子。
坑 3:连续动作范围不匹配,报错或奖励异常
-
现象:算法输出的动作超出环境要求的上下界,导致环境报错或奖励异常。
-
解决:算法输出端用 tanh 将动作压缩到 [-1,1],再线性映射到环境动作空间的 [low, high];也可以直接使用内置的RescaleAction包装器自动处理。
坑 4:最大步数截断的价值估计偏差
-
现象:达到最大步数截断的回合,算法当成真实终止处理,导致价值函数估计不准。
-
解决:区分terminated和truncated,截断的回合不能算真正终止,在计算回报、优势函数时需要对后续价值进行自举(bootstrap)。
坑 5:环境安装失败
-
Box2D 安装报错:Windows 系统需先安装 swig:pip install swig,再安装 box2d 依赖。
-
Atari 环境缺失 ROM:安装时接受协议:pip install "gymnasium[atari, accept-rom-license]"。
-
服务器无图形界面渲染失败:将render_mode设为rgb_array,不要用human模式。
坑 6:渲染闪退、内存泄漏
-
现象:render 画面一闪而过,或多次创建环境后内存上涨。
-
解决:渲染循环中加入适当延时;每个环境使用结束后必须调用env.close()释放资源,不要反复创建环境实例。
七、生态扩展
-
算法库适配:Stable Baselines3、RLlib、CleanRL 等主流强化学习库均原生支持 Gymnasium 接口,传入环境名称即可直接训练。
-
扩展环境库:
-
PettingZoo:多智能体强化学习环境,与 Gymnasium 同团队,接口一致。
-
Minigrid:轻量网格世界环境,适合稀疏奖励、探索算法研究。
-
Gymnasium-Robotics:机器人操作与抓取仿真环境。
-

