R 错误:优化导致“未使用的参数(x)”

2024-03-12

我正在使用 R 编程语言。我定义了以下函数,并且尝试对此函数执行“随机搜索”算法。

首先,我加载了库:

#load library : https://cran.r-project.org/web/packages/randomsearch/index.html 

library(randomsearch)

然后,我定义了这个函数:

# create some data for this example
a1 = rnorm(1000,100,10)
b1 = rnorm(1000,100,10)
c1 = sample.int(1000, 1000, replace = TRUE)
train_data = data.frame(a1,b1,c1)


#define function (4 inputs x[1], x[2], x[3], x[4] and 4 outputs f1, f2, f3, f4)

fn <- function(i) {
    x1 <- x[i,1]; x2 <- x[i,2]; x3 <- x[i,3] ; x4 <- x[i,4]
    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 > 150,1,0 )))
    
    table_b = data.frame(b_table%>% group_by(cat) %>%
                             mutate(quant = ifelse(c1 > 300,1,0 )))
    
    table_c = data.frame(c_table%>% group_by(cat) %>%
                             mutate(quant = ifelse(c1 > 400,1,0 )))
    
    f1 = mean(table_a$quant)
    f2 = mean(table_b$quant)
    f3 = 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
    
    f4 = mean(final_table$quant)
    
    #add some constraints
    if((x3 - x1) < 0. | (x4 - x2) < 0.) {
        f[1] <- NaN
        f[2] <- NaN
        f[3] <- NaN
        f[4] <- NaN
        
    }
    
    return (f)
}

最后,我尝试对此函数运行“随机搜索”算法:

#run algorithm
res = randomsearch(fn, lower = c(80, 80, 80, 80), upper = c(100,120,100,120), minimize = c(TRUE, TRUE, TRUE, TRUE), max.evals = 30)
rs = summary(res)

但这导致了以下错误:

fun(x, ...) 中的错误:未使用的参数 (x)

有谁知道为什么会产生这个错误?这与我定义函数“fn”的方式有关吗?

Thanks


以下代码有效,但我无法使约束起作用:

library(randomsearch)

# create some data for this example
a1 = rnorm(1000,100,10)
b1 = rnorm(1000,100,10)
c1 = sample.int(1000, 1000, replace = TRUE)
train_data = data.frame(a1,b1,c1)

fun_1  <- function(x) {
    x1 <- x[1]
    x2 <- x[2]
    x3 <- x[3] 
    x4 <- x[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 > 200,1,0 )))
    
    table_b = data.frame(b_table%>% group_by(cat) %>%
                             mutate(quant = ifelse(c1 > 300,1,0 )))
    
    table_c = data.frame(c_table%>% group_by(cat) %>%
                             mutate(quant = ifelse(c1 > 400,1,0 )))
    
    f1 = mean(table_a$quant)
    f2 = mean(table_b$quant)
    f3 = 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
    
    f4 = mean(final_table$quant)
    
    
    
    return(c(f1, f2,f3))
}
    

res = randomsearch(fun_1, lower = c(90, 100, 90, 100), upper = c(100,120,100,120), minimize = c(TRUE, TRUE,TRUE), max.evals = 30)
rs = summary(res)

现在,查看结果:

> head(rs)
$pareto.front
         y_1       y_2       y_3       x1       x2       x3       x4
1  0.7605634 0.6851628 0.6400000 91.12101 114.1228 96.77341 117.0649
4  0.7611940 0.6974249 0.5867238 90.16010 110.6879 99.06183 103.1964
5  0.7631579 0.6996337 0.5863570 93.49183 103.2529 90.54579 100.0828
8  0.7804878 0.7196653 0.5791667 93.37388 101.6645 91.03374 100.0605
9  0.7878788 0.6862745 0.5936842 92.85005 106.4595 94.16650 105.3454
14 0.7884615 0.6828423 0.6010782 94.17298 106.6873 91.62018 109.2036

@Sam Rogers:我很想知道你的想法是什么?

Thanks!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 错误:优化导致“未使用的参数(x)” 的相关文章

随机推荐