2016-04-25 7 views
2

Я пользуюсь функцией nerldermead() пакета nolptr и хотел бы найти, например, 50 наиболее вероятных решений. В этом примере:R - nolptr - Найдите 50 лучших решений, не только лучших

opti= function(x){x-12} 
     x0=c(0) 
     lower=c(0) 
     upper=c(100) 
solution=neldermead(x0,opti,lower,upper,control=list(maxeval = 1000,stopval = -Inf)) 

Я только получить solution=12, но я бы получить это лучшее решение и 49 других вокруг. Есть ли способ извлечь эту информацию из функции nerldermead()?

Большое спасибо!

ответ

2

Симплекс - это локальный алгоритм, который не позволит вам найти разные локальные оптимумы, но только одно оптимальное значение (глобальное или локальное). Вы можете итерировать оптимизацию симплексов с помощью алгоритма многоуровневого одиночного связывания, который найдет разные стартовые точки для вашего симплекса, в зависимости от результатов предыдущего симплекса. Вот пример с функцией:

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-итерационный симплекс, не забудьте его изменить.

+0

Большое спасибо за этот ясный и полезный ответ! Он делает эту работу! –