You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:22:45