使用quadProg库进行约束二次优化

时间:2015-06-15 09:24:29

标签: r mathematical-optimization quadprog quadratic-programming

我有一个长度为A的向量N。我还有N*N矩阵C。我想最大化以下等式:

minimize (- (w_transpose * A) + p * w_transpose * C * w)

其中w是一个长度为N的向量,其中每个w都是非负数,所有w的总和为1。

我见过一个名为quadProg的软件包。我需要指明:

Dmat = Cdvec = Abvec = w

但不确定如何在那里应用上述限制。

我想我可以提供Amat作为单位矩阵,这将使所有w非负。但不确定如何保持w标准化(总和等于零)。实际上我也可以稍后将它们标准化,但仍然想知道我是否可以在这里做到。

1 个答案:

答案 0 :(得分:2)

您可以使用quadprog中的solve.QP函数执行此操作。从?solve.QP开始,我们读到solve.QP解决了min_b {-d'b + 0.5 b'Db | A'b >= b0}形式的系统。您正在解决min_w {-A'w + pw'Cw | w >= 0, 1'w = 1}形式的问题。因此,表格之间的映射:

  • d = A(在dvec的参数中称为solve.QP
  • D = 2pC(在Dmat的参数中称为solve.QP
  • 对于第一组约束,您有I'w >= 0。最终约束可以重新表述为1'w >= 1-1'w >= -1。因此,你的A约束矩阵(Amat的参数中的solve.QP)是一个单位矩阵,右边有一个向量和一个-1向量,右边有一个b0({{在bvec)的参数中,1}}是附加1和-1的0向量。

你可以很容易地将它们放在R中:

solve.QP

您可以在一些简单的二维问题上进行测试:

library(quadprog)
solve.my.QP <- function(A, p, C) {
  solve.QP(Dmat=2*p*C,
           dvec=A,
           Amat=cbind(diag(1, length(A)), rep(1, length(A)), rep(-1, length(A))),
           bvec=c(rep(0, length(A)), 1, -1))$solution
}