首页 > 解决方案 > 如何适应 GOAP AI 模型中“目标”的变化?

问题描述

假设代理正在寻找执行一系列需要不同“目标”的动作(拿起物品、吃食物等)。我们选择实现这一点的方式是让每个代理将其当前目标存储为一个字段,然后可以将其表示为键值状态(与其他状态一起)以提供给 GOAP 规划器。

如果一系列动作要求智能体先吃蘑菇m然后拿起剑,就会出现问题s。理想情况下,规划器可能会找到类似于以下的操作路径:

定位 m -> 去 m -> 拿起 m -> 吃 m -> 定位 s -> 去 s -> 拿起 s

当然,我们希望尽可能地泛化我们的动作,因此我们当前的设计有像 goTo、pickUp、eat 等这样的泛化动作,以简单地相信前面的“定位 x”动作已经找到了一个有效的目标。

换句话说,locate x 的承诺状态为 ,target == x而像 goTo 这样的动作将具有所需的状态hasTarget == true和承诺状态isNearTarget == true。类似的“通用”要求和目标集存在于pickUp。然后,eat 操作将具有类似于holdingTarget == trueand的要求target == Food,同时在食物被消耗后还将 target 设置为 null。

那么最大的问题是当 m 被吃掉时会发生什么?计划者怎么知道接下来要定位的是一把剑而不是别的东西?这如何在 GOAP 状态中以确保以下操作按预期运行的方式表示?

提出的一个想法是将动作分为 3 类:

然后,这种方法会带来一个问题,即知道哪些操作是最终的,哪些不是,这本身似乎是一个令人讨厌的问题。

如果这太抽象且难以理解,我很抱歉 - 我试图将问题从我们的特定代码中概括出来,因为我认为它不是特定于我们的实现的东西,但可能是我们对状态如何的误解应该在 GOAP 中表示。如果需要,我可以提供代码以及任何说明。

标签: artificial-intelligencegame-development

解决方案


首先,如果您显示一些代码会很好。其次,我希望你已经看过这个goap 演示

这应该回答你的问题。在提出行动之前,必须满足先决条件。举个例子,如果你要求 AI 在拿起剑之前吃掉muchroom m,我会做这样的事情:

吃蘑菇动作:效果:“mushroomEaten” == true

拿起剑动作:前提条件:if "mushroomEaten" == true

然后

效果:“goPickUpSword”

我必须概括,因为您的问题也很笼统,没有给出具体的代码示例。查看提供的链接,您将了解如何将操作链接在一起以实现目标。


推荐阅读