PDDL2.1:“全部”目的

问题描述

我正在使用PDDL2.1持续性操作,并且难以理解over all的目的。

我有一个函数charge_level,该函数每10Hz更新一次。在持续性操作move中,我说condition: (over all (>= (charge_level) 12))

我将其解释为“在执行操作时,请验证charge_level大于或等于12,否则,move失败,并且计划者应找到条件为{{1 }}”。但是,计划者似乎没有这种计划。我对此表示感谢。

谢谢!

解决方法

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

,

over all条件的语义确实如@haz在他的回答中所说(它防止计划者与您的move动作并行地调度另一个违反over all的动作条件),但我认为让您感到困惑的是计划与计划执行之间的区别。在计划执行期间,由于电池故障或传感器故障等原因,(charge_level)可能会在任何时候意外降到12以下。在这种情况下,您的计划执行应停止 move行动(以及整个计划)并重新计划。此时,计划者可以选择在该新状态下具有满足先决条件的任何操作。因此不一定at start (< (charge_level) 12)

计划者在计算计划时不能停止或暂停PDDL持续性操作。但是,如果您告诉计划者(charge_level)是如何随着时间变化的,它可以计算出move动作的最长可能持续时间,然后执行其他操作,例如为电池充电,然后再将move动作的另一个 instance 安排到同一计划中。在这种方法中,没有失败,只需要推理一个给定动作可以持续多长时间才能实现目标,而不会违反任何约束,包括over all条件。

如果这是您想要的行为,则需要将(charge_level)建模为连续变化的函数。如果要查看示例,请参见power generatorcoffee machine。这是Generator领域的一瞥:

发电机一定不能耗尽燃料:

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

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

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

鉴于首字母为(fuel-level),这是一种简单的计算方法,可确定操作的最大持续时间。为了获得这种灵活性,您需要像coffee machine域中那样,不受限制地指定:duration (>= ?duration 0)的操作持续时间。

现在,要能够处理包括continuous numeric effects在内的模型,您将需要一个支持:continuous-effects要求的计划者,例如OPTICPOPF