PDDL Durative-Action:灵活的持续时间

PDDL Durative-Action: Flexible duration

我正在 PDDL2.1 中实现基于函数 (charge_level) 的充电操作。 (charge_level) 的函数值起作用并更新 ~10Hz。

我想创建一个名为 charge 的操作,该操作会一直持续到 charge_level 达到阈值。即

 (:durative-action charge
    :duration ( CONTINUE UNTIL (> (charge_level) HIGH_THRES)))
    :condition (and
        (at start ( < (charge_level) LOW_THRES)))
    :effect (and
    )
 ))

我该如何实施?我试图将 ?duration 变量分配给 charge_level 并设置 :duration (> ?duration HIGH_THRES) 但它不会成功计划。

提前致谢!

答案取决于您解决方案的两个方面:

  • 您正在使用的规划器的功能
  • 您 select 的规划模型和 execution/control
  • 抽象级别

对于第一个方面:如果您的域还对其他动作中的放电效果进行建模,并且如果您的规划器支持连续效果,则您可以采用类似于此 boil 动作的方式对动作进行建模:

(:durative-action boil-water
    :parameters ()
    :duration (>= ?duration 0)
    :condition (and
        (at start (and
            (not (boiling))
        ))
        (over all (and
            (<= (water-temperature) 100)
        ))
    )
    :effect (and
        (at start (and
            (boiling)
        ))
        (at end (and
            (not (boiling))
        ))
        (increase (water-temperature) (* #t 1.0))
    )
)

您可以找到 full example is here连续效应 (increase (water-temperature) (* #t 1.0)) 定义了温度随时间变化的速度。这样,计划者就可以推断出该行动应该花费多长时间。这就是为什么持续时间没有任何上限 :duration (>= ?duration 0) 定义的原因。这是假设在问题的域或目标中有另一个动作,这要求 water-temperature 具有特定的数值。否则计划者没有理由将行动添加到计划中。

另一种方法是使用 PDDL+ 中定义的 process(和 event)。

关于第二个方面:如果您的域确实不需要推理 charge_level 的值,您应该将其委托给您的计划执行基础设施。在实践中,作为状态推理的一部分,根据规划器外部的条件 (> (charge_level) HIGH_THRES)) 评估布尔谓词 fully_charged 要简单得多。