序言 我必须编写一个程序来计算魔法矩阵排列

标签 prolog magic-square

我必须编写一个计算魔法矩阵的程序,我已经编写了我的代码并且它可以工作,但是我的排列非常慢。 我需要一个更快的人可以帮助我请

这是代码:

diabolico([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P]) :- 
    permutar([1,14,3,16,5,12,13,15,9,10,11,6,7,2,8,4],[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P]),
    A+B+C+D=:=34, E+F+G+H=:=34, I+J+K+L=:=34, M+N+O+P=:=34,
    A+E+I+M=:=34, B+F+J+N=:=34, C+G+K+O=:=34, D+H+L+P=:=34,
    M+B+G+L=:=34, I+N+C+H=:=34, E+J+O+D=:=34, A+F+K+P=:=34,
    P+C+F+I=:=34, L+O+B+E=:=34, H+K+N+A=:=34, D+G+J+M=:=34.   

permutar([],[]). 
permutar([X|Y], Z):-
    permutar(Y,L),
    insertar(X,L,Z). 

insertar(E,L,[E|L]). 
insertar(E, [X|Y], [X|Z]):-
    insertar(E, Y, Z).

最佳答案

您可以尝试使用 permutation/2,也许它比您的更快(我不确定,应该对其进行基准测试)。不管怎样,排列通常需要不同的方法,例如 CLP(FD)。我复制了你的代码,并修改了它:

:- use_module(library(clpfd)).

diabolico([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P]) :-
 Vs = [A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P],
 Vs ins 1..16,
 all_different(Vs),
 A+B+C+D#=34,
 E+F+G+H#=34,
 I+J+K+L#=34,
 M+N+O+P#=34,
 A+E+I+M#=34,
 B+F+J+N#=34,
 C+G+K+O#=34,
 D+H+L+P#=34,
 M+B+G+L#=34,
 I+N+C+H#=34,
 E+J+O+D#=34,
 A+F+K+P#=34,
 P+C+F+I#=34,
 L+O+B+E#=34,
 H+K+N+A#=34,
 D+G+J+M#=34,
 label(Vs).

writerows([]).
writerows([A,B,C,D|Rs]) :-
 format('~|~t~d~3+~|~t~d~3+~|~t~d~3+~|~t~d~3+~n', [A,B,C,D]),
 writerows(Rs).

这是一个示例:

?- diabolico(X), writerows(X).
  1  8 10 15
 12 13  3  6
  7  2 16  9
 14 11  5  4
X = [1, 8, 10, 15, 12, 13, 3, 6, 7|...] ;
  1  8 10 15
 14 11  5  4
  7  2 16  9
 12 13  3  6
X = [1, 8, 10, 15, 14, 11, 5, 4, 7|...] ;
  1  8 11 14
 12 13  2  7
  6  3 16  9
 15 10  5  4
X = [1, 8, 11, 14, 12, 13, 2, 7, 6|...] 
...

我对你的 permutar/2 实现表示赞赏:它比 permutation/2 好得多:

?- X=[1,2,3,4,5,6,7,8], time(aggregate(count,X^Y^permutation(X,Y),C)).
% 328,837 inferences, 0.171 CPU in 0.172 seconds (99% CPU, 1927406 Lips)
X = [1, 2, 3, 4, 5, 6, 7, 8],
C = 40320.

?- X=[1,2,3,4,5,6,7,8], time(aggregate(count,X^Y^permutar(X,Y),C)).
% 86,597 inferences, 0.079 CPU in 0.081 seconds (99% CPU, 1091190 Lips)
X = [1, 2, 3, 4, 5, 6, 7, 8],
C = 40320.

唉,那么我最初的建议就完全没用了...

关于序言 我必须编写一个程序来计算魔法矩阵排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23939565/

相关文章:

python - 优化幻方生成时出现问题

c - 暴力破解幻方时出现堆栈溢出错误。有什么可能的解决办法吗?

prolog - Prolog 中的逻辑 'not' 是什么?

prolog - 定义规则时使用分号

lambda - 在 prolog 中的谓词内定义谓词

Prolog:编写一个像 Jeopardy 中的 Watson 一样的程序

prolog - 相邻涉及第一个和最后一个元素,Prolog

c++ - 我如何编写一个程序来读取一个整数方阵并确定它是否是幻方?

java - 二维数组对角线和

Prolog 和 Magic Squares 与 CLPFD