单纯形法是一种局部算法,它不允许您找到不同的局部最优值,而只能找到一个最优值(全局或局部)。您可以使用多级单链接算法之类的方法迭代您的单纯形优化,该算法将为您的单纯形找到不同的起点,具体取决于先前单纯形的结果。这是您的功能的示例:
require(nloptr)
table <- NULL
opti <- function(x){
res <- x-12
table <<- rbind(table, c(x, res))
res
}
lower <- c(0)
upper <- c(100)
local_opts <- list( "algorithm" = "NLOPT_LN_NELDERMEAD",
maxeval=15,
"xtol_abs"=1.0e-4)
opts <- list("algorithm" = "NLOPT_GN_MLSL_LDS",
"local_opts" = local_opts,
maxeval=50*15,
print_level=3)
OPT <- nloptr(
x0 = runif(1, min=lower, max=upper), # random starting point
eval_f=opti,
lb = lower,
ub = upper,
eval_grad_f=NULL,
opts=opts
)
table <- table[order(table[,2]),]
table[1:50,]
由于您的函数很简单,因此您的 50 个结果是相同的,但表面更粗糙,您可能会期待有趣的结果。据我所知,nloptr 不允许您跟踪优化路径,因此您必须将其写入评估函数中。这里的迭代次数非常少:你有 50 次随机开始 15 次迭代单纯形,不要忘记改变它。