PySC2使用简介(星际争霸II)
在AlphaGo获得成功后,DeepMind将注意力转向在《星际争霸2》(StarCraft II)中打败职业玩家。最近,他们通过AlphaStar (https://deepmind.com/blog/alphastar-mastering-real-time-strategy-game-starcraft-ii/)实现了自己的目标。在2017年,暴雪发布了一个Python库,提供了一个可以加速代理开发的组件。同时,该Python库具有巨大的动作空间,可以作为未来强化学习算法的基准。自最初发布以来,库有了很大的改进!
在设置环境(参考pysc2的GitHub中的说明)之后,我们需要创建一个启动脚本,Python代码如下:
from pysc2.env.sc2_env import SC2Env, AgentInterfaceFormat, Bot, Agent from pysc2.env.sc2_env import Race, Difficulty, Dimensions interface = AgentInterfaceFormat( Dimensions(64,64) ) players = [ Agent(Race.terran, 'TestAgent'), Bot(Race.terran, Difficulty.easy) ] with SC2Env( map_name="Simple64", players=players, agent_interface_format=interface, visualize=True ) as env: env.reset() input()
如果一切正常,我们可以看到一个带有彩色圆圈和2D图形的奇怪环境。这是特征图像查看器,从星际争霸2环境中获取信息的选项之一。
观察(Observations)
观察结果代表了环境告诉自己的信息。PySC2提供了不同的选项。如果我们想从游戏中提供图像(仅在Windows中工作),我们必须更改以下内容,Python示例如下:
interface = AgentInterfaceFormat( rgb_dimensions=Dimensions(124,124) )
我们很可能不想使用此选项。环境提供特征图像以加速训练。这些特征来自屏幕和小地图。可以在pysc2 / lib / features.py中找到这些特征列表。
我们可以用另外一种方法从环境中提取信息。如果我们在前面的代码中添加以下几行Python代码:
interface = AgentInterfaceFormat( feature_dimensions=Dimensions(128, 128), use_feature_units=True, use_raw_units=True ) … obs = env.reset() f_units = obs[0].observation['feature_units'] r_units = obs[0].observation['raw_units']
我们可以使用与单位直接相关的信息,如健康、位置、所有者、单位类型等。特征单元显示位于camera下区域的单元,而raw units显示地图中每个已知单元。
还提供了一些非空间数据,如矿物/gas数、供应量。观察中还包括可用的操作和当前的游戏状态。
动作(Actions)
环境的观察空间很重要,但主要的挑战是关注动作空间。PySC2使用13种可能类型的参数定义了大约300个动作函数。他们使用动作函数和类型来减少动作空间。要在环境中尝试我们的第一个操作,请键入以下Python代码:
from pysc2.env.sc2_env import SC2Env, AgentInterfaceFormat, Bot, Agent from pysc2.env.sc2_env import Race, Difficulty, Dimensions from pysc2.env.environment import StepType from pysc2.lib.actions import FunctionCall interface = AgentInterfaceFormat( feature_dimensions=Dimensions(128, 128), ) players = [ Agent(Race.terran, 'TestAgent'), Bot(Race.terran, Difficulty.easy) ] with SC2Env( map_name="Simple64", players=players, agent_interface_format=interface, visualize=True ) as env: obs = env.reset() while(obs[0].step_type != StepType.LAST): obs = env.step([FunctionCall(0, [])]) # action ID, arguments
现在,我们可以坐下来看看机器人是如何轻易地摧毁我们的基地。我们提供给环境的行为功能是一个简单的动作。因此,它不像其他命令那样需要参数。其他动作函数可以在pysc2/lib/actions.py中找到。