3.4.1 PySC2 强化学习环境
《星际争霸》是暴雪娱乐公司(Blizzard Entertainment)开发的一款历史悠久的即时策略(Real-Time Strategy, RTS)游戏,这类游戏的特点是游戏有一张巨大的地图,地图中有数个资源点,玩家的视角只能局限于地图的一部分,同时需要考虑在地图的不同部分进行资源的搜索、采集,以及使用资源建造和升级建筑,然后使用建筑制造军队打败对手。从前面的介绍可以看出,这类游戏是非常复杂的。实际上,对于环境的观测,并得到当前环境的状态,要求智能体对地图的不同部分进行采样,因为智能体每时每刻只能观察到地图的一小部分;同时,在智能体的每一步决策中,大约有108种可能的动作,而且对应的强化学习的奖励非常稀疏,我们只能在游戏结束的时候才知道智能体的操作最终能够获得多少奖励(当然《星际争霸》游戏本身内置了游戏分数,可以作为奖励的一部分加入到强化学习环境中缓解这个问题)。另外,智能体的决策过程非常漫长,每一次游戏包含了数千次决策和动作,而早期的决策往往对后期的结果有着深远的影响。
为了研究类似于这种复杂游戏的强化学习算法,DeepMind开发了PySC2强化学习环境,来让智能体能够更方便地获取当前游戏的状态。具体的强化学习环境和强化学习算法之间的相互作用如图3.9所示(图片来源为本书参考文献7)。根据图3.9可以看出,从PySC2的强化学习环境出发,环境提供了当前可用的资源(resources)、可能的动作(available_actions),以及建筑队列(build_queue)这三个状态;同时还有当前屏幕的视角(当前智能体视角能获取的一小部分地图的信息)和小地图视角(全局整体地图状态的缩略图)这两个状态(图像特征)。根据这些输入的状态,智能体做出具体的决策,并将动作传递给强化学习环境获取对应的奖励。
图3.9 基于PySC2的强化学习算法决策过程示意图
为了使用PySC2强化学习环境,首先需要安装对应的Python库,具体只需要执行命令pip install pysc2,即可安装。如果读者使用的是Linux操作系统,需要从暴雪公司(Blizzard)的游戏GitHub站点的s2client-proto项目下下载对应的游戏版本的客户端,并将这些客户端解压到~/StarCraftII/目录下。如果是Windows/MacOS操作系统,可以直接安装暴雪公司的游戏客户端,即可使用PySC2强化学习环境。由于这个强化学习环境非常复杂,下面仅举一个简单的例子说明如何使用这个强化学习环境。
代码3.10展示了如何使用这个强化学习环境(这里只是截取了关键一部分,所有可运行的代码请参考ex_3_10.py)。
代码3.10 PySC2强化学习环境使用示例。
首先需要初始化强化学习的地图,在每一个片段开始的时候,将会随机从地图中选取其中一幅地图。然后需要定义的是强化学习的玩家,这里使用两个玩家,第一个玩家是我们的智能体,采用随机的种族(《星际争霸》游戏中的概念,具体有神族、虫族和人族三个种族),第二个玩家是《星际争霸》的机器人,具体的种族是虫族,难度为简单,策略为进攻型策略(Rush)。接下来定义的是智能体的一些具体参数agent_interface_format,包括图像特征的大小、动作空间的大小等,具体的定义请参考ex_3_10.py。然后就是重复执行的步数step_mul,以及每个片段执行的步数game_steps_per_episode。定义完强化学习环境之后,就能获取具体的观测状态obs,以及对应的有效的动作空间obs.available_actions(因为在《星际争霸》游戏中,有效的动作空间和当前的状态有关,因此这两个变量会相互关联)。在代码3.10中,随机从有效的动作空间中进行采样并且执行一步动作,最后获得一定的奖励reward。从整个代码来看,虽然PySC2强化学习环境的配置比较复杂,但是整体的设计思路和前面介绍的几个强化学习环境还是一致的。