1. 为什么是Gymnasium?从Gym到Gymnasium的平稳过渡

如果你刚开始接触强化学习,大概率会从OpenAI Gym这个经典平台入手。我刚开始学的时候也是,照着网上的教程装Gym,跑CartPole,感觉一切都很美好。但后来我发现,OpenAI官方对Gym的维护在几年前就基本停止了,很多依赖库版本老旧,在Win10上安装简直是“步步惊心”,动不动就报错,什么Swig找不到、Visual C++构建工具缺失,能把新手直接劝退。

所以,今天我们不聊“古董”Gym,我们来聊聊它的官方继任者——Gymnasium。你可以把它理解为Gym的“精神续作”和全面升级版。它由Farama基金会维护,这个基金会还维护着很多其他优秀的强化学习环境。Gymnasium完全兼容原版Gym的API,这意味着你之前为Gym写的99%的代码,在Gymnasium上都能直接运行,几乎不用改。但它的内核更新,依赖更现代,社区更活跃,Bug修复也更及时。简单说,用Gymnasium,你能获得更流畅的安装体验、更少的兼容性麻烦,以及接触更前沿的环境。对于Win10用户来说,这无疑是条更轻松的入门路径。

那么,我们这次实战的目标就很明确了:在Windows 10系统上,从零开始,搭建一个干净、稳定、能跑通经典控制问题的Gymnasium强化学习环境。我会带你走一遍我踩过坑的完整流程,包括用Anaconda管理环境、处理那些令人头疼的Windows特有依赖,最后用一个简单的例子验证环境是否成功。放心,我会把每个可能出错的地方都指出来,咱们争取一次搞定。

2. 战前准备:理清思路与备好工具

在动手敲命令之前,我们先花几分钟把整个搭建思路理清楚。强化学习环境搭建,核心是解决“依赖”和“隔离”两个问题。

依赖问题:Gymnasium不是一个孤立的库,它就像一棵树的树干,需要很多“树根”(底层库)来支撑。比如,它需要Python解释器,需要numpy做数值计算,某些环境(如Atari游戏)需要图像处理库pillow,经典控制环境(如我们待会要用的CartPole)可能需要pygamebox2d来进行可视化渲染。在Windows上,最棘手的是一些用C/C++编写的底层依赖(比如swig,一个连接C/C++和Python的工具),它们需要编译,而编译又需要微软的Visual C++构建工具。如果这些依赖没处理好,安装就会卡住。

隔离问题:你电脑上可能已经有很多Python项目,每个项目用的库版本可能都不一样。如果所有库都装在同一个地方(全局环境),很容易出现版本冲突。比如你的A项目需要numpy 1.20,但B项目需要numpy 1.24,两者不兼容,这就乱套了。所以,我们必须为Gymnasium创建一个独立的“房间”——也就是虚拟环境。在这个房间里,库的版本由我们说了算,和外面的世界互不干扰。装错了?大不了把这个“房间”拆了(删除环境)重来,完全不影响其他项目。

为此,我们选择两个核心工具:AnacondaPyCharm(或其他你喜欢的IDE)。

  • Anaconda:它是我们的“环境管家”和“包管理器”。用它的conda命令,我们可以轻松创建、切换、删除虚拟环境。更重要的是,conda不仅管理Python包,还能管理一些非Python的二进制依赖(特别是Windows上的),这能帮我们避开很多编译坑。当然,你也可以用纯pipvenv,但在Windows上,conda的体验通常更友好。
  • PyCharm:它是我们的“代码工作室”。一个强大的IDE能极大提升编程效率,代码提示、调试、运行环境管理都非常方便。我们将配置PyCharm使用我们创建好的Conda虚拟环境。

你需要确保已经安装了Anaconda。如果还没装,去官网下载安装包,一路Next就行,记得安装时勾选“Add Anaconda to my PATH environment variable”(将Anaconda添加到系统路径),这样后面在命令行里使用会更方便。PyCharm的社区版(免费)功能就足够我们使用了。

3. 步步为营:创建并配置专属的Gymnasium环境

