本公众号MyEncyclopedia定期发布AI,算法,工程类深度和前沿文章。AI系列会涉及深度强化学习,计算机视觉,NLP等前沿方向的实践和理论。
今天和大家分享强化学习的经典训练环境,任天堂的红白机训练环境。

这次的环境,我将分装成 docker 镜像,这样在任何平台:Windows,Linux 甚至 Mac 上都可以运行。
这里将通过大家最常用的 Windows 系统来演示环境的使用。
X window 服务器
在 Windows上,首先,我们要装 X Window Server。可以用 Cygwin 或者是 XLaunch。

这里采用 XLaunch 是因为安装比较方便,安装包也很小。
如果 XLaunch 正常启动的话,就会在系统托管的地方显示出来。接着我们来下载环境的 docker images。
拉取镜像
用 docker pull 命令我们将预制的公开镜像拉下来
docker pull myencyclopedia/gym-nes
拉下来以后,可以用 docker image命令来检查是否存在
docker images
下一步,我们需要找到物理机或者 docker host 机器的 IP 地址。
在windows上,我们执行 ipconfig 命令,注意我们要的是 WSL 对应的 IP 地址。
$ ipconfig.exe
Windows IP 配置
以太网适配器 以太网:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
以太网适配器 vEthernet (WSL):
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::8841:6bd8:5064:9a3c%45
IPv4 地址 . . . . . . . . . . . . : 172.23.0.1
子网掩码 . . . . . . . . . . . . : 255.255.240.0
默认网关. . . . . . . . . . . . . :
得到了物理机的 docker 网段地址以后,我们将地址保存在物理机的 Display 环境变量中,注意最后需要加上 :0
export DISPLAY=172.23.0.1:0
至此,我们可以一键跑超级玛丽了。
docker run -e DISPLAY=$DISPLAY myencyclopedia/gym-nes bash -c 'python gym_nes_demo.py'
解释一点,-e DISPLAY=$DISPLAY
将 Display 环境变量从当前 shell 注入到 container 中。
一切顺利的话,有个 X window的窗口会跳出来,无人控制得超级玛丽运行了起来,它会随机执行一些动作。
结束程序记得要把 docker container 显示关掉,需要执行 docker stop
。
运行各种游戏
其实,预制的 docker 环境给大家装了更多的游戏,大家也可以修改源码跑其他游戏
具体方法是,将上面命令稍微修改一下 次我们进入 interactive bash。
docker run -it -e DISPLAY=$DISPLAY myencyclopedia/gym-nes bash

进了 container 之后,我们发现之前执行的 python 原代码是当前目录的 gym_nes_demo.py
先列出所有的游戏的 rom 文件。
(py3.7) root@aff72945133b:/proj/nes_py# find . -name '*.nes'
./tests/games/excitebike.nes
./tests/games/super-mario-bros-2.nes
./tests/games/super-mario-bros-3.nes
./tests/games/empty.nes
./tests/games/super-mario-bros-lost-levels.nes
./tests/games/super-mario-bros-1.nes
./tests/games/the-legend-of-zelda.nes
./tests/nes-roms/1942 (Japan, USA).nes
./tests/nes-roms/contra.nes
./tests/nes-roms/Battle City (J).nes
./tests/nes-roms/red.nes
./tests/nes-roms/Gradius 2 (J).nes
./tests/nes-roms/super-mario.nes
./tests/nes-roms/Contra Force (USA).nes
./tests/nes-roms/Rush'n Attack (U).nes
文件夹里有很多游戏, 包括魂斗罗,坦克大战等等。
修改 gym_nes_demo.py
,将超级玛丽替换成魂斗罗 nes。
from nes_py import NESEnv
import tqdm
env = NESEnv('/proj/nes_py/tests/games/super-mario-bros-1.nes')
done = True
try:
for _ in tqdm.tqdm(range(5000)):
if done:
state = env.reset()
done = False
else:
state, reward, done, info = env.step(env.action_space.sample())
env.render()
except KeyboardInterrupt:
pass
env = NESEnv('./tests/nes-roms/contra.nes')
保存后,执行
python gym_nes_demo.py
魂斗罗的 random agent 也跑起来了。

下一期,我会把一些很经典的深度强化学习的算法应用到这个环境中,让大家可以很方便得训练调试深度强化学习算法来挑战各种红白机游戏。
最后,感谢大家关注 MyEncyclopedia 公众号,B站频道或者 Youtube 频道。




