Проблема 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)
Мне также интересно увидеть альтернативные реализации на других языках (которые работают лучше, чем моя реализация) или есть ли возможности для улучшения моего алгоритма / программы
length/2
. Я не могу комментировать CLPFD, но считаю, что встроенные модули обычно реализуются в сильно оптимизированном коде нижнего уровня, а не в самом прологе. Таким образом, вы также можете уменьшить размер кода и воспользоваться возможными оптимизациями, которые, возможно, уже были сделаны для вас. - person nedned   schedule 08.12.2009generate/2
неверен. - person false   schedule 22.07.2015