Быстрее решатель - для петель - PullRequest
1 голос
/ 10 марта 2019

Скажем, у нас есть функция стоимости:

my_func <- function(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11){
  rst <- (x1^2) * x2 + x2 + x3*x4*x5*x6*x7*x8*x9 + x10^3 + (1-x11-x10)
  return(rst)
}

Реальный пример имеет такое же количество переменных, более сложную функцию стоимости.

Тогда скажите, что у меня есть ограничения для каждой переменной:

0 <= x1 <= (1/11)
0 <= x2 <= (1/20)
0 <= x3 <= (1/5)
....
0 <= x11 <= (1/10)

И я хочу найти минимальную стоимость для этого.

Мое текущее решение - сначала построить последовательности для каждой переменной с заданной точностью (0,001), скажем для x1:

x1.seq <- seq(0, 1/11, by = 0.001)
....

Затем я запускаю 11 для циклов и пробую каждую комбинацию, чтобы попытаться найти минимум:

hold <- NULL # Preallocation of this variable does help, a bit...
for (i in 1:length(x1.seq){
  x1 <- x1.seq[i]
  for (j in 1:length(x2.seq){
    x2 <- x2.seq[j]
      ....
      hold <- c(hold, my_func(x1 = x1, ..., x11 = x11))
      ....
  }
}
min(hold)

Теперь, как вы, наверное, знаете, это будет продолжаться вечно, если точность не тривиальна. Так есть ли более быстрый способ сделать это в R? Я знаю о других подходах, таких как частные производные или множители Лагранжа, и т. Д., Но они также занимают много времени (и грубо с моей проблемой нелинейности), и я ищу подход с использованием кода R, если таковой существует.

1 Ответ

0 голосов
/ 11 марта 2019

Я буду использовать какой-нибудь пакет нелинейной оптимизации:

  1. nolptr https://cran.r -project.org / web / packages / nloptr / index.html
  2. NlcOptim https://cran.r -project.org / web / packages / NlcOptim / index.html
  3. optimx: https://cran.r -project.org / web / packages / optimx / index.html
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...