Проблема 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)
Мне также интересно видеть альтернативные реализации на других языках (которые работают лучше, чем моя реализация) или Если есть место для улучшения в моем алгоритме / программе