本篇花点时间谈谈GOAP的设计,这种AI结构非常容易做出差异化的ai表现,而从配置的角度上来说,对策划的要求也会比做fms或者行为树的配置要低得多。

GOAP是什么?

面向目标的行动计划(GOAP)是游戏人工智能中常用的一种技术,用于创建能够自主决定其行动并在游戏环境中实现特定目标的代理。GOAP可用于为游戏中的非玩家角色(NPC)创建复杂且自适应的行为。

基本思想

GOAP的基本思想是将一个复杂的任务或目标分解为一系列较小、更简单的动作,代理可以执行这些动作。然后将这些动作组织成一个计划或一系列动作,引导代理实现所需的目标。

具体执行方式

GOAP从代理评估其当前状态和期望的目标状态开始。然后,代理搜索可用动作库,以找到一系列将当前状态转换为所需目标状态的动作。每个操作都与一组先决条件相关联,这些先决条件必须满足才能执行该操作。例如,提取密钥的操作可能有一个前提条件,即密钥与代理在同一个房间中。
创建计划后,代理将执行计划中的第一个操作。当代理完成每个操作时,它会重新评估其状态和计划中的剩余操作,以确保它仍在朝着目标前进。如果代理遇到障碍或游戏环境发生变化,它可以动态调整计划,以找到仍能实现所需目标的新动作序列。

适用场景

GOAP在具有复杂环境和多个目标的游戏中特别有用,因为它允许NPC适应不断变化的情况,并根据其当前状态和期望的结果做出决策。它还可以用于通过调整决策过程中不同行动或目标的权重来创建具有不同个性或行为模式的NPC。
总的来说,GOAP是一种在游戏中创建智能和自适应代理的强大技术,可以在游戏世界中执行复杂任务并实现特定目标。

举个例子

我们有一个代理,扮演一个伐木工人,他把木头砍成木柴。目标是制作干柴,并具有砍树、拿斧头和收集树枝等动作(Action)。
砍木头的动作会把木头变成木柴,但前提是伐木工人有斧头。拿斧头动作会给伐木工人一把斧头。最后,收集树枝行为也会产生木柴,而不需要斧头,但木柴的质量不会那么高。
当我们给代理制作干柴目标时,我们会得到以下两个不同的动作序列:

1
2
制造木柴 = 需要木柴->拿斧头->砍树
制造木柴 = 需要木柴->收集树枝

如果代理能得到一把斧头,那么他们就可以砍木头。但也许他们拿不到斧头;他们就可以去收集树枝了。这些序列的组合行为都将实现目标。
GOAP可以根据可用的先决条件选择最佳序列。如果手边没有斧头,那么木材切割工就只能拿起树枝。拾树枝可能需要很长时间,而且产生的木柴质量很差,所以我们希望它只有在必要的时候。

成本计算

为了帮助 GOAP 确定我们想要使用的操作,每个操作都被赋予一个成本。与成本较低的操作相比,不会选择成本较高的操作。当我们对操作进行排序时,我们会将成本加起来,然后选择成本最低的顺序。
让我们为这些行动分配一些成本:
获得斧头花费:2
砍树成本:4
收集树枝成本:8
如果我们再次查看动作序列并计算总成本,我们将看到最便宜的序列是什么:
需要柴火-> 获得斧头 (2) -> 砍伐原木 (4) = 制作柴火 (总计: 6)
需要柴火->收集树枝(8)=制作柴火(总计:8)
拿起斧头砍倒一根木头可以以较低的成本 6 生产木柴,而收集树枝可以以较高的成本 8 生产木材。因此,我们的代理选择拿起斧头砍木头。
但是,这个相同的序列不是一直都在运行吗?如果我们引入先决条件,情况就不是这样了;

前提条件和影响

动作有前提条件和效果。前提条件是运行动作所需的状态,效果是运行动作后状态的变化。
例如,砍树动作要求代理手头有一把斧头。如果代理没有斧头,它需要找到另一个可以满足该先决条件的动作,以便让砍树动作运行。拿斧头动作做到了这一点——这就是动作的效果。

目标计划

GOAP计划器是一段代码,它着眼于行动的前提条件和效果,并创建完成目标的行动队列。该目标由代理提供,以及世界状态和代理可以执行的一系列行动。有了这些信息,GOAP计划器可以排列行动,查看哪些可以运行,哪些不能运行,然后决定哪些行动是最好的。
获得斧头成本:2。先决条件:“有斧头”,“没有斧头”。效果:“有斧头”。
砍树成本:4。先决条件:“有斧头”。效果:“砍柴”
收集树枝花费:8。先决条件:(无)。效果:“制作柴火”。
现在,GOAP规划者已经掌握了所需的信息,可以安排制作木柴(我们的目标)的行动顺序
我们首先向GOAP Planner提供当前的世界状态和代理的状态。这个组合的世界状态是:

1
2
“没有斧头”
“有斧头可用”

看看我们目前可用的动作,与它们相关的状态只有“没有斧头”和“有斧头”的状态;另一个状态可能用于其他具有其他动作的代理。
好的,我们有了当前的世界状态、我们的行动(及其前提条件和影响)以及目标。让我们开始计划吧!

1
2
3
拿斧头->砍树(总计:6)
拿斧头->收集树枝(总计:10)
收集树枝(共8个)

一共有三条路径,被前提条件过滤掉前两条,实际就剩下收集树枝。

与行为树型的比对

GOAP更适合做量化的个性化AI,可以理解为每次规划行为都可能创建新的行为树结构,让每个ai都有不同的个性。
如果是想要通过行为树去进行编辑是相当的耗费时间的。从这一点上来说是比较有优势的。
缺点也很明显,它与行为树比较起来并不直观,可以说很抽象,配置ai的时候容易出错,当然制作合适的可视化工具是非常有帮助的甚至说解决这个问题。

参考文章:
Goal Oriented Action Planning for a Smarter AI