R:为什么mco的nsga2函数优化解不满足约束条件?

R: Why does the optimization solution from mco's nsga2 function not satisfy the constraints?

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

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())

我指定我的 objective 函数:

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 时,结果发现这些解不满足必须大于 [=15] 的约束=].为什么会这样?

要强制求解参数大于或等于 myvec 中的值,请改用 nsga2lower.bounds

您可以通过获取成对最大值将原始 lower.bound 与 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