artificial-intelligence - 如何适应 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 == true
and的要求target == Food
,同时在食物被消耗后还将 target 设置为 null。
那么最大的问题是当 m 被吃掉时会发生什么?计划者怎么知道接下来要定位的是一把剑而不是别的东西?这如何在 GOAP 状态中以确保以下操作按预期运行的方式表示?
提出的一个想法是将动作分为 3 类:
- 指定 - 承诺将目标设置为某事物的操作(即 locateFood)
- 中介 - 做出广义目标承诺的行动(即 goTo)
- 终端 - “消耗”目标的动作,使其无效(即吃)
然后,这种方法会带来一个问题,即知道哪些操作是最终的,哪些不是,这本身似乎是一个令人讨厌的问题。
如果这太抽象且难以理解,我很抱歉 - 我试图将问题从我们的特定代码中概括出来,因为我认为它不是特定于我们的实现的东西,但可能是我们对状态如何的误解应该在 GOAP 中表示。如果需要,我可以提供代码以及任何说明。
解决方案
首先,如果您显示一些代码会很好。其次,我希望你已经看过这个goap 演示
这应该回答你的问题。在提出行动之前,必须满足先决条件。举个例子,如果你要求 AI 在拿起剑之前吃掉muchroom m,我会做这样的事情:
吃蘑菇动作:效果:“mushroomEaten” == true
拿起剑动作:前提条件:if "mushroomEaten" == true
然后
效果:“goPickUpSword”
我必须概括,因为您的问题也很笼统,没有给出具体的代码示例。查看提供的链接,您将了解如何将操作链接在一起以实现目标。
推荐阅读
- linux - 有人可以追踪分段错误的原因吗?
- java - 找不到明确的活动类 {};您是否在 AndroidManifest.xml 中声明了此活动?
- php - 单击按钮后无法产生动作
- python - 在python中获取类的所有实例
- tailwind-css - 如何修改 TailwindCSS 中 Typography 散文类的默认样式?
- javascript - 您将如何编写嵌入在 HTML 中的 JavaScript 与将写入文件的普通 JavaScript 的语句?
- php - Laravel - 无法使用 cpanel 在 SMTP 服务器上使用用户名进行身份验证
- python - 如何修复 Python 二叉搜索树中的 NoneType 错误?
- data-science - 数据根本没有显示在 Tableau 工作表上
- html - 尝试使用 VBA 自动化 Internet Explorer 网页中的手动输入/过程,但遇到窗口弹出值输入