R中约束条件下函数的最小化



我有一个函数"f";如下所示:

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

该函数有三个变量X1(X[1](、X2(X[2](和X3(X[3](。因此,我的问题是如何通过将这些变量应用于函数"R"的结果来以这种方式找到/优化R中的这些变量;f";将大于或等于某个值,比方说96。

您可以考虑以下方法:

f <- function(X)
{
DD <-  ((91.8372 - 10.3096 * (as.numeric((X[1] < 70.5) & (X[2] > 69.5) & (X[2] < 79.5) & (X[3] > 37.5)))
+ 5.3719 * (as.numeric((X[1] > 68.5) & (X[2] < 47.0)))
- 4.8144 * (as.numeric((X[1] < 73.5) & (X[2] < 79.5) & (X[3] > 36.5)))
+ 3.9302 * (as.numeric((X[2] < 79.5) & (X[3] > 45.5) & (X[3] < 51.5))) - 4.9666 * (as.numeric(X[2]  < 71.5))
- 5.8016 * (as.numeric((X[1] > 75.5) & (X[1] < 83.5) & (X[2] < 76.5) & (X[3] > 36.5) & (X[3] < 51.5)))
+ 9.7572 * (as.numeric((X[1] > 68.5) & (X[1] > 73.5) & (X[2] > 71.5) & (X[2] > 75.0) & (X[2] > 76.5) & X[2] > 79.5)))
+ 4.2909 * (as.numeric((X[1] > 68.5) & (X[2] > 75.0) & (X[3] < 36.5) & (X[3] < 39.5) & (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

最新更新