好了,工具备齐,我们开始动手。打开你的“开始”菜单,找到并打开 “Anaconda Prompt”。我强烈建议使用这个,而不是普通的CMD或PowerShell,因为它启动时自动激活了Conda的基础环境,省去我们手动配置的麻烦。

3.1 创建全新的虚拟环境

在Anaconda Prompt里,我们输入第一条命令来创建一个全新的虚拟环境。我建议环境名起得直观一些,比如就叫gymnasium_env

conda create -n gymnasium_env python=3.9

这条命令的意思是:conda create是创建环境,-n后面跟环境名称gymnasium_envpython=3.9指定这个环境里安装Python 3.9版本。为什么不直接用最新的Python 3.11或3.12呢?因为一些科学计算库或深度学习框架对新版Python的支持可能会有延迟,Python 3.9是一个在兼容性和新特性之间取得很好平衡的版本,非常稳定。执行后,Conda会列出将要安装的包,输入y确认即可。

3.2 激活并进入你的环境

创建成功后,这个环境还处于“关闭”状态。我们需要“打开门”走进去。使用激活命令:

conda activate gymnasium_env

激活后,你会发现命令行的提示符前缀从(base)变成了(gymnasium_env)。这就对了!这意味着你之后所有操作,包括安装库、运行Python,都只在这个小房间里进行。

3.3 安装核心依赖:Gymnasium与渲染伴侣

现在,我们在这个干净的环境里安装主角。首先,我们直接用pip安装Gymnasium。为了加快下载速度,我们使用国内的镜像源,比如清华源。

pip install gymnasium -i https://pypi.tuna.tsinghua.edu.cn/simple

稍等片刻,Gymnasium及其最核心的依赖(如numpy)就会安装好。但光有Gymnasium还不够,很多环境需要额外的依赖组。Gymnasium把这些依赖分成了不同的“扩展包”。对于我们初学者,最常用的是 [classic_control][toy_text],它们包含了像CartPole(车杆平衡)、MountainCar(小车爬山)这样的经典环境。

我们一次性安装这两个扩展包:

pip install "gymnasium[classic_control, toy_text]" -i https://pypi.tuna.tsinghua.edu.cn/simple

注意命令里扩展包列表两边的引号,这在某些终端里是必须的。这个命令会同时安装pygamebox2d-py等用于可视化渲染的库。box2d-py在Windows上有时会编译失败,如果遇到问题,我们可以用Conda来安装一个预编译好的版本,这通常是更稳妥的方案:

conda install -c conda-forge swig
pip install "gymnasium[classic_control]" -i https://pypi.tuna.tsinghua.edu.cn/simple
# 如果上面命令安装box2d失败,尝试用conda安装
conda install -c conda-forge box2d-py

这里我们先通过Conda安装了swig(一个必要的构建工具),然后再尝试安装Gymnasium的经典控制包。如果box2d-py通过pip安装失败,再用condaconda-forge频道安装,这个频道提供了大量预编译好的Windows二进制包,能完美解决编译问题。

4. 攻克Windows典型“暗坑”:常见报错与解决方案

即使按照上面的步骤,在Windows上你仍有可能遇到一些特有的错误。别慌,这些坑我都踩过,下面给你准备好“填坑指南”。

4.1 错误:Microsoft Visual C++ 14.0 or greater is required

这是Windows上最常见的错误,没有之一。当你安装某些需要编译的Python包(早期安装某些版本的gym时附带的box2d就容易触发)时,系统会提示这个错误。

原因:这些包的底层是C/C++代码,在安装时需要本地编译。而编译过程依赖微软的Visual Studio Build Tools(构建工具)。

解决方案:去微软官网下载“Build Tools for Visual Studio 2022”。安装时,在“工作负载”选项卡中,务必勾选“使用C++的桌面开发”,并在右侧的“安装详细信息”中,确保“Windows 10 SDK”或“Windows 11 SDK”被选中。安装完成后,重启电脑,再重新尝试安装失败的包。

4.2 错误:swig 相关错误或 box2d 编译失败

正如前面提到的,box2d-py是一个“刺头”。

解决方案(首选):放弃用pip编译安装,直接使用Conda安装预编译的二进制包。这能100%避免编译问题。

conda install -c conda-forge swig box2d-py

