星际争霸2人工智能初探——SC2LE研究环境搭建

##前言

2017年5月28日,一场围棋界的世纪大战落下帷幕,人类棋手柯洁以0:3的比分负于人工智能AlphaGO。至此,人工智能攻破了千百年来人类智慧的最后防线——被称为”千古无重局“的围棋。标志着人工智能已迈向一个新的高度。
同年8月10号,AlphaGO的创造者DeepMind公司宣布正式与暴雪公司展开合作,使用暴雪开发的传统电子竞技项目 星际争霸2 作为辅助人工智能学习提升的手段,并联合暴雪发布了星际争霸2人工智能研究环境SC2LE,包括——
机器学习API:由暴雪开发,将研究人员和开发人员接入游戏,并自带首次发布的Linux工具包。
匿名游戏回放数据集:包含65000多场游戏记录,在接下来的几周将增加至50万场,帮助实现智能体间的离线比赛。
开源的DeepMindPySC2工具包:方便研究人员使用暴雪的特征层API训练智能体。
一系列简单的增强学习迷你游戏:帮助研究人员在特定任务上测试智能体的性能。
概述开发环境的论文:记录了迷你游戏的初始基线结果、监督学习数据以及智能体间完整的对抗记录。
PySC2是DeepMind的 “星际争霸II学习环境”(SC2LE)的Python组件。它暴露了 暴雪娱乐公司的星际争霸II机器学习API作为Python RL环境。这是DeepMind和暴雪之间的合作,将星际争霸II发展成为RL研究的丰富环境。PySC2为RL代理提供了一个与星际争霸2进行交互的接口,获取观察和发送动作。
暴雪机器学习API:https://github.com/BoZiTong/s2client-proto
DeepMind工具包pysc2:https://github.com/BoZiTong/pysc2
相关文档:https://github.com/BoZiTong/awesome-starcraftAI
##星际争霸2与围棋

DeepMind在攻克了围棋后将星际争霸2(下文简称星际2)作为下一个目标,并不是代表在体现人类智慧这方面星际 2要强于围棋,因为它们本质上是不同的东西。只是星际争霸2 有着更加复杂的机制。

###地图

几千年以来,人类的围棋战术有过无数次的优化和改变,但棋盘永远是固定的,固定的棋盘也就限定了围棋的战术——即使再如何变化战术,仍是以这个固定的棋盘为基础。而星际2的“棋盘”是不断变化的,不同的地图即为不同的棋盘,而不同的地图也有着不同的战术,有些战术在特定的地图上拥有更强大的杀伤力,而有些战术在某些地图上则基本行不通。


###战争迷雾

连暴雪与DeepMind团队也曾公开表示过,对于AI来说,星际2与围棋相比最大的影响就是“战争迷雾”,围棋的棋盘是固定且明了的,而星际2拥有多样化的对战地图和战争迷雾。在围棋中,对手的每一次落子都可以传递给人工智能,从而让人工智能计算应采取的最佳对策,而星际2中则拥有战争迷雾,对手的每一步动作、战术策略并不能让人工智能在第一时间得知,需要依靠侦查手段才能获得对手的情报,因此这会极大的影响人工智能的判断和战术选择。


###操作

若要提到星际2与围棋的最大不同,那一定就是操作。围棋的一场比赛只需要完成落子这样的动作,而这个动作由你的策略决定,并不能影响战局。而星际2中操作往往能改变比赛结果,对手的一个操作失误或是你表现出更优秀的操作往往能让一场根本打不赢的决战完成逆转。这一点星际2玩家应该深有体会。

由此不难看出,人工智能若想在星际争霸2上战胜人类选手,应该是个不小的挑战。

##目前的研究

笔者在中科院自动化所模式识别中心国家重点实验室,目前正进行星际争霸2相关的机器学习研究。星际争霸 2的可操作空间十分巨大,而且还需要在这个过程中不断对接下来的动作做出选择。能获取的信息又十分有限,大部分情况下人类选手都是凭经验和侦查预测对手下一步的动作,从而做出相应的应对。放弃侦查盲目执行自己的打法往往只能带来失败。所以,对于一块很大的地图来说,人工智能每一秒都要面临无数种抉择,即使游戏地图仅有 84×84 这么小,人工智能随时都要面对 1 亿种可能的操作。更可怕的是很多操作都还需要同时去进行,采矿、建造、侦查、交战都要兼顾。面对这种现状,DeepMind的科学家们提出了一种新的方案,就是将操作分成一个个小任务,如采矿、移动视角等,不再需要人工智能去计算每一个微小的操作细节,从而减轻大量的选择对机能造成的负担。但是,现在的人工智能连星际争霸2的简单电脑都打不过,更别提和有经验的人类玩家对战了。要真正实现像AlphaGO那样战胜顶尖人类选手更是遥不可及的梦。不过我们也不能能过于悲观,毕竟我们在围棋上也曾经是这样,但又有谁能知道以后会怎样呢?

##SC2LE研究环境
相信有不少星际争霸2玩家和人工智能从业人员都想小试牛刀,“调教”一下AI。但目前的研究成果有限,文档更是少之有少。
在https://github.com/BoZiTong/pysc2上有完整的英文版安装步骤及介绍供大家参考。
笔者在此结合自身经验给出一个完整的安装步骤:
环境:Windows7操作系统 
Python3.4.1
星际争霸最新版本

