原文地址:

https://blog.csdn.net/woaipichuli/article/details/78645999

-----------------------------------------------------------------------------------------

这篇博文简单的介绍PySC2的基本使用以及分析一份网友提供的代码(使用DQN来让计算机玩星际2)。

##1-PySC2 ##

Deepmind公布的这段python与PySC2通信的源码主要包含以下的几个方面(原图来于博客):

这里我们只讲解对于强化学习算法开发过程当中需要用到的一些内容:主要就是env
在env当中包装了观测量集合、动作集合、状态推进功能、状态重置功能等,它所具有的实例化参数如下原图来于博客

观测量集合
可以通过SC2Env的实例获得,也可以利用step方法返回的元组来获得,内容都是以python当中的字典的方式进行组织的。

动作集合
有了观测值,我们就具有了动作部分所需要的输入,星际2当中的动作空间非常的大,就单纯考虑其中的动作类型就具有524个动作函数:

  1. python -m pysc2.bin.valid_vactions

对于这些函数都是具有其函数ID的,我们可以通过FunctionCall来完成调用,返回的是一个action。

状态推进
既然有了动作值,那么我们怎么进一步的去推进游戏进程呢?这里使用的方法与Gym当中一样,使用step方法就可以完成,返回的内容是一个环境的字典(前面已经提到过了)。

状态重置
星际争霸是一个没有固定时限的测试环境,我们当然可以把时间设置成无穷大,让游戏结束的时候返回,但往往为了效率,我们可以设置一个时间的长度,当到达这个时间长度以后对环境状态进行reset即可。

2-挖矿代码解读

