DEOPtim错误:目标函数结果与参数矩阵的长度不同

时间:2015-09-17 18:59:01

标签: r optimization data.table differential-evolution

我正在尝试使用DEoptim命令(来自同名的R包)来最小化一个函数,但是得到这个奇怪的错误“目标函数结果的长度与参数矩阵不同。”我找不到关于这个问题的任何事情,除了一些我无法阅读的C代码。

当我尝试通过...参数将其他参数传递给函数时,会出现错误。在下面的示例中,我修改了Rosenbrock函数(取自DEoptim文档)以获得第二个参数pow(我将其设置为2,因此该示例与记录的示例相同)。这有效。然后我尝试使用Rastrigin功能(来自GenSA文档)。同样的技巧在这里失败了(但是如果我在第二个参数中进行硬编码,优化器工作正常,就像在记录的情况下那样)。

以下是示例代码:

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对象调用函数,其中函数的第一个参数是要被最小化的(标量)参数,其余参数是从{{1 }}

1 个答案:

答案 0 :(得分:1)

我必须深入了解根本原因,但看起来你的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)

我将提交错误报告。感谢可重复的例子!