You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:39:01