簡體   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