如何使用CVXPY解决8个皇后问题?

时间:2019-02-12 14:26:58

标签: python optimization mathematical-optimization n-queens cvxpy

我真的是CVXPY的新手。我正在尝试解决8 queens problem,即在8 x 8的棋盘上放置8个国际象棋皇后的问题,这样就不会有两个女王互相威胁。据我了解,约束应该是:

  1. 每行的总和等于1。
  2. 每列的总和等于1。
  3. 每个对角线的
  4. 总和等于1。
  5. 所有变量均应大于0。

此外,目标函数应该是:最大化矩阵的2范数(这样我们就只能得到1和0,因为我们也可以用float得到1的和,但范数是1零的值大于0到1之间的浮点数的范数,该浮点数也等于1(例如:0.8 ^ 2 + 0.2 ^ 2 <1 ^ 2 + 0 ^ 2)。

是否可以在CVXPY中解决此类问题?我对如何在CVXPY中形成约束和目标函数一无所知,但这是我最初的尝试(我立即遇到了“ DCP错误”,因此我没有理由继续,但是仍然):

from cvxpy import *
x=Variable(shape=(9,9), name='board')
obj = Maximize(norm(x))
const = [sum(x, axis=1)==1]
prob=Problem(objective=obj,constraints=const)
prob.solve()

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

我已经在评论中说过:

Maximize(norm(x))导致问题不凸。 CVXPY仅用于凸问题。

通常用二进制变量link)建模

8皇后问题。您尝试使用非凸目标绕过此目标。通常这不起作用:

  • 凸解决方案不会接受您的问题
  • 本地NLP求解器将最终达到局部最优状态
  • 因此需要全局NLP求解器(例如Baron,Antigone或Couenne)。但这并不比使用线性MIP求解器容易。

通常,不能通过技巧使“本质上困难,离散的问题”变得“易于解决”。另一个这样的技巧是使用约束x(1-x)=0。这也遇到了同样的问题:您需要一个全局求解器来解决一个困难的非凸问题。因此,最好坚持使用带有二进制变量的线性公式。如果有一种简单的方法可以使这种凸面和连续性基本上消失,那么MIP求解器开发人员将倒闭。另一方面,如果您发现这样的转变,我相信诺贝尔奖将会等着您。

此外,如评论中所述,请注意

3. sum of each diagonal equals to 1.

应阅读

3. sum of each diagonal <= 1.