2015-09-17 1 views
1

Я пытаюсь использовать команду DEoptim (из одноименного пакета R), чтобы свести к минимуму функцию, но я получаю эту странную ошибку. разной длины, чем матрица параметров. «Я ничего не могу найти об этой проблеме, кроме некоторого опубликованного кода на C, который я не могу прочитать.Ошибка в DEoptim: результат объектной функции имеет разную длину, чем матрица параметров

Ошибка возникает, когда я пытаюсь передать дополнительные параметры функции через аргумент .... В следующем примере я изменяю функцию Rosenbrock (взятую из документации DEoptim), чтобы иметь второй аргумент pow (который я установил равным 2, так что пример идентичен документированному). Это работает. Затем я пытаюсь сделать то же самое с функцией Растригина (из документации 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.

ответ

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) 

Я напишу отчет об ошибке. Спасибо за воспроизводимый пример!

+0

Это потрясающе, и это действительно удача, что я использовал «p» в качестве аргумента в MWE (так как это также имя аргумента в моей реальной цели). Благодаря! – Scott

Смежные вопросы