PDDL2.1: цель `над всеми`

#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, чтобы посмотреть, что происходит — вероятно, в модели есть ошибка, которая означает, что условие выполняется каким-то странным образом.