#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