【问题标题】:Adding Logical Constraints in PuLP在 PuLP 中添加逻辑约束
【发布时间】:2021-12-08 01:53:29
【问题描述】:

我正在尝试在钢中添加合金,以便以最低成本将钢的碳含量提高到一定范围。 但一个限制是,在现实生活中,机器最多只能添加 50 公斤的合金。因此,如果我们添加某种合金,那么它可以是 50/60/70 公斤等,如果我们不添加该特定合金,则可以是 0 公斤。我将如何添加相同的约束?

提前致谢!

下面是我写的函数:

def optimizer_pd(test):

    # declare problem
    prob = LpProblem("Minimize Alloy Cost",LpMinimize)

    # percentage of carbon in each alloy
    percs = ele_percs['carbon']
    
    # alloy_vars is a list of all possible alloys
    
    # constraints
    prob += lpSum([percs[i] * alloy_vars[i] for i in alloys]) >= minimum_carbon
    prob += lpSum([percs[i] * alloy_vars[i] for i in alloys]) <= maximum_carbon


    # objective function
    prob += lpSum([costs[i] * alloy_vars[i] for i in alloys])
    
    # solving
    sol = prob.solve()
    
    # results
    var_dict = {}
    for var in prob.variables():
        var_dict[var.name] = var.value()

    return var_dict

【问题讨论】:

    标签: python optimization linear-programming pulp


    【解决方案1】:

    欢迎来到本站。

    将来,如果您为您正在尝试做的事情提供一个最小的可重现示例,您将获得更好的答案。但是,从您发布的内容中可以清楚地看到。

    因此,您需要引入一个额外的帮助器或“指标”二进制变量,由合金索引来执行此操作。这个是/否变量表示承诺至少使用最低量的合金。 (您基本上需要将您的需求分解为 2 个变量......)

    然后您将需要对使用量使用“大 M”约束(或仅使用最大值)。在伪代码中:

    use[alloy] ∈ {0,1}
    amount[alloy] ∈ non-negative reals
    min[alloy], max[alloy] are fixed min/max parameters
    

    最小使用限制:

    amount[alloy] >= use[alloy] * min[alloy]   for each alloy
    

    最大使用限制:

    amount[alloy] <= use[alloy] * max[alloy] (or big M)  for each alloy
    

    插入一些数字以确保您“相信”:)

    【讨论】:

    • 这很完美!谢谢