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

R使用ompr包创建多背包MIP模型出现变量未识别错误如何解决

R ompr包多背包问题约束编写错误解决

你出现报错的核心原因是两个约束的维度逻辑和写法不符合ompr的多维度约束规范,具体错误和修正方案如下:

错误说明

  1. 背包容量约束错误:你原写法将所有背包的所有物品重量加总后匹配c[j],既不符合多背包每个背包单独限制容量的逻辑,也会因为j的索引范围混乱导致ompr识别变量失败。
    正确逻辑是:对每个背包j单独生成约束,仅对该背包下的所有物品重量求和,限制不超过背包j的容量。
  2. 物品不重复约束错误:你原写法将所有物品、所有背包的变量加总后限制<=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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:36:03