【问题标题】:Prolog Sudoku with permutationProlog数独与排列
【发布时间】: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 的列表Ls0L! 解决方案,让我们粗略估计一下您的方法在最坏的情况下可能需要多长时间。您有 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


【解决方案1】:

所以我想通了。问题在于,对于 PC 来说,使用纯粹的排列来完成这项任务实在是太大了(尽管这是任务所要求的)。解决方案是以更理想的方式重新排列排列。如上所述,它计算行、列、然后是框,最好将它们混合在一起以更轻松地完成任务。像这样:

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,
%row
 permutation([X1,X3,X5,X6],[1,3,5,6]),
 permutation([X8,X10,X11,X12],[2,4,5,6]),
 %column
 permutation([X1,X19,X25,X31],[1,2,4,5]),
 permutation([X8,X14,X20,X26,X32],[1,2,3,5,6]),
 %box
 permutation([X1,X3,X8],[2,5,6]),
 permutation([X5,X6,X10,X11,X12],[1,3,4,5,6]),
 %row
 permutation([X14,X15,X16,X17,X18],[1,2,3,4,5]),
 permutation([X19,X20,X21,X22,X23],[1,2,3,4,5]),
 %column
 permutation([X3,X15,X21,X27],[2,4,5,6]),
 permutation([X10,X16,X22,X28],[1,3,4,5]),   
 %box
 permutation([X25,X26,X27,X28,X29],[1,3,4,5,6]),
 permutation([X31,X32,X36],[2,4,5]),
%row
 permutation([X14,X15,X19,X20,X21],[1,2,3,4,5]),
 permutation([X16,X17,X18,X22,X23],[1,2,3,4,5]), 
 %column
 permutation([X5,X11,X17,X23,X29],[2,3,4,5,6]),
 permutation([X6,X12,X18,X36],[1,3,4,5]),
 %box
 permutation([X25,X26,X27,X31,X32],[1,2,4,5,6]),
 permutation([X28,X29,X36],[3,4,5]).

输出有点奇怪但正确。 Stackoverflow 再一次让我失望了,我必须回答我自己的问题。感谢各位天才的否决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多