PySC2使用简介(星际争霸II)

albertjone 2019-02-26

在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()

PySC2使用简介(星际争霸II)

PySC2使用简介(星际争霸II)

如果一切正常,我们可以看到一个带有彩色圆圈和2D图形的奇怪环境。这是特征图像查看器,从星际争霸2环境中获取信息的选项之一。

观察(Observations)

观察结果代表了环境告诉自己的信息。PySC2提供了不同的选项。如果我们想从游戏中提供图像(仅在Windows中工作),我们必须更改以下内容,Python示例如下:

interface = AgentInterfaceFormat(
 rgb_dimensions=Dimensions(124,124)
)

PySC2使用简介(星际争霸II)

我们很可能不想使用此选项。环境提供特征图像以加速训练。这些特征来自屏幕和小地图。可以在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']

PySC2使用简介(星际争霸II)

我们可以使用与单位直接相关的信息,如健康、位置、所有者、单位类型等。特征单元显示位于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使用简介(星际争霸II)

现在,我们可以坐下来看看机器人是如何轻易地摧毁我们的基地。我们提供给环境的行为功能是一个简单的动作。因此,它不像其他命令那样需要参数。其他动作函数可以在pysc2/lib/actions.py中找到。

相关推荐