python - 在 PuLP 中添加逻辑约束
问题描述
我正在尝试在钢中添加合金,以便以最低的成本将钢的碳含量提高到一定范围。但一个限制是,在现实生活中,机器最多只能添加 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 个变量......)
然后,您将需要对要使用的数量使用“大 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
插入一些数字以确保您“相信”:)
推荐阅读
- matlab - 在matlab中初始化Kronecker delta矩阵
- python - 尝试使用目录和子目录中的 glob 进行排序
- bash - Bash函数绘制坐标数组
- animation - 我必须在 Webflow 上浪费时间来制作动画还是只使用 JavaScript 技能
- amazon-web-services - 我可以使用什么 AWS 服务每周有效地处理大量 S3 数据?
- javascript - 需要有人帮我修复一个意外敲掉我的 HTML 代码其余部分的正则表达式
- laravel - 带有嵌套 whereDate 的 Laravel 雄辩查询
- bixby - 结构概念中具有相同类型的多个属性
- python - 如何使用 Selenium 自动点击 iframe 中的多个链接?
- c# - 如何在事件处理程序之外收集有关输入触摸的信息