首页 > 解决方案 > 在 PuLP 中添加逻辑约束

问题描述

我正在尝试在钢中添加合金,以便以最低的成本将钢的碳含量提高到一定范围。但一个限制是,在现实生活中,机器最多只能添加 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

标签: pythonoptimizationlinear-programmingpulp

解决方案


欢迎来到本站。

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

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

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


推荐阅读