如何在Gurobi Python中为MILP问题编写嵌套求和带乘法的约束
Gurobi嵌套求和乘法约束实现方案
根据你要构建的约束形式(嵌套求和+乘法:对每个i,Σj(Σk(xijk × yjk)) ≤ zi),直接用Gurobi的quicksum工具即可高效实现,以下是具体代码示例:
步骤1:定义集合与变量
先明确你的索引集合(比如I、J、K,可根据实际业务用列表/集合定义),再创建对应的Gurobi变量:
from gurobipy import Model, GRB, quicksum # 示例集合,替换为你的实际索引 I = [1, 2, 3] J = ["A", "B", "C"] K = [0, 1] model = Model("OptimizationModel") # 三维决策变量x_ijk x = model.addVars(I, J, K, vtype=GRB.CONTINUOUS, name="x") # 二维变量/参数y_jk:如果是参数直接用字典存储,比如y = {(j,k): 1.5 for j in J for k in K} y = model.addVars(J, K, vtype=GRB.CONTINUOUS, name="y") # 一维变量z_i z = model.addVars(I, vtype=GRB.CONTINUOUS, name="z")
步骤2:添加嵌套求和约束
利用双层quicksum实现嵌套求和,避免低效的Python循环:
for i in I: # 内层对k求和x_ijk*y_jk,外层对j求和,最终约束结果≤z_i left_hand_side = quicksum(quicksum(x[i,j,k] * y[j,k] for k in K) for j in J) model.addConstr(left_hand_side <= z[i], name=f"Constraint_{i}")
注意事项
- 必须用
quicksum而非Python内置sum,Gurobi会对quicksum生成的表达式做优化,大幅提升大规模模型的构建速度 - 如果
y是固定输入参数,无需创建Gurobi变量,直接用Python字典代入计算即可 - 约束命名带上索引
i,方便后续通过model.getConstrByName()调试特定约束
内容的提问来源于stack exchange,提问作者Margi Shah
相关产品推荐
相关产品推荐

