如何在PuLP中替代Gurobi max_()实现布尔变量取最大约束?
用PuLP替代Gurobi
gp.max_() 的布尔变量约束方案 逻辑等价转换
原Gurobi中针对布尔变量的y[c,d] == gp.max_([z[s,d] for s in df1.loc[c]]),可以拆解为两组线性约束(因所有变量都是0-1布尔型):
- 对每个
s ∈ df1.loc[c]:z[s,d] ≤ y[c,d]—— 确保只要有一个z为1,y必须为1 sum(z[s,d] for s ∈ df1.loc[c]) ≥ y[c,d]—— 确保当所有z为0时,y必须为0
PuLP实现代码
替换原Gurobi的约束添加逻辑,完整代码如下:
import pulp as plp # 假设problem是已初始化的PuLP模型,y、z、x为预定义的布尔型LpVariable for day in days_list: # 实现max_对应的约束逻辑 for c in df2: # 约束1:每个z[s,day]不能超过y[c,day] for s in df1.loc[c]: problem.addConstraint(z[s, day] <= y[c, day]) # 约束2:z的求和值至少等于y[c,day] problem.addConstraint(plp.lpSum(z[s, day] for s in df1.loc[c]) >= y[c, day]) # 原有的x求和约束直接适配PuLP语法 problem.addConstraints( plp.lpSum(x[s, day] for s in df1.loc[c]) <= 32 * y[c, day] for c in df2 )
原代码错误分析
你之前的尝试存在两个关键问题:
- 调用
z[s, day].value:PuLP变量在模型求解前没有实际数值,无法用于条件判断 - 使用Python原生
max()/sum():这些函数无法识别PuLP的变量对象,必须使用PuLP提供的lpSum()来构建线性表达式
内容的提问来源于stack exchange,提问作者Qingyao-sof
相关产品推荐
相关产品推荐

