实验室中猴子的 STRIPS 表示

STRIPS representation of monkey in the lab

我一直在审查一些material关于给定 STRIPS 格式的 AI 计划的表示,发现不同的人似乎以不同的方式表述相同的问题。

例如,维基百科有一个关于实验室问题中的猴子的例子。问题指出:

有一个盒子可以让猴子爬上去够到挂在天花板上的香蕉。最初,猴子在A,香蕉在B,箱子在C。猴子和箱子的高度都是Low,但是如果猴子爬上箱子,他的高度就会和香蕉一样高。猴子可用的动作包括从一个地方到另一个地方,将一个物体从一个地方推到另一个地方,从一个物体上爬上或爬下,以及抓住或松开一个物体。如果猴子和物体在同一高度相同的位置,则抓住物体会导致握住物体。

这是维基百科的计划(请注意,它与这个问题的描述不完全匹配,但它是同一个问题。它似乎没有实现 Ungrasp,这对本次讨论并不重要):

现在在这个计划中的任何地方我都看不到香蕉位于级别(高),所以从计划中实际泄露的唯一方法是通读整套行动并从那里推断出来猴子必须处于 Level(high) 才能与香蕉互动,因此它们必须处于 Level(high)。

将此信息放入初始状态是否是个好主意,并且有类似的东西:

Monkey(m) & Bananas(ba) & Box(bx) & Level(low) & Level(high) & Position(A) & Position(B) & Position(C) & At(m, A, low) & At(ba, B, high) & At(bx, C, low)

它看起来很冗长,但同时,它允许 reader 仅通过阅读初始状态就可以了解场景。我还被告知我们不应该在 STRIPS 中的任何地方使用常量,所以我认为将 A、B 和 C 声明为位置是个好主意。

是不是有些人的做法有所不同(我觉得这会破坏用标准化语言来表示事物的想法),还是我提出的其中一种方式不正确格式?我是 STRIPS 的新手,所以我完全有可能(而且很可能)遗漏了一些关键点。

这不是最伟大的维基百科。 STRIPS 的描述是准确的,但有点过时了。

通常你不需要担心在初始状态下定义所有变量,因为变量是由域定义的(链接文章中四元组中的 P)。对于原因的直觉,您在初始状态下有一个 MONKEY 运算符,但您仍在引入一个未在其他任何地方定义的自由变量 m 。如果你试图那样做,你最终会遇到先有鸡还是先有蛋的问题,所以系统中的事实只是命题变量,它们实际上是对系统用户有意义的哨兵值,而不是系统本身。

你是正确的,你需要将每个项目的级别定义为初始状态的一部分,但考虑到香蕉 always[=38 的限制,示例的初始状态实际上是正确的=] 高,盒子 总是 低,猴子是唯一改变水平的东西。我可能会更改示例,让 At 命题考虑到所讨论的对象,而不是为每个对象使用不同的命题名称,但这只是一种风格选择;语义相同。

STRIPS 中的运算符通常由 3 个不同的组件表示:

  • preconditions - 前置条件列表中的每个变量必须完全匹配当前状态下的相应变量(true 必须为 true,false 必须为 false)但是你忽略所有其他变量前提条件中没有明确说明
  • 添加效果 - 执行动作时,这些是添加到状态的变量的效果
  • 删除效果 - 执行操作时,这些是从状态中删除的效果
  • 考虑到成本最优性时,有时还有第 4 个 成本 组成部分

你例子中列出的post条件是添加效果和删除效果的并集。当您进入删除松弛抽象时,将它们分开的好处将在稍后出现。


在您提出的初始状态中,您的命题包含同一对象的多个属性(例如 At(bx, C, low))。通常会避免这种情况,而有利于为状态中每个对象的每个 属性 提供一个命题。这样做会让你最终得到一个更大的状态,但会使实现更简单,因为你不必分解状态变量来识别对象中特定 属性 的值先决条件列表。