我正试图在dataframe中找到一个优化解决方案。从三个单独的行中选择,我想找到一个将公式最小化的解决方案: result =(sum((B))+sum((C))/sum((A)
> set.seed(1)
> a <- sample.int(10,size = 10)
> b <- sample.int(10,size = 10)
> c <- sample.int(10,size = 10)
> df_optimize <- data.frame(a,b,c)
> df_optimize
a b c
1 9 3 5
2 4 1 9
3 7 5 1
4 1 8 6
5 2 2 10
6 5 6 7
7 3 10 2
8 10 9 4
9 6 4 3
10 8 7 8
>
> objective_function <- function(x,y,z) {
+ p_1 <- x$a + y$a + z$a
+ p_2 <- x$b + y$b + z$b
+ p_3 <- x$c + y$c + z$c
+ result <- (p_2 + p_3) / p_1
+ return(result)
+ }
>
> #example result outputs
> objective_function(df_optimize[1,],df_optimize[3,],df_optimize[5,])
[1] 1.444444
> #and
> objective_function(df_optimize[2,],df_optimize[4,],df_optimize[6,])
[1] 3.7
>
> # Attempt to find combination that minimizes result
> optimize(interval = df_optimize[1:10,], f = objective_function)
Error in x$a : $ operator is invalid for atomic vectors发布于 2022-09-14 17:50:12
这是一个野蛮的力量,网格搜索解决方案。
inx <- 1:nrow(df_optimize)
arg_space <- expand.grid(inx, inx, inx)
i <- apply(arg_space, 1, \(x) any(x[1] == x[-1] | x[2] == x[3]))
arg_space <- arg_space[!i,]
res <- sapply(1:nrow(arg_space), \(i) {
j1 <- arg_space[i, 1, drop = TRUE]
j2 <- arg_space[i, 2, drop = TRUE]
j3 <- arg_space[i, 3, drop = TRUE]
objective_function(df_optimize[j1,],df_optimize[j2,],df_optimize[j3,])
})
i_opt <- which.min(res)
arg_space[i_opt, ]
# Var1 Var2 Var3
#29 9 3 1
res[i_opt]
#[1] 0.9545455编辑
在缩放到更多变量时,请确保列号都与
i <- apply(arg_space, 1, \(x) length(unique(x)) == length(x))
arg_space <- arg_space[i,]注意,这提取条件id TRUE的位置,它使用的是i而不是!i。
https://stackoverflow.com/questions/73720837
复制相似问题