N クイーン問題:
この問題は、サイズが N × N のチェス盤が与えられたときに、互いに脅威を与えずに N 個のクイーンを盤上に配置できるさまざまな順列を見つけることを示しています。
私の質問は次のとおりです。
プログラムが妥当な時間内に答えを計算できる N の最大値は何ですか? または、これまでに見た最大の N は?
CLPFD(Prolog)での私のプログラムは次のとおりです。
generate([],_).
generate([H|T],N) :-
H in 1..N ,
generate(T,N).
lenlist(L,N) :-
lenlist(L,0,N).
lenlist([],N,N).
lenlist([_|T],P,N) :-
P1 is P+1,
lenlist(T,P1,N).
queens(N,L) :-
generate(L,N),lenlist(L,N),
safe(L),
!,
labeling([ffc],L).
notattack(X,Xs) :-
notattack(X,Xs,1).
notattack(X,[],N).
notattack(X,[Y|Ys],N) :-
X #\= Y,
X #\= Y - N,
X #\= Y + N,
N1 is N + 1,
notattack(X,Ys,N1).
safe([]).
safe([F|T]) :-
notattack(F,T),
safe(T).
このプログラムは問題なく動作しますが、所要時間は N とともに増加し続けます。実行例を次に示します。
?- queens(4,L).
L = [2, 4, 1, 3] ;
L = [3, 1, 4, 2] ;
No
これは、列 1 の行 2、列 2 の行 4、列 2 の行 1、行 3 の列 4 に 4 つのクイーンを配置することを意味します (4 x 4 のチェス盤で)。
次に、このプログラムがどのように実行されるかを見てみましょう (最初の順列の計算にかかる時間):
N=4,5.....10 の場合 1 秒以内に計算
N=11-30 の場合 -1-3 秒かかります
N=40 の場合..50 それでも1分以内に計算
N=60で グローバルスタックから抜けます(探索空間が膨大)。
これは過去の宿題の問題でした。(元の問題は、N-Queen をコーディングすることだけでした)
また、他の言語での代替実装 (私の実装よりもパフォーマンスが高い) を見ることにも興味があります。または、アルゴリズム/プログラムに改善の余地があるかどうか