解决CSP时启发式的奇怪行为

时间:2016-05-22 21:40:16

标签: prolog clpfd eclipse-clp

考虑以下难题:

Kakurasu

单元格已标记或未标记。拼图右侧和底侧的数字表示某行或列的总和。单元格(如果已标记)对其行和列中的总和做出贡献:位置(i,j)中的单元格向列总和提供i,向行总和提供j。例如,在上图中的第一行中,标记了第1,第2和第5个单元格。这些对行总和贡献1 + 2 + 5(因此总计为8),每列为其总和。

我已经在ECLiPSe CLP写了一个求解器。它工作得很好,但它对不同的值/变量选择方法表现出非常奇怪的行为,我不知道为什么。 (注意:拼图中的每个字段都是域[0,1]的决策变量,如果标记为1则为0,否则为0。约束条件很明显。)

如果我使用input_order(参见search/6),first_fail,occurences或max_constrained,谜题几乎可以在几乎没有内存使用的情况下立即解决。如果我使用anti_first_fail,最大或最小,谜题可能需要几分钟才能完成并可能吃掉高达16GB的ram 。为什么?为什么大多数约束对这些方法保持活跃这么长时间?

为什么两者之间存在差异?最小和first_fail?如果域只包含2个元素,并且所有变量都具有相同的域,那么first_fail,anti_first_fail,maximum,smallest和most_constrained应该是等价的,不是吗?删除域中的一个值会将单个值附加到该变量,因此不再需要传播。因此,在这种情况下,搜索将始终处理其域正好由2个项组成的变量。否?

0 个答案:

没有答案