Gym 是 Python 中一个广泛使用的开源库,用于开发和比较强化学习(Reinforcement Learning, RL)算法。它最初由 OpenAI 开发,提供标准化的环境接口,允许开发者在各种任务(如游戏、机器人控制、模拟物理系统)中测试 RL 算法。Gym 的设计简单且灵活,适合学术研究和工业应用。2022 年,Gym 被整合到 Gymnasium(由 Farama Foundation 维护)中,成为主流的强化学习环境库。本文以 Gymnasium(gymnasium
)为基础,兼容旧版 Gym(gym
)。
以下是对 Python 中 Gym(Gymnasium)库的详细介绍,包括其定义、功能、用法、示例、最佳实践和注意事项。内容基于官方文档(截至 2025 年 6 月,Gymnasium v0.29+)和其他可靠来源(如 GitHub、Farama Foundation)。
Gymnasium(前身为 Gym)是一个强化学习环境库,提供标准化的环境接口,用于开发和测试 RL 算法。每个环境定义了状态空间(observation space)、动作空间(action space)、奖励函数(reward function)和终止条件,模拟 RL 代理与环境的交互。
核心功能:
gymnasium.spaces
定义离散或连续的空间。VectorEnv
)。依赖:核心依赖 NumPy,可选依赖如 MuJoCo、Atari ROMs、PyGame。
env.step(action)
与环境交互,获取 (observation, reward, terminated, truncated, info)
。
observation
:当前状态(如图像、向量)。reward
:动作的奖励值。terminated
:是否达到终止状态(如任务完成)。truncated
:是否因外部限制(如时间)截断。info
:额外调试信息(字典)。gymnasium.spaces.Discrete
:离散动作/状态(如 0, 1, 2)。gymnasium.spaces.Box
:连续空间(如浮点向量)。env.reset()
初始化环境,返回初始状态。Gymnasium 是当前推荐的版本,安装方式:
pip install gymnasium
pip install "gymnasium[classic-control]"
pip install "gymnasium[atari]"
pip install "gymnasium[accept-rom-license]" # 自动接受 ROM 许可
pip install "gymnasium[mujoco]"
pip install gym
使用 gymnasium.make
创建环境,通过 step
和 reset
交互。
示例(CartPole 环境):
import gymnasium as gym
env = gym.make("CartPole-v1", render_mode="human") # 创建环境,可视化
observation, info = env.reset(seed=42) # 重置环境
for _ in range(1000):
action = env.action_space.sample() # 随机动作
observation, reward, terminated, truncated, info = env.step(action) # 执行动作
if terminated or truncated:
observation, info = env.reset()
env.close() # 关闭环境
CartPole-v1
:经典控制任务,目标是平衡小车上的杆。render_mode="human"
:显示图形界面。action_space.sample()
:从动作空间随机采样。检查环境的动作和状态空间。
示例:
env = gym.make("CartPole-v1")
print(env.action_space) # 输出: Discrete(2)(左右推车)
print(env.observation_space) # 输出: Box([-4.8, -inf, -0.418, -inf], [4.8, inf, 0.418, inf], (4,), float32)
结合 RL 算法(如 PPO from Stable-Baselines3)训练代理。
示例:
from gymnasium import make
from stable_baselines3 import PPO
env = make("CartPole-v1")
model = PPO("MlpPolicy", env, verbose=1) # 使用 PPO 算法
model.learn(total_timesteps=10000) # 训练 10000 步
model.save("ppo_cartpole") # 保存模型
# 测试模型
obs, _ = env.reset()
for _ in range(1000):
action, _states = model.predict(obs)
obs, reward, terminated, truncated, _ = env.step(action)
if terminated or truncated:
obs, _ = env.reset()
env.close()
通过继承 gymnasium.Env
创建自定义 RL 环境。
示例:
import gymnasium as gym
from gymnasium.spaces import Discrete, Box
import numpy as np
class CustomEnv(gym.Env):
def __init__(self):
super().__init__()
self.action_space = Discrete(2) # 两个动作
self.observation_space = Box(low=-1, high=1, shape=(1,), dtype=np.float32)
self.state = 0
self.steps = 0
def reset(self, seed=None, options=None):
super().reset(seed=seed)
self.state = 0
self.steps = 0
return np.array([self.state], dtype=np.float32), {}
def step(self, action):
self.state += 0.1 if action == 1 else -0.1
self.steps += 1
reward = 1.0 if abs(self.state) < 0.5 else -1.0
terminated = self.steps >= 100
truncated = False
return np.array([self.state], dtype=np.float32), reward, terminated, truncated, {}
env = CustomEnv()
obs, _ = env.reset()
for _ in range(10):
action = env.action_space.sample()
obs, reward, terminated, truncated, info = env.step(action)
print(obs, reward)
强化学习研究:
机器人控制:
游戏 AI:
工业仿真:
数据管道:
选择合适的渲染模式:
render_mode="rgb_array"
获取图像数据,render_mode="human"
用于可视化。env = gym.make("CartPole-v1", render_mode="rgb_array")
环境包装(Wrapper):
gymnasium.Wrapper
自定义环境逻辑(如状态归一化、奖励缩放)。from gymnasium.wrappers import NormalizeObservation
env = NormalizeObservation(gym.make("CartPole-v1"))
向量化环境:
gymnasium.vector.make
并行运行多个环境,加速训练。envs = gym.vector.make("CartPole-v1", num_envs=4)
异常处理:
try:
env = gym.make("Pong-v4")
except ImportError:
print("Install Atari dependencies")
测试环境:
pytest
测试环境行为。import pytest
import gymnasium as gym
def test_cartpole():
env = gym.make("CartPole-v1")
obs, _ = env.reset()
assert env.observation_space.contains(obs)
env.close()
种子设置:
reset(seed=...)
确保实验可重复。env.reset(seed=42)
Gym vs Gymnasium:
gym
)已停止维护,推荐使用 Gymnasium(gymnasium
)。# 旧版
import gym
env = gym.make("CartPole-v0")
# 新版
import gymnasium as gym
env = gym.make("CartPole-v1")
环境版本:
v1
环境(CartPole-v1
),旧版 v0
已弃用。env = gym.make("CartPole-v1") # 正确
依赖问题:
pip install "gymnasium[accept-rom-license]"
性能:
envs = gym.vector.make("CartPole-v1", num_envs=8)
动态环境:
beautifulsoup4
或 selenium
。from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com")
Gymnasium(Gym)是强化学习领域的标准环境库,提供了丰富的预定义和自定义环境支持。其核心特点包括:
参考文献: