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 的交互流程就三步:重置 → 循环执行动作 → 收集数据。我画了个流程图,你看一眼就明白了。
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 把强化学习环境标准化了,你只需要关心「输入动作,拿到反馈」这个循环,剩下的交给环境去处理。