1.安装Python 和星际争霸2
如何安装在这里就不赘述了
安装Python可以参考
http://jingyan.baidu.com/article/7908e85c78c743af491ad261.html
推荐安装最新版本,即Python3.6.1,注意一定要配置环境变量Path
安装星际
https://www.battlenet.com.cn/account/download/ 
如果没有安装在默认目录下,需要配置环境变量SC2PATH为安装路径

2.安装pysc2
打开cmd,执行

```
pip install pysc2
```
如果上一步中没有配置环境变量Path这里会提示pip不是内部或外部命令。
之后会自动安装需要的依赖,
如果之前没有安装过pygame,这里会出现错误,需要我们手动安装pygame,访问
https://pypi.python.org/pypi/Pygame
根据自己的python版本下载相应的whl文件,如果python版本为3.6则下载pygame-1.9.3-cp36-cp36m-win32.whl (md5),cp后面的两个数字为版本号。下载后需要将其重命名为pygame-1.9.3-py3-none-any.whl。之后打开cmd,执行

```
pip install D:\pygame-1.9.3-py3-none-any.whl ##文件路径
```
即可完成安装,再次执行

```
pip install pysc2
```
完成后续依赖的安装,如果出现问题则尝试手动安装。

3.下载Map Packs,mini-game和replay
https://github.com/BoZiTong/s2client-proto上下载MapPacks和ReplayPacks
https://github.com/deepmind/pysc2/releases/download/v1.0/mini_games.zip下载mini-game

4.添加Maps
在星际争霸2的目录中创建Maps文件夹,将Melee和Mini-game解压到其中。密码是iagreetotheeula

5.测试
至此已安装完毕,打开cmd,输入

```
python -m pysc2.bin.agent --map Simple64
```
进行测试
Windows下画面
![这里写图片描述](https://img-blog.csdn.net/20170924223557034?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYm96aXRvbmcxOTk2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
MacOS与Linux的安装方法基本相同,只是Linux下没有原游戏画面。

##结语
转眼,这已经是星际争霸系列陪我度过的第12年。从一个打不过电脑的孩子,到线下比赛冠军;从一个普通的游戏玩家,到从事开发和研究,一路上经历了很多。
希望大家关注我的博客和[个人主页](http://47.94.250.132/)(手机打开可能无法正确显示排版)


###                        浅唱——于中科院自动化所

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Pysc2是一个用于创建人工智能星际争霸2(StarCraft II)理程序的Python库。它允许您通过Python代码与StarCraft II进行交互,并使用Python编写的算法来控制游戏单位。以下是一个简单的Pysc2示例,展示如何使用Pysc2库来控制星际争霸2游戏单位: ```python import numpy as np import cv2 import time import pysc2 from pysc2 import maps from pysc2.lib import actions from pysc2.lib import features # 加载StarCraft II地图 pysc2.maps.get("Simple64") # 定义动作和特征 FUNCTIONS = actions.FUNCTIONS FEATURES = features.features_from_game_version(game_version=pysc2.maps.get("Simple64").game_version) # 定义代理类 class SimpleAgent(pysc2.agents.Agent): def __init__(self): super(SimpleAgent, self).__init__() self.attack_coordinates = None def step(self, obs): super(SimpleAgent, self).step(obs) # 如果没有准备好攻击坐标,则选择一个 if self.attack_coordinates is None: player_relative = obs.observation["screen"][features.SCREEN_FEATURES.player_relative.index] x, y = (player_relative == features.PlayerRelative.ENEMY).nonzero() target = [x.mean(), y.mean()] self.attack_coordinates = target # 如果可以攻击,则攻击 if FUNCTIONS.Attack_screen.id in obs.observation["available_actions"]: player_relative = obs.observation["screen"][features.SCREEN_FEATURES.player_relative.index] x, y = (player_relative == features.PlayerRelative.ENEMY).nonzero() if not y.any(): return FUNCTIONS.no_op() target = [x[0], y[0]] return FUNCTIONS.Attack_screen("now", target) # 如果无法攻击,则移动到攻击坐标 player_relative = obs.observation["screen"][features.SCREEN_FEATURES.player_relative.index] x, y = (player_relative == features.PlayerRelative.SELF).nonzero() if not x.any(): return FUNCTIONS.no_op() player = [int(x.mean()), int(y.mean())] if self.attack_coordinates is not None: return FUNCTIONS.Move_screen("now", self.attack_coordinates) return FUNCTIONS.no_op() # 运行代理 agent = SimpleAgent() try: while True: with sc2_env.SC2Env( map_name="Simple64", players=[sc2_env.Agent(sc2_env.Race.terran)], agent_interface_format=features.AgentInterfaceFormat( feature_dimensions=features.Dimensions(screen=84, minimap=64), use_feature_units=True), step_mul=16, game_steps_per_episode=0, visualize=True) as env: # 运行一局游戏 agent.setup(env.observation_spec(), env.action_spec()) # 重置游戏环境 timesteps = env.reset() agent.reset() # 运行游戏 while True: step_actions = [agent.step(timesteps[0])] if timesteps[0].last(): break timesteps = env.step(step_actions) except KeyboardInterrupt: pass ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值