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

问题描述 投票:0回答:2

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

问题:min x ^ THx s.t

(1)e ^ T * x = 1,

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

H是20x20矩阵,e是长度为20的那些

我怎样才能做到这一点?我看着optimizeoptimoptimix,但不知怎的,我不知道如何开始。

我开始创建我的目标函数:

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

和约束(1)

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

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

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

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

r optimization constraints mathematical-optimization minimization
2个回答
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

0
投票

检查quadprog包。它有一个函数solve.QPto解决以下二次规划:

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

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.