PDDL 持续动作:灵活的持续时间

Posted

技术标签:

【中文标题】PDDL 持续动作:灵活的持续时间【英文标题】:PDDL Durative-Action: Flexible duration 【发布时间】:2020-09-11 14:49:05 【问题描述】:

我正在 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 (&gt; ?duration HIGH_THRES),但它不会成功计划。

提前致谢!

【问题讨论】:

【参考方案1】:

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

您正在使用的规划器的功能 您为规划模型和执行/控制选择的抽象级别

对于第一个方面:如果您的域还对其他动作中的放电效果进行建模,并且如果您的规划器支持连续效果,您可以以类似于 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 (&gt;= ?duration 0)。这是假设在问题的域或目标中有另一个动作,这要求water-temperature 具有特定的数值。否则计划者没有理由将动作添加到计划中。

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

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

【讨论】:

这很有道理,谢谢。我希望有更好的方法来定义反馈(increase (water-temperature) (* #t 1.0)),因为如果这在源/传感接口的其他地方发生了变化,那么它可能会搞砸这个动作。 你当然可以用一个PDDL函数来替换1.0。这仍然只是现实生活的规划模型。只要变化率不随时间变化,这种影响是线性的,几个规划者将能够处理它。它在计划执行期间发生变化的事实并不一定会使计划无效。 此外,如果没有其他动作在改变变化率,并且您的域中的收费率是恒定的(因此数字效应是线性的),您可以直接计算持续时间在(:duration ) 声明中。

以上是关于PDDL 持续动作:灵活的持续时间的主要内容,如果未能解决你的问题,请参考以下文章

我似乎无法理解 pddl 中的动作和目标

持续动作

C# timer 持续5秒钟无动作,执行

以不同的持续时间永远重复动作

PDDL 无法编译

spark persist() (然后动作)真的持续存在吗?