pddl - 我似乎无法理解 pddl 中的动作和目标
问题描述
我对 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。没有计划能解决它
解决方案
问题在于您的操作及其参数的前提条件。您只声明两个参数?x
和?y
. 对于那些您需要持有五件东西才能执行旅行行动的人:
(region ?x)
(region ?y)
(at-region ?x)
(at-bridge ?x)
(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)))
)
推荐阅读
- r - R下拉菜单,带有表格
- ubuntu - 如何配置 minikube ssh?
- java - 为什么最后一个字符没有出现?
- spring-integration - 在 HTTP 出站网关之后保留原始请求 POJO
- video - 媒体源api,流简单mp4
- javascript - 如何在 Javascript 中引用外部 JSON 文件作为变量
- php - 如何使用 2 个外键在 Entity 中加载固定装置?
- c - 添加到节点时如何重置指向头节点的指针?
- python - 如何为 Keras Sequential 模型指定 input_shape
- kubernetes - ConfigMap 数据存储在哪里?