0

我对 pddl 的理解有问题,我正在尝试制定一个宇宙飞船计划,只要船长和导航员在桥上,宇宙飞船就可以移动到一个区域。

这是我从域文件中操作的代码

(:action travel :parameters (?x ?y)
        :precondition   (and (REGION ?x) (REGION ?y) ; travel between regions
                            (at-region ?x) (at-bridge ?x) (at-bridge ?y))
        :effect         (and (at-region ?y)
                        (not (at-region ?x)))
    ) 

当我尝试这个问题文件时


(:init (SUBMARINE submarine) 
            (ROOM bridge) (ROOM sickbay) ; 2 rooms - bridge and sickbay
            (PERSONNEL captain) (PERSONNEL navigators)
            (REGION regionempty) (REGION seaport)
            (at-region seaport) (at-bridge captain) (at-bridge navigators)
    )
    
    (:goal (and (at-region regionempty))
    
    )

我得到错误:ff:目标可以简化为 FALSE。没有计划能解决它

4

1 回答 1

1

问题在于您的操作及其参数的前提条件。您只声明两个参数?x?y. 对于那些您需要持有五件东西才能执行旅行行动的人:

  1. (region ?x)
  2. (region ?y)
  3. (at-region ?x)
  4. (at-bridge ?x)
  5. (at-bridge ?y)

?x问题是数字 4和5。?x应该是您想要旅行的区域(即 1.-3.)表达的区域。但是你说该区域 ?x也必须在桥上(4.),并且该区域 ?y必须在新娘处(5.)。这里的要点是,对于旅行动作的实例,您必须为每个变量选择一个值,所有前提条件同时成立。

解决您的问题的方法是添加两个附加参数:

(:action travel :parameters (?x ?y ?p1 ?p2)
        :precondition   (and (REGION ?x) (REGION ?y) ; travel between regions
                            (at-region ?x) (at-bridge ?p1) (at-bridge ?p1))
        :effect         (and (at-region ?y)
                        (not (at-region ?x)))
    )

最后,您是无类型的 PDDL,并使用一元谓词检查类型。这是相当过时的。出于建模目的,您应该始终使用类型化变量。即引入类型区域、人员、潜艇......然后动作定义如下所示:

(:action travel :parameters (?x ?y - region ?p1 ?p2 - personnel)
        :precondition   (and (at-region ?x) (at-bridge ?p1) (at-bridge ?p1))
        :effect         (and (at-region ?y)
                        (not (at-region ?x)))
    )
于 2020-10-15T10:51:27.640 回答