这是一个网友分享出来的代码当中的一个部分,在这段代码当中他使用了一个DQN网络对星际争霸2当中的挖矿任务进行了测试:

  1. #导入需要的模块
  2. import sys
  3.  
  4. from absl import flags
  5. import baselines.common.tf_util as U
  6. import numpy as np
  7. from baselines import deepq
  8. from pysc2.env import environment
  9. from pysc2.env import sc2_env #导入环境模块
  10. from pysc2.lib import actions
  11. from pysc2.lib import actions as sc2_actions #导入动作模块
  12. from pysc2.lib import features
  13.  
  14. import deepq_mineral_shards
  15.  
  16. #获取屏幕上的个体信息,其实就是一个矩阵,里面0表示环境中可以移动的位置,1表示队友,3表示矿产
  17. _PLAYER_RELATIVE = features.SCREEN_FEATURES.player_relative.index
  18. _PLAYER_FRIENDLY = 1
  19. _PLAYER_NEUTRAL = 3 # beacon/minerals
  20. _PLAYER_HOSTILE = 4
  21. _NO_OP = actions.FUNCTIONS.no_op.id
  22. #记录相应动作函数的ID
  23. _MOVE_SCREEN = actions.FUNCTIONS.Move_screen.id
  24. _ATTACK_SCREEN = actions.FUNCTIONS.Attack_screen.id
  25. _SELECT_ARMY = actions.FUNCTIONS.select_army.id
  26. _NOT_QUEUED = [0]
  27. _SELECT_ALL = [0]
  28.  
  29. step_mul = 16
  30. steps = 400
  31.  
  32. FLAGS = flags.FLAGS
  33.  
  34. def main():
  35. FLAGS(sys.argv)
  36. #实例化环境
  37. with sc2_env.SC2Env(
  38. map_name="CollectMineralShards",
  39. step_mul=step_mul, #推进的速度,通俗理解就是人类玩家的每秒的有效操作
  40. visualize=True, #是否可视化
  41. game_steps_per_episode=steps * step_mul #每轮的运行步长,None则表示没有时间限制
  42. ) as env:
  43.  
  44. #调用Baselines中的deepq,以后会再做讲解
  45. model = deepq.models.cnn_to_mlp(
  46. convs=[(32, 8, 4), (64, 4, 2), (64, 3, 1)],
  47. hiddens=[256],
  48. dueling=True)
  49.  
  50. def make_obs_ph(name):
  51. return U.BatchInput((64, 64), name=name)
  52.  
  53. act_params = {
  54. 'make_obs_ph': make_obs_ph,
  55. 'q_func': model,
  56. 'num_actions': 4,
  57. }
  58. #导入训练好的模型参数
  59. act = deepq_mineral_shards.load(
  60. "mineral_shards.pkl", act_params=act_params)
  61.  
  62. while True:
  63. #环境初始化
  64. obs = env.reset()
  65. episode_rew = 0
  66.  
  67. done = False
  68. #这里固定了第一步的操作:选择所有的个体,一共就两个农民,利用step执行该命令,获得新的环境
  69. step_result = env.step(actions=[
  70. sc2_actions.FunctionCall(_SELECT_ARMY, [_SELECT_ALL])
  71. ])
  72.  
  73. while not done:
  74. #查看返回的字典中屏幕中的目标关系分布图:1表示着地图中个体的位置,3表示着矿物的位置
  75. #这里面因为一个个体可能占好几个像素点,所以个体可能是有1构成块状体表示
  76. player_relative = step_result[0].observation["screen"][
  77. _PLAYER_RELATIVE]
  78.  
  79. obs = player_relative
  80. #筛选里面个体是盟军的整列,变成了一个0-1矩阵,盟军的位置表示为1
  81. player_y, player_x = (
  82. player_relative == _PLAYER_FRIENDLY).nonzero()
  83. #计算平均位置player_x表示各个1所在的位置x坐标集合,player_y则是y坐标上的集合
  84. #注意这里是一个位置矩阵,其实就是行列坐标
  85. player = [int(player_x.mean()), int(player_y.mean())]
  86. #shift函数就是对屏幕视角进行中心化移动,然后将溢出矩阵的部分数据无效化(赋值为2)
  87. #这里是相当于DQN的输入的设定
  88. if (player[0] > 32):
  89. obs = shift(LEFT, player[0] - 32, obs)
  90. elif (player[0] < 32):
  91. obs = shift(RIGHT, 32 - player[0], obs)
  92.  
  93. if (player[1] > 32):
  94. obs = shift(UP, player[1] - 32, obs)
  95. elif (player[1] < 32):
  96. obs = shift(DOWN, 32 - player[1], obs)
  97.  
  98. #将观察情况输入到Baselines中的act函数里,获得返回的行为
  99. action = act(obs[None])[0]
  100. coord = [player[0], player[1]]
  101. #根据输出的action让个体在64*64的地图内进行移动,移动到矿物所在的位置就可以进行采矿
  102. #这里设置移动的步长都是16,这里是DQN生成的行为的解码
  103. if (action == 0): #UP
  104.  
  105. if (player[1] >= 16):
  106. coord = [player[0], player[1] - 16]
  107. elif (player[1] > 0):
  108. coord = [player[0], 0]
  109.  
  110. elif (action == 1): #DOWN
  111.  
  112. if (player[1] <= 47):
  113. coord = [player[0], player[1] + 16]
  114. elif (player[1] > 47):
  115. coord = [player[0], 63]
  116.  
  117. elif (action == 2): #LEFT
  118.  
  119. if (player[0] >= 16):
  120. coord = [player[0] - 16, player[1]]
  121. elif (player[0] < 16):
  122. coord = [0, player[1]]
  123.  
  124. elif (action == 3): #RIGHT
  125.  
  126. if (player[0] <= 47):
  127. coord = [player[0] + 16, player[1]]
  128. elif (player[0] > 47):
  129. coord = [63, player[1]]
  130.  
  131. #在这里我们需要对DQN生成的行为转化为星际争霸里面的操作
  132. new_action = [
  133. sc2_actions.FunctionCall(_MOVE_SCREEN,
  134. [_NOT_QUEUED, coord])
  135. ]
  136.  
  137. step_result = env.step(actions=new_action)
  138. #获取游戏反馈的回报值,也就是矿物的采集情况
  139. rew = step_result[0].reward
  140. #判断是否需要进入下一轮游戏
  141. done = step_result[0].step_type == environment.StepType.LAST
  142.  
  143. episode_rew += rew
  144. print("Episode reward", episode_rew)
  145.  
  146. UP, DOWN, LEFT, RIGHT = 'up', 'down', 'left', 'right'
  147.  
  148. def shift(direction, number, matrix):
  149. ''' shift given 2D matrix in-place the given number of rows or columns
  150. in the specified (UP, DOWN, LEFT, RIGHT) direction and return it
  151. '''
  152. if direction in (UP):
  153. matrix = np.roll(matrix, -number, axis=0)
  154. matrix[number:, :] = -2
  155. return matrix
  156. elif direction in (DOWN):
  157. matrix = np.roll(matrix, number, axis=0)
  158. matrix[:number, :] = -2
  159. return matrix
  160. elif direction in (LEFT):
  161. matrix = np.roll(matrix, -number, axis=1)
  162. matrix[:, number:] = -2
  163. return matrix
  164. elif direction in (RIGHT):
  165. matrix = np.roll(matrix, number, axis=1)
  166. matrix[:, :number] = -2
  167. return matrix
  168. else:
  169. return matrix
  170.  
  171. if __name__ == '__main__':
  172. main()

----------------------------------------------------------------------------------------------------

参考资料地址:

https://zhuanlan.zhihu.com/p/28434323

