2015-10-27 200 views
0

我正在嘗試使用PuLP來解決FLP問題。我想爲變量值添加邏輯約束。如何在PuLP中添加邏輯約束條件

我有LpVariable f和C是LpVariables列表。我想將f添加到問題的約束中,這取決於c [i]的值。

下面的代碼片段>

prob = LpProblem("The MILP problem", LpMinimize) 

加1約束:

prob += lpSum(c[i] for i in range (len(c))) == 2 

現在我想添加如下約束:

if`lpSum(c[i] for i in range (len(c))) > 1: 
`  prob += f == 1 
    else: 
     prob += f == 0 


prob += lpSum(c[i] for i in range (len(c)) + f) 

現在的問題是LpVariables C [1]初始化爲None,因此在計算時拋出錯誤210。

我希望我很清楚。讓我知道如果需要任何幫助理解這個查詢,但我認爲給出的代碼片段就夠了。

回答

1

三點:

(1) 你的第一個約束迫使lpsum等於2,因此f永遠是1在你的榜樣 - 你確定你的提法是正確的?

(2) 如果語句不能與lpSum結合使用 - 則應將其表示爲實際約束。

例如,你可以將f作爲一個二元變量,並添加這個約束:

prob += lpSum(c[i] for i in range (len(c))) - 1 <= M*f 

其中M是一個足夠大的數字。 然後,如果f == 0,我們有「lpsum()< = 1」,並且如果f == 1,我們可以將lpsum作爲任何東西。玩弄這種類型的約束,讓f按照你想要的方式行事。 (3) 約束「prob + = lpSum(c [i] for i in range(len(c))+ f)」除非它被認爲是MILP的目標,否則什麼也不做?如果是這樣,您應該在prob = LpProblem(「MILP問題」,LpMinimize)後立即添加它

祝您好運