I am working with the R programming language. I am using the "mco" library to perform "constrained multi-objective optimization" (https://cran.r-project.org/web/packages/mco/mco.pdf)
#load libraries
library(dplyr)
library(mco)
# create some data for this example
a1 = rnorm(1000,100,10)
b1 = rnorm(1000,100,5)
c1 = sample.int(1000, 1000, replace = TRUE)
train_data = data.frame(a1,b1,c1)
I defined the following function that I want to optimize (7 inputs, 4 outputs):
#define function
funct_set <- function (x) {
x1 <- x[1]; x2 <- x[2]; x3 <- x[3] ; x4 <- x[4]; x5 <- x[5]; x6 <- x[6]; x[7] <- x[7]
f <- numeric(7)
#bin data according to random criteria
train_data <- train_data %>%
mutate(cat = ifelse(a1 <= x1 & b1 <= x3, "a",
ifelse(a1 <= x2 & b1 <= x4, "b", "c")))
train_data$cat = as.factor(train_data$cat)
#new splits
a_table = train_data %>%
filter(cat == "a") %>%
select(a1, b1, c1, cat)
b_table = train_data %>%
filter(cat == "b") %>%
select(a1, b1, c1, cat)
c_table = train_data %>%
filter(cat == "c") %>%
select(a1, b1, c1, cat)
#calculate quantile ("quant") for each bin
table_a = data.frame(a_table%>% group_by(cat) %>%
mutate(quant = ifelse(c1 > x[5],1,0 )))
table_b = data.frame(b_table%>% group_by(cat) %>%
mutate(quant = ifelse(c1 > x[6],1,0 )))
table_c = data.frame(c_table%>% group_by(cat) %>%
mutate(quant = ifelse(c1 > x[7],1,0 )))
f[1] = mean(table_a$quant)
f[2] = mean(table_b$quant)
f[3] = mean(table_c$quant)
#group all tables
final_table = rbind(table_a, table_b, table_c)
# calculate the total mean
f[4] = mean(final_table$quant)
#count number of rows in each table
n5 = data.frame(table_a %>%
summarise(count = n()))
n6 = data.frame(table_b %>%
summarise(count = n()))
n7 = data.frame(table_c %>%
summarise(count = n()))
return (f);
}
Next, I defined a series of constraints:
gn <- function(x,f) {
g1 <- x[3] - x[1]
g2<- x[4] - x[2]
g3 <- x[7] - x[6]
g4 <- x[6] - x[5]
g5 <- n5 > 20
g6 <- n6 > 20
g7 <- n7 > 20
return(c(g1,g2,g3,g4, g5, g6, g7))
}
Finally, I ran the optimization algorithm (idim = input dimension, odim = output dimension, cdim = dimension of the constraints)
optimization <- nsga2(funct_set, idim = 7, odim = 4 , constraints = gn, cdim = 7,
generations=150,
popsize=100,
cprob=0.7,
cdist=20,
mprob=0.2,
mdist=20,
lower.bounds=rep(80,80,80,80, 100,200,300),
upper.bounds=rep(120,120,120,120,200,300,400)
)
Problem: Unfortunately, this produces an error:
Evaluation of vectorized objective function returned a malformed matrix. Expected 4 rows and 100 columns but got 7 rows and 100 columns.
Does anyone know why this error is being produced? Is it because the "gn" object can not accept inputs such as "n5, n6, n7"?
Thanks