Programmazione lineare con Python e PuLP

Tweet about this on TwitterShare on FacebookShare on LinkedInShare on Google+Share on StumbleUponEmail this to someone

Vogliamo dare un breve esempio di come risolvere un problema di programmazione lineare con Python. Tra le varie opzioni abbiamo scelto il modulo PuLP sviluppato da Stuart Mitchell.

Un problema LP

Una azienda meccanica può produrre 2 diversi prodotti utilizzando 4 reparti. Sono note le capacità produttive massime annuali dei 4 reparti in relazione ai due tipi di prodotto:

RepartoProdottoAProdottoB
Stampaggio25.00035000
Verniciatura33.00017.000
Assemblaggio A22.5000
Assemblaggio B015.000
Profitto netto unitario300250

Questo significa, ad esempio, che il reparto di stampaggio ha una capacità produttiva massima di 25.000 unità di prodottoA se lavora esclusivamente su questo prodotto. Ha invece una capacità massima di 35.000 unità se lavora solo per il prodottoB.

Qual’è la produzione annuale (mix di produzione) che massimizza il profitto netto totale?

Variabili

x=unità prodotte di prodottoA;
y=unità prodotte di prodottoB;

Funzione Obiettivo

max z=300*x+250*y

Vincoli

1,4*x+y ≤ 35.000
0,51*x+y ≤ 17.000
x ≤ 22.500
y ≤ 15.000
x ≥ 0
y ≥ 0

Risolviamo con Python e PuLP

PuLP è un modulo Python che consente agli utenti di descrivere e risolvere problemi LP. PuLP lavora interamente all’interno della sintassi e dei naturali idiomi di Python fornendo oggetti Python che rappresentano problemi di ottimizzazione e variabili di decisione e permettendo ai vincoli di essere espressi in un modo che è molto simile all’originale matematico.

Vi rimandiamo alla documentazione e alcuni esempi sull’uso di PuLP.


from pulp import *
x = pulp.LpVariable("x", lowBound=0)
y = pulp.LpVariable("y", lowBound=0)
problem = pulp.LpProblem("Un semplice problema di max", pulp.LpMaximize)

problem += 300*x + 250*y, "The objective function"
problem += 1.4*x + y <= 35000, "1st constraint"
problem += 0.51*x + y <= 17000, "2nd constraint"
problem += x <= 22500, "3rd constraint"
problem += y <= 15000, "4th constraint"
problem.solve()
print "Risultati della ottimizzazione:"
for variable in problem.variables():
    print variable.name, "=", variable.varValue
print "Massimo profitto netto totale:"
print value(problem.objective)

Risultati della ottimizzazione:
x = 20224.719
y = 6685.3933
Massimo profitto netto totale:
7738764.025