1

我一直在查看一些关于 STRIPS 格式的 AI 计划表示的材料,并发现不同的人似乎以不同的方式制定相同的问题。

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

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

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

维基百科解决问题

现在在这个计划中我看不到香蕉位于 Level(high),所以从计划中真正泄露这一点的唯一方法是通读整个动作集并从那里推断出猴子必须是在 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, 高) & At(bx, C, 低)

这样看起来很冗长,但同时也让读者可以通过阅读初始状态来理解场景。我还被告知我们不应该在 STRIPS 中的任何地方使用常量,所以我认为将 A、B 和 C 声明为 Positions 是个好主意。

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

4

1 回答 1

1

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

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

您是正确的,您需要将每个项目的级别定义为初始状态的一部分,但考虑到香蕉总是高的约束条件,示例的初始状态实际上是正确的,盒子总是低的,猴子是唯一的改变水平的东西。我可能会更改示例以使At命题考虑相关对象,而不是为每个对象使用不同的命题名称,但这只是一种样式选择;语义是相同的。

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

  • 前提条件- 前提条件列表中的每个变量必须与当前状态中的相应变量完全匹配(真必须为真,假必须为假),但您忽略所有其他未在先决条件中明确显示的变量
  • 添加效果- 执行操作时,这些是添加到状态的变量的效果
  • 删除效果- 执行操作时,这些是从状态中删除的效果
  • 有时在考虑成本最优时是第四个成本组成部分

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


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

于 2015-06-18T04:28:31.933 回答