在 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
输入几个数字以确保您“相信”:)
我正在尝试向钢中添加 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
输入几个数字以确保您“相信”:)