2011-10-11 17 views
11

Wciąż jestem nowy w Pythonie, po latach Matlaba. Próbuję użyć Pulp, aby ustawić program liniowy integer.Python Pulp using with Matrices

Biorąc pod tablicą liczb:

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

chcę maksymalizować:

sum(x_i P_i) 

zastrzeżeniem ograniczeń

A x <= b 
A_eq x = b_eq 

iz granicach (granice oparte wektor)

LB <= x <= UB 

W pulpy nie widzę jednak sposobu prawidłowego tworzenia deklaracji wektorowych. Używałem:

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

gdzie mogę wpisać tylko pojedyncze granice (czyli tylko 1 cyfrę).

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

i dla ograniczeń, czy naprawdę muszę to zrobić w linii? Wygląda na to, że czegoś mi brakuje. Byłbym wdzięczny za pomoc. Dokumentacja omawia krótki przykład. Liczba zmiennych w moim przypadku to kilka tysięcy.

+0

Jak pamiętam w PuLP, musisz dodać każde ograniczenie indywidualnie (linia po linii). – arboc7

+0

Mam to samo pytanie. Wiem, że to jest stare. Byłbym wdzięczny za satysfakcjonującą odpowiedź! –

Odpowiedz

2

Możesz ustawić lowBound i upBound na zmiennych po inicjalizacji. Można utworzyć tablicę zmiennych z

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

z następującego kodu.

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] 

Drugi parametr LpVariable.dict to zbiór indeksów zmiennych decyzyjnych, a nie ich dolnych granic.