1

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

(:functions (goal))    

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

2 回答 2

1

Fast Downward 不支持使用算术比较作为操作前提条件,但规划器Metric-FF支持。后者可以从这里下载,并且很容易安装:

  • 确保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的部分,将“时间”设置为“x”,例如“时间”是,“x”等于。 (= (total-cost ?cost) 0)cost0
  • 现在可以在任何动作前提条件下使用算术比较;例如(> (total-cost ?cost) x), wherex可以设置为任何值(包括浮点数);请注意,在这种情况下?cost必须包含在:parameters上述操作的部分中
  • 最后,在每次使用(resp. )执行操作后,total-cost可以增加(resp.减少)的值,其中可以再次用任何值替换。(increase (total-cost ?cost) x) (decrease (total-cost ?cost) x)x
于 2017-09-24T02:06:54.507 回答
0

在 PDDL 中,您不能直接比较,而是可以定义一些带参数的布尔函数。在前提条件中指定此类函数意味着该函数成立。例如:

(operation
 makebigger
  (params
   (<a> Object) (<b> Object))
  (preconds
    (greater <a> <b>))
   effects
    (greater <b> <a>)))

类似更大的功能(预先编写)。这种声明先决条件的布尔函数将用于您的计划。

于 2018-04-08T05:57:17.280 回答