【技术·真相】谈一谈游戏AI - Utility
如果你背对着冷嘲热讽,它会成为助推器。
郑重说明:本文适合对游戏开发感兴趣的初级及中级开发和学习者,本人力图将技术用简单的语言表达清楚。鉴于水平有限,能力一般,文章如有错漏之处,还望批评指正,谢谢。
本系列前面的文章我们已经谈过:
今天我们来谈另外一种游戏AI的决策模型:Utility。
一、Utility 名词的由来
我们在平时的工作或学习中,需要训练发散思维以及举一反三的能力,最好能有意识得将新学习的知识或者技术与我们已知的其他事物进行横向对比,以此加深理解的深度和学习的效率。
发散的来思考,其实游戏中 NPC 的 AI 决策和我们日常生活中的决策是有类似的地方的,相关的方法论可以借用,而 Utility 的使用也正是基于这样一种思考方式。
Utility 译为效用,是微观经济学中最常用的概念之一。一般而言,效用是指消费者对各种商品和服务的消费或投资的相对满意度的度量值。基于理性选择理论的经济学理论通常认为消费者会尽可能最大化其效用。
这样说,可能还是有点难以理解,我们举一个简单的例子。比如你假期出门旅游,需要订酒店,此时有几个不错的酒店可供选择,一家酒店的价格是450元每晚,另外一家类似条件的价格是350。很明显,这里你的决策其实很简单,类似条件的选择便宜的价格即可(350元的那家)。这里各家酒店的价格其实就是用于决策的一种 “效用”,我们根据效用值即可做出判断。
由于这样一种将具体的事物转换成数学上的数值的思想,Utility 也被应用于游戏中,用来设计和表达游戏中角色对各种不同行为的倾向。
在 Utility AI 中,角色的每个 action 被标记一个 score(也就是 Utility 值),也可以称为权重。最终角色采取什么 action,其决策的依据就是:选取最大 score 的那个 action。
二、基本概念
Utility AI 会根据当前所处的游戏环境对所有需要执行的 action 进行评分(确定 score),然后从中选取分数最高的一项任务执行。一个简单的 Utility AI 的方式表述如下:
这里的分值 score 是一个归一化的值,取值范围在 [0, 1],这么做是有原因的。因为有时候不同的 action 其实是无法直接比较的,其打分的维度就不一样,此时就需要从全局的角度将所有的维度统一调整,对应的 score 归一化为 [0, 1] 这个范围。
基于该 Utility AI 的 Sense/Think/Act 模型表达如下:
在这里,孤立的每个 Utility 值(score)是没有意义的,因为它本质是一种权重值,权重只有在整体评估时才有意义。
回忆一下之前的行为树,Utility AI 其实可以类似的看成将整棵行为树拉平,所有的分支子树都放在一层,其身份都是平等的,唯一不同的就是其权重。
三、Utility V.s. 行为树
为了方便对比,我们来看一个 AI 分别用 Utility 和行为树的方式来实现的例子:
行为树实现:
Utility 实现:
我们可以看到,行为树的表示方法还是比较复杂的,如果新增一个分支,你需要综合考虑其他分支的情况,以决定当前分支放置在哪个合适的位置。
而 Utility AI 要直观的多,它是会综合评估所有的 action 选项的权重,最终选出 score 值最大的 action。
行为树在遍历的时候是有顺序的:从上到下,从左到右,只要任意一个叶子节点满足条件就立即返回,不会遍历整棵树。从顺序的角度来说,设计行为树的分支时候,就要考虑各个分支的先后顺序,而 Utility AI 不存在这个问题,它唯一关系的问题就是权重值 score。
以这种方式实现的AI相较于常规方式更加灵活,也更加方便扩展。
四、具体使用
1)score 值函数
基于分数的决策,权重值(score)怎么设置得好,是需要大量测试得,比较难调参。
通常来说 score 的设置是需要确定一个 action 在不同的环境输入对应输出的函数模型。如果用 f 来表示一个函数,就是如下的表示方式:
// 某个 action 的 score
score = f(环境input)
例如,一个游戏中的 NPC AI 在不同的饥饿程度时,决定是否去吃饭的情况。如果环境系统探测到 NPC 极度饥饿,那去吃饭的 action 的 score 就可能是 1;相反,如果 NPC 判断自己很饱,去吃饭的 action 的 score 值就是 0。
一种常见的函数是线性函数:
或者二次函数:
更可能适合实际情况的分段线性函数:
具体应该使用哪种函数来拟合,需要大量的实验、调优和测试,最终可能会综合使用上述的各种函数等。
2)数学期望
utility 决策系统中,具体采取哪种 action 有时候也是不确定的,这也比较好理解:现实世界中很多事情就是有不确定性,一个 action 在执行之前,我们无法判断是否应该执行它:它可能会有 N 个后果,每一种后果会有一个概率 prob。
针对这种 action,我们就需要确定该 action 每一种后果的 score 及其发生的概率,然后计算多种后果的加权平均,也就是其数学期望值:
score = score1 * prob1 + score2 * prob2 + ... + scoreN * probN
使用该数学期望值作为 action 对应的 score。
当然以上只是一种简单描述,实际要构造出这样的AI系统是一项复杂的工程。也并不是所有游戏都适用 Utility AI,对于绝大多数游戏,状态机或行为树就能很好满足需求。但是对于某些追求真实代入感的游戏Utility AI更加擅长创造出更复杂,更智能的AI,如:为AI添加情绪、模拟人类行为、战术推理、过程推演、群体行为、与上下文相关的动态规划等等这些高级特性。
小结
在本文,我们谈到了另外一种基于全局权重的 AI 决策机制:Utility
- Utility 概念的由来
- Utility 的基本概念
- Utility 与 行为树的对比
- 具体使用 Utility 的一些细节
希望本文对大家有所帮助!
作者:我是零壹协奏,期待你的关注,不要错过我后续的文章更新
参考资料:
转载自:https://juejin.cn/post/7214041943297818685