使用 R nloptr 包最小化 - 多个相等约束

Minimization with R nloptr package - multiple equality constraints

提问人:Paweł Orliński 提问时间:7/15/2015 最后编辑:989Paweł Orliński 更新时间:1/4/2021 访问量:4972

问:

是否可以在 R 的函数中指定多个相等约束?我尝试运行的代码如下:nloptr

eval_f <- function( x ) {
  return( list( "objective" = x[3]^2+x[4]^2,
                "gradient" = c( 0,
                                0,
                                2*x[3],
                                2*x[4] ) ) )
}
# constraint functions
# equalities
eval_g_eq <- function( x ) {
  constr <- c( x[1] + x[2] + x[3] - 4,  
               x[1]^2 + x[2]^2 + x[4] - 15
  )
  grad <- c( c(1, 1, 1, 0),
             c(2*x[1], 2*x[2], 0, 1)
  )
  return( list( "constraints"=constr, "jacobian"=grad ) )
}
# initial values
x0 <- c( 1, 5, 5, 1 )
local_opts <- list( "algorithm" = "NLOPT_LD_MMA",
                    "xtol_rel" = 1.0e-7 )
opts <- list( "algorithm" = "NLOPT_LD_AUGLAG",
              "xtol_rel" = 1.0e-7,
              "maxeval" = 1000,
              "local_opts" = local_opts )
res <- nloptr( x0=x0,
               eval_f=eval_f,
               eval_g_eq=eval_g_eq,
               opts=opts)
print( res )

它产生的结果如下:

Current value of controls: -1.035323 3.093593 2.409501 0.2708714

但是,这些值不具有相等约束,即

-1.035323 + 3.093593 + 2.409501 = 4.467771
(-1.035323)^2 + 3.093593^2 + 0.2708714 = 10.91308

我想要么不可能在函数中指定多个相等约束,要么我以错误的方式传递了它们。 我在包文档中没有发现任何具有多个相等约束的示例。nloptr

更新

好的,我解决了。情况是,指定 和 in 应该使用 代替 .constrgradeval_g_eqrbind()c()

r 约束 相等 非线性优化 nlopt

评论

0赞 Colonel Beauvel 7/15/2015
您想要的质量限制是什么?第一平方、第二平方和第四的总和等于 15?
0赞 Paweł Orliński 7/15/2015
是的,这正是我想要的。
0赞 Abhishek Singh 5/29/2017
嗨,请让我知道这是否可用于需求优化的价格。我想使用NLP。

答:

0赞 cmilando 1/4/2021 #1

我最近在另一篇文章中回答了这个问题,用于不等式约束,但您也应该能够在向量中返回多个相等约束c()

“多重不等式约束” - 使用 R nloptr 包进行最小化