Python cvxopt求解器qp如何工作

时间:2015-09-12 20:39:27

标签: python cvxopt

我想使用cvxopt求解器qp并计算拉格朗日乘数,但我想知道它是如何“完全”的。我试图找到更多的信息,但没有太多关于cvxopt的信息。我正在研究这个示例问题,我不确定这些变量的含义以及它们如何提出解决方案。

示例是这样的:

minimize: 2x_{1}^{2} + x_{2}^{2} + x_{1}x_{2} + x_{1} + x_{2}
subject to: x_{1} >= 0
            x_{2} >= 0
            x_{1} + x_{2} = 1

可以使用

解决
Q = 2*matrix([ [2, .5], [.5, 1] ])
p = matrix([1.0, 1.0])
G = matrix([[-1.0,0.0],[0.0,-1.0]])
h = matrix([0.0,0.0])
A = matrix([1.0, 1.0], (1,2))
b = matrix(1.0)
sol=solvers.qp(Q, p, G, h, A, b)
print(sol['x'])

2 个答案:

答案 0 :(得分:7)

你应该看看这个:

Solving QP with CVXopt

为了解决二次规划问题,CVXopt接受一组矩阵,通常称为P,q,G,A和h。 您必须先将问题转换为CVXopt接受的特定形式(在链接中提到)。 目的是找到一个最优解,(在你的例子中,拉格朗日乘数),即矩阵'x'。

“存储”解决方案的对象有许多属性,其中一个是矩阵“x”,您可以打印或用于进一步计算。

答案 1 :(得分:0)

我不确定完整设置如何工作,但是基本设置如下所示。我正在使用文档中的this example

  • c是我们要最小化的函数,2x1 + x2 = BodyPart messageBodyPart ; // Add HTML + image // first part (the html) messageBodyPart = new MimeBodyPart(); //multipart = new MimeMultipart("related"); messageBodyPart.setContent(Constantes.html + msg +"</h4>", "text/html"); // add it messageBodyPart.setDisposition(MimeBodyPart.INLINE); //multipart.addBodyPart(messageBodyPart); // second part ( image 1) BodyPart messageBodyPartSMSC = new MimeBodyPart(); DataSource fds = new FileDataSource(Constantes.imagePath + "logo1.png"); messageBodyPartSMSC.setDataHandler(new DataHandler(fds)); messageBodyPartSMSC.setHeader("Content-ID", "<logo1>"); // add image to the multipart messageBodyPartSMSC.setDisposition(MimeBodyPart.INLINE); // multipart.addBodyPart(messageBodyPart); // second part ( image 2) BodyPart messageBodyPartDEVB = new MimeBodyPart(); fds = new FileDataSource(Constantes.imagePath + "logo2.png"); messageBodyPartDEVB.setDataHandler(new DataHandler(fds)); messageBodyPartDEVB.setHeader("Content-ID", "<logo2>"); messageBodyPartDEVB.setDisposition(MimeBodyPart.INLINE); // add image to the multipart //multipart.addBodyPart(messageBodyPart); // add attachment (zip file) ------------------------------ DataSource source = new FileDataSource(fileName); BodyPart messageBodyPartZip = new MimeBodyPart(); messageBodyPartZip.setDataHandler(new DataHandler(source)); messageBodyPartZip.setFileName(onlyFileName); messageBodyPartZip.setDisposition(MimeBodyPart.ATTACHMENT); MimeMultipart multipart = new MimeMultipart("related"); multipart.addBodyPart(messageBodyPart); multipart.addBodyPart(messageBodyPartSMSC); multipart.addBodyPart(messageBodyPartDEVB); multipart.addBodyPart(messageBodyPartZip); // Send the complete message parts message.setContent(multipart); Transport.send(message);
  • b(AKA h)是约束右侧的值。
  • A(AKA G)是约束方程的系数。

约束方程是

  • -x1 + x2 <= 1
  • x1 + x2> = 2
  • x2> = 0
  • x1-2x2 <= 4

任何> =的约束都必须乘以[2,1]才能成为<=。

所以-1 还有

b=[1,-2,0,4]

解决

A = [ 
  [-1.0, -1.0, 0.0, 1.0], #x1
  [1.0, -1.0, -1.0, -2.0] #x2
]