解决方案(备用):如果实在不想用Conda,可以尝试寻找预编译的.whl文件。但这个方法比较麻烦,不推荐新手。

4.3 环境渲染时闪退或黑屏

当你运行环境并调用env.render()时,窗口一闪而过或者根本是黑的。

原因:这通常是GUI事件循环与你的Python脚本冲突导致的。特别是在使用像Jupyter Notebook或某些IDE的内置控制台时。

解决方案:对于pygame渲染的后端(经典控制环境常用),可以尝试在代码中强制使用一种特定的渲染模式,并添加延迟。更根本的解决方法是采用异步渲染。这里给你一个修改后的稳定示例:

import gymnasium as gym
import time # 导入时间模块

env = gym.make("CartPole-v1", render_mode="human") # 指定渲染模式为‘human’
observation, info = env.reset()

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()
    
    time.sleep(0.01) # 添加一个小的延迟,让渲染窗口有机会更新

env.close()

关键点在于render_mode="human"time.sleep(0.01)。对于更复杂的项目,建议使用gymnasium.wrappers.RenderCollection或转向更稳定的渲染方式,如录制视频。

5. 终极验证:让你的第一个智能体动起来

理论说再多,不如跑通一行代码。我们来写一个最简单的脚本,验证环境是否完全正确。打开你的PyCharm,创建一个新项目。重点来了:为项目选择我们刚才创建的Conda环境

在PyCharm中,点击 File -> Settings -> Project:你的项目名 -> Python Interpreter。点击右上角的齿轮图标,选择Add...。在打开的窗口中,左侧选择Conda Environment,右侧选择Existing environment,然后找到你Anaconda安装路径下的envs/gymnasium_env/python.exe(例如C:\Users\你的用户名\anaconda3\envs\gymnasium_env\python.exe)。选中它,点击确定。这样,PyCharm就会使用我们这个装好了所有库的环境。

新建一个Python文件,比如叫做test_gymnasium.py,把下面的代码粘贴进去:

import gymnasium as gym

# 创建CartPole环境
env = gym.make("CartPole-v1", render_mode="human")
# 初始化环境,获取初始状态
observation, info = env.reset()

# 运行100个时间步
for step in range(100):
    # 渲染当前帧(弹出图形窗口)
    env.render()
    
    # 这里我们采用一个简单的启发式策略:根据杆子的角度来决定推力方向
    # observation是一个包含4个数字的数组:[小车位置, 小车速度, 杆子角度, 杆子顶端速度]
    pole_angle = observation[2]  # 取出杆子角度
    
    # 如果杆子向右偏(角度为正),则向右推(动作1);否则向左推(动作0)
    action = 1 if pole_angle > 0 else 0
    
    # 执行动作,获取环境反馈
    observation, reward, terminated, truncated, info = env.step(action)
    
    # 如果游戏结束(杆子倒得太厉害或者小车跑出界),则重置环境
    if terminated or truncated:
        print(f"Episode finished at step {step+1}")
        observation, info = env.reset()

# 关闭环境
env.close()
print("环境测试成功!")

这段代码做了几件事:

  1. 导入了gymnasium,并创建了“CartPole-v1”环境(这是新版命名,相当于旧版的CartPole-v0)。
  2. 采用了一个极其简单的策略:看着杆子往哪边倒,就往哪边推小车。这当然不是一个“智能”的策略,但它能让我们直观地看到环境在运行。
  3. 循环执行动作、渲染画面,并在游戏结束时重置。

右键点击代码,选择Run ‘test_gymnasium.py‘。如果一切顺利,你应该会看到一个新窗口弹出来,里面有一个小车和一根左右摇摆的杆子。小车会根据我们的笨策略移动,杆子晃来晃去,直到倒下,然后环境重置,开始新一轮。

看到这个动画窗口,恭喜你!你的Gymnasium环境在Win10上已经完美搭建成功。你不仅安装好了库,还成功地运行了一个完整的交互式强化学习环境。这标志着你可以正式开启强化学习算法实战之旅了,接下来就可以尝试用Q-learning、DQN等算法来替换上面代码中的简单策略,让小车真正学会平衡杆子。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