我一直在尝试修改Knapsack Linear Programming帖子中的示例,以解决具有多个约束的多重背包类型问题。下面提供了一个reprex。将背包限制为x
个项目时,链接后的解决方案效果很好。但是,当添加以下所述的其他项目限制约束(2和3)时,我的尝试失败了。
背包必须满足以下条件:
exact.num.elt <- 10
Type1
,Type2
等(包含在向量t
中)和相应的重量(包含在向量w
中)Type
的总和必须分别等于1、2或3。库(lpSolve)
p <- c(rnorm(50, 15, 5))
t <- rep(c("Type1", "Type2", "Type3", "Type4", "Type5"), length.out = 50) #item labels
w <- c(rnorm(50, 3500)) #the weight of each item
cap <- 32000 #sum of 'w' cannot exceed this amount
exact.num.elt <- 10 #total knapsack capacity
# max item limit by Type - set const.dir to "=" for each type
Type1 <- 2
Type2 <- 1
Type3 <- 2
Type4 <- 2
Type5 <- 3
mod <- lp(direction = "max",
objective.in = p,
const.mat = rbind(w, rep(1, length(p))) & rbind(t, rep(1, length(t))),
const.dir = c("<=", "=", "=", "=", "=", "=", "="),
const.rhs = c(cap, exact.num.elt, Type1, Type2, Type3, Type4, Type5),
all.bin = TRUE)
运行上述reprex会产生以下错误:
rbind(w,rep(1,length(p)))和rbind(t,rep(1,length(t)))中的错误: 操作仅适用于数字,逻辑或复杂类型
我可以看到此错误与我对constant.mat
参数进行编码的方式有关。但是,我无法弄清楚如何添加额外的Type
约束而不产生一个错误或另一个错误。我还希望能够生成多个(例如10或20个)不同的解决方案,以便生成汇总统计信息。