前言: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()))
- 结果