PDDL潜艇移动规划问题:多位置目标报错排查求助
错误信息解读与问题解决
先拆解你收到的规划器输出
- Suspected timeout:这是误报,实际搜索仅耗时微秒级(2.5e-05秒=0.025毫秒),远低于60秒的时间预算,搜索很快就终止了。
- IW搜索结果:
{2/1/0}:IW(1) -> [2][3][4];; NOT I-REACHABLE ;;- 格式
{#goals, #UNnachieved, #Achieved}代表总共有2个目标,当前状态下1个未达成、0个已达成(核心是目标未全部满足)。 NOT I-REACHABLE说明迭代宽度搜索(IW)在最大宽度为1的情况下,找不到能满足所有目标的可行路径。
- 格式
- BFS搜索结果:
Plan found with cost: 2.8026e-45- 这个极小的异常cost值是无效结果,并非真正的可行计划——规划器在目标不可行时,会返回这类异常值而非明确的"目标不可达"提示。
核心问题根源
你的目标本身逻辑不可行:潜艇是单一实体,不可能同时处于loc1和loc2两个不同位置。此外,你的PDDL领域可能缺少关键约束:
- 移动动作未定义位置排他性:即潜艇移动到新位置后,未移除旧位置的
(at submarine ?old-loc)fluent,导致规划器误以为潜艇可以同时存在于多个位置,但实际物理上不可能实现。
针对性解决方法
根据你的实际需求,分两种场景处理:
场景1:需要潜艇先后到达loc1和loc2(非同时)
修改问题目标为"标记已访问过两个位置",而非同时处于两个位置:
- 在领域文件中添加
visited谓词,用于记录潜艇到达过的位置:
(:predicates ; 保留你原有的谓词,新增以下内容 (visited ?sub - submarine ?loc - location) )
- 更新移动动作,添加标记已访问位置的效果,同时确保位置排他性:
(:action move :parameters (?sub - submarine ?from - location ?to - location) :precondition (and (at ?sub ?from) (adjacent ?from ?to) (water-depth ?to deep) (has-pilot ?sub) ) :effect (and (at ?sub ?to) (not (at ?sub ?from)) ; 关键:移除旧位置的状态 (visited ?sub ?to) ; 标记已访问目标位置 ) )
- 修改问题文件的目标,要求潜艇已访问过两个位置,且最终停在其中一个:
(:goal (and (visited submarine loc1) (visited submarine loc2) (at submarine loc2) ; 可选:指定最终位置 ))
场景2:确实需要同时有潜艇在两个位置(多潜艇场景)
如果是需要多艘潜艇分别占据不同位置,修改领域和问题定义:
- 在问题文件中定义多艘潜艇实例:
(:objects sub1 sub2 - submarine command-centre loc1 loc2 - location ; 保留你原有的其他对象 )
- 设置初始状态中各潜艇的位置:
(:init (at sub1 command-centre) (at sub2 command-centre) ; 保留你原有的其他初始状态(如相邻关系、水域深度、飞行员状态等) )
- 修改目标为不同潜艇处于对应位置:
(:goal (and (at sub1 loc1) (at sub2 loc2) ))
必须修复的基础问题
无论哪种场景,都要确保移动动作包含(not (at ?sub ?from))的效果——这是保证潜艇位置排他性的核心,否则会导致状态逻辑混乱,后续所有规划都可能出现异常。
验证步骤
- 先测试原始可行目标(潜艇从command-centre到loc1),确认动作逻辑正常。
- 再测试修改后的目标,查看规划器是否返回有效计划。
内容的提问来源于stack exchange,提问作者Mostack
相关产品推荐
相关产品推荐

