基于SAT来求解N皇后问题

本文介绍了如何通过配置环境并利用Python的Sat求解器Glucose3解决N皇后问题,提供了具体的代码示例,展示了如何计算不同大小的N皇后问题解的数量和打印解决方案。
摘要由CSDN通过智能技术生成

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}")

 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值