PDDL2.1:`over all`的目的

PDDL2.1: Purpose of `over all`

我正在使用 PDDL2.1 持续操作,但我很难理解 over all 的目的。

我有一个函数 charge_level,它每 10Hz 更新一个值。在持续动作 move 中,我说 condition: (over all (>= (charge_level) 12)).

我将其解释为“在执行动作时,验证 charge_level 是否大于或等于 12,否则,move 失败,规划器应找到条件为 at start (< (charge_level) 12)”。然而,规划者似乎并没有那样规划。我感谢对此的任何澄清。

谢谢!

如果您只想根据条件阻止操作发生,那么您可以使用 at startover all 适用于必须在整个操作期间保持的条件。因此,您可以将您的情况解释为,“在整个移动过程中,永远不要让电池电量低于 12”。

over all 条件的语义确实如@haz 在他的回答中所说(它防止计划者安排另一个与你的 move 动作并行的动作,这会违反 over all 条件),但我认为让您感到困惑的是计划和计划执行之间的区别。在计划执行期间,(charge_level) 可能会在任何时候因电池故障或传感器故障等原因意外低于 12。在这种情况下,您的计划执行应该 停止 move 行动(以及整个计划)和 re-plan。在这一点上,规划者可以选择任何在新状态下满足 pre-condition 的动作。所以不一定at start (< (charge_level) 12).

在计算计划时,计划者无法停止或暂停 PDDL 持续性操作。然而,如果你告诉规划器,(charge_level) 是如何随时间变化的,它可以计算出 move 动作的最长可能持续时间,然后做其他事情,例如给电池充电,然后再将 move 操作的另一个 实例 安排到同一计划中。在这种方法中,不涉及失败,只是推理给定的动作可以持续多长时间以在不违反任何约束(包括 over all 条件)的情况下实现目标。

如果这是您想要的行为,您需要将 (charge_level) 建模为一个不断变化的函数。如果你想看一个例子,这里是 power generator or the coffee machine。这是来自 Generator 领域的一瞥:

发电机不得 运行 耗尽燃料:

(over all (>= (fuel-level ?g) 0))

燃料每单位时间减少1单位#t

(decrease (fuel-level ?g) (* #t 1))

给定初始 (fuel-level),计算出动作的最长持续时间是一个简单的计算。为了获得这种灵活性,您需要指定不受约束的操作持续时间 :duration (>= ?duration 0),如在 coffee machine 域中一样。

现在,为了能够处理这样的模型,包括 continuous numeric effects, you will need a planner that supports the :continuous-effects requirement, so for example OPTIC, or POPF