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

问题描述 投票:1回答:1

我必须用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)
python optimization pulp integer-programming
1个回答
0
投票

我认为你在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

在第一行中,(A-20)/ 80对于A的值从0到19将为负,并且当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,这将导致第二个约束强制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小于其他情况。

© www.soinside.com 2019 - 2024. All rights reserved.