Использование арифметического сравнения в качестве предварительного условия в PDDL

Я искал способ установить сравнение в качестве предварительного условия для действия в PDDL. Есть ли способ сказать, например:

(:functions (goal))    

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

2 ответа

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 часть файла проблемы, установите "время", чтобы начать как "х", например, (= (total-cost ?cost) 0) где "время" cost и "х" равен 0,
  • Теперь можно использовать арифметическое сравнение в любом предварительном условии действия; например (> (total-cost ?cost) x), где x может быть установлено любое значение (включая числа с плавающей запятой); Обратите внимание, что в этом случае ?cost должны быть включены в :parameters раздел указанного действия
  • Наконец, значение total-cost может быть увеличено (соответственно уменьшено) после каждого выполнения действия с (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>)))

Что-то вроде большей функции (написано в предзаказе). Такая логическая функция, которая устанавливает предварительное условие, будет использоваться при планировании.

Другие вопросы по тегам