我正在寻找一种将比较设置为 PDDL 中操作的前提条件的方法。有没有办法说例如:
(:functions (goal))
(:action CheckLoser
:parameters (?team)
:precondition
(> goals 5)
:effect
(loses ?team)
)
我正在寻找一种将比较设置为 PDDL 中操作的前提条件的方法。有没有办法说例如:
(:functions (goal))
(:action CheckLoser
:parameters (?team)
:precondition
(> goals 5)
:effect
(loses ?team)
)
Fast Downward 不支持使用算术比较作为操作前提条件,但规划器Metric-FF支持。后者可以从这里下载,并且很容易安装:
确保flex
并bison
安装在您的系统上;在 Ubuntu 上只需使用:
sudo apt-get install bison flex
make
在源目录中运行
Metric-FF
可以执行如下:
./ff -o path/to/domain.pddl -f path/to/problem.pddl
为了解决问题中的问题,我使用了一个变量cost
来跟踪时间,并允许在经过一定时间后发生动作。
我的代码示例如下:
:predicate
在域文件中定义一个,例如(cost ?cost)
:function
在域文件中定义一个,例如(:functions (total-cost ?cost))
(cost)
的:objects
一部分 :init
的部分,将“时间”设置为“x”,例如“时间”是,“x”等于。 (= (total-cost ?cost) 0)
cost
0
(> (total-cost ?cost) x)
, wherex
可以设置为任何值(包括浮点数);请注意,在这种情况下?cost
必须包含在:parameters
上述操作的部分中total-cost
可以增加(resp.减少)的值,其中可以再次用任何值替换。(increase (total-cost ?cost) x)
(decrease (total-cost ?cost) x)
x
在 PDDL 中,您不能直接比较,而是可以定义一些带参数的布尔函数。在前提条件中指定此类函数意味着该函数成立。例如:
(operation
makebigger
(params
(<a> Object) (<b> Object))
(preconds
(greater <a> <b>))
effects
(greater <b> <a>)))
类似更大的功能(预先编写)。这种声明先决条件的布尔函数将用于您的计划。