我一直在审查有关STRIPS格式的人工智能计划表示的一些材料,并发现不同的人似乎以不同的方式制定同样的问题。
例如,维基百科有一个关于猴子实验室问题的例子。问题表明:
有一个盒子可以让猴子爬上天花板上的香蕉,如果他爬上它。最初,猴子在A,香蕉在B,盒子在C。猴子和盒子的高度低,但如果猴子爬到盒子上,他将有高度,与香蕉相同。猴子可用的动作包括从一个地方转到另一个地方,将一个物体从一个地方推到另一个地方,从一个物体上爬上或爬上一个物体,然后抓住或取消一个物体。如果猴子和物体位于相同高度的相同位置,则抓住物体会导致握住物体。
这是维基百科的计划(请注意,它与此问题描述并不完全匹配,但它也是同样的问题。它似乎没有实现Ungrasp,这对于此讨论并不重要):< / p>
现在在这个计划中我没有看到香蕉位于Level(高),因此实际上可以从计划中泄露的唯一方法是阅读整套动作并从那里推断出猴子必须处于水平(高)与香蕉互动,因此它们必须处于水平(高)。
将此信息置于初始状态是不是一个好主意,并且有类似的内容:
猴子(m)&amp;香蕉(ba)&amp; Box(bx)&amp;等级(低)&amp;等级(高)&amp;位置(A)&amp;位置(B)&amp;位置(C)&amp;在(m,A,low)&amp;在(ba,B,高)&amp;在(bx,C,low)
它看起来相当冗长,但与此同时,它允许读者通过阅读初始状态来理解场景。我也被告知我们不应该在STRIPS的任何地方使用常量,所以我认为将A,B和C声明为位置是一个好主意。
是否有些人以不同的方式做到这一点(我认为这会破坏使用标准化语言来表示事物的想法),或者我所呈现的方式之一是不是正确的格式?我是STRIPS的新手,所以我完全有可能(而且可能)错过了一些关键点。
答案 0 :(得分:1)
这不是有史以来最伟大的维基百科。 STRIPS的描述是准确的,但有点过时。
通常,您不必担心在初始状态中定义所有变量,因为变量是由域定义的(链接文章中的四倍中的P)。为了直觉了解原因,您在初始状态下拥有MONKEY
的运算符,但您仍然引入了未在其他任何位置定义的自由变量m
。如果你试图这样做,你最终会遇到鸡和蛋的问题,所以系统中的事实只是命题变量,它们是有效的哨兵值,对系统的用户而言意味着某些东西,而不是系统本身。 / p>
你是正确的,你需要定义每个项目的级别作为初始状态的一部分,但是实例的初始状态实际上是正确的,考虑到香蕉总是高的约束,框总是低,猴子是唯一改变水平的东西。我可能会更改示例,让At
命题考虑到有问题的对象,而不是为每个对象使用不同的命题名称,但这只是一个样式选择;语义是一样的。
STRIPS中的运营商通常由3个不同的组件表示:
示例中列出的帖子条件是添加效果和删除效果的并集。当你进入删除放松抽象时,分离它们的优势将会延迟。
在您建议的初始状态中,您的命题包含同一对象的多个属性(例如At(bx, C, low)
)。这通常被避免有利于对该州中每个对象的每个属性提出建议。这样做会让你最终得到一个更大的状态,但是实现起来要简单得多,因为你不必分解状态变量来识别前置条件列表中对象的特定属性的值。