Проблема N-Куинса:
Эта проблема гласит, что, учитывая шахматную доску размером N на N, найдите различные перестановки, в которых N досок могут быть помещены на доску, не угрожая друг другу.
Мой вопрос:
Какое максимальное значение N, для которого программа может рассчитать ответ в разумные сроки? Или какой самый большой N мы видели до сих пор?
Вот моя программа в CLPFD (Пролог):
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
Это означает, что вы помещаете 4 королевы в строку 2 в столбце 1, строку 4 в столбце 2, строку 1 в 3 и строку 3 в 4. (В шахматной доске 4 на 4)
Теперь давайте посмотрим, как работает эта программа (время, затрачиваемое на вычисление первой перестановки):
Для N = 4,5..... 10 вычислений в секунду
Для N = 11-30 занимает от -1-3 секунд
Для N = 40..50 еще рассчитывается в течение минуты
При N = 60 он выходит из глобального стека (пространство поиска огромно).
Это была проблема с домашним заданием в прошлом. (Первоначальной проблемой было просто закодировать N-Queens)
Я также заинтересован в том, чтобы увидеть альтернативные реализации на других языках (которые работают лучше, чем моя реализация) или есть ли возможности для улучшения в моем алгоритме/программе