在目标函数中具有a_ix_i ^ 2项的二次规划

时间:2016-12-22 16:58:12

标签: r matrix quadratic-programming quadprog

关于二次规划,我如何设置像

这样的目标函数

min⁡Σa_i(x_i)^ 2

以包“quadprog”或“limSolve”的矩阵形式(对于这个包,我不确定它是否需要以矩阵形式)?

从我到目前为止所看到的讨论来看,二次项没有增加。

1 个答案:

答案 0 :(得分:2)

让我们考虑一下您提到的形式的简单线性约束二次规划:

min  0.5x^2 + 0.7y^2
s.t. x + y = 1
     x >= 0
     y >= 0

使用quadprog

的解决方案

quadprog包接受以下格式的模型:

min −d'b + 1/2b'Db
s.t. A'b >= b0

要将我们的问题纳入此表单,我们需要构建一个以D为主对角线的矩阵(2*0.5 2*0.7),以及一个带有三个约束和右边的矩阵A手边b0

dvec <- c(0, 0)
Dmat <- diag(c(1.0, 1.4))
Amat <- rbind(c(1, 1), c(1, 0), c(0, 1))
bvec <- c(1, 0, 0)
meq <- 1  # The first constraint is an equality constraint

现在我们可以将其提供给solve.QP

library(quadprog)
solve.QP(Dmat, dvec, t(Amat), bvec, meq=meq)$solution
# [1] 0.5833333 0.4166667

使用limSolve

的解决方案

limSolve包的lsei函数接受以下格式的模型:

min  ||Ax-b||^2
s.t. Ex = f
     Gx >= h

为了获得我们的目标函数,我们需要构造矩阵A,其中(sqrt(0.5) sqrt(0.7))为主对角线,将b设置为0向量,以及编码其他对象的矩阵和向量信息:

A <- diag(c(sqrt(0.5), sqrt(0.7)))
b <- c(0, 0)
E <- rbind(c(1, 1))
f <- 1
G <- diag(2)
h <- c(0, 0)

现在我们可以将此信息提供给lsei

library(limSolve)
lsei(A, b, E, f, G, h)$X
# [1] 0.5833333 0.4166667