如何在Python上使用PuLP GLPK为混合整数线性编程(MILP)的决策变量编写IF条件?

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

我正在尝试在PuLP上使用混合整数线性编程并在Python上使用GLPK求解器来解决优化问题。到目前为止,我已经成功解决了带有约束的基本优化问题,例如:

prob = LpProblem("MILP", LpMinimize)
x1 = LpVariable("x1",lowBound=0, cat = 'Binary')
x2 = LpVariable("x2", cat = 'Continuous')
prob += 4*x1 + x2, "Objective Function"
prob += x2 - 4*x1 <= 0
prob += x2 - 2*x1 >= 0
status = prob.solve()
LpStatus[status]
value(x1), value(x2), value(prob.objective)

这给出最佳结果,其中x1 = 1.0,x2 = 3.0,目标函数= 7.0

我想弄清楚的是如何解决带有if条件的优化问题,例如,以下约束:

x1 > 0 IF x2 > 2

或类似的东西:

x1 > 0 IF x2 == 3

特别是,如何将if条件语句集成到MILP约束中。

python pulp glpk
1个回答
0
投票

欢迎您!您要查找的google搜索词是“指标变量”或“ big-M约束”。

据我所知,PULP不直接支持指标变量,所以大M约束是可行的方法。

一个简单的例子x1 <= 0 IF x2 > 2

from pulp import *

prob = LpProblem("MILP", LpMaximize)
x1 = LpVariable("x1", lowBound=0, upBound=10, cat = 'Continuous')
x2 = LpVariable("x2", lowBound=0, upBound=10, cat = 'Continuous')

prob += 0.5*x1 + x2, "Objective Function"

b1 = LpVariable("b1", cat='Binary')

M1 = 1e6
prob += b1 >= (x1 - 2)/M1

M2 = 1e3
prob += x2 <= M2*(1 - b1)

status = prob.solve()
print(LpStatus[status])
print(x1.varValue, x2.varValue, b1.varValue, pulp.value(prob.objective))

我们希望在x1 <= 0时存在约束x2 > 2。当x2 <= 2不存在此类约束时(x1可以为正或负)。

首先我们创建一个二进制变量:

b1 = LpVariable("b1", cat='Binary')

选择此项以表示条件x2 > 2。实现此目的的最简单方法是添加约束:

M1 = 1e6
prob += b1 >= (x2 - 2)/M1

这里M1是big-M值。需要选择使得x2的最大可能值是(x2-2)/M。它应尽可能小以避免数值/缩放问题。在这里,值为10会起作用(<=1的上限为10)。

要了解此约束的工作原理,请考虑以下情况,对于x2 <= 2,右侧最多为0,因此无效(二进制变量的下限已设置为0)。但是,如果x2右侧将迫使x2>2大于0-作为二进制变量,它将被强制为1。

最后,我们需要建立所需的约束:

b1

再次了解此约束的工作原理,请考虑各种情况,如果b1为true(M2 = 1e3 prob += x1 <= M2*(b1 - 1) ),则该约束处于活动状态并变为:1。如果b1为假('0'),则约束变为x1 <= 0,如果x1 <= M2足够大,则将不起作用(此处可能小到10,因为M2已具有上限10。] >

在上面的完整代码中,如果您在目标函数中更改x1的系数,则应注意x1已被激活/停用,并且附加约束已按预期方式应用于b1

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