我是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
传递这些参数的正确方法是什么?
答案 0 :(得分:1)
您的代码有几个问题:
要最小化的函数和约束函数必须使用向量作为参数,而您只需要在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)
)