2016-04-25 9 views
2

私はパッケージのnerldermead()機能を使用しています。たとえば、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

シンプレックスは、異なるローカル最適値を見つけることを許可しないローカルアルゴリズムですが、最適値(グローバルまたはローカル)は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反復シンプレックスを持っている、それを変更することを忘れないでください。

+0

ありがとうございました。 それは仕事をする! –

関連する問題