基于Answer Set Programming的哈密顿环编码求解返回不可满足,是否编码有误?
问题分析:编码存在错误,实例本身存在哈密顿环
首先明确:你给出的图实例存在有向哈密顿环(例如 1→2→3→4→1 或 2→3→4→1→2),程序返回UNSATISFIABLE是因为编码存在错误。
具体错误及修正方案
1. 注释行语法错误
编码中有一行注释误用了#开头:
# p=path, o=omit, op=on-path, r=reach, s=start% generate path
ASP中注释需以%开头,这行应改为:
% p=path, o=omit, op=on-path, r=reach, s=start % generate path
虽然这行不会直接导致语法报错,但可能干扰求解器的解析逻辑。
2. 节点入/出边约束的逻辑缺陷
原编码中用op(Y):- p(X,Y), p(Y,Z).来表示节点Y同时有入边和出边,再通过:- n(X), not op(X).约束所有节点必须满足该条件。这个逻辑本身是对的,但在grounding过程中,部分节点的op(Y)推导可能存在遗漏风险。更可靠的写法是拆分入边和出边的约束:
% 每个节点至少一条入边 :- n(X), not p(_, X). % 每个节点至少一条出边 :- n(X), not p(X, _).
这种写法更直接,避免了原规则中变量依赖可能导致的推导问题。
3. 缺少边数约束(可选但更严谨)
原编码仅通过入/出边数量限制和连通性约束推导环,但添加边数等于节点数的约束可以更明确地限定哈密顿环的结构(n个节点的环恰好有n条边):
:- #count{p(X,Y)} != #count{n(X)}.
修正后的完整编码
% vertices: n=node n(1..4). % edges: e=edge e(1,(2;3)). e(2,(3;4)). e(3,(1;4)). e(4,1). % starting point s(1). % p=path, o=omit, op=on-path, r=reach, s=start % generate path p(X,Y):- not o(X,Y), e(X,Y). o(X,Y):- not p(X,Y), e(X,Y). % at most one incoming/outgoing edge :- p(X,Y), p(U,Y), X < U. :- p(X,Y), p(X,V), Y < V. % at least one incoming/outgoing edge :- n(X), not p(_, X). :- n(X), not p(X, _). % connectedness r(X):- s(X). r(Y):- r(X), p(X,Y). :- n(X), not r(X). % 边数等于节点数(可选) :- #count{p(X,Y)} != #count{n(X)}.
运行修正后的编码,clingo会返回正确的哈密顿环解。
内容的提问来源于stack exchange,提问作者asraful islam
相关产品推荐
相关产品推荐

