R使用ompr包创建多背包MIP模型出现变量未识别错误如何解决
R ompr包多背包问题约束编写错误解决
你出现报错的核心原因是两个约束的维度逻辑和写法不符合ompr的多维度约束规范,具体错误和修正方案如下:
错误说明
- 背包容量约束错误:你原写法将所有背包的所有物品重量加总后匹配
c[j],既不符合多背包每个背包单独限制容量的逻辑,也会因为j的索引范围混乱导致ompr识别变量失败。
正确逻辑是:对每个背包j单独生成约束,仅对该背包下的所有物品重量求和,限制不超过背包j的容量。 - 物品不重复约束错误:你原写法将所有物品、所有背包的变量加总后限制<=1,等价于要求所有背包总共只能放1个物品,和你要求的「每个物品仅能放入1个背包」完全不符,同样会触发维度索引错误。
正确逻辑是:对每个物品i单独生成约束,仅对该物品在所有背包的变量求和,限制总和不超过1。
修正后的完整代码
library(tidyverse) library(ROI) library(ROI.plugin.glpk) library(ompr) library(ompr.roi) # Create variables from data to use in model n <- nrow(KP) v <- KP$Value w <- KP$Weight c <- c(240,150) m <- length(c) # Now solve the model solution <- MIPModel() %>% add_variable(x[i, j], i = 1:n,j=1:m, type = "binary") %>% set_objective(sum_expr(v[i] * x[i, j], i = 1:n, j=1:m), "max") %>% # 修正:每个背包j单独做容量约束 add_constraint(sum_expr(w[i] * x[i, j], i = 1:n) <= c[j], j = 1:m) %>% # 修正:每个物品i单独做不重复约束 add_constraint(sum_expr(x[i, j], j = 1:m) <= 1, i = 1:n) %>% solve_model(with_ROI(solver = "glpk")) %>% get_solution(x[i, j])
后续你可以将solution中的i和原KP数据的Itemid匹配,j对应背包编号,筛选value>0的记录即可得到每个背包的装包结果。
内容的提问来源于stack exchange,提问作者JGW
相关产品推荐
相关产品推荐

