У меня есть вопрос о конкретной c реализации алгоритма Нелдера-Мида (1), который обрабатывает ограничения блока необычным образом. Я не могу найти что-либо об этом ни в одной статье (25 статей), в учебнике (обыскала 4 из них) или в целых числах rnet.
У меня типичная проблема оптимизации: min f(x)
с ограничением на поле -0.25 <= x_i <= 250
Ожидаемый подход будет использовать функцию штрафа и убедиться, что все экземпляры f(x)
"непривлекательны", когда x выходит за пределы.
Алгоритм работает иначе: рассматриваемая реализация не касается f(x)
. Вместо этого он искажает пространство параметров, используя обратную гиперболи c tangens atanh(f)
. Теперь симплексный алгоритм может свободно работать в пространстве без границ и выбирать любую точку. Прежде чем получить f(x)
, чтобы оценить решение в точке x, алгоритм переключается обратно в нормальное пространство.
На первый взгляд я нашел идею гениальной. Таким образом мы избегаем недостатков штрафных функций. Но сейчас у меня есть сомнения. Искаженное пространство влияет на поведение завершения. Одним из критериев завершения является размер симплекса. Раздувая пространство параметров с помощью atanh(x)
, мы также увеличиваем размер симплекса.
Эксперименты с алгоритмом также показывают, что он работает не так, как задумано. Я еще не понимаю, как это происходит, но я получаю результаты, которые выходят за пределы. Я могу сказать, что почти половина возвращенных локальных минимумов выходит за пределы.
В качестве примера рассмотрим nmkb (), оптимизирующую функцию rosenbrook, когда мы постепенно изменяем ширину ограничения box:
rosbkext <- function(x) {
# Extended Rosenbrock function
n <- length(x)
sum (100*(x[1:(n-1)]^2 - x[2:n])^2 + (x[1:(n-1)] - 1)^2)
}
np <- 6 #12
for (box in c(2, 4, 12, 24, 32, 64, 128)) {
set.seed(123)
p0 <- rnorm(np)
p0[p0 > +2] <- +2 - 1E-8
p0[p0 < -2] <- -2 + 1E-8
ctrl <- list(maxfeval = 5E4, tol = 1E-8)
o <- nmkb(fn = rosbkext, par = p0, lower = -box, upper = +box, control = ctrl)
print(o$message)
cat("f(", format(o$par, digits = 2), ") =", format(o$value, digits=3), "\n")
}
Вывод показывает, что он утверждает, что сходится, но не в трех случаях. И делает это для границ (-2,2) и (-12,12). Я мог бы принять это, но тогда это также терпит неудачу в (-128, 128). Я также попробовал то же самое с неограниченным dfoptim :: nmk (). Нет проблем там. Он отлично сходится.
[1] "Successful convergence"
f( -0.99 0.98 0.97 0.95 0.90 0.81 ) = 3.97
[1] "Successful convergence"
f( 1 1 1 1 1 1 ) = 4.42e-09
[1] "Successful convergence"
f( -0.99 0.98 0.97 0.95 0.90 0.81 ) = 3.97
[1] "Successful convergence"
f( 1 1 1 1 1 1 ) = 1.3e-08
[1] "Successful convergence"
f( 1 1 1 1 1 1 ) = 4.22e-09
[1] "Successful convergence"
f( 1 1 1 1 1 1 ) = 8.22e-09
[1] "Successful convergence"
f( -0.99 0.98 0.97 0.95 0.90 0.81 ) = 3.97
Почему ограниченный алгоритм имеет больше проблем сходимости, чем неограниченный?
Сноска (1): Я имею в виду реализацию Nelder-Mead используется в пакете optimx в R. Этот пакет вызывает другой пакет dfoptim с функцией nmkb.