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

时间:2019-04-17 12:16:13

标签: r optimization constraints mathematical-optimization minimization

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

问题:最小x ^ T H x

(1)e ^ T * x = 1

(2)0

Schedule是20x20的矩阵,而H是长度为20的矢量的向量。

我该怎么做?我看过eoptimizeoptim,但不知怎么开始。

我开始创建目标函数:

optimix

和约束(1)

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

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

我也不知道哪个优化功能适合该问题。 感谢您的任何建议。

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

2 个答案:

答案 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) = 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