2011-10-11 12 views
11

Sono ancora molto nuovo a Python, dopo anni e anni di Matlab. Sto cercando di usare Pulp per impostare un programma lineare intero.Polpa di pitone usando con le matrici

Dato un array di numeri:

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

voglio massimizzare:

sum(x_i P_i) 

soggetta ai vincoli

A x <= b 
A_eq x = b_eq 

e con limiti (bounds a base vettoriale)

LB <= x <= UB 

In Pulp, tuttavia, non vedo come eseguire correttamente le dichiarazioni vettoriali. Stavo usando:

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

dove posso entrare solo i singoli limiti (in modo che solo 1 numero).

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

e per i vincoli, devo davvero fare questa linea per linea? Sembra che mi manchi qualcosa. Gradirei un aiuto. La documentazione tratta di un breve esempio. Il numero di variabili nel mio caso è di poche migliaia.

+0

Come ricordo in PuLP, è necessario aggiungere ogni vincolo singolarmente (riga per riga). – arboc7

+0

Ho la stessa domanda. So che questo è vecchio. Apprezzerei molto una risposta soddisfacente! –

risposta

2

È possibile impostare il LowBound e il upBound sulle variabili dopo l'inizializzazione. È possibile creare un array di variabili con

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

con il seguente codice.

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] 

Il secondo parametro è l'indice LpVariable.dict impostare delle variabili di decisione, non i loro limiti inferiori.

Problemi correlati