在R语言嵌套循环中将线性规划结果存入数据框
嘿,别纠结啦!刚学R的时候碰到这种“结果存不进向量”的问题太常见了,我帮你一步步搞定~
首先得明确:lpSolve里的lp()函数返回的是一个列表对象,不是单个数值,直接把它塞向量里肯定不行,得先提取你需要的具体结果(比如目标函数值、变量解),再存到向量里。
完整示例代码
我先补全你没写完的代码,再加上循环存储的正确写法:
library(lpSolve) # 先定义多组权重,比如这里用a1从1到5、a2从1到5的所有组合 weight_pairs <- expand.grid(a1 = 1:5, a2 = 1:5) # 预分配存储目标函数值的向量(比每次c()添加更高效) obj_results <- numeric(nrow(weight_pairs)) # 如果要存x1和x2的解,可以预分配一个矩阵 var_solutions <- matrix(nrow = nrow(weight_pairs), ncol = 2, dimnames = list(NULL, c("x1", "x2"))) # 循环处理每组权重 for (i in 1:nrow(weight_pairs)) { # 取出当前组的权重 current_a1 <- weight_pairs$a1[i] current_a2 <- weight_pairs$a2[i] # 1. 设置目标函数:max a1*x1 + a2*x2 f.obj <- c(current_a1, current_a2) # 2. 约束矩阵 f.con <- matrix( c(1, 1, # 约束1:x1 + x2 <= 500 8, -9), # 约束2:8x1 - 9x2 = 0 nrow = 2, byrow = TRUE ) # 3. 约束方向:<= 和 = f.dir <- c("<=", "=") # 4. 约束右侧的数值 f.rhs <- c(500, 0) # 5. 求解最大化线性规划 lp_out <- lp("max", f.obj, f.con, f.dir, f.rhs) # 6. 提取结果并存入向量/矩阵 if (lp_out$status == 0) { # status=0表示求解成功 obj_results[i] <- lp_out$objval # 存目标函数值 var_solutions[i, ] <- lp_out$solution # 存x1、x2的解 } else { # 求解失败时存NA,避免程序中断 obj_results[i] <- NA var_solutions[i, ] <- NA } } # 查看结果 print("目标函数值向量:") obj_results print("x1和x2的解矩阵:") var_solutions
关键知识点
- 预分配容器:用
numeric(n)或matrix()提前分配好存储的空间,比每次用c(obj_results, new_value)添加元素效率高太多,尤其是循环次数多的时候。 - 提取lp结果:
lp()返回的列表里常用的元素:$objval:目标函数的最优值$solution:变量x1、x2的最优解$status:求解状态(0=成功,其他数值对应不同错误)
- 错误处理:加入
if (lp_out$status == 0)的判断,能避免求解失败时程序报错,还能标记出有问题的权重组。
内容的提问来源于stack exchange,提问作者Sankalp Sharma
相关产品推荐
相关产品推荐

