我正在尝试使用 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
对象调用函数,其中函数的第一个参数是要最小化的(标量)参数,其余参数是从data.table
.