Programmazione lineare con Python e PuLP

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:

Reparto ProdottoA ProdottoB
Stampaggio 25.000 35000
Verniciatura 33.000 17.000
Assemblaggio A 22.500 0
Assemblaggio B 0 15.000
Profitto netto unitario 300 250

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

Informazioni su Carlo Bazzo 12 Articoli
Carlo Bazzo è fondatore di Epysoft, sysadmin e network engineer per due multinazionali, talvolta marketing consultant per Xerox, KeyPoint Intelligence, HP. E' contattabile via Linkedin o su Twitter.