Критерии остановки для optim / SANN в R не работают

#r #optimization

#r #оптимизация

Вопрос:

Проблема 1 У меня есть целевая функция, gFun(modelOutput,l,u) которая возвращает 0, если смоделированный вывод находится в интервале [l,u] , в противном случае она возвращает положительное (!) число.

 OFfun <- function(params) {
  out <- simulate(params)
  OF <- gFun(out,0,5)
  return(OF)
}
  

Целевая функция вызывается из optim функции с некоторыми настройками допуска.

 fitval=optim(par=parms,fn=OFfun,method="SANN",control = list(abstol = 1e-2))
summary(fitval)
  

Моя проблема в том, что оптимизация не останавливается, если OFfun == 0.
Я пытался выполнить условие, приведенное ниже:

   if (OF == 0){ 
    opt <- options(show.error.messages=FALSE) 
    on.exit(options(opt)) 
    stop()
  } 
  

это работает, но не возвращает значение OF обратно в optim , и поэтому я не получаю fitval информацию с оценочными параметрами.

Проблема 2

Другая проблема заключается в том, что решатель иногда выходит из строя и прерывает всю оптимизацию. Я хотел бы собрать множество наборов решений для разных начальных предположений — поэтому мне нужно обработать неудачные симуляции. вероятно, связано с проблемой 1.

Любой совет был бы очень признателен.

Комментарии:

1. Первое: не используйте метод SANN в optim , он не является ни надежным, ни эффективным. Второе: если вы собираетесь применить имитацию отжига, есть пакет GenSA с самой современной реализацией. В-третьих: у GenSA есть опция управления, позволяющая останавливать процесс оптимизации при достижении определенного минимального уровня. В моем понимании это то, о чем вы просите. Другие стохастические решатели см. в представлении задачи оптимизации .

2. Вопрос, связанный с GenSA, я запускаю следующий fitval = GenSA (par=log (parms), fn = OFfun, lower =log(p_min), upper =log(p_max), control = list (maxit= MaxIter)), но он не учитывает настройку maxit, есть идеи, что я делаю неправильно?

3. Откройте новый вопрос… и предоставьте некоторый воспроизводимый код.

4. Из статьи R Journal: ‘maxit: целое число. Максимальное количество итераций алгоритма. Значение по умолчанию равно 5000, которое может быть увеличено пользователем для оптимизации очень сложной целевой функции. ‘ нет ничего о возможности его уменьшения. (Источник: journal.r-project.org/archive/2013/RJ-2013-002/RJ-2013-002.pdf ). Предоставление кода не является простым, поскольку оно реализуется с использованием проприетарного пакета. К счастью, использование ‘max.time: числовое. Максимальное время выполнения в секундах ‘ Я могу достичь того, что мне нужно,