PDDL2.1: Цель «во всем»

Я работаю с длительными действиями PDDL2.1, и мне трудно понять цель over all.

У меня есть функция charge_level, которая обновляется со значением каждые 10 Гц. В продолжительном действии move я говорю condition: (over all (>= (charge_level) 12)).

Я интерпретировал это так: при выполнении действия убедитесь, что charge_level больше или равно 12, иначе move не удастся, и планировщик должен найти новое действие с условием at start (< (charge_level) 12). Однако планировщик, похоже, так не планирует. Я ценю любую ясность по этому поводу.

Спасибо!


person mger    schedule 14.09.2020    source источник


Ответы (2)


Семантика условия 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.

person Jan Dolejsi    schedule 25.09.2020

Если вы просто хотите предотвратить выполнение действия на основе условия, вы используете at start. over all для условий, которые должны соблюдаться на протяжении всего действия. Таким образом, вы можете интерпретировать свое состояние как то, что на протяжении всего движения уровень заряда батареи никогда не опускался ниже 12.

person haz    schedule 14.09.2020
comment
Я пытался использовать at start и over all в качестве условий для длительного действия. Однако, похоже, это не останавливает действие, если условие не выполняется. Я надеялся найти способ прекратить текущее действие, если условие не выполняется. - person mger; 16.09.2020
comment
Возможно, стоит запустить ваш план через VAL, чтобы увидеть, что происходит — вероятно, в модели есть ошибка, которая означает, что условие выполняется каким-то странным образом. - person haz; 17.09.2020