2

我正在使用包的nerldermead()功能,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()函数的这些信息?

非常感谢 !

4

1 回答 1

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 次迭代单纯形,不要忘记改变它。

于 2016-04-25T09:03:00.117 回答