如何最小化具有两个约束的 R 中的函数?

How to minimize a function in R with two constraints?

我想用 R 中的两个约束解决最小化问题。

问题:最小 x^THx s.t

(1) e^T*x = 1,

(2) 0 < x_i <= 1 , i=1,..,20.

H 是一个 20x20 矩阵,e 是长度为 20

的向量

我该怎么做?我查看了 optimizeoptimoptimix,但不知如何开始。

我开始创建我的 objective 函数:

f<- function(x) {t(x)%*%H%*%x}

和约束(1)

g<- function(x) {t(e)*x=1}

但我不知道如何制定约束条件(2)。

我也不知道哪个优化函数适合这个问题。 我感谢任何建议。

最后我想接收一个有 20 个值的向量 x。

检查 quadprog 包。 它有一个函数solve.QP来求解下面的二次规划:

min(-d^T b + 1/2 b^T D b) 约束 A^T b >= b_0.

在你的例子中 D=H*2,d = 0。

以下是如何为您的问题构建矩阵 A 和向量 b0:

Amat <- t(rbind(rep(1, n), diag(1, 20), -diag(1, 20))
b0 <- c(1, rep(0, 20), rep(-1, 20))

那你可以运行

library(quadprog)
solve.QP(Dmat = 2*H, dvec = 0, Amat = Amat, bvec = b0, meq = 1)

注意meq = 1表示第一个不等式应该是等式。

如果您只想要最优的 x 值,那么试试这个:

solve.QP(Dmat = 2*H, dvec = 0, Amat = Amat, bvec = b0, meq = 1)$solution

希望对您有所帮助。

下面是如何使用 CVXR 包。

注意(1)与sum(x_i) = 1相同,(2)可以简化为x_i > 0,因为sum(x_i) = 1x_i > 0 =>x_i <= 1

H <- rWishart(1, df = 30, diag(20))[,,1] # a 20x20 symmetric positive matrix

library(CVXR)

# the variable
x <- Variable(20)

# objective 
objective <- Minimize(quad_form(x, H))

# define problem
constraint1 <- sum(x) == 1
constraint2 <- x > 0
problem <- Problem(objective, constraints = list(constraint1, constraint2))

# solve problem
result <- solve(problem)

# results
result$getValue(x) # optimal x
result$value # value of objective at optimal x