2

DEoptim コマンド (同名の R パッケージから) を使用して関数を最小化しようとしていますが、「目的関数の結果の長さがパラメーター行列とは異なります」という奇妙なエラーが発生します。読めない投稿されたCコードを除いて、この問題について何も見つかりません。

引数を介して関数に追加のパラメーターを渡そうとすると、エラーが発生し...ます。次の例では、Rosenbrock 関数 (DEoptim のドキュメントから取得) を修正して、2 番目の引数pow(ドキュメントに記載されている例と同じになるように 2 に設定) を指定します。これは機能します。次に、Rastrigin 関数で同じことを試みます (GenSA のドキュメントから)。ここでは同じトリックが失敗します (ただし、文書化されているケースのように、2 番目の引数をハードコーディングすると、オプティマイザーは正常に機能します)。

コード例は次のとおりです。

library(DEoptim)
## Note that the vector of parameters to be optimized must be the first
## argument of the objective function passed to DEoptim.
Rosenbrock <- function(x,pow){
  x1 <- x[1]
  x2 <- x[2]
  100 * (x2 - x1 * x1)^pow + (1 - x1)^pow
}

lower <- c(-10,-10)
upper <- -lower
set.seed(1234)

# works
DEoptim(Rosenbrock,pow=2, lower, upper)

Rastrigin <- function(x) {
  sum(x^2 - 10 * cos(2 * pi * x)) + 10 * length(x)
}

Rastrigin2 <- function(x,p) {
  sum(x^2 - p * cos(2 * pi * x)) + 10 * length(x)
}

dimension <- 2
lower <- rep(-5.12, dimension)
upper <- rep(5.12, dimension)

# works
DEoptim(fn=Rastrigin,lower=lower,upper=upper,
        control = list(storepopfrom = 1))

# should be same, but doesn't work
DEoptim(fn=Rastrigin2,p=10,lower=lower,upper=upper,
        control = list(storepopfrom = 1))

当然、この問題はより複雑な例で出てきましたが、この単純なケースの説明が助けになることを願っています。追加のヘルプである場合、最終的な目標はオブジェクトから関数を呼び出すことですdata.table。関数の最初の引数は最小化される (スカラー) パラメーターであり、残りの引数は から取得したデータdata.tableです。

4

1 に答える 1

2

根本的な原因を詳しく調べる必要がありますがp、最適化/評価プロセスのどこかで、あなたの引数が別の引数と部分的に一致しているようです。回避策は、その引数に別の名前を使用することです。

require(DEoptim)
Rastrigin2 <- function(x,p.) {
  sum(x^2 - p. * cos(2 * pi * x)) + 10 * length(x)
}
lower <- rep(-5.12, 2)
upper <- -lower
de <- DEoptim(Rastrigin2, lower, upper, list(storepopfrom=1), p.=10)

バグレポートを提出します。再現可能な例をありがとう!

于 2015-09-17T19:31:47.050 に答える