Skip to content

optimization algorithm from the "mco" library is not respecting the conditions from the "constraints" #2

@swaheera

Description

@swaheera

I am using the R programming language - I am trying to follow the answer from this stackoverflow post (https://stackoverflow.com/questions/68324822/correctly-specifying-logical-conditions-in-r) that shows how to perform "multi objective constrained optimization" using the "mco" library in R.

I created some data for this example:

#load libraries
library(dplyr)


# 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 then defined a function ("funct_set") with "4 objectives" (f[1], f[2], f[3], f[4]) which are to be minimized for a set of "seven inputs" ([x1], [x2], [x3], x[4], x[5], x[6], x[7]):

#load libraries
    library(dplyr)
    library(mco)
    
#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(4)
    
    
    #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 : this is what needs to be optimized
    
    f[4] = -mean(final_table$quant)
    
    
    return (f);
}

Next, I define a series of 4 "restrictions" (i.e. logical conditions/constrains) used in the optimization:

#define restrictions

restrictions <- function (x) {
    x1 <- x[1]; x2 <- x[2]; x3 <- x[3]; x4 <- x[4]; x5<- x[5] ; x6 <- x[6]; x7 <- x[7]
    restrictions <- logical(4)
    restrictions[1] <- (x3 - x1 >= 0)
    restrictions[2] <- (x4 - x2 >= 0)
    restrictions[3] <- (x7 - x6 >= 0)
 restrictions[4] <- (x6 - x5 >= 0)
    return (restrictions);
}

Finally, I run the optimization algorithm that attempts to simultaneously minimize all 4 objectives with respect to the restrictions:

#run optimization


optimization <- nsga2(funct_set, idim = 7, odim = 4 ,   constraints = restrictions, cdim = 4,
                      
                      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)
)

The above code works fine.

Problem : I noticed that in the output of this code, the optimization algorithm is not respecting the restrictions. For example:

https://i.stack.imgur.com/04vBK.png

In the above picture, I have identified some rows where the logical conditions specified in the restrictions are violated.

Does anyone know why this is happening? Have I incorrectly specified the restrictions? Can someone please show me how to fix this?

Thanks

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions