如何让PDDL中的load-ship动作支持船舶装载无限数量包裹?
解决船舶无限装载包裹的PDDL方案
你的load-ship动作本身已经支持船舶装载无限数量的包裹,核心原因是:PDDL中如果没有为船舶添加容量限制类的前置条件,就默认允许无限制装载不同包裹。
具体说明
这个动作每次针对单个包裹执行,只要满足以下前提,就可以重复调用它来装载多个包裹:
- 船舶和目标包裹在同一港口
- 目标包裹尚未被装载(
not (loaded ?package))
不过你当前的动作定义有一个小问题:effect里的(not (loaded ?package))是错误的,包裹被装载后应该标记为已装载,避免被重复装载。修正后的动作定义如下:
(:action load-ship :parameters (?ship - ship ?package - package ?port - port) :precondition (and (at ?ship ?port) (at ?package ?port) (not (loaded ?package)) ) :effect (and (carrying ?ship ?package) (not (at ?package ?port)) (loaded ?package) ; 标记包裹已被装载,防止重复操作 ) )
为什么能支持无限装载
因为这个动作没有任何限制船舶承载数量的逻辑(比如没有引入remaining-capacity ?ship ?num这类谓词来限制剩余容量),所以只要有符合条件的包裹,就可以反复执行load-ship动作,把任意多个包裹装上船。
内容的提问来源于stack exchange,提问作者Chris Costa
相关产品推荐
相关产品推荐

