在 PuLP 中添加逻辑约束

Adding Logical Constraints in PuLP

我正在尝试向钢中添加 alloys,以便以最低的成本将钢的碳含量控制在一定范围内。 但一个限制是,在现实生活中,机器只能添加至少 50 公斤的 alloy。因此,如果我们添加某个 alloy,那么它可以是 50/60/70 公斤等,如果我们不添加那个特定的 alloy,则可以是 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

欢迎来到本站。

将来,如果您为您尝试做的事情提供一个最低限度的可重现示例,您将获得更好的答案。但是,从你post.

的内容来看已经足够清楚了

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

输入几个数字以确保您“相信”:)