[cplex教程]cp问题系列8


前言:cplex的安装教程已经发布在 前面的内容中了,可自行领取

cplex系列1的链接为:https://blog.csdn.net/wlgtcl/article/details/137999127?spm=1001.2014.3001.5502
cplex系列2的链接为:https://blog.csdn.net/wlgtcl/article/details/138037571?spm=1001.2014.3001.5502
cplex系列3的链接为:https://blog.csdn.net/wlgtcl/article/details/138091170?spm=1001.2014.3001.5502
cplex系列4的链接为:https://blog.csdn.net/wlgtcl/article/details/138525911?spm=1001.2014.3001.5501
cplex系列5的链接为:https://blog.csdn.net/wlgtcl/article/details/138539016?spm=1001.2014.3001.5501
cplex系列6的链接为:https://blog.csdn.net/wlgtcl/article/details/138562705?spm=1001.2014.3001.5502
cplex系列7的链接为:https://blog.csdn.net/wlgtcl/article/details/138610919?spm=1001.2014.3001.5502

n皇后问题

问题描述

  • 算法题,给定一个 n × n n \times n n×n的方格,将 n n n个皇后放到这个方格中,要求:
    • 同一行,同一列只能有一个皇后,每条对角线上也只能有一个皇后
    • 例:
      在这里插入图片描述
  • 此问题比较简单

代码与解析

  • 导包
from docplex.cp.model import CpoModel
from sys import stdout
  • 定义问题规模,实例化模型并定义NB_QUEEN个变量,表示每个皇后的位置
NB_QUEEN = 8

mdl = CpoModel()
x = mdl.integer_var_list(NB_QUEEN, 0, NB_QUEEN - 1, "X")
  • 以下的三个约束
    • 第一个约束表示每个皇后的位置均不同
    • 第二,三个约束表示对角线约束,不能有两个皇后在同一个对角线上
mdl.add(mdl.all_diff(x))
mdl.add(mdl.all_diff(x[i] + i for i in range(NB_QUEEN)))
mdl.add(mdl.all_diff(x[i] - i for i in range(NB_QUEEN)))
  • 求解与打印结果
print("Solving model....")
msol = mdl.solve(TimeLimit=10, agent='local',
                 execfile=r'C:\Program Files\IBM\ILOG\CPLEX_Enterprise_Server1210\CPLEX_Studio\cpoptimizer\bin\x64_win64\cpoptimizer.exe')

# Print solution
if msol:
    stdout.write("Solution:")
    for v in x:
        stdout.write(" {}".format(msol[v]))
    stdout.write("\n")
    # Draw chess board
    for l in range(NB_QUEEN):
        qx = msol[x[l]]
        for c in range(NB_QUEEN):
            stdout.write(" ")
            stdout.write("Q" if c == qx else ".")
        stdout.write("\n")
else:
    stdout.write("Solve status: {}\n".format(msol.get_solve_status()))
  • 结果
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值