即时战略游戏的AI策略思考

news2024/9/23 17:21:33

想起来第一次玩RTS游戏,就是框住一大群兵进攻,看他们把对面消灭干净……我接触的第一款游戏是《傲世三国》那会儿是小学,后来高中接触了魔兽地图编辑器,我发现自己喜欢直接看属性而省去争论和试验的步骤——我喜欢能一眼看透的感觉。

这篇博客都是务虚的,没啥干货,全是不算成熟的想法和思考

【本篇将以“单位”来统一对实体、兵力、对象、算子等的称呼】

一、策略的描述

研究生的课题是“人机结合的智能体构建方法”,于是我回忆起了这些东西,但好像真的没认真考虑过什么是策略,怎么才能取胜(我不喜欢枯燥的练习游戏水平)。

我先是用极限法想到:是不是即时战略的兵极端抽象后就是下棋那种回合制,一种局面仅有固定的策略和解法(比如中国象棋的残局)?

还一个问题,涉及博弈论和社会关系计算的,我如何制作一个可以模拟这些过程、看到质点如何成为如此策略的平台工具?

1.行为建模

1)有限状态机

petri网络和基于有限状态机的规则推理

2)行为树

ROS机器人的操作系统中常常使用行为树

2.驱动方式

这部分我采用魔兽地图编辑器的思路来描述。

魔兽地图编辑器(以下简称WE) ,每个触发分为3个东西【事件、条件、动作】

1)时间驱动

这个是某个仿真引擎中的虚函数,它的两个触发条件就是时间和事件。

2)事件驱动

这个是最常用的,比如”任意单位被攻击“,然后条件是”被攻击的单位拥有技能【反击螺旋】“,最后动作是”随机数触发,如果触发了,选定范围形成单位组,对单位组施加伤害,被攻击的单位播放旋转动画“。

3)连锁反应的推理驱动

这个也就是经由其他触发器来引发这个触发启动的。

二、游戏和平台的构建

大战略,战役,战术小队,单兵技术……

钢铁雄心、骑马与砍杀(大地图与战场的分割,指挥下令)、魔兽争霸……在不同层面有不同的战斗表现方式,但是面面俱到的话玩家不可能学的过来而挫败。

一种战术是如何描述的?策略是如何描述和执行的?

1.环境交互

研究庙算平台后,我对这个平台做出了一些自己粗略的印象(编写规则式ai):

赋予算子反应(行动),然后再检查条件,再赋予行动。

基础的行动就是我们可以执行的指令,行动序列就是要产出的东西。

2.强化学习

智能体(Agent)

强化学习的本体,作为学习者或者决策者。

{

  策略(Policy)策略是从状态到动作的一个映射,智能体根据策略来选取动作。

  价值函数 (Value Function)用价值函数来评估当前状态的好坏程度。

  模型(Model)智能体对环境的建模,即对环境的动力学进行建模。

        {状态转移概率、奖励函数}

}

环境

强化学习智能体以外的一切,主要由状态集合组成。

状态(环境、智能体、信息)

一个表示环境的数据,状态集则是环境中所有可能的状态。

动作

智能体可以做出的动作,动作集则是智能体可以做出的所有动作。

奖励

智能体在执行一个动作后,获得的正/负反馈信号,奖励集则是智能体可以获得的所有反馈信息。

目标

智能体自动寻找在连续时间序列里的最优策略,而最优策略通常指最大化长期累积奖励。

因此,强化学习实际上是智能体在与环境进行交互的过程中,学会最佳决策序列。

序列决策

按时间顺序进行一系列决策,是一种动态的决策方式,可用于随机性或不确定性动态系统最优化。 马尔可夫决策问题就属于序列决策问题。

另起一个,智能体分类

