【发布时间】:2015-05-07 11:45:17
【问题描述】:
这是数独,每个 X 是 6x6 数独中的一个框,我们将给出我一开始尝试设置的数独。认为这个策略会奏效,但我想不会:我 “设置 X 的已知值,然后生成所需的排列并测试是否符合问题约束。” 需要帮忙!我不知道为什么这行不通! 这是更新的版本,prolog 仍然没有响应 true 或 false。只是在不告诉我数独的解决方案是什么的情况下匆匆离开。它还使用了我 98% 的 cpu,而它没有响应,所以去想一想。谁能帮帮我?
sudoku(X1,X2,X3,X4,X5,X6,X7,X8,
X9,X10,X11,X12,X13,X14,X15,X16,X17,
X18,X19,X20,X21,X22,X23,X24,X25,X26,
X27,X28,X28,X30,X31,X32,X33,X34,X35,X36):-
X2=4,
X4=2,
X7=3,
X9=1,
X13=6,
X24=6,
X30=2,
X33=3,
X34=6,
X35=1,
permutation([X1,X3,X5,X6],[1,3,5,6]),
permutation([X8,X10,X11,X12],[2,4,5,6]),
permutation([X14,X15,X16,X17,X18],[1,2,3,4,5]),
permutation([X19,X20,X21,X22,X23],[1,2,3,4,5]),
permutation([X25,X26,X27,X28,X29],[1,3,4,5,6]),
permutation([X31,X32,X36],[2,4,5]),
permutation([X1,X19,X25,X31],[1,2,4,5]),
permutation([X8,X14,X20,X26,X32],[1,2,3,5,6]),
permutation([X3,X15,X21,X27],[2,4,5,6]),
permutation([X10,X16,X22,X28],[1,3,4,5]),
permutation([X5,X11,X17,X23,X29],[2,3,4,5,6]),
permutation([X6,X12,X18,X36],[1,3,4,5]),
permutation([X1,X3,X8],[2,5,6]),
permutation([X5,X6,X10,X11,X12],[1,3,4,5,6]),
permutation([X14,X15,X19,X20,X21],[1,2,3,4,5]),
permutation([X16,X17,X18,X22,X23],[1,2,3,4,5]),
permutation([X25,X26,X27,X31,X32],[1,2,4,5,6]),
permutation([X28,X29,X36],[3,4,5]).
【问题讨论】:
-
permutation([X1,X3,X4,X5,X6],[1,3,5,6]),永远不会成功。(:=)/2是什么意思? -
只是一个小评论:考虑到
permutation(Ls0, Ls)对于长度为L的列表Ls0有L!解决方案,让我们粗略估计一下您的方法在最坏的情况下可能需要多长时间。您有 18 个或多或少的permutation/2独立调用,它们的参数平均(粗略估计)长度为 5。因此,我们预计在最坏的情况下,必须考虑(5!)^18的潜在解决方案。这大约是 10^38。如果您还考虑每秒可以生成多少亿个解决方案,您可以粗略估计完成这需要多长时间。 -
建议你用constraints来表达不同变量之间的关系,而不是穷举搜索潜在解决方案的整个空间,以便无法扩展到解决方案的子配置尽快跳过。例如,查看
dif/2或有限域约束。 -
当然,因此您可以使用例如几个
dif/2目标来表达这一点。dif/2是最基本的约束之一,例如=/2。在这个具体的案例中,由于您正在推理整数,我建议使用有限域约束,其中all_different/1之类的约束已经可用。 -
查看sample code 以使用 SICStus Prolog 解决数独问题!
标签: prolog permutation sudoku