#planning #pddl
#планирование #pddl
Вопрос:
Я работаю с PDDL2.1 durative-actions, и мне трудно понять цель over all
.
У меня есть функция charge_level
, которая обновляется значением каждые 10 Гц. В длительном действии move
, я говорю condition: (over all (>= (charge_level) 12))
.
Я интерпретировал это как «при выполнении действия убедитесь, что оно charge_level
больше или равно 12, в противном случае move
произойдет сбой, и планировщик должен найти новое действие с условием at start (< (charge_level) 12)
«. Однако планировщик, похоже, не планирует таким образом. Я ценю любую ясность по этому поводу.
Спасибо!
Ответ №1:
Семантика over all
условия действительно такова, как @haz говорит в своем ответе (это не позволяет планировщику планировать другое действие параллельно с вашим move
действием, которое нарушило бы over all
условие), но то, что, я думаю, вас смущает, — это разница между планированием и выполнением плана. Во время выполнения плана (charge_level)
может неожиданно упасть ниже 12
в любой момент из-за неисправной батареи или неисправного датчика и т. Д. В таком случае выполнение вашего плана должно остановить move
действие (и, следовательно, весь план) и перепланировать. В этот момент планировщик может выбрать любое действие, которое имеет удовлетворительное предварительное условие в этом новом состоянии. Так что не обязательно at start (< (charge_level) 12)
.
Планировщик не может остановить или приостановить действие PDDL во время вычисления плана. Однако, если вы сообщите планировщику, как (charge_level)
меняется со временем, он может вычислить максимально возможную продолжительность move
действия, а затем сделать что-то еще, например, перезарядить аккумулятор, прежде чем планировать другой экземпляр move
действия в том же плане. В этом подходе нет никаких сбоев, просто рассуждение о том, как долго может длиться данное действие для достижения цели без нарушения каких-либо ограничений, включая over all
условия.
Если это то поведение, которое вы хотите, вам нужно будет смоделировать (charge_level)
как постоянно меняющуюся функцию. Если вы хотите увидеть пример, вот генератор энергии или кофемашина. Вот краткий обзор домена генератора:
В генераторе не должно заканчиваться топливо:
(over all (>= (fuel-level ?g) 0))
Топливо уменьшается на 1
единицу за каждую единицу времени #t
.
(decrease (fuel-level ?g) (* #t 1))
Учитывая начальное значение (fuel-level)
, это простой расчет для определения максимальной продолжительности действия. Для такой гибкости вам нужно будет указать неограниченную продолжительность действия :duration (>= ?duration 0)
, как в домене кофемашины.
Теперь, чтобы иметь возможность обрабатывать такую модель, включая непрерывные числовые эффекты, вам понадобится планировщик, поддерживающий :continuous-effects
требование, например, OPTIC или POPF.
Ответ №2:
Если вы просто хотите предотвратить выполнение действия на основе условия, тогда вы используете at start
. over all
предназначено для условий, которые должны выполняться в течение всего срока действия. Таким образом, вы могли бы интерпретировать свое условие как «в течение всего времени перемещения никогда не позволяйте уровню заряда батареи опускаться ниже 12».
Комментарии:
1. Я пытался использовать
at start
иover all
в качестве условий для длительного действия. Однако, похоже, что это не «останавливает» действие, если условие не выполняется. Я надеялся найти, есть ли способ завершить текущее действие, если условие не выполняется.2. Возможно, стоит запустить ваш план через VAL, чтобы посмотреть, что происходит — вероятно, в модели есть ошибка, которая означает, что условие выполняется каким-то странным образом.