将特定约束输入 cvxopt QP
inputting specific constraints into cvxopt QP
我有一个相当复杂的二次问题,我试图在 python 中解决,但是,为了这个问题 - 我正在大大简化手头的问题。
我试图在满足以下约束条件的同时最小化以下二次函数:
minimize 0.5 * x.T * P * x + q.T * x
where:
x >= 0
x[0] >= 1.5
x[n] >= 1.5 # n = last element
我在scipy.optimize中写了等价物:
def minimize_func(x,y,P):
return 0.5*np.dot(x.T,np.dot(P,x)) + np.dot(y.T,x)
cons = ({'type':'ineq','fun': lambda x: x},
{'type':'ineq','fun': lambda x: x[0] - 1.5},
{'type':'ineq','fun': lambda x: x[n] - 1.5})
但是,我的问题是如何在 cvxopt 二次求解器中输入特定约束?
我查看了 cvxopt 文档页面,none 他们给出的示例似乎与我的 question.I 相关,我正在寻找输入元素明智的约束。任何帮助是极大的赞赏。
cvxopt 专注于自然矩阵形式,对于不了解内部结构的人来说,这可能看起来很低级。
所有你需要的都记录在案in the user-manual
cvxopt.solvers.qp(P, q[, G, h[, A, b[, solver[, initvals]]]])
解决:
假设 n=3
和你的约束(我假设 0-indexing -> n-1 是最后一个元素):
x >= 0
x[0] >= 1.5
x[n-1] >= 1.5 # n-1 = last element
这看起来像:
G =
-1 0 0
0 -1 0
0 0 -1
h = -1.5
0
-1,5
道理很简单:
- 1 * x[0] + 0 * x[1] + 0 * x[2] <= -1.5
<-> - x[0] <= -1.5
<-> x[0] >= 1.5
(我们在这里忽略了 x[0]
和 x[1]
的非负约束,因为 >= 1.5
更具限制性)
numpy/scipy 和 co 中有很多辅助函数。更容易做到这一点(例如 np.eye(n)
)。
一般来说,我建议使用 cvxpy,这是一个更高级的建模工具,也允许调用 cvxopt 的求解器。
我有一个相当复杂的二次问题,我试图在 python 中解决,但是,为了这个问题 - 我正在大大简化手头的问题。
我试图在满足以下约束条件的同时最小化以下二次函数:
minimize 0.5 * x.T * P * x + q.T * x
where:
x >= 0
x[0] >= 1.5
x[n] >= 1.5 # n = last element
我在scipy.optimize中写了等价物:
def minimize_func(x,y,P):
return 0.5*np.dot(x.T,np.dot(P,x)) + np.dot(y.T,x)
cons = ({'type':'ineq','fun': lambda x: x},
{'type':'ineq','fun': lambda x: x[0] - 1.5},
{'type':'ineq','fun': lambda x: x[n] - 1.5})
但是,我的问题是如何在 cvxopt 二次求解器中输入特定约束?
我查看了 cvxopt 文档页面,none 他们给出的示例似乎与我的 question.I 相关,我正在寻找输入元素明智的约束。任何帮助是极大的赞赏。
cvxopt 专注于自然矩阵形式,对于不了解内部结构的人来说,这可能看起来很低级。
所有你需要的都记录在案in the user-manual
cvxopt.solvers.qp(P, q[, G, h[, A, b[, solver[, initvals]]]])
解决:
假设 n=3
和你的约束(我假设 0-indexing -> n-1 是最后一个元素):
x >= 0
x[0] >= 1.5
x[n-1] >= 1.5 # n-1 = last element
这看起来像:
G =
-1 0 0
0 -1 0
0 0 -1
h = -1.5
0
-1,5
道理很简单:
- 1 * x[0] + 0 * x[1] + 0 * x[2] <= -1.5
<-> - x[0] <= -1.5
<-> x[0] >= 1.5
(我们在这里忽略了 x[0]
和 x[1]
的非负约束,因为 >= 1.5
更具限制性)
numpy/scipy 和 co 中有很多辅助函数。更容易做到这一点(例如 np.eye(n)
)。
一般来说,我建议使用 cvxpy,这是一个更高级的建模工具,也允许调用 cvxopt 的求解器。