繁体   English   中英

在 PuLP 中添加逻辑约束

[英]Adding Logical Constraints in PuLP

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

提前致谢!

下面是我写的函数:

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

欢迎来到本站。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM