在纸浆中添加逻辑约束



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

欢迎来到本站。

在将来,如果您提供一个最小可复制的示例,您将得到更好的答案。但是,从你的帖子中已经足够清楚了。

因此,您需要引入一个额外的帮助器或"指示符"。二进制变量,由合金索引来做这个。这个是/否变量表示承诺至少使用最少量的合金。(你需要把你的需求分解成2个变量....)

那么你需要使用"大"限制要使用的数量(或者只使用最大值)。在伪代码:

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

插入一些数字,以确保你"相信它";:)

相关内容

  • 没有找到相关文章

最新更新