3、环境搭建:Gym库介绍、安装与配置、创建第一个强化学习环境(CartPole)

好,咱们进入实操环节。

说实话,很多初学者在理论部分听得热血沸腾,一到动手就卡住了。环境搭不起来,代码跑不通,心态直接崩了。我当年也经历过——花了一整天装库,结果连个倒立摆都看不到。

所以这一章,咱们就踏踏实实把环境搭好。你跟着我走一遍,保证能跑起来。

3.1 Gym库是什么?

Gym 是 开发的一套强化学习标准环境库。说白了,它就像是一个「实验超市」——里面摆好了各种现成的实验场景,你只需要拿过来用就行。

为什么要用 Gym?

  • 统一接口:所有环境都遵循 reset()、step()、render() 这套 API。你学会一个,其他的都差不多。
  • 环境丰富:从经典的 CartPole、MountainCar,到 Atari 游戏、机器人控制,应有尽有。
  • 社区成熟:大家都在用,遇到问题搜一下就有答案。

核心概念:Gym 把强化学习问题抽象成了一个「黑箱」。你给它动作,它返回下一个状态、奖励、是否结束。就这么简单。

3.2 安装与配置

安装 Gym 其实就一行命令。但这里有几个坑,我帮你提前踩了。

3.2.1 基础安装

pip install gym

嗯,这就装好了。但注意,这只是最精简版本,只包含经典控制类环境(比如 CartPole)。

3.2.2 安装完整版(推荐)

如果你想玩 Atari 游戏或者机器人模拟,需要装带扩展的版本:

pip install gym[all]

注意:在 Windows 上装 gym[all] 可能会遇到依赖问题。我曾经被 Box2D 的编译折腾了俩小时。如果你只是入门,装基础版就够了。

3.2.3 验证安装

装完之后,打开 Python 终端,输入:

import gym
print(gym.__version__)

如果能正常输出版本号,恭喜你,环境搭好了。

我的习惯:每次新建项目,我都会先跑一遍这个验证脚本。别嫌麻烦,这能帮你排除「是不是环境没装好」这种低级问题。

3.3 创建第一个强化学习环境:CartPole

CartPole 是强化学习界的「Hello World」。任务很简单:一个小车上面立着一根杆子,你要控制小车左右移动,让杆子不倒。

为什么选它?因为它状态空间小(4个维度),动作空间也小(2个动作),训练快,可视化直观。我刚开始学 RL 时,第一个跑通的就是它。

3.3.1 创建环境

import gym

env = gym.make('CartPole-v1')
print("观测空间:", env.observation_space)
print("动作空间:", env.action_space)

输出应该是:

观测空间: Box([-4.8...], [4.8...], (4,), float32)
动作空间: Discrete(2)

看到没?观测空间是 4 维的连续值,分别代表:小车位置、小车速度、杆子角度、杆子角速度。动作空间只有 2 个:左移(0)和右移(1)。

3.3.2 环境交互的基本流程

Gym 的交互流程就三步:重置 → 循环执行动作 → 收集数据。我画了个流程图,你看一眼就明白了。

Gym 环境交互流程 开始 env.reset() 是否结束? env.step(action) 结束 step() 返回: (next_state, reward, done, info) done=True 时,一轮 episode 结束

3.3.3 写一个完整的交互代码

来,咱们写一个完整的例子。让智能体随机动作,看看 CartPole 能撑多久。

import gym
import time

# 创建环境
env = gym.make('CartPole-v1')

# 重置环境,得到初始状态
state = env.reset()
print("初始状态:", state)

done = False
total_reward = 0
step_count = 0

# 开始交互
while not done:
    # 渲染画面(可视化)
    env.render()
    
    # 随机选择一个动作(0或1)
    action = env.action_space.sample()
    
    # 执行动作
    next_state, reward, done, info = env.step(action)
    
    total_reward += reward
    step_count += 1
    
    # 稍微慢一点,方便观察
    time.sleep(0.02)

print(f"共走了 {step_count} 步,总奖励: {total_reward}")

# 关闭环境
env.close()

小技巧:env.render() 会弹出一个窗口显示画面。如果你在服务器上跑没有图形界面,可以注释掉这行,或者用 env.make('CartPole-v1', render_mode='rgb_array') 来获取图像数组。

3.4 理解 step() 返回的四个值

这一步很重要。很多新手搞不清楚 step() 返回了什么,导致后面写算法时一脸懵。

返回值 类型 说明
next_state 数组 (4,) 执行动作后的新状态:[位置, 速度, 角度, 角速度]
reward 浮点数 这一步获得的奖励。CartPole 中每坚持一步得 1 分
done 布尔值 是否结束。杆子倾斜超过 15° 或小车出界就结束
info 字典 调试信息。CartPole 中通常是空字典

我曾经踩过的坑:刚开始写 DQN 时,我把 next_state 和 state 搞混了,导致训练完全不收敛。后来才发现,step() 返回的是 下一个 状态,不是当前状态。这个细节一定要注意。

3.5 环境配置参数

Gym 的环境其实有很多隐藏参数。比如 CartPole,你可以修改杆子的长度、小车的质量等。不过入门阶段,用默认参数就够了。

如果你想看看有哪些参数:

# 查看环境的所有配置
print(env.env.__dict__)

输出里会有一堆东西,比如 gravity=9.8、masscart=1.0、length=0.5 等等。感兴趣的话可以改着玩,看看不同参数下智能体学起来有什么区别。

3.6 本章小结

好,咱们捋一下这章做了什么:

  • 认识了 Gym 库——强化学习的「实验超市」
  • 装好了环境——一行命令搞定
  • 跑通了 CartPole——看到了那个摇摇晃晃的杆子
  • 理解了交互流程——reset → step → 循环

说实话,环境搭建这一步虽然枯燥,但它是后面所有实验的基础。你想想看,如果连环境都跑不起来,后面那些漂亮的算法不就成了纸上谈兵吗?

下一章咱们就要开始写真正的强化学习算法了。不过在那之前,我建议你多跑几遍 CartPole,试试不同的随机策略,看看杆子能撑多久。动手永远是学习 RL 最好的方式。

一句话记住这章:Gym 把强化学习环境标准化了,你只需要关心「输入动作,拿到反馈」这个循环,剩下的交给环境去处理。

可可精品资料库