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 start
。 over 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。
我正在使用 PDDL2.1 持续操作,但我很难理解 over all
的目的。
我有一个函数 charge_level
,它每 10Hz 更新一个值。在持续动作 move
中,我说 condition: (over all (>= (charge_level) 12))
.
我将其解释为“在执行动作时,验证 charge_level
是否大于或等于 12,否则,move
失败,规划器应找到条件为 at start (< (charge_level) 12)
”。然而,规划者似乎并没有那样规划。我感谢对此的任何澄清。
谢谢!
如果您只想根据条件阻止操作发生,那么您可以使用 at start
。 over 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。