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