シンプレックスはローカル アルゴリズムであり、異なるローカル最適値を見つけることはできませんが、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 ランダムがあります。これを変更することを忘れないでください。