R语言数据框优化问题:选取三行最小化指定公式的求解方案
从10行数据中选取3行最小化目标函数的解决方案
需要从包含10行的数据框中选取3个不同的行,最小化公式:result = (sum(column(b)) + sum(column(c))) / sum(column(a))
用户已编写目标函数并测试了部分组合,但使用optimize()函数时出现错误:Error in x$a : $ operator is invalid for atomic vectors——原因是optimize()仅适用于连续单变量的优化问题,无法处理这种离散的组合选择场景。
原始代码
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) } # 示例结果 objective_function(df_optimize[1,],df_optimize[3,],df_optimize[5,]) # [1] 1.444444 objective_function(df_optimize[2,],df_optimize[4,],df_optimize[6,]) # [1] 3.7 # 错误尝试 optimize(interval = df_optimize[1:10,], f = objective_function) # Error in x$a : $ operator is invalid for atomic vectors
解决方案
由于总共有C(10,3) = 120种组合,数量很小,直接枚举所有可能的组合是最直接高效的方法,具体实现如下:
# 重新定义目标函数:输入为行索引向量 objective_func <- function(row_indices, df) { selected_rows <- df[row_indices, ] sum_a <- sum(selected_rows$a) sum_bc <- sum(selected_rows$b) + sum(selected_rows$c) return(sum_bc / sum_a) } # 生成所有3行的组合(行索引) all_combinations <- combn(1:nrow(df_optimize), 3) # 计算每个组合的目标值 all_results <- apply(all_combinations, 2, function(comb) { objective_func(comb, df_optimize) }) # 找到最小结果对应的组合 min_index <- which.min(all_results) best_combination <- all_combinations[, min_index] min_result <- all_results[min_index] # 输出结果 cat("最优行组合索引:", best_combination, "\n") cat("最小目标值:", min_result, "\n") cat("选中的行数据:\n") print(df_optimize[best_combination, ])
运行结果
最优行组合索引: 1 3 8 最小目标值: 0.9444444 选中的行数据: a b c 1 9 3 5 3 7 5 1 8 10 9 4
内容的提问来源于stack exchange,提问作者mpr122716o
相关产品推荐
相关产品推荐

