使用算术比较作为PDDL的前提条件

时间:2017-09-20 18:34:09

标签: comparison pddl

我一直在寻找一种方法来将比较设置为PDDL中的操作的前提条件。有没有办法说出来:

(:functions (goal))    

(:action CheckLoser  
    :parameters  (?team)  
    :precondition  
        (> goals 5)  
    :effect  
        (loses ?team)  
)

2 个答案:

答案 0 :(得分:1)

Fast Downward不支持将算术比较用作动作前置条件,但计划程序 Metric-FF 不支持。后者可以从here下载,并且易于安装:

  • 确保您的系统上安装了flexbison;在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>)))

更强大的功能(以预购编写)。这种表示前置条件的布尔函数将用于您的计划中。