【转载】 Deepmind星际争霸2平台使用第一轮-完成采矿的更多相关文章

  1. 【转载】 星际争霸2的AI环境搭建

    原文地址: https://blog.csdn.net/qq_40244666/article/details/80957644 作者:BOY_IT_IT 来源:CSDN -------------- ...

  2. PySC2是DeepMind的“星际争霸II学习环境”(SC2LE)的Python组件

    PySC2是DeepMind的"星际争霸II学习环境"(SC2LE)的Python组件. 它暴露了暴雪娱乐公司的星际争霸II机器学习API作为Python RL环境. 这是Deep ...

  3. 星际争霸,FF反作弊对战平台

    星际一 [FF]反作弊对战平台让作弊行为无所遁形,只为星际玩家服务的反作弊对战平台目前能检查星际霸主以及其他星际争霸ZUOBI软件支持星际113版本 支持XP WIN7 WIN8 MAC 游戏外挂带来 ...

  4. 2018年星际争霸AI挑战赛–三星与FB获冠亚军,中科院自动化所夺得季军

    雷锋网 AI 科技评论消息,2018 年 11 月 13-17 日,AAAI 人工智能与交互式数字娱乐大会 (AI for Interactive Digital Entertainment) 在阿尔 ...

  5. 星际争霸的虫王IA退役2年搞AI,自叹不如了

    ------------恢复内容开始------------ 金磊 发自 凹非寺 量子位|公众号 QbitA 这年头,直播讲AI,真算不上什么新鲜事.但要是连职业电竞选手,都开播主讲呢?没开玩笑,是真 ...

  6. 10. 星际争霸之php设计模式--原型模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  7. FZU 2219 StarCraft(星际争霸)

    Description 题目描述 ZB loves playing StarCraft and he likes Zerg most! One day, when ZB was playing SC2 ...

  8. 星际争霸反作弊AG对战平台_支持108,113

    星际争霸反作弊AG对战平台_支持108,113,116 强大的星际反作弊功能,对战神器,让玩家公平对战 目前腾讯对战,浩方对战,VS对战平台都有星际外挂,AG平台什么都不干专门反外挂,希望热爱星际的玩 ...

  9. 人类又被AI碾压,这次是星际争霸

    还记得2017年,那个血洗围棋界的“阿尔法狗”吗?     这个由谷歌旗下 DeepMind 公司开发的 AI ,对阵世界顶尖围棋选手,打出完全碾压式的战绩: AlphaGo vs. 樊麾 - 5 : ...

随机推荐

  1. python爬虫——对爬到的数据进行清洗的一些姿势(5)

    做爬虫,当然就要用数据.想拿数据进行分析,首先清洗数据.这个清洗数据包括清除无用数据列和维度,删除相同数据,对数据进行勘误之类的. 从各大不同新闻网站可以爬到重复新闻...这个可以有.之前为了对爬到的 ...

  2. Docker Overlay 应用部署

    Docker Overlay 部署条件 要想使用Docker原生Overlay网络,需要满足以下任意条件: 1.Docker运行在Swarm模式 2.使用键值存储的Docker主机集群 本次部署使用键 ...

  3. Docker Kubernetes 命令行创建容器

    Docker Kubernetes 命令行创建容器 环境: 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 管理节点:192.168.1.79 ...

  4. Linux 查看网卡流量、网络端口

    查看网络流量 # 查看网卡流量 命令:sar -n DEV 1 10 注:每1秒 显示 1次 显示 10次 平均时间: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcm ...

  5. 【题解】JSOIWC2019 Round3

    题面 题解: T1: 先对图进行染色,重新对联通快重新建图 根据四色定理,珂以得出这实际是一颗树 因为树的中心肯定是最佳的决策,所以答案就是树的直径/2(上取整) #include <bits/ ...

  6. nmon监控数据分析

    性能测试中,各个服务器资源占用统计分析是一个很重要的组成部分,通常我们使用nmon这个工具来进行监控以及监控结果输出. 一. 在监控阶段使用类似下面的命令 ./nmon -f write_3s_20v ...

  7. [easyUI] datagrid 数据格 可以进行分页

    1. 新建一个GridNode的类: public class GridNode { private Long id; private String title;//投票标题 private Inte ...

  8. springcloud入门-什么是springcloud

    1.单体应用架构存在的问题 一个归档包(例如war)包含所有功能的应用程序,通常称为单体应用. 相信很多项目都是从单体应用开始的,单体应用比较容易部署和测试,项目的初期,项目可以很好的运行,然而,随着 ...

  9. CUDA 例程

    scalar add #include <thrust/host_vector.h> #include <thrust/device_vector.h> #include &l ...

  10. 用python做一个烟花show

    烟花效果如图(截了几个时刻的静态图): 源代码如下: # -*- coding: utf-8 -*- # Nola import tkinter as tk from PIL import Image ...