详解 pysc2 中的 Observation 和 Action

2023-12-28 15:20

本文主要是介绍详解 pysc2 中的 Observation 和 Action,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

详解 pysc2 中的 Observation 和 Action

SCII 环境具有非常丰富的动作空间和状态空间。Pysc2 接口从游戏中读取并提供给我们使用的信息有两类:空间/视觉类的(spatial/visual);结构性的元素(structured elements),其中结构性的元素主要是提供一些重要的数据,而且这些数据对于机器来说往往很难通过游戏画面直接读取,比如燃料的数量,所以接口直接提供这些数据。

Important!

从observation中获取得到的坐标信息是 (y,x) 形式的,即纵坐标写在前,而有些action需要跟上一个屏幕/小地图的坐标位参数,比如移动某单位到哪个点去,这里需要传入的坐标是 (x,y) 形式的,即横坐标写在前。坐标原点 (0,0) 都是左上角,y轴正方向向下,x轴正方向向右

例如,一个将 observation 中获取得到的坐标传递给某个 action 的例子:

# Spatial observations have the y-coordinate first:
y, x = (obs.observation["feature_screen"][_PLAYER_RELATIVE] == _PLAYER_NEUTRAL).nonzero()# Actions expect x-coordinate first:
target = [int(x.mean()), int(y.mean())]
action = actions.FunctionCall.Move_screen("now", target)

Observation

Spitial/Visual

RGB Pixels

这一类Observation就是屏幕和小地图真实显示的画面,即在规定的分辨率下所看到的游戏界面,和正常游戏看到的一致(除了分辨率较低),但是,不包括下边的UI等信息

Feature Layers

Feature layers 是对于一些游戏中重要信息的表示,并对这些信息进行了结构化处理,根据所显示的范围分为两类:feature_screenfeature_minimap,即屏幕的feature和小地图的feature,如下图中所示的都是feature layers:

完整的列表在 pysc2.lib.features 中。

collections.namedtuple("ScreenFeatures", ["height_map", "visibility_map", "creep", "power", "player_id", "player_relative", "unit_type", "selected", "unit_hit_points", "unit_hit_points_ratio", "unit_energy", "unit_energy_ratio", "unit_shields", "unit_shields_ratio", "unit_density", "unit_density_aa", "effects", "hallucinations", "cloaked", "blip", "buffs", "buff_duration", "active", "build_progress", "pathable", "buildable", "placeholder"])collections.namedtuple("MinimapFeatures", ["height_map", "visibility_map", "creep", "camera", "player_id", "player_relative", "selected", "unit_type", "alerts", "pathable", "buildable"])
Minimap(小地图)

