我必须用 Pull 解决 Python 中的整数线性优化问题。 我解决了基本问题,现在我必须添加额外的约束。 有人可以帮助我用逻辑指示器添加条件吗? 逻辑限制是:如果 A>20,则 B>5
这是我的代码:
from pulp import *
prob = LpProblem("The Optimization Problem", LpMaximize)
A = LpVariable("A", 0, 100)
B = LpVariable("B", 0, 200)
C = LpVariable("C", 0, 100)
R1 = LpVariable("R1", 0)
R2 = LpVariable("R2", 0)
R1 = 0.1 * A + 0.2 * B + 0.075 * C
R2 = 0.05 * A + 0.1 * B + 0.05 * C
prob += 2 * A + 3 * B + 2.55 * C - 0.6 * R1 - 0.8 * R2
prob += 0.5 * A + 0.8 * B + C <= 100, "T1"
prob += 0.8 * A + 0.6 * B + 0.2 * C <= 100, "T2"
prob.writeLP("OptimizationModel.lp")
prob.solve()
print("Status:", LpStatus[prob.status])
for v in prob.variables():
print(v.name, "=", v.varValue)
最佳答案
我认为您在 f 中创建二进制“开关”变量的方向是正确的。
f = LpVariable('f',0,1,cat='Integer')
如果我理解正确的话,只要 A > 20,就需要 B > 5,对吗?
那么您需要调整代码,只要 A 大于 20,f 就设置为 1。
由于 f 是二进制的,因此您可以这样做:
prob+= f>= (A-20)/80
prob+= B>= 6*f
在第一行中,对于从 0 到 19 的 A 值,(A-20)/80 将为负值,并且当 A 为 20 时为零。这将确保对于这些 A 值,f 为零。
当 f 为零时,第二个约束仅意味着 B 必须至少为零,无论如何这是它的下界。
但是,如果 A 为 21 及以上,即 A>20,则 (A-20)/80 变为正数,但绝不会大于 1(稍后会详细介绍)。当 A 为 21 及以上时,这会强制 f 至少为 1。由于f只能为1或0,因此f被设置为1。
这将导致第二个约束在 B 为 1(即 A 大于 20)时强制 B 至少为 6。简而言之,只要 f 为 1(即 A 大于 20),B 就大于 5 20.
希望这有帮助!如果不起作用,请告诉我。我自己一直在研究 puLP 问题,并使用这种方法编写了一些我的约束。
注意: 我们除以 81 以确保 (A-20)/80 永远不会大于 1。例如,如果 A 为 21,则 (A-20)/80 的计算结果为 1/80。由于 A 只能大到 100,因此 (A-20)/80 只能大到 (100-20)/80,即 1。如果我们将其更改为 (A-20)/X,其中这里的 X 是低于 (A-20) 最大值的任何其他值,则分数 (A-20)/X 可以大于 1。并且由于 f 是二进制(1 或 0),因此约束 f>= (A-20)/X 意味着我们实际上会迫使 A 比其他情况更小。
关于python - 使用 PuLP 进行线性优化,变量附加条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48288286/