我真的是CVXPY的新手。我正在尝试解决8 queens problem,即在8 x 8的棋盘上放置8个国际象棋皇后的问题,这样就不会有两个女王互相威胁。据我了解,约束应该是:
此外,目标函数应该是:最大化矩阵的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()
任何帮助将不胜感激!
答案 0 :(得分:2)
我已经在评论中说过:
Maximize(norm(x))
导致问题不凸。 CVXPY仅用于凸问题。
8皇后问题。您尝试使用非凸目标绕过此目标。通常这不起作用:
通常,不能通过技巧使“本质上困难,离散的问题”变得“易于解决”。另一个这样的技巧是使用约束x(1-x)=0
。这也遇到了同样的问题:您需要一个全局求解器来解决一个困难的非凸问题。因此,最好坚持使用带有二进制变量的线性公式。如果有一种简单的方法可以使这种凸面和连续性基本上消失,那么MIP求解器开发人员将倒闭。另一方面,如果您发现这样的转变,我相信诺贝尔奖将会等着您。
此外,如评论中所述,请注意
3. sum of each diagonal equals to 1.
应阅读
3. sum of each diagonal <= 1.