将R传递给几个实变量的函数的参数

时间:2019-05-29 11:43:44

标签: r

我是R的新手,需要解决多目标优化问题(MOOP)。我已经导入了mco软件包,定义了我的函数并检查了nsga2函数。问题是,当前者与数字变量匹配时,我没有找到正确的方法来绑定函数定义(形式参数)中的参数和调用(实际参数)中的参数。

我有以下代码:

funct_set <- function (x1,x2,x3) {
  f <- numeric(2)
  f[1] <- min(-5*x1 - 2*x2 - 8*x3)
  f[2] <- min(1000*x1 + 8000*x2 + 12000*x3)
  return (f);
}

restrictions <- function (x1,x2,x3) {
  restrictions <- numeric(3)
  restrictions[1] <- (x1 + x2 + x3 <= 30)
  restrictions[2] <- (x1 + x2 + x3 > 0)
  restrictions[3] <- (2*x1 + 3*x2 + 1.5*x3 <= 45)
  return (restrictions);
}

optimization <- nsga2(funct_set('x1', 'x2', 'x3'),
                      constraints = restrictions('x1', 'x2', 'x3'),
                      2, 2,
                      NULL,
                      generations=150,
                      popsize=100,
                      cprob=0.7,
                      cdist=20,
                      mprob=0.2,
                      mdist=20,
                      lower.bounds=rep(-5, 2),
                      upper.bounds=rep(10, 2)
                      );

但是,这导致R考虑到'x1','x2'和'x3'不是数字: Error in x1 + x2 : non-numeric argument to binary operator

传递这些参数的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您的代码有几个问题:

  • 要最小化的函数和约束函数必须使用向量作为参数,而您只需要在nsga2

  • 中传递它们的名称
  • 您必须将idim设置为3,即参数数量

  • lower.boundsupper.bounds的长度必须为idim

  • 您必须将cdim设置为3(约束数量)

  • 我不知道您为什么设置一个NULL参数

下面是更正的代码,它可以工作。

library(mco)

funct_set <- function (x) {
  x1 <- x[1]; x2 <- x[2]; x3 <- x[3]
  f <- numeric(2)
  f[1] <- min(-5*x1 - 2*x2 - 8*x3)
  f[2] <- min(1000*x1 + 8000*x2 + 12000*x3)
  return (f);
}

restrictions <- function (x) {
  x1 <- x[1]; x2 <- x[2]; x3 <- x[3]
  restrictions <- logical(3)
  restrictions[1] <- (x1 + x2 + x3 <= 30)
  restrictions[2] <- (x1 + x2 + x3 > 0)
  restrictions[3] <- (2*x1 + 3*x2 + 1.5*x3 <= 45)
  return (restrictions);
}

optimization <- nsga2(funct_set, idim = 3, odim = 2,
                      constraints = restrictions, cdim = 3,
                      generations=150,
                      popsize=100,
                      cprob=0.7,
                      cdist=20,
                      mprob=0.2,
                      mdist=20,
                      lower.bounds=rep(-5, 3),
                      upper.bounds=rep(10, 3)
)