为 CVXOPT 提供的 QP 求解器可解决以下形式的问题(请参阅 http://cvxopt.org/userguide/coneprog.html#quadratic-programming ):
Minimize
(1/2)*x.t*P*x + q.T*x
Subject to
G*x <= h
A*x = b
这工作得很好,但是当想要解决两侧不等式约束的问题时,它会变得有点尴尬:
Minimize
(1/2)*x.t*P*x + q.T*x
Subject to
G1*x <= h1
G2*x >= h2
A*x = b
我可以将第二个问题重新定义为第一个问题,方法是将维度数量加倍并要求 new_x
成为old_x
堆叠在自身之上:
new_x = [old_x]
[old_x]
我认为我可以通过为A
找到合适的形式来强制执行上述条件。 。然后我可以对 h1
进行编码和h2
不平等进入new_G * new_x <= new_h
通过设置new_h
成为h1
堆积在 h2
和new_G
是一个对角矩阵 n
连续 1
s 后跟 n
连续 -1
s 在对角线上。
无论如何,上面的方法非常笨拙,它使我的问题的维度加倍,甚至可能不起作用。
在 CVXOPT 中是否有更好的方式来表达第二个问题?
最佳答案
Minimize
(1/2)*x.T*P*x + q.T*x
Subject to
new_G * x <= new_h
A * x = b
哪里
new_G = [G1;-G2],
new_h = [h1;-h2].
(G1 - matrix m1*n, G2 - matrix m2*n, new_G - matrix (m1 + m2)*n)
new_G = numpy.concatenate( ( G1, -G2 ), axis = 0 )
new_h = numpy.concatenate( ( h1, -h2 ), axis = 1 )
`
关于python - CVXOPT二次编程接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27376572/