Использование арифметического сравнения в качестве предварительного условия в 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>)))
Что-то вроде большей функции (написано в предзаказе). Такая логическая функция, которая устанавливает предварительное условие, будет использоваться при планировании.