R:为什么 mco 的 nsga2 函数的优化解决方案不满足约束?

标签 r optimization mathematical-optimization

下面是一个可重现的示例。首先我的数据:

myvec <- c(-0.531346314931298, 0.298659434001583, -0.691720475359108)
mymat <- new("dgeMatrix", x = c(16.3574344575224, -15.8734447380907, -2.5840252937711, 
                                3.06801501320276, 1.02979983522784, -0.54581011579616, -18.9562379944301, 
                                -13.26737180927, -15.3314450728231, -16.892164730877, -16.232802331708, 
                                -15.9908074719921, 8.05590245092502, -8.05590245092502, -1.51374510440886, 
                                1.51374510440887, 0.12099742985792, -0.120997429857927, -9.56964755533389, 
                                -6.54215734651616, -8.05590245092502, -8.05590245092502, -7.9349050210671, 
                                -8.17689988078295, 3.78595636574668, -4.26994608517835, -1.09039597003911, 
                                0.606406250607442, -0.632174774229305, 0.14818505479763, 1.33542428436906, 
                                -0.303932077216888, 4.33320538312598, -3.30171317597381, 25.7164288780753, 
                                -24.6849366709232, 2.96628530035713, -4.59014893387888, 24.3728836566943, 
                                -25.9967472902161, -1.06980486854892, -0.554058764972834, 25.5514562424382, 
                                24.7395244256774, 28.9907656065072, 21.3002150616084, 24.8998122739105, 
                                25.3911683942051, 2.74913208137828, -1.12526844785653, 13.3846769837898, 
                                -11.760813350268, 1.33987291197775, 0.283990721544011, -0.921712011956532, 
                                -0.109780195195655, 1.3543960057099, -2.38588821286208, 12.0963242028502, 
                                -13.1278164100024, -12.8382805804706, -12.4583324395663, -14.9147553487727, 
                                -10.3818576712642, -13.0374407869434, -12.2591722330935, -1.30406270512594, 
                                1.30406270512594, 1.49880108324396e-15, -1.77635683940025e-15, 
                                6.32415325500923, -6.32415325500923, -1.11022302462516e-15, 2.33146835171283e-15, 
                                -1.30406270512594, 1.30406270512594, 6.32415325500923, -6.32415325500922, 
                                -1.30406270512594, 1.30406270512594, -5.55111512312578e-16, 0, 
                                6.32415325500923, -6.32415325500923, -6.32415325500922, -6.32415325500923, 
                                -7.62821596013516, -5.02009054988329, -6.32415325500923, -6.32415325500923
), Dim = c(30L, 3L), Dimnames = list(NULL, NULL), factors = list())
myvec2 <- new("dgeMatrix", x = c(2.43138842392909e-14, 1.77635683940025e-14, 
                                 -0.0990891178849278, 0.0990891178849509, 1.4210854715202e-14, 
                                 -1.99840144432528e-15, -0.0990891178849438, 0.0990891178849393, 
                                 7.105427357601e-15, -1.75415237890775e-14, -7.54951656745106e-15, 
                                 -1.77635683940025e-15, 4.88498130835069e-15, 3.5527136788005e-15, 
                                 -0.099089117884942, 0.0990891178849376, -4.44089209850063e-15, 
                                 2.48689957516035e-14, -0.0990891178849393, 0.0990891178849416, 
                                 -1.77635683940025e-15, -7.21644966006352e-15, -1.02140518265514e-14, 
                                 -1.77635683940025e-15, 3.99680288865056e-15, 0, -0.0990891178849447, 
                                 0.0990891178849447, 0, 1.4432899320127e-15), Dim = c(30L, 1L), 
              Dimnames = list(NULL, NULL), factors = list())
我指定我的目标函数:
myobj <- function(x){
  return(-x)
}
我指定了我的约束函数。我总共有 33 个约束。 constr2 中指定的最后 3 个约束要求解参数大于或等于 myvec 中的值。
myconstr <- function(x){
  constr1 <- as.numeric(as.matrix(cbind(mymat, -myvec2)) %*% c(x, 1))
  # Must be bigger than myvec
  constr2 <- x - myvec
  return(c(constr1, constr2))
}
现在我运行 nsga2 函数:
library(mco)
out <- nsga2(myobj, idim = 3, odim = 3,
                   lower.bounds = c(12.36988, -25.19478, -42.12804), 
                   upper.bounds = c(11.30719, 25.79210, 40.74460),
                   constraints = myconstr, cdim = 33)
> out$par[1, ] >= myvec
[1]  TRUE  TRUE FALSE
但是,当我再次检查 out 中的解是否大于 myvec 时,结果发现解不满足它们必须大于 myvec 的约束。为什么会这样?

最佳答案

强制求解参数大于或等于 myvec 中的值,使用 lower.boundsnsga2反而。
您可以将原始下限与 myvec 结合使用通过获得成对最大值:

pmax(myvec,c(-12.36988, -25.19478, -42.12804))
所以,你得到:
library(mco)

myconstr <- function(x){
  return(as.numeric(as.matrix(cbind(mymat, -myvec2)) %*% c(x, 1)))
}

out <- nsga2(myobj, idim = 3, odim = 3,
                   lower.bounds = pmax(myvec,c(-12.36988, -25.19478, -42.12804)), 
                   upper.bounds = c(11.30719, 25.79210, 40.74460),
                   constraints = myconstr, cdim = 30)
out$par[1, ] >= myvec
# [1] TRUE TRUE TRUE

关于R:为什么 mco 的 nsga2 函数的优化解决方案不满足约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65975581/

相关文章:

r - 使用 Data.Table 有条件地选择组中的行

r - 提取大矩阵的非对角切片

python - 最速下降吐出不合理的大值

math - 检测三角形与三角形相交的最有效方法是什么?

python - 线性回归和自动求导

r - 准确理解何时 data.table 是对另一个 data.table 的引用(而不是其副本)

r - R 中的标记似然等高线图

java - 如何优化检查给定数组之一是否包含在另一个数组中

c++ - vector 是否必须存储两次大小?

performance - 有没有办法提高使用相同图像的图像控件的图像内存使用率?