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

シンプレックスはローカル アルゴリズムであり、異なるローカル最適値を見つけることはできませんが、1 つの最適値 (グローバルまたはローカル) のみを見つけることができます。前のシンプレックスの結果に応じて、シンプレックスのさまざまな開始点を見つけるマルチレベル シングル リンケージ アルゴリズムのようなものを使用して、シンプレックスの最適化を繰り返すことができます。関数の例を次に示します。

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 では最適パスのトレースを取得できないため、評価関数に記述する必要があります。ここでは、反復回数が非常に少ないです。15 反復シンプレックスから開始する 50 ランダムがあります。これを変更することを忘れないでください。

于 2016-04-25T09:03:00.117 に答える