我试图在钢中添加合金,以便以最小的成本将钢的碳含量降低到一定范围。但有一个限制是,在现实生活中,机器只能添加至少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
插入一些数字,以确保你"相信它";:)