如何在R中使用NLopt的nloptr接口实现内置最大化功能
在R的nloptr中启用NLopt内置最大化功能
要使用NLopt的内置符号翻转实现最大化,无需手动对目标函数取负,只需在nloptr()的opts参数列表中添加"objective" = "maximize"即可。
关键说明:
- 目标函数直接传入原最大化目标
eval_f0,无需包裹取负的匿名函数。 - 不等式约束
eval_g_ineq的要求始终是返回值≤0,与最大化/最小化模式无关,只需确保约束函数的返回值符合这一逻辑即可(无需额外翻转符号,除非原约束方向需要调整)。
修改后的示例代码
library(nloptr) # 目标函数(直接定义为需要最大化的形式) eval_f0 <- function( x, a, b ){ return( - sqrt(x[2]) ) } # 约束函数:返回值需满足 ≤0(对应原约束 x2 ≥ (a*x1 + b)^3) eval_g0 <- function( x, a, b ) { return( (a*x[1] + b)^3 - x[2] ) } # 定义参数 a <- c(2,-1) b <- c(0, 1) # 使用NLOPT_LN_COBYLA算法,启用内置最大化功能 nloptr(x0 = c(1.234, 5.678), eval_f = eval_f0, # 直接传入原目标函数 lb = c(-Inf, 0), ub = c(Inf, Inf), eval_g_ineq = eval_g0, # 无需手动取负 opts = list( "algorithm" = "NLOPT_LN_COBYLA", "objective" = "maximize" # 启用最大化模式 ), a = a, b = b)
内容的提问来源于stack exchange,提问作者Lukas D. Sauer
相关产品推荐
相关产品推荐

