PuLP中添加逻辑约束:实现合金最小添加量与步进值限制的方法
PuLP添加合金投料特殊约束的实现方案
你需要引入二进制辅助变量+整数步进变量配合大M约束实现要求的投料逻辑,具体修改步骤如下:
核心变量定义调整
- 对每类合金
i,新增二进制变量y[i]:取值为1表示添加该类合金,取值为0表示不添加 - 将原有的连续型投料变量替换为非负整数变量
k[i]:表示10kg的投料步进倍数,最终实际投料量为10 * k[i],天然满足10kg步进要求
新增逻辑约束
引入单种合金最大投料上限MAX_ADD(需根据实际生产工况设置,仅需略高于单种合金的最大可能投料量即可),添加如下两组约束:
- 不添加时投料为0:
10 * k[i] <= MAX_ADD * y[i],当y[i]=0时自动限制k[i]=0,对应投料量为0 - 添加时满足最小投料要求:
k[i] >=5 * y[i],当y[i]=1时要求k[i]>=5,对应投料量至少为10*5=50kg,满足最小添加量要求
修改后完整代码
from pulp import LpProblem, LpMinimize, LpVariable, lpSum def optimizer_pd(test): # 声明问题 prob = LpProblem("Minimize Alloy Cost", LpMinimize) # 配置参数 percs = ele_percs['carbon'] # 单种合金最大投料上限,按需调整 MAX_ADD = 1000 # 定义变量 # k[i]:10kg步进倍数,整数 k = LpVariable.dicts("step_count", alloys, lowBound=0, cat='Integer') # y[i]:是否添加该合金,二进制变量 y = LpVariable.dicts("use_alloy", alloys, lowBound=0, upBound=1, cat='Binary') # 核心逻辑约束 for i in alloys: # 不添加时投料为0,添加时不超上限 prob += 10 * k[i] <= MAX_ADD * y[i] # 添加时最小投料50kg prob += k[i] >= 5 * y[i] # 碳含量区间约束 total_carbon = lpSum([percs[i] * 10 * k[i] for i in alloys]) prob += total_carbon >= minimum_carbon prob += total_carbon <= maximum_carbon # 目标函数:最小化添加成本 prob += lpSum([costs[i] * 10 * k[i] for i in alloys]) # 求解(默认CBC求解器支持整数规划) sol = prob.solve() # 结果整理 var_dict = {} for var in prob.variables(): var_dict[var.name] = var.value() # 可按需补充计算实际投料量:10*k[i]的数值写入结果 return var_dict
注意:若存在多炉次批量生产场景,可直接调整MAX_ADD参数适配不同设备的投料上限即可,约束逻辑无需修改
内容的提问来源于stack exchange,提问作者jojoreferencepointer
相关产品推荐
相关产品推荐