小地图即对全局的低分辨率图像,可以设置minimap的分辨率,一些主要的 features_minimap

  • height_map:显示地形特征
  • visibility:显示地图的哪一部分是隐藏的、已经被看到的或当前可见的
  • creep:哪些部分是虫族势力
  • camera:地图的哪一部分在屏幕中可见
  • player_id:显示所拥有的单位,以及其ID
  • player_relative:显示所有的单位是己方的还是地方的。 取[0,4]的值,分别表示 [background, self, ally, neutral, enemy]([背景,自身,盟友,中立,敌人]单位
  • selected:选择了哪些单位
Screen(屏幕)

屏幕显示的即当前玩家所看到的区域,拥有比小地图更高的分辨率(of course),一些主要的 feature_screen

  • height_map:显示地形特征
  • visibility:显示地图的哪一部分是隐藏的、已经被看到的或当前可见的
  • creep:哪些部分是虫族势力
  • power:哪些部分是神族势力,只会显示你的势力
  • player_id:显示所拥有的单位,以及其ID
  • player_relative:显示所有的单位是己方的还是地方的。 取[0,4]的值,分别表示 [background, self, ally, neutral, enemy]([背景,自身,盟友,中立,敌人]单位
  • unit_type:单位类型的ID,可以在 pysc2/lib/units.py 中查看完整列表
  • selected:选择了哪些单位
  • hit_points:单位所具有的生命值
  • energy:设备所具有的能量值
  • shields:装置所具有的防御值/盾值(仅适用于神族单位)
  • unit_density:该像素中有多少个单位
  • unit_density_aaunit_density的抗锯齿版本,每个像素每单位最多16个
Structured(结构化的数据)

Structured(结构化的)数据是那些无法从像素中直接读取的信息,通过 tensor 表示。详细的说明请参考:
https://github.com/deepmind/pysc2/blob/master/docs/environment.md#structured

这里列一下主要的结构化信息有:

  • 基本的玩家信息(General player information)
  • 控制组信息(Control groups)
  • 单独选中的单位信息(Single Select)
  • 多选中的单位信息(Multi Select)
  • 多个选中的正在移动中的单位信息(Cargo)
  • 多个选中的正在修建的单位信息(Build Queue)
  • 可用动作(的id)(Available Actions)
  • 上一轮中成功运行的动作(的id)(Last Actions)
  • 给出动作的结果(Action Result)
  • 提醒被攻击的信号(一般为空)(Alerts)

可以通过Debug清楚地看到这些变量(如何在PyCharm中对pysc2的Agent类进行Debug):

Actions

函数化动作(Function Actions)

SCII 环境中的动作空间非常非常复杂且庞大,因此,pysc2 使用了函数化动作(function actions),所有可用的动作/函数类型定义在了 pysc2.lib.action 中的 ValidActions 类中,每一个动作就是一个 FunctionCall,同样也定义在了 pysc2.lib.action 中。

There are hundreds of possible actions, many of which take a point in either screen or minimap space, and many of which take an additional modifier.
We created function actions that are rich enough to give composability, without the complexity of an arbitrary hierarchy.

collections.namedtuple("ValidActions", ["types", "functions"])
collections.namedtuple("FunctionCall", ["function", "arguments"])

简单说就是,在pysc2中,每一个动作(action)其实是一个 FunctionCall 类的实例,需要两个参数来确定,一个是 function_id,表示某个函数的id,另一个就是与该函数对应的参数。比如已经确定一个函数id,表示为 fun_id,以及对应的满足要求的参数,表示为 args,此时一个真正的action就可以这样写:

(from pysc2.lib import actions)
action = actions.FunctionCall(fun_id, args)

值得一提的是,所有的函数及其类型均被定义在了 pysc2.lib.actions 中,如果你有自定义的环境需要用到自定义的动作、函数类型,需要把它加到这个列表中才能起作用。

显示动作列表

可以使用如下命令显示所有动作:

Python -m pysc2.bin.valid_actions

可选的参数有:

  • --hide_specific:不显示具体的动作(specific actions)(下边会提到什么是specific actions)
  • --screen_resolution:只显示应用于游戏屏幕的动作
  • --minimap_resolution:只显示应用于小地图的动作

比如列出了如下的动作们(实际上多得多):

   0/no_op                       ()1/move_camera                 (1/minimap [64, 64])11/build_queue                 (11/build_queue_id [10])12/Attack_screen               (3/queued [2]; 0/screen [84, 84])23/Behavior_CloakOff_quick     (3/queued [2])42/Build_Barracks_screen       (3/queued [2]; 0/screen [84, 84])220/Effect_Repair_screen        (3/queued [2]; 0/screen [84, 84])264/Harvest_Gather_screen       (3/queued [2]; 0/screen [84, 84])303/Morph_Lair_quick            (3/queued [2])331/Move_screen                 (3/queued [2]; 0/screen [84, 84])

每一行的格式为:

<function id>/<function name>(<type id>/<type name> [<value size>, *]; *)

表示为:

【函数ID】/【函数名称】 (【函数参数类型的ID】/【函数参数的类型名称】 【函数参数的取值类型与范围】)

两个例子:

  • 1/move_camera (1/minimap [64, 64]):表示名字为 move_camera 的函数,它对应函数id为1,他的参数类型为 minimap,对应函数参数类型中的第 1 类,参数取两个数值,都是 [0,64) 范围内的数值,表示小地图上的一个坐标
  • 331/Move_screen (3/queued [2]; 0/screen [84, 84]):表示名字为 Move_screen 的函数,它对应函数id为 331,它接收两个参数,第一个参数是一个 queued 类型的参数,对应的参数类型id为3,是一个布尔值,表示该操作是应该立即发生还是在之前的操作之后发生;第二个参数是一个 screen 类型的参数,对应类型id为0,后边的 [84, 84] 同上边的 [64, 64]

pysc2 中所定义的函数以及参数名称都代表一定的意义,通常可以通过名称来大致理解其作用。

完整的列表同样也是定义在 pysc2.lib.actions 中。

官方给出的 random agent 就是一个非常好的理解 function actions 的例子:

import numpy as np
from pysc2.lib import actionsdef step(self, obs):super(MyAgent, self).step(obs)function_id = np.random.choice(obs.observation.available_actions)args = [[np.random.randint(0, size) for size in arg.sizes]for arg in self.action_spec.functions[function_id].args]return actions.FunctionCall(function_id, args)

根据前后缀对动作的分类

所有动作函数的名称都具有一定的意义,而且可以通过其前缀、后缀来进行分类,(但是前后缀的使用并不是完全严格的),比如以 Morph 开头的动作即“转换”动作,比如虫族中的一些孵化动作;以 Effect 开头的一般是一个单独的效果,通常不可以被取消;以 Behavior 开头的通常是一个可以调为 on 或 off 的值;以 screen 结尾的通常是作用于游戏屏幕;而以 minimap 结尾的通常是作用与小地图中的动作。

一般动作 vs 具体动作(General vs. Specific Actions)

SCII中,动作可以被分为两类,一般动作(general actions)和具体动作(specific actions),一般动作是一个大类,而具体动作则更加具体。举个例子,Burrow(打洞)这个动作,有很多单位可以完成,比如虫族中的 Zergling 和 Drone(两种不同的作战单位),但是他们自己的打洞动作有自己对应的具体动作,BurrowDown_ZerglingBurrowDown_Drone,其中 BurrowDown_Zergling 只能被应用于 Zergling 单位, Drone同理,那么如果在某一帧下,我们选中的单位既有 Zergling 也有 Drone 呢,那此时如果使用 BurrowDown_Zergling 动作,那其中的 Drone 单位就没有办法行动了,所以需要 BurrowDown 这个一般动作来执行,选中这个动作,所有能够执行这个动作的单位都可以执行。

在pysc2的定义中,可以理解为具体动作是相应的一般动作的继承,只是多了一个额外的参数来确定其“具体的部分”。

这篇关于详解 pysc2 中的 Observation 和 Action的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_38962621/article/details/117138414
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/546415

相关文章

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

SpringCloud中的@FeignClient注解使用详解

《SpringCloud中的@FeignClient注解使用详解》在SpringCloud中使用Feign进行服务间的调用时,通常会使用@FeignClient注解来标记Feign客户端接口,这篇文章... 在Spring Cloud中使用Feign进行服务间的调用时,通常会使用@FeignClient注解

Java Spring 中的监听器Listener详解与实战教程

《JavaSpring中的监听器Listener详解与实战教程》Spring提供了多种监听器机制,可以用于监听应用生命周期、会话生命周期和请求处理过程中的事件,:本文主要介绍JavaSprin... 目录一、监听器的作用1.1 应用生命周期管理1.2 会话管理1.3 请求处理监控二、创建监听器2.1 Ser

maven中的maven-antrun-plugin插件示例详解

《maven中的maven-antrun-plugin插件示例详解》maven-antrun-plugin是Maven生态中一个强大的工具,尤其适合需要复用Ant脚本或实现复杂构建逻辑的场景... 目录1. 核心功能2. 典型使用场景3. 配置示例4. 关键配置项5. 优缺点分析6. 最佳实践7. 常见问题

JVisualVM之Java性能监控与调优利器详解

《JVisualVM之Java性能监控与调优利器详解》本文将详细介绍JVisualVM的使用方法,并结合实际案例展示如何利用它进行性能调优,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1. JVisualVM简介2. JVisualVM的安装与启动2.1 启动JVisualVM2

Redis中的Lettuce使用详解

《Redis中的Lettuce使用详解》Lettuce是一个高级的、线程安全的Redis客户端,用于与Redis数据库交互,Lettuce是一个功能强大、使用方便的Redis客户端,适用于各种规模的J... 目录简介特点连接池连接池特点连接池管理连接池优势连接池配置参数监控常用监控工具通过JMX监控通过Pr

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可