guobipy(Gurobi)引入列表绝对差约束的最大化模型不可行问题排查
Gurobi模型不可行问题修复方案
核心错误点及修复方法
- c变量约束的维度与变量重名错误
该错误是导致不可行的核心原因:原代码定义c[j]约束时,内层求和的迭代变量和外层循环变量均使用j,变量作用域冲突导致c[j]的计算逻辑完全错误,和后续差值约束无法匹配。
原错误代码段:
z=0 for j in n: o.addConstr(c[j]== grb.quicksum((j+1)* x[z,j] for j in range(0,N))) z=z+1
修复后代码段:
# 按x的行索引z计算对应赋值结果,c[z]为z行选中列的索引+1 for z in n: o.addConstr(c[z] == grb.quicksum((k+1)*x[z,k] for k in n))
- 模型实例重复创建冗余错误
原代码在with语句中创建带环境的模型后,又重新初始化了空模型,导致环境配置失效,删除冗余行即可:
原错误代码段:
with grb.Env() as env, grb.Model(env=env) as o: o = grb.Model() # 冗余行,直接删除
- 绝对值约束写法不规范
直接调用abs_函数绑定变量可能导致约束解析异常,最大化场景下可替换为两个线性约束,逻辑等价且稳定性更高:
原错误代码段:
for j in n: o.addConstr(adifc[j]== abs_(difc[j]))
修复后代码段:
for j in n: o.addConstr(adifc[j] >= difc[j]) o.addConstr(adifc[j] >= -difc[j])
- 变量边界优化(可选)
定义adifc变量时可直接指定下界为0,减少不必要的约束校验:
adifc[j] = o.addVar(vtype=grb.GRB.INTEGER, lb=0, name='adifc'+str(j))
内容的提问来源于stack exchange,提问作者Deepan
相关产品推荐
相关产品推荐

