我一直在寻找一种方法来将比较设置为PDDL中的操作的前提条件。有没有办法说出来:
(:functions (goal))
(:action CheckLoser
:parameters (?team)
:precondition
(> goals 5)
:effect
(loses ?team)
)
答案 0 :(得分:1)
Fast Downward不支持将算术比较用作动作前置条件,但计划程序 Metric-FF 不支持。后者可以从here下载,并且易于安装:
确保您的系统上安装了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
部分,将“time”设置为“x”,例如(= (total-cost ?cost) 0)
其中“time”为cost
且“x”等于0
。 (> (total-cost ?cost) x)
,其中x
可以设置为任何值(包括浮点数);请注意,在这种情况下,?cost
必须包含在所述操作的:parameters
部分total-cost
(分别为(increase (total-cost ?cost) x)
)执行每个操作后,(decrease (total-cost ?cost) x)
的值可以增加(分别减少) ,其中x
可以再次替换为任何值。答案 1 :(得分:0)
在PDDL中你不能直接比较,而是可以用参数定义一些布尔函数。在前提条件中规定这种功能意味着该功能成立。 例如:
(operation
makebigger
(params
(<a> Object) (<b> Object))
(preconds
(greater <a> <b>))
effects
(greater <b> <a>)))
更强大的功能(以预购编写)。这种表示前置条件的布尔函数将用于您的计划中。