2011-10-11 66 views
11

經過多年和多年的Matlab,我對Python仍然很陌生。我正在嘗試使用Pulp來設置一個整數線性程序。使用矩陣的Python紙漿

鑑於數的數組:

{P[i]:i=1...N} 

我希望最大化:

sum(x_i P_i) 

受約束

A x <= b 
A_eq x = b_eq 

並與邊界(基於矢量邊界)

LB <= x <= UB 

然而,在紙漿中,我沒有看到如何正確地做矢量聲明。我正在使用:

RANGE = range(numpy.size(P)) 
x = pulp.LpVariable.dicts("x", LB_ind, UB_ind, "Integer") 

其中我只能輸入個別界限(因此只有1個數字)。

prob = pulp.LpProblem("Test", pulp.LpMaximize) 
prob += pulp.lpSum([Prices[i]*Dispatch[i] for i in RANGE]) 

並且爲了約束,我真的必須每行都做這行嗎?看來我失去了一些東西。我希望得到一些幫助。文檔討論了一個簡短的例子。在我的情況下,變量的數量是幾千。

+0

正如我在PuLP中記得的那樣,您必須逐個添加每個約束(逐行)。 – arboc7

+0

我有同樣的問題。我知道這是舊的。我會非常感激滿意的答案! –

回答

2

初始化後,您可以設置lowBound和upBound變量。 您可以創建一個數組變量與

LB[i] <= x[i] <= UB[i] 

用下面的代碼。

x = pulp.LpVariable.dicts("x", RANGE, cat="Integer") 
for i in x.viewkeys(): 
    x[i].lowBound = LB_ind[i] 
    x[i].upBound = UB_ind[i] 

的第二個參數LpVariable.dict是該指數設定的決策變量,而不是他們的下界。