1.需要提前配置环境
输入命令:
pip stall python-sat
运行结果:
2.代码基于SAT求解,可以计算出N皇后问题解的个数,并打印结果,如下图4皇后问题的求解结果:
3.注意:代码中设置了变量n,用来求解不同的N皇后问题,根据需要自行更改
代码如下:
from pysat.solvers import Glucose3
def n_queens_sat(n):
solutions = []
g = Glucose3()
#每行至少一个皇后
for i in range(n):
clause = [n * i + j + 1 for j in range(n)]
g.add_clause(clause)
# 每行最多一个皇后
for i in range(n):
for j in range(n):
for k in range(j + 1, n):
g.add_clause([-n * i - j - 1, -n * i - k - 1])
# 没有两个皇后在同一列
for i in range(n):
for j in range(n):
for k in range(j + 1, n):
g.add_clause([-n * j - i - 1, -n * k - i - 1])
# 没有两个皇后在同一对角线
for i in range(n):
for j in range(n):
for k in range(1, n):
if i + k < n and j + k < n:
g.add_clause([-n * i - j - 1, -n * (i + k) - (j + k) - 1])
if i + k < n and j - k >= 0:
g.add_clause([-n * i - j - 1, -n * (i + k) - (j - k) - 1])
# Solve the SAT instance
while g.solve():
model = g.get_model()
solution = [(i % n) + 1 for i in model if i > 0]
solutions.append(solution)
blocking_clause = [-lit for lit in model]
g.add_clause(blocking_clause)
return solutions
#此处修改n的值可以求解n皇后问题,此处为4皇后问题
n=4
solutions = n_queens_sat(n)
print(n,"皇后解的个数为:", len(solutions))
for idx, solution in enumerate(solutions):
print(f"Solution {idx + 1}: {solution}")