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)
我也有兴趣看到其他语言的替代实现(其性能比我的实现更好),或者我的算法/程序是否还有改进的余地
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!)),但计算所有排列是不可扩展的
O(n!)