【发布时间】:2022-01-05 17:48:27
【问题描述】:
我是答案集编程(带有 Clingo 的 ASP Core-2)的新手,并且正在努力解决我无法解决的问题。 目标是解决“哈密顿路径”问题,描述如下: 在有向图中,我们正在寻找一条只访问一次图的所有节点的路径。
我们可以假设所有边关系都被称为事实,并且输入图确实包含哈密顿路径。所需的输出是谓词
visited(NodeName, StepInOrder)
每个都包含一个节点以及到达该节点的步骤数。例如,输出可能是
visited(a, 1), visited(c, 2), visited(b, 3)
请参阅下面的代码。问题是,在最后一行,程序似乎进入了一个无限循环。而且我不明白这可能是什么原因。
% pick one random start node
1 <= {startNode(N) : node(N)} <= 1.
% define helper predicate inPath which is true once and false once for each edge of the graph
{inPath(X, Y)} :- edge(X,Y).
% create possible paths
visited(X, 1) :- startNode(X).
visited(Y, C+1) :- visited(X, C), inPath(X, Y), not visited(Y, _). % infinite loop here
% some killing constraints to eliminate invalid solution candidates...
我的猜测是,由于某种循环,该程序正在生成无限数量的答案集,它们的 #stepInOrder 值都不同,但我认为 not visited(Y, _) 应该防止这种情况发生。
如果您需要任何其他上下文,请告诉我。提前致谢!
【问题讨论】:
-
你好。提供一个问题实例来调试您的代码很有帮助——因此任何人都可以实际运行您的代码。此外,#-symbol 在 cligo 中保留用于内置功能。你可以通过将它们用于其他任何事情来混淆 clgo 程序员。
-
@DuDa 感谢您的提示,我进行了相应的编辑。
标签: answer-set-programming clingo