我想解决R中有两个约束的最小化问题。
问题:最小x ^ T H x
(1)e ^ T * x = 1
(2)0 我该怎么做?我看过 我开始创建目标函数: 和约束(1) 但我不知道如何制定约束条件(2)。 我也不知道哪个优化功能适合该问题。
感谢您的任何建议。 最后,我想接收带有20个值的向量x。Schedule
是20x20的矩阵,而H
是长度为20的矢量的向量。e
,optimize
和optim
,但不知怎么开始。 optimix
f<- function(x) {t(x)%*%H%*%x}
答案 0 :(得分:0)
检查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
希望这会有所帮助。
答案 1 :(得分:0)
这里是处理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