シンプレックスは、異なるローカル最適値を見つけることを許可しないローカルアルゴリズムですが、最適値(グローバルまたはローカル)は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は最適なパスのトレースを取得することを許可していないので、評価関数に書く必要があります。ここでは反復回数が非常に少ない:あなたは50ランダム開始15反復シンプレックスを持っている、それを変更することを忘れないでください。
ありがとうございました。 それは仕事をする! –