如何在GurobiPy实现的0-1背包模型中添加产品配对约束?
0-1背包模型添加配对产品约束的实现方法
核心逻辑
你需要实现的约束是:若产品i被选入新仓库(Xᵢ=1),则其配对产品j必须也被选入(Xⱼ=1)。对应整数规划的数学约束为:Xᵢ ≤ Xⱼ
因为Xᵢ和Xⱼ都是0-1变量,当Xᵢ=1时,Xⱼ必须≥1(即Xⱼ=1);当Xᵢ=0时,Xⱼ可以取0或1,完全符合需求。
代码实现步骤
假设你已经定义了Gurobi模型model,以及0-1变量字典X(键为产品编号,值为对应Gurobi Var对象),根据不同的配对数据结构,实现方式如下:
情况1:配对列表为二元组列表(如pairings = [(i1,j1), (i2,j2), ...])
直接遍历每个配对,添加约束:
# 遍历所有配对,添加i选中则j必须选中的约束 for i, j in pairings: model.addConstr(X[i] <= X[j], name=f"pair_constraint_{i}_{j}")
情况2:配对列表为字典(如pair_dict = {i: [j1,j2,...], ...},一个产品对应多个配对产品)
遍历字典的每个键值对,为每个配对产品单独添加约束:
# 遍历每个主产品,为其所有配对产品添加约束 for i, required_js in pair_dict.items(): for j in required_js: model.addConstr(X[i] <= X[j], name=f"pair_constraint_{i}_{j}")
注意事项
- 如果需求是双向必选(i和j必须同时选或同时不选),则需要添加双向约束,等价于
Xᵢ == Xⱼ,可直接用model.addConstr(X[i] == X[j], ...)简化。 - 约束名称
name参数可选,但建议添加,方便后续调试时查看约束详情。
内容的提问来源于stack exchange,提问作者RB Vries de
相关产品推荐
相关产品推荐

