Передача аргумента в R функциям нескольких вещественных переменных - PullRequest
0 голосов
/ 29 мая 2019

Я новичок в 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 Ответ

1 голос
/ 29 мая 2019

Несколько проблем с вашим кодом:

  • минимизируемая функция и функция ограничений должны принимать вектор в качестве аргумента, и вам просто нужно передать их имена в nsga2

  • необходимо установить idim на 3, количество параметров

  • lower.bounds и upper.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)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...