You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 23:25:59