和钱康来合作翻译的AI PRO 1和2 系列,计划是一周一篇,先捡着有意思的翻,对那篇有兴趣也可以留言给我优先翻译,希望都翻译好后有机会成书吧,有兴趣一起翻译的也可以联系我。
游戏人工智能是什么( What Is Game AI)?
Kevin Dill
1.1 介绍
游戏AI就是目的就是为玩家创作出让人信服的体验,我们使用的每项技术,窍门以及算法,都是为了实现这个目标。维基上给予人工智能(AI,Artificial Intelligence )的定义是:“智能代理(智能主体,intelligent agents)的研究与设计”。而智能代理是指“可以观察周围环境并让作出的行动最大可能的获得成功的系统”。但这并不是AI唯一的定义,“AI‘”只是术语,众所周知它是难以定义的,但它确实精确的描述了在大学中研究和教学的大部分的AI。我们通常用术语“学术AI”来描述这些我们现在通常教学的部分。
电影动画师通常把他们创作的生命幻觉( illusion of life)称作人工生命体,这个短语被认为是起源于迪士尼动画。但这是个非常不同的目标。卡通角色并不需要“让行动成功的机会最大化”。相反在大多数情况下,他们希望观众可以直觉的去相信他们所实现的内容(尽管实际上这些明显是人工创作的)并创作出让人信服的体验,这些就是电影所做的。
而每个游戏都不相同,游戏的AI非常的广泛。相比经典的学术的AI,游戏AI的目标更近似于迪士尼的人工生命体。卡通和游戏是为了娱乐而创作的,并不需要最大化成功率的认知的来建模,而是要叙述故事,创作体验,一种智能的幻觉(illusion of intelligence)。在某些情况下,我们创作幻想所需的技术可以来源于学术AI,但大多数情况下却是不同的。这里,我们用术语游戏AI来做描述,游戏AI专注于创作智慧的表现以及给给观众特别的体验,而不是创作出真实的智慧。
1.2 创作体验
这里通常谈论的目标是如何让游戏AI最大的提升玩家的乐趣,而不是最大化成功机会。后者确实可以作为AI的目标,但并不是最佳的定义。就像AI这个术语一样,“有趣”也是个众所周知但又难以定义的词汇。而且,并不是所有的游戏都有趣的,有些游戏是描述故事,或者是故事里非常酷的角色,其他一些游戏创作的是刺激,冒险,悬念甚至是恐惧的感觉。还有一些游戏给予玩家的是权利感,让他感觉起来更像是人。
1.2.1 暂停怀疑
玩家是有意愿来参与我们为他们创作的体验。因为玩家有了加入创作的幻想的意愿,所以会自愿的停止自己天生的怀疑,并正常的去体会这种明显人工创作的角色和事件。虽说如此,我们还是有责任提供足够引人入胜的幻觉,使玩家可以暂时不去怀疑。当玩家认同和反应AI认为它是真实的时候,成功了,即便底层的算法相当的简单。而AI的一些行为让用户发觉AI只是机器程序而不是真实的话,那么就失败了。ELIZA-由Joseph Weizenbaum于1964年提出的AI心理学,举证了如何可以轻易的用简单算法来获得玩家的信任,以及如何因为算法出错而迅速失去玩家新人。
因为玩家是愿意参与体验的,而且是人类的思维方式,所以实际上是相当宽容的。只要AI所做的行为是合理的,玩家的头脑就会现办法来解释AI所做决策,这通常是非常复杂的,比AI内部的实现还要复杂,但基本上也是令人信服。实际上,在某种程度上创作复杂的AI可以是错误的,不但会浪费宝贵的开发时间,同样也会导致角色执行的行动,虽然是很合理的AI,但并不对应玩家关于AI行为的心理模型。也就是说,如果玩家知道AI在想什么的话那这些行为是合理的,但玩家并不知道。因此,那些仔细的决策选择最终看起来只是随机或是仅是普通的错误。
我们要不惜一切代价避免的是人为的愚蠢行为-选择那种看起来明显错误的或是没有任何意义的行为。常见的例子如走进到墙壁里,被卡在几何体里或者是忽视正在射击你的玩家。甚至是一些实际人类会避免的行为,因为那些行为由AI控制的角色执行看起来是毫无人性的。例如人类经常会改变想法,但让AI来做的话,往往给人是错误算法的印象,而不是对情况的重新评估。
解决这种人为的愚蠢行为的方法可以简单的让AI变得更好一些,但可能和玩家期望的不同,很难同时满足所有人的。结果上,各种方法都有被使用。在一些僵尸类的游戏就是很好的例子,敌人角色被有意的做的有些愚蠢和不可靠,他们的这种陌生感更容易被接受。在其他的一些游戏里,角色会使用短台词,有时被称作“barks”,来提示玩家发生了什么。例如他们会大喊”Grenade“或”I’m hit!“,这个并不是用来和其他AI交流的(通常是用代码来传递消息),而是向玩家解释他们的行动。
在很多的讨论中已经给了游戏AI各种最佳的架构。实际上本书的全部章节也是处于这个目的。第一个想法可能是从学术AI建立所需体验的启发式定义,然后使用机器学习来优化这些体验。但这种方法也有一些问题,最明显的是这种体验往往是游戏设计师来定义的,可能他并不是程序员并且使用的模糊的人类语言的术语。你如何去开发启发式功能来最大化“有趣”,“刺激”或是“冷静的态度”?
这并不是说启发式功能是无用的---实际上,基于功能(utility)的方法也是AI最常用的一种方法,特别是那些有着比较复杂决策制定的游戏(例如策略游戏以及类似The Sims or Zoo Tycoon这样的模拟游戏)。最重要的是,要保留创作者的控制(authorial control)-也就是说,要确保AI的开发者可以调整和优化AI已确保达到想要的体验。如果我们放弃对机器学习算法的控制,那么就很难获得我们想要的结果了。
这是个矛盾的需求,不过我们需要角色可以感受环境并选择恰当的行动来应对微秒和瞬息万变的游戏中的情况。AI的反应性和创作者控制并不是互斥的,还是可以构建一个带有反应的系统,但因为可以通过控制AI制定决策时评估情况的方式,所以仍然提供了创作者的控制。控制有反应的AI是比较复杂的,因为作为开发者必须要去思考你所做的变化将会如何去改变AI的决策制定,而并不仅仅是简单的直接去改变角色行为。
关于这点并没有唯一正确的答案,有些游戏(例如策略游戏或者是模拟人生这种)需要更多的反应性,而其他一些游戏(例如魔兽世界)就要权衡设计决策,用更多的脚本AI来创作出那种周密的手工调整而又能给出玩家很高的可预见的体验。哪种都没错,每种类型的优秀游戏提供的体验是不同的,所以这是当你要选择AI的方法时所需要去考虑的。
对游戏AI来说有各种流行的架构,其中很多一会在本书后文中讨论到。一些提供了更好的反应性,另一些允许更加直接的创作者控制。下图1.1中用图表粗略的表明了最流行的AI架构在这两者之间的权衡。要记住的是,每周架构都有自己的优缺点和特征。图里只是一个简单的指导。
值得注意的是,机器学习被放在图上,仅仅是由于它在学术界的普及。很少有游戏把机器学习作为它的核心AI。另外行为树在这里被故意的省略了,这时因为行为树的性能很大程度上依赖所使用的决策组件的类型。如果组件都是简单的,就像Damian Isla最初设想的,那么行为树就和有限状态机处于同样的位置。然后,行为树的一个很大的优势在于,每个节点都可以包含最合适的决策逻辑,允许你为每个独立的决策使用最合适的架构。
另外一个选择AI架构的复杂因素就是它的不确定性。在很多游戏中,我们希望为角色增加一定的随机性,使他们不会被玩家所预测(很可能会被玩家利用到)。同时,我们不希望AI去选择明显错误的行为,所以也需要确保随机选择仍然是合理的。有些架构更有助于我们增加一些随机性来进行混合(特别是行为树和基于功能的架构处理的更好)。所以这也是当你设计游戏时需要考虑的另外一个因素。
1.2.3 简单和可扩展
既需要创作者的控制又要避免人为的愚蠢行为的来配置游戏AI是一个反复迭代的过程。配置AI需要处理每种可能的情况,试图第一次就使得AI每种可能都要体现创作者的意图并且令人信服,这个是非常难的。相反的,需要不断的反复测试AI,找到最坏的问题,修复并再次测试。
UNIX和C语言的合作开发者Brian Kernighan曾说过:“调试的难度两倍于一开始的写代码。因此,如果你尽可能巧妙地编写代码,根据定义,说明你还不具备足够的智商来调试它”。对AI来说更加如此,任何代码的更改都会引起意想不到的副作用,你修改了一个地方的bug或平衡问题,就会导致某个地方更微秒的问题。一个简单的底层算法意味着你你能更加掌握AI。最后,你需要更充分的去想象所做改变引起的所有副作用,开发就可以更加的安全和快速,最终结果也会更加完美(玩起来也更加有趣)。
如果你看了游戏常用的各种决策算法:有限状态机,脚本,行为树,基于权重随机,以及目标导向的行为规划,他们自身的算法都相当的简单,建立在这些框架上的顶层配置可能更加复杂一些,但底层的代码是简单易懂,并且很容易跟踪和调试的。
需要警告的是,一些简单的算法的AI可扩展性是很差的(有限状态机就是个典型的例子),一些情况下,有限状态机的转换数量会随着状态数量增加指数级的增长。显然很快就会失控,因此优雅的架构不光是要简单易懂,而且还要易于使用,除此之外还要有很好的扩展性。
1.2.4技巧与作弊
已经说了很多关于AI的东西了,但似乎并不能认定“作弊”是什么。作弊可以让AI比起玩家更强大一些么?要是给予AI道具来作为额外奖励呢?或者作弊在策略游戏里给AI经济上的奖励,可以更便宜的购买单位?要是允许玩家选择这个奖励的大小,并称之为“困难等级”呢?
有一个真实的故事,是我最近和暴雪策略游戏的AI组长Bob Fitch的对话中确认的,在原版魔兽争霸里的剧情AI,会等待固定的一段时间,然后生成一波敌兵单位来攻击玩家。它会在战场迷雾的边缘产生这些敌人单位,也就是在你的士兵单位的可见范围外,剧本AI会不停的生成敌兵,直到你的防御力量几乎被摧毁,然后AI就会停止,并让你用剩余的士兵单位来赢得战斗。
这种方法看起来干净利索的跨过了公平线进入了“欺骗”的领域。AI不需要操心建筑,节约开支,或是雇佣单位,只要生成它们想要的就可以了。另外考虑下体验的结果,不管玩家在游戏中的好坏,它都为玩家创建了一场史诗级的战斗,会把玩家推向能力的绝对极限,玩家最终会战胜一切困难,取得胜利。
当然这种作弊有它黑暗的一面,它只有在玩家不知道内情的情况下工作,如果玩家发现了,那体验就完全不同了-没有人喜欢被特殊对待。不幸的是,现今特别是互联网的出现,玩家比起1994年要难以被愚弄了(宽容也相当少)。
另外一种作弊方式是纯粹信息上的。也就是说AI必须要靠感知到敌兵单位来得知它的存在和位置。而问题在于,用视线做可见性检查相当容易,但是要记住看到的并用来预测未来的时间就相当难了。也就是说,如果AI看到一个单位,然后它不见了,那如何记得它的存在?如何猜测他的位置?如果后面又看到同样类型的单位,AI怎么知道他是不是同一个单位?人类是很擅长做这种事的,要做好的话,需要敌人模型的组合,直接以及一些纯粹的猜测。这些对计算机来说是并不擅长的。
不幸的是,对于大多数类型的游戏来说,AI有合理来预测资源的位置,敌人的强壮和位置等事物的能力是相当重要的。如果玩家犯错就会失败,这对大多数玩家来说是可以接受的。“没有发现可以做的事情”或者是“这次被你骗了,下次要加倍奉还”,玩家会开始另一个游戏,或者加载存档,如果有什么挑战可以把他们拉回到游戏的话。而如果AI犯错的话,玩家会轻松的取胜,没有经历任何重大的挑战。玩家不会认为是“AI可能运气不大好”,而是觉得“这个AI太蠢了”。一旦玩家开始认为AI是愚蠢的,你所追求的体验也就几乎肯定失去了。
最后,是否要决定写一个AI的作弊是相对简单的事。如果它只是可以改善玩家体验的话,那应该让AI可以作弊,但要记住,如果你的AI作弊并被发现的话,这将会改变玩家的体验,而且通常是负面的。在可汗2这款因为AI而广受赞誉的RTS游戏里,使用了2个巧妙的作弊,一个方法是给了AI每30秒一次随机机会可以作弊探索一个我们(开发者)已知找到某些好东西的区域。这样有助于我们避免游戏里AI在早期找不到足够资源.。第2种方法是追踪一个区域的敌人强度的大致数量(但并不知道敌人单位的具体位置)。这样我们的AI就可以的分配力量来攻击和防御,并避免AI去做一些徒劳无功的事情。没有任何人能够发现这些作弊行为,而且事实上很多的智能行为是赋予给AI的,家感受到的AI的行为,其实只是我们作弊带来的效果。
1.3总结
学术AI可以在许许多多的事情上起作用,可以解决困难的问题,再现人类的智慧,对人类的认知建模来了解我们的大脑是如何工作的,优化在复杂运行环境下的性能(例如机器人),或者是一系列极限的挑战和有价值的追求。所有这些都很困难并值得去做的,但适用于这些的解决方案并不一定就适用于游戏。
游戏AI应该并且只能是一件事情;允许开发者为玩家创作出引人入胜的体验,让玩家可以在游戏中花费时间,并愿意去购买扩展包和续作,这也是成功的必然结果。
本书剩下的部分包含了各种已经在我们的游戏产品中被证明的小窍门,技术和解决方案。游戏开发的时间表很紧凑,当要上市时如果AI不能很好的工作,也很少有容错和扩展的机会。此外,要简单的创建出令人信服的游戏AI是很有挑战的。我们没有时间和意愿去解决那些我们并不需要的困难问题,或者去重复开发一些已经被发现的解决方案。有了这些挑战,希望本书里找到的一些方法也可以为你所用。
- AI PRO I 第4章
Behavior Selection Algorithms An Overview Michael Dawe, Steve Gargolinski, Luke Dicken, Troy Humphre ...
- [Git01]Pro Git 第三章 分支 读书笔记
[git]分支 Git 的分支模型称为“必杀技特性”,而正是因为它,将 Git 从版本控制系统家族里区分出来. Git 有何特别之处呢?Git 的分支可谓是难以置信的轻量级,它的新建操作几乎可以在 ...
- 美国末日AI System设计分享
引言 好久没有写博客了,这半年在游戏公司工作,过得比较充实,每天不是add feature就是debug,所以忽视了写博客.今天发一篇关于AI博客. 主要是最近看了一些关于"The Last ...
- “分而治之”,一种AI和动画系统的架构
译者注:随着国内游戏研发水平的不断提高,对画面品质的不断提升,同时大量手游使用Unity和Unreal 4等成熟的工具开发,动作状态机已经不是什么陌生的概念了.我们在项目开发时也大量使用了动作状态机. ...
- 初学Spring有没有适合的书
初学者之前没有阅读java框架源码的习惯.没有阅读过源码,知道整体流程么?知道依赖注入的概念么?知道aop么?知道其中用到了哪些设计模式么?再说了,如果一上手就是源码?难道你没有注意到Spring的类 ...
- QTestLib Tutorial
本学习指南介绍了如何使用QTestLib框架的一些特性,分为4章: 编写一个单元测试程序 数据驱动测试 模拟GUI事件 重复GUI事件 第一章 编写一个单元测试程序 文件列表: qtestlib/tu ...
- game学习资源收集
一些国外网站 游戏ai相关 http://aigamedev.com/ http://www.gdcvault.com/ http://www-cs-students.stanford.edu/~am ...
- [Pandas] 05 - Parallel processing
相关资源 [Python] 09 - Multi-processing [Pandas] 01 - A guy based on NumPy [AI] 深度数学 - Bayes 这章非常有意思,但一定 ...
- WY 2019 人工智能数学基础视频教程
├─01.第一阶段:AI数学基石 │ ├─01.第一章:线性代数 │ │ │ ]AI Math_[第1章]线性代数v2 .pdf │ │ │ │ │ └─视频 │ │ 01_本章概述.mp4 │ │ ...
随机推荐
- 前端福利!10个短小却超实用的JavaScript 代码段
JavaScript正变得越来越流行,它已经成为前端开发的第一选择,并且利用基于JavaScript语言的NodeJS,我们也可以开发出高 性能的后端服务,甚至我还看到在硬件编程领域也出现了JavaS ...
- 【Python基础学习三】数字(Number)
Python Number 数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间. Python 四种数值类型: 整型(Int) - 通常 ...
- WindowsForm菜单工具栏--2016年12月6日
ContextMenuStrip 添加控件后可在其他空间属性中进行绑定 MenuStrip 设置热键:在编辑的时候输入(&F) 设置快捷键:选中菜单项--右键属性--S ...
- 批量导出oracle中的对象
背景 Oracle数据库中有table,view,procedure,function,package,type等对象,需要将这些对象导出到不同的文件中.常用的方法有3种:1. 通过开发工具直接导出. ...
- mysql事务和锁InnoDB
背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备 ...
- JavaScript链表
//实现列表类 function list() { this.listSize = 0;//元素个数 属性 this.pos = 0;//当前位置 属性 ...
- vagrant学习笔记
什么是vagrant简而言之,vagrant就是一个用来管理虚拟机文件的工具为什么要使用vagra如果经常玩虚拟机的话,就会知道,当你需要新建一个虚拟环境的时候,总是要重复的安装操作系统,以及操作系统 ...
- Yii2 用户登录
在Yii2的basic版本中默认是从一个数组验证用户名和密码,如何改为从数据表中查询验证呢?且数据库的密码要为哈希加密密码验证? 下面我们就一步一步解析Yii2的登录过程. 一. 创建user表模型 ...
- kkjcre1p: unable to spawn jobq slave process, slot 0, error 1089(Linux x86_64)补丁
在shutdown immediately的时候,alert Log出现如下错误信息,并且不能正常关闭 kkjcre1p: unable to spawn jobq slave process, sl ...
- CompletionService/ExecutorCompletionService/线程池/concurrent包
线程池 线程池的基本思想:线程频繁的创建.销毁会极大地占用系统资源,为了减少系统在创建销毁线程时的开销,线程池应运而生.线程池包括多个已创建的线程,当有任务要在新线程中执行时,将任务提交给线程池,线程 ...