繁体   English   中英

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

[英]How can I write an IF condition for my decision variable for Mixed Integer Linear Programming (MILP) using PuLP GLPK on Python?

我正在尝试在 PuLP 上使用混合 integer 线性编程和 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 和 Objective Function = 7.0

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

x1 > 0 IF x2 > 2

或类似的东西:

x1 > 0 IF x2 == 3

基本上,如何将 if 条件语句集成到 MILP 约束中。

您要查找的搜索词是“指标变量”或“大 M 约束”。

据我所知,PULP 不直接支持指标变量,因此大 M 约束是通向 go 的方法。

一个简单的例子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))

x2 > 2时,我们希望约束x1 <= 0存在。 x2 <= 2时,不存在这样的约束( x1可以是正数或负数)。

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

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

选择它来表示条件x2 > 2 实现这一点的最简单方法是添加约束:

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

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

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

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

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

再次了解此约束如何工作,请考虑以下情况,如果 b1 为 true ( 1 ),则约束处于活动状态并变为: x1 <= 0 如果 b1 为 false ('0'),则约束变为x1 <= M2 ,前提是M2足够大,这将不起作用(这里它可能小至 10,因为x1的上限已经为 10。

在上面的完整代码中,如果您改变目标 function 中x1的系数,您应该注意到b1已激活/停用,并且附加约束按预期应用于x1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM