ASP Core-2 哈密顿路径求解器出现无限循环问题求助
问题根因
死循环的核心成因是步骤变量C没有设置上限约束。Clingo的grounding(实例化)阶段需要为规则中的所有变量生成合法取值,你没有限制C的最大值,程序会持续推导C+1的更大取值,即便所有节点都已被访问,也会不断生成无意义的步骤序号,导致程序卡在grounding阶段无法进入求解逻辑。你添加的not visited(Y, _)只能避免同一个节点被重复访问,完全限制不了步骤值的无限增长。
修复后的完整实现
% 统计总节点数 n(Total) :- Total = #count{Node : node(Node)}. % 选择唯一的起始节点 1 <= {startNode(N) : node(N)} <= 1. % 初始化第一步访问的节点 visited(X, 1) :- startNode(X). % 推导后续访问节点,新增步骤上限约束避免无限增长 visited(Y, C+1) :- visited(X, C), edge(X, Y), not visited(Y, _), n(Total), C < Total. % 约束:所有节点必须被访问到,符合哈密顿路径要求 :- node(N), not visited(N, _).
额外说明
- 原代码中的
inPath谓词属于冗余设计,直接使用edge(X,Y)事实即可减少不必要的候选生成,如果你需要保留inPath做额外逻辑校验,可以补充规则inPath(X,Y) :- visited(X,C), visited(Y,C+1).将路径上的边和inPath绑定 - 最终输出的
visited谓词完全符合要求的visited(节点名, 步骤序号)格式,无需额外转换 - 如果需要限制路径的起点/终点,只需要在
startNode的选择规则上叠加对应约束即可
内容的提问来源于stack exchange,提问作者BenjyTec
相关产品推荐
相关产品推荐

