Минимизация функции при ограничениях в R

#r #optimization #mathematical-optimization #nonlinear-optimization

#r #оптимизация #математическая оптимизация #нелинейная оптимизация

Вопрос:

У меня есть функция «f» следующим образом:

 f <- function (X){
  DD= 91.8372-10.3096*(as.numeric((X[1]<70.5)amp;(X[2]>69.5)amp;(X[2]<79.5)amp;(X[3]>37.5)))
           5.3719*(as.numeric((X[1]>68.5)amp;(X[2]<47.0)))
          -4.8144*(as.numeric((X[1]<73.5)amp;(X[2]<79.5)amp;(X[3]>36.5)))
           3.9302*(as.numeric((X[2]<79.5)amp;(X[3]>45.5)amp;(X[3]<51.5)))-4.9666*(as.numeric(X[2]<71.5))
          - 5.8016*(as.numeric((X[1]>75.5)amp;(X[1]<83.5)amp;(X[2]<76.5)amp;(X[3]>36.5)amp;(X[3]<51.5)))
           9.7572*(as.numeric((X[1]>68.5)amp;(X[1]>73.5)amp;(X[2]>71.5)amp;(X[2]>75.0)amp;(X[2]>76.5)amp; 
          X[2]>79.5))) 4.2909*(as.numeric((X[1]>68.5)amp;(X[2]>75.0)amp;(X[3]<36.5)amp;(X[3]<39.5)amp;(X[3] 
          <45.5))) 17.6214*(as.numeric(X[1]>89.0))
  

Эта функция имеет три переменные X1 (X[1]), X2 (X[2]) и X3 (X[3]). Итак, мой вопрос заключается в том, как найти / оптимизировать эти переменные в R таким образом, чтобы, применяя эти переменные, результат функции «f» будет больше или равен определенному значению, скажем, 96.

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

1. Вы уже смотрели на функцию, подобную optim в R?

2. То, как это сформулировано, делает проблему недифференцируемой. У большинства решателей будут проблемы с этим.

3. Умножение на логическое преобразует его в числовое, поэтому as.numeric не требуется.

4. Привет, MrFlick, я пытался оптимизировать функцию (96-f) ^ 2, но проблема в том, что эта функция будет уже меньше 96. И использование `optim` не позволяет применять ограничение, что f> = 96.

Ответ №1:

Вы можете рассмотреть следующий подход :

 f <- function(X)
{
  DD <-  ((91.8372 - 10.3096 * (as.numeric((X[1] < 70.5) amp; (X[2] > 69.5) amp; (X[2] < 79.5) amp; (X[3] > 37.5)))
            5.3719 * (as.numeric((X[1] > 68.5) amp; (X[2] < 47.0)))
          - 4.8144 * (as.numeric((X[1] < 73.5) amp; (X[2] < 79.5) amp; (X[3] > 36.5)))
            3.9302 * (as.numeric((X[2] < 79.5) amp; (X[3] > 45.5) amp; (X[3] < 51.5))) - 4.9666 * (as.numeric(X[2]  < 71.5))
          - 5.8016 * (as.numeric((X[1] > 75.5) amp; (X[1] < 83.5) amp; (X[2] < 76.5) amp; (X[3] > 36.5) amp; (X[3] < 51.5)))
            9.7572 * (as.numeric((X[1] > 68.5) amp; (X[1] > 73.5) amp; (X[2] > 71.5) amp; (X[2] > 75.0) amp; (X[2] > 76.5) amp; X[2] > 79.5)))
            4.2909 * (as.numeric((X[1] > 68.5) amp; (X[2] > 75.0) amp; (X[3] < 36.5) amp; (X[3] < 39.5) amp; (X[3] < 45.5))) 
            17.6214 * (as.numeric(X[1] > 89.0)))
  
  if(DD < 96)
  {
    return(10 ^ 30)
    
  }else
  {
    return(DD)
  }
}

library(DEoptim)

obj_DEoptim <- DEoptim(fn = f, lower = rep(-1000, 3), upper = rep(1000, 3), control = list(itermax = 1000))

obj_DEoptim$optim$bestmem
  
  par1       par2       par3 
  73.02648  251.92860 -976.23650

obj_DEoptim$optim$bestval

  96.1281