R DEoptim()函数:如何使用比Npop更小的初始种群数

时间:2014-04-13 10:29:37

标签: r mathematical-optimization

此问题需要DEoptim个包:

install.packages("DEoptim")
library(DEoptim)

来自help(DEoptim)

Rosenbrock <- function(x){
x1 <- x[1]
x2 <- x[2]
100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}

lower <- c(-10,-10)
upper <- -lower

## run DEoptim and set a seed first for replicability
set.seed(1234)
DEoptim(Rosenbrock, lower, upper)

现在这很好用: 但是,如果我使用Npop

提供初始人口dim(Npop)[1] < 10*length(lower)
xini <- cbind(runif(10),runif(10))
ran <- abs(lower - upper)
Npop <- apply(xini,2,function(x) x*ran+lower)
DEoptim(Rosenbrock, lower, upper,DEoptim.control(initialpop = Npop))

我收到以下错误:

Error in DEoptim(Rosenbrock, lower, upper, DEoptim.control(initialpop = Npop)) : 
Initial population is not a matrix with dim. NP x length(upper).

我该怎么做?

与此问题相关:R DEoptim() function: How to select parameters to be opimised?

例如不估计1个参数,我不需要考虑它 DEoptim.control(initialpop)

2 个答案:

答案 0 :(得分:0)

这是我从DEoptim()

的作者那里得到的解决方法
library(DEoptim)

#From help(DEoptim)

Rosenbrock <- function(x){
          x1 <- x[1]
          x2 <- x[2]
          100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}

lower <- c(-10,-10)
upper <- -lower

## run DEoptim and set a seed first for replicability

set.seed(1234)
DEoptim(Rosenbrock, lower, upper)

n <- length(lower) * 10 
# n <- length(lower) * 5 

xini <- cbind(runif(n),runif(n))
ran <- upper - lower
Npop <- as.matrix(apply(xini,2,function(x) x*ran+lower))
DEoptim(Rosenbrock, lower, upper, DEoptim.control(NP=n,initialpop = Npop))

答案 1 :(得分:0)

关于上面的答案,apply函数似乎没有给出正确的矩阵。我相信您需要按行(1)应用然后转置矩阵。

Npop <- t(as.matrix(apply(xini,1,function(x) x*ran+lower)))