在 R 中指定逻辑条件(例如 "greater than" 和 "less than")

Specifying Logical Conditions (e.g. "greater than" and "less than") in R

我正在使用 R 编程语言 - 我正在尝试执行“多 objective 约束优化”。

我为此示例创建了一些数据:

#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)

然后我用“4 objectives”定义了一个函数(“funct_set”)(f1、f[2]、f[3]、f[4 ]) 对于一组“七个输入”([x1]、[x2]、[x3]、x[4]、x[5]、x[6]、x[7]),它们将被最小化:

#加载库
    图书馆(dplyr)
    图书馆(mco)
    
#定义函数

funct_set <- 函数 (x) {
    x1 <- x[1]; x2 <- x[2]; x3 <- x[3] ; x4 <- x[4]; x5 <- x[5]; x6 <- x[6]; x[7] <- x[7]
    f <- 数字 (4)
    
    
    #根据随机标准对数据进行分类
    train_data <- train_data %>%
        突变(cat = ifelse(a1 <= x1 & b1 <= x3,“a”,
                            ifelse(a1 <= x2 & b1 <= x4, "b", "c")))
    
    train_data<span class="math-container">$cat = as.factor(train_data$</span>cat)
    
    #新分裂
    a_table = train_data %>%
        过滤器(猫==“a”)%>%
        select(a1, b1, c1, 猫)
    
    b_table = train_data %>%
        过滤器(猫==“b”)%>%
        select(a1, b1, c1, 猫)
    
    c_table = train_data %>%
        过滤器(猫==“c”)%>%
        select(a1, b1, c1, 猫)
    
    
    
    #计算每个箱子的分位数(“quant”)
    
    table_a = data.frame(a_table%>% group_by(cat) %>%
                             变异(量化= ifelse(c1> x [5],1,0)))
    
    table_b = data.frame(b_table%>% group_by(cat) %>%
                             变异(量化= ifelse(c1> x [6],1,0)))
    
    table_c = data.frame(c_table%>% group_by(cat) %>%
                             变异(量化= ifelse(c1> x [7],1,0)))
    
    f[1] = -mean(table_a<span class="math-container">$quant)
    f[2] = -mean(table_b$</span>量化)
    f[3] = -mean(table_c$quant)
    
    
    #对所有表进行分组
    
    final_table = rbind(table_a, table_b, table_c)
    # 计算总均值:这是需要优化的
    
    f[4] = -mean(final_table$quant)
    
    
    return (女);
}
接下来,我定义了一系列用于优化的 4 个“限制”(即逻辑 conditions/constrains):

#定义限制

限制 <- 功能 (x) {
    x1 <- x[1]; x2 <- x[2]; x3 <- x[3]; x4 <- x[4]; x5<- x[5] ; x6 <- x[6]; x7 <- x[7]
    限制 <- 逻辑 (4)
    限制[1] <- (x3 - x1 >= 0)
    限制[2] <- (x4 - x2 >= 0)
    限制[3] <- (x7 - x6 >= 0)
 限制[4] <- (x6 - x5 >= 0)
    return(限制);
}

最后,我 运行 尝试同时最小化所有 4 objective 限制的优化算法:

#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)
)

以上代码工作正常。

问题:我注意到在此代码的输出中,优化算法没有遵守限制。例如:

在上图中,我已经确定了一些违反限制中指定的逻辑条件的行。

有谁知道为什么会这样?我是否错误地指定了限制?有人可以告诉我如何解决这个问题吗?

谢谢

可能的答案:

#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<span class="math-container">$cat = as.factor(train_data$</span>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<span class="math-container">$quant)
    f[2] = mean(table_b$</span>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);
}


gn <- function(x) {
    g1 <- x[3] - x[1] 
    g2<- x[4] - x[2] 
    g3 <- x[7] - x[6]
    g4 <- x[6] - x[5] 
    return(c(g1,g2,g3,g4))
}

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

现在,如果我们看一下输出:

#view output
optimization

对于任何给定的行,似乎都符合所有逻辑条件!