1、根据智能体的学习内容,我们可以把智能体分为如下三类:

  • 基于策略(policy based)的智能体 直接学习策略,不需要学习价值函数。
  • 基于价值(value based)的智能体 学习价值函数,通过价值函数隐式地得到策略。
  • 演员-评论家(Actor Critic)的智能体 是基于策略和基于价值的结合,既学习策略,也学习价值函数。

2、根据智能体是否需要对环境动力学进行建模,可以把智能体分为如下两类:

  • 基于模型(model based)的智能体 通过对环境进行建模,以此来学习策略或价值函数。
  • 不于模型(model free)的智能体 不需要对环境建模,通过学习价值函数和策略函数进行决策。

第一讲 强化学习介绍 - 知乎 (zhihu.com)

3.炼丹(深度学习拟合)

对于可以清楚描述的数学问题不需要炼丹,对于尚不清楚的只能炼丹让ai帮我们试。

三、从玩家角度入手

我想到了如下几个东西。

1.术语

  • 快攻:牺牲经济和科技的发展,尽可能在初期就全力建造部队击败对手;为了加快速度,经常需要把产兵建筑偷偷造在对手的基地附近,还可以派出部分甚至所有农民来协助进攻。
  • Timing一波:预测对手的兵力薄弱期,通过固定的运营策略,在这些时间点集结出尽可能强大的兵力发动总攻,并且往往伴随着关键科技的恰巧升级完成。
  • 压制:派出部队前压,占对手的一些便宜或者把对手压在家里无法开矿,而自己则趁机扩张。
  • 骚扰:派出高机动单位、空中单位或者运输局运载部队,尽量避开敌方主力而去击杀对方的农民,从而打击他的经济。
  • 控图:处于均势时,在战线上四处游走,进行充分的侦查,了解敌方主力位置和构成,等待时机进攻或者骚扰。
  • 偷经济:认为敌方不会细致侦查时,偷偷在较远的位置开出分矿,铤而走险来获得经济优势。
  • 偷科技:牺牲兵力或者经济,从而提早研发关键科技,来获得进攻Timing的提前
  • 大后期:前中期侧重于防守和扩张,并构筑大量防守建筑来稳定战线,最终在良好的经济和科技支撑下,造出大量高级部队来蚕食消灭对手。这样一局比赛往往要很久,比如“城市化”战术甚至有打过7个多小时的...
  • 换家:在正面对抗能力不如对手时,充分发挥游击战的思想,避开敌方部队的锋芒,在对方进攻时绕到他家中进行互拆,这个战术最能体现出星际2的复杂性和选手的应变能力。

以上战术的术语来自:AlphaStar的游戏——星际争霸2 AI综述_星际 op ai-CSDN博客

2.熟练的玩家

打王者荣耀多了就会发现,即使是moba也可以看成是“回合制”,由于对英雄的操控已经十分熟悉,影响较大的因素(除非超常的反应)是技能cd和自己在打团时的位置了。抛开发育和补兵之类的,只聚焦于团战,那就是一个策略游戏了。

除此之外,我看到一篇sky对魔兽争霸3的评价,在熟悉游戏后,只要游戏没有更新,打法和策略都会趋向于固定的几种。这个就很像我理解中的机器学习搜索出的博弈论中的纳什均衡。

3.boss怪的套路、脚本外挂

想到这个是因为想起了《只狼》这种游戏的boss,一般都是有固定套路的,boss只要能动起来,别太机制就行。

星际争霸2因为谷歌的DeepMind与暴雪开源了人工智能研究环境of星际争霸2,这样才诞生出的第一个战胜职业玩家的AI——AlphaStar。

PySC2 GitHub 链接

暴雪星际争霸 API

我想搞点事情,但是没找到合适的开源项目,我的想法是【如果改变了属性和游戏规则,比如虽然都是黑白棋,但是”围棋“和”五子棋“规则下训练出的AI一定不一样】

嗯……我觉得我可以试着单独做一个rts游戏(交互层和显示层分离,专门提供给机器学习;自定义技能和行为组合;以及自驱动的智能体单位) ,但是策略加入多了就变成了slg游戏,如何做好过渡……又是一个问题。

四、如何让玩家更好的操控局面

有一个基础想法作为公理:身经百战的高排名大神玩家的总结一定是有价值的,因为事实证明小白玩家是打不过大神玩家的。(人肉机器学习)

1.把人嵌入到过程中

我先想到的还是“下令”,这是最基础的想法,编写程序从汇编写到最后,也就到了一个函数执行、命令行执行脚本的状态。我有理由相信这就是人机交互的最稳固形式。

从游戏来说,骑马与砍杀中就有梗“f1,f3”,就是下令“全体士兵,冲锋!”。在古代战争电影中也是将帅下令来进行战争活动。

把人带入过程,这么想来,回合制是最方便的方式。但是由于实际的反应速度和局面信息差而不可能是真正的回合制,只能接近于这种“理想状态”。

2.行动的构建

从基础的行动单元(移动、攻击),到一些基础指令的组合扩展(走A),再到复杂的技能操作组成的连招(比如魔兽世界的宏)——这些是计策之外的东西。

计策,回到最开始,就是一个残局的求解。从残局逆推,以我的粗略见解,一整局的斗争行为,无非是扩充了局面的形成过程以及其中的博弈行为。涉及了很多东西,发育-出装-技巧-团战等。

五、游戏之外

科技是第一生产力,降本增效靠的不是单纯的压榨人(加班),应该是优化人力结构(安排对的人到对的事)的这种小幅提升,以及根本的基础实现方式(置换反应制铝变成电解反应、电子管到晶体管)的大幅度突破。

这些东西怎么从游戏这个模拟的世界的镜子来让我们自己看清楚当下最该做什么呢?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1365209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

20240107移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下调通能上网

20240107移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下调通能上网 2024/1/7 11:17 开发板:Firefly的AIO-3399J【RK3399】SDK:rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab …

【Spring实战】25 Spring Boot Admin 应用

文章目录 1. 查看健康信息2. 使用 Micrometer 和 "/metrics"3. 管理包和类的日志级别4. 其他功能总结 Spring Boot Admin 是一个功能强大的工具,用于监控和管理多个 Spring Boot 应用程序。通过上一篇文章 【Spring实战】24 使用 Spring Boot Admin 管理…

Android getApplication()、getApplicationContext的区别

在Android中,getApplication()和getApplicationContext()是两种获取应用程序上下文的方法,但它们有一些细微的区别。 getApplication()方法: getApplication()方法通常用于Activity或Fragment中,它返回当前Activity或Fragment所属…

MySQL-存储引擎

简介:存储引擎是存储数据,建立索引,更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的, (同一个数据库的不同表可以选择不同的存储引擎) 所以存储引擎也可被称为表类型。 我们输入 SHOW CREATE TAB…

Django 10 表单

表单的使用流程 1. 定义 1. terminal 输入 django-admin startapp the_14回车 2. tutorial子文件夹 settings.py INSTALLED_APPS 中括号添加 "the_14", INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib…

Kafka(五)生产者

目录 Kafka生产者1 配置生产者bootstrap.serverskey.serializervalue.serializerclient.id""acksallbuffer.memory33554432(32MB)compression.typenonebatch.size16384(16KB)max.in.flight.requests.per.connection5max.request.size1048576(1MB)receive.buffer.byte…

Fowsniff

靶场搭建 遇到扫描不到的情况,可以尝试改靶机的网络为NAT模式,在靶机启动时按”esc“,进入Advanced options for Ubantu,选择recovery mode,选择network,按方向键”→“,OK,然后res…

Python爬虫获取百度的图片

一. 爬虫的方式: 主要有2种方式: ①ScrapyXpath (API 静态 爬取-直接post get) ②seleniumXpath (点击 动态 爬取-模拟) ScrapyXpath XPath 是 Scrapy 中常用的一种解析器,可以帮助爬虫定位和提取 HTML 或 XML 文档中的数据。 Scrapy 中使用 …

