考虑以下难题:
一个单元格被标记或未标记。谜题右侧和底部的数字表示特定行或列的总和。单元格对其行和列中的总和有贡献(如果标记):位置中的单元格对列总和和行总和(i,j)
有贡献。比如上图的第一行,标记了第 1、2、5 个单元格。这些对行总和有贡献(因此总共有 8 个),对它们的列总和贡献了 1。i
j
1 + 2 + 5
我在 ECLiPSe CLP 中编写了一个求解器。它工作得很好,但是对于不同的值/变量选择方法,它表现出非常奇怪的行为,我不知道为什么。(注意:拼图中的每个字段都是域 [0,1] 的决策变量,标记为 1,否则为 0。约束是显而易见的。)
如果我使用 input_order(请参阅search/6)、first_fail、occurrences 或 max_constrained,则几乎可以立即解决难题,而内存使用量很少。如果我使用最大或最小的 anti_first_fail,拼图可能需要几分钟才能完成,并且可能会占用 16GB 内存。为什么?为什么大多数约束对这些方法保持有效这么长时间?
为什么最小和 first_fail 之间有区别?如果域仅包含 2 个元素,并且所有变量具有相同的域,那么 first_fail、anti_first_fail、最大、最小和 most_constrained 应该是等价的,不是吗?删除域中的一个值会将单个值附加到该变量,因此不需要更多的传播。因此,在这种情况下,搜索将始终处理其域恰好包含 2 个项目的变量。不?