在PDDL中如何将计划启动后的累计时间作为变量访问?
PDDL中全局累计时间与成本计算的解决方案
核心结论
你要用到的计划启动后总累计时间,和持续效果里的#t是完全不同的变量:#t仅代表当前持续动作的已执行时长,无法直接用来表示全局时间线的累计值。
问题(a):POPF拒绝#t的原因
POPF规划器对#t的使用场景有严格限制:它只能用于和当前动作持续时间直接绑定的线性效果(比如按动作时长累计热量的场景)。你把#t和动态变化的num-not-yet-fixed变量做乘法,属于非线性效果定义,超出了POPF的支持范围,因此会被拒绝。
问题(b):实现全局累计时间的方法
要获取计划启动后的总累计时间,需要手动维护一个全局时间变量,具体步骤如下:
- 初始化全局时间:在问题的初始状态中添加
(= (global-time) 0) - 添加全局时间更新动作:定义一个持续运行的背景动作,自动累计时间:
如果是连续时间场景,可将(durative-action update-global-time :duration (= ?duration 1) # 按1时间单位粒度更新,可根据需求调整 :condition (and (at start (>= (global-time) 0))) :effect (and (increase (global-time) ?duration)))?duration设为一个极小值,或者使用连续时间的语法定义。 - 修改成本计算逻辑:用全局时间变量
(global-time)替代#t,你的效果定义改为:
这样就能实现“后期修复待处理项成本更高”的设计目标。(increase (total-cost) (* (global-time) (num-not-yet-fixed ?group)))
注意事项
确保你的PDDL域定义包含必要的需求声明:(:requirements :typing :durative-actions :continuous-effects :action-costs),POPF需要这些需求来支持持续动作和成本计算。
内容的提问来源于stack exchange,提问作者Fred Douglis
相关产品推荐
相关产品推荐

