Симплекс - это локальный алгоритм, который не позволит вам найти разные локальные оптимумы, но только одно оптимальное значение (глобальное или локальное). Вы можете итерировать оптимизацию симплексов с помощью алгоритма многоуровневого одиночного связывания, который найдет разные стартовые точки для вашего симплекса, в зависимости от результатов предыдущего симплекса. Вот пример с функцией:
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-итерационный симплекс, не забудьте его изменить.
Большое спасибо за этот ясный и полезный ответ! Он делает эту работу! –