我想用R中的两个约束来解决最小化问题。
问题:min x ^ THx s.t
(1)e ^ T * x = 1,
(2)0 <x_i <= 1,i = 1,..,20。
H
是20x20矩阵,e
是长度为20的那些
我怎样才能做到这一点?我看着optimize
,optim
和optimix
,但不知怎的,我不知道如何开始。
我开始创建我的目标函数:
f<- function(x) {t(x)%*%H%*%x}
和约束(1)
g<- function(x) {t(e)*x=1}
但我不知道如何制定约束(2)。
我也不知道哪个优化函数适合这个问题。我很感谢任何建议。
最后我想收到一个带有20个值的向量x。
以下是如何处理CVXR
包。
注意,(1)与sum(x_i) = 1
相同,并且(2)可以简化为x_i > 0
,因为sum(x_i) = 1
和x_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
检查quadprog
包。它有一个函数solve.QP
to解决以下二次规划:
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
希望这可以帮助。