VMware NAT 模式,网关无法ping通 网关解决办法

开启红框服务即可。。 参考:VMware NAT 模式,网关无法ping通 网关解决办法_vmware设置net,本机ping不通网关-CSDN博客

【代码】Keras3.0:实现残差连接

简介 残差连接是一种非常重要的网络结构创新,最早被广泛应用于ResNet(Residual Neural Network)模型中,由何凯明等人在2015年的论文"Deep Residual Learning for Image Recognition"中提出。 核心思想 通过引入“short…

【Sharding-Sphere 整合SpringBoot】

Sharding-Jdbc在3.0后改名为Sharding-Sphere。Sharding-Sphere相关资料,请自行网上查阅,这里仅仅介绍了实战相关内容,算是抛砖引玉。 Sharding-Sphere 整合SpringBoot 一、项目准备二、项目实战1. pom.xml及application.yml2. OrderInfoCont…

大数据 Yarn - 资源调度框架

Hadoop主要是由三部分组成,除了前面我讲过的分布式文件系统HDFS、分布式计算框架MapReduce,还有一个是分布式集群资源调度框架Yarn。 但是Yarn并不是随Hadoop的推出一开始就有的,Yarn作为分布式集群的资源调度框架,它的出现伴随着…

Mac M1 Parallels CentOS7.9 Deploy Docker + Rancher + K8S(HA+More Master)

一、准备虚拟机资源 虚拟机清单 机器名称IP地址角色rancher10.211.55.200管理K8S集群k8svip10.211.55.199K8S VIPmaster0110.211.55.201K8S集群主节点master0210.211.55.202K8S集群主节点master0310.211.55.203K8S集群主节点node0110.211.55.211K8S集群从节点node0210.211.55…

nvm安装教程,实现node的多版本管理(图文界面)

目录 前言1. 安装配置2. 使用方式 前言 由于前端项目不同的node版本,导致重复的卸载安装会比较麻烦,对此需要nvm来管理 类似python版本的差异,可以使用虚拟环境管理(anconda),在我原先的文章也有讲解过 …

Hive精选10道面试题

1.Hive内部表和外部表的区别? 内部表的数据由Hive管理,外部表的数据不由Hive管理。 在Hive中删除内部表后,不仅会删除元数据还会删除存储数据, 在Hive中删除外部表后,只会删除元数据但不会删除存储数据。 内部表一旦…

Basal前端梳理

Basalt前端逻辑梳理 TBB安装参考 https://zhuanlan.zhihu.com/p/480823197 代码注释参考 https://blog.csdn.net/qq_39266065/article/details/106175701#t7 光流追踪参考 https://blog.csdn.net/weixin_41738773/article/details/130282527 VI Odometry KLT tracking 原理 …

new和delete表达式的工作步骤

new表达式工作步骤 调用一个operator new库函数开辟未类型化的空间 void *operator new(size_t); 在为类型化的空间上调用构造函数,初始化对象的成员 返回相应类型的指针 delete表达式工作步骤 调用相应类型的析构函数,但析构函数并不能删除对象所在的空间&…

【linux学习笔记】网络

目录 【linux学习笔记】网络检查、监测网络ping-向网络主机发送特殊数据包traceroute-跟踪网络数据包的传输路径netstat-检查网络设置及相关统计数据 【linux学习笔记】网络 检查、监测网络 ping-向网络主机发送特殊数据包 最基本的网络连接命令就是ping命令。ping命令会向指…

062:vue中将一维数组变换为三维数组(图文示例)

第062个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

Leetcode2487. 从链表中移除节点

Every day a Leetcode 题目来源:2487. 从链表中移除节点 解法1:单调栈 遍历链表,建立一个单调栈(单调递减)。 再用头插法将单调栈的元素建立一个新的链表,返回该链表的头结点。 代码: /*…