条件的语义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)
值,计算动作的最大持续时间是一个简单的计算。为了获得这种灵活性,您需要指定动作持续时间 unconstrained :duration (>= ?duration 0)
,就像在咖啡机领域中一样。
现在,为了能够处理包含连续数值效应的此类模型,您将需要一个支持该:continuous-effects
要求的规划器,例如OPTIC或POPF。