一尘不染

解决N皇后问题……我们能走多远?

algorithm

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

这意味着您将4个皇后放在第1列的第2行,第2列的第4行,第3列的第1行和第4列的第3行中(在4×4棋盘中)

现在让我们看一下该程序的执行方式(计算第一个排列所花费的时间):
对于N = 4,5 ..... 10,在一秒钟内计算
对于N = 11-30,需要-1-3秒,
对于N = 40 ..50仍在一分钟内仍在计算
N = 60时,它超出了全局堆栈(搜索空间很大)。

这是过去的作业问题。(最初的问题只是编码N-Queens)

我也有兴趣看到其他语言的替代实现(其性能比我的实现更好),或者我的算法/程序是否还有改进的余地


阅读 243

收藏
2020-07-28

共1个答案

一尘不染

pycon的raymond hettinger提出的一个简短解决方案:python中的easy
ai

#!/usr/bin/env python
from itertools import permutations
n = 12
cols = range(n)
for vec in permutations(cols):
    if (n == len(set(vec[i] + i for i in cols))
          == len(set(vec[i] - i for i in cols))):
        print vec

尽管(O(n!)),但计算所有排列是不可扩展的

2020-07-28