使用PuLP进行线性优化,对变量进行附加条件

时间:2018-01-16 19:12:20

标签: python optimization pulp integer-programming

我必须用Python来解决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)

1 个答案:

答案 0 :(得分:0)

我认为你正在创建一个二进制&#39;开 - 关&#39;变量在f。

f = LpVariable('f',0,1,cat='Integer')

如果我理解正确,你需要B是&gt;只要A> 5,则为5。 20,对吗?

然后您需要调整代码,只要A超过20,f就会设置为1.

由于f是二进制,你可以这样做:

prob+= f>= (A-20)/80
prob+= B>= 6*f

在第一行中,(A-20)/ 80对于A的值从0到19将为负,并且当A为20时将为零。这将确保对于这些A的值,f为零。 / p>

当f为零时,第二个约束只暗示B必须至少为零,无论如何都是它的下限。

然而,如果A是21且更高,即A> 20,那么(A-20)/ 80变为正,但是从不大于1(稍后更多)。然后,只要A为21或更高,这就迫使f至少为1。由于f只能是1或0,因此f设置为1.

当B为1时,这将导致第二个约束强制B至少为6,这是每当A大于20时。简而言之,只要f为1,B就大于5,即只要A大于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小于其他情况。