Risolvi il modello PuLP

Analytics per la supply chain con Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Flusso tipico di modellazione con PuLP

  1. Inizializza il modello
  2. Definisci le variabili decisionali
  3. Definisci la funzione obiettivo
  4. Definisci i vincoli
  5. Risolvi il modello
    • chiama il metodo solve()
    • verifica lo stato della soluzione
    • stampa le variabili decisionali ottime
    • stampa la funzione obiettivo ottima
Analytics per la supply chain con Python

Risolvi il modello - metodo solve

.solve(solver=None)
  • solver = Opzionale: il solver specifico da usare; predefinito quello di default.
Analytics per la supply chain con Python
# Initialize, Define Decision Vars., Objective Function, and Constraints
from pulp import *
import pandas as pd
model = LpProblem("Minimize Transportation Costs", LpMinimize)
cust = ['A','B','C']
warehouse = ['W1','W2']
demand = {'A': 1500, 'B': 900, 'C': 800}
costs = {('W1','A'): 232, ('W1','B'): 255, ('W1','C'): 264, 
         ('W2','A'): 255, ('W2','B'): 233, ('W2','C'): 250}
ship = LpVariable.dicts("s_", [(w,c) for w in warehouse for c in cust], 
                         lowBound=0, cat='Integer')
model += lpSum([costs[(w, c)] * ship[(w, c)] for w in warehouse for c in cust])
for c in cust: model += lpSum([ship[(w, c)] for w in warehouse]) == demand[c]

# Solve Model
model.solve()
Analytics per la supply chain con Python

Risolvi il modello - stato della soluzione

LpStatus[model.status]
  • Not Solved: stato prima della risoluzione.
  • Optimal: trovata una soluzione ottima.
  • Infeasible: nessuna soluzione ammissibile (es. vincoli x ≤ 1 e x ≥ 2).
  • Unbounded: funzione obiettivo non limitata; massimizzare/minimizzare tende a infinito (es. unico vincolo x ≥ 3).
  • Undefined: la soluzione ottima può esistere ma non è stata trovata.
1 Keen, Ben Alex. “Linear Programming with Python and PuLP 2 Part 2.” _Ben Alex Keen_, 1 Apr. 2016, benalexkeen.com/linear-programming-with-python-and-pulp-part-2/._{{5}}
Analytics per la supply chain con Python
# Initialize, Define Decision Vars., Objective Function, and Constraints
from pulp import *
import pandas as pd
model = LpProblem("Minimize Transportation Costs", LpMinimize)
cust = ['A','B','C']
warehouse = ['W1','W2']
demand = {'A': 1500, 'B': 900, 'C': 800}
costs = {('W1','A'): 232, ('W1','B'): 255, ('W1','C'): 264,
         ('W2','A'): 255, ('W2','B'): 233, ('W2','C'): 250}
ship = LpVariable.dicts("s_", [(w,c) for w in warehouse for c in cust], lowBound=0, cat='Integer')
model += lpSum([costs[(w, c)] * ship[(w, c)] for w in warehouse for c in cust])
for c in cust: model += lpSum([ship[(w, c)] for w in warehouse]) == demand[c]
# Solve Model
model.solve()
print("Status:", LpStatus[model.status])
Status: Optimal
Analytics per la supply chain con Python

Stampa le variabili su standard output:

for v in model.variables():
    print(v.name, "=", v.varValue)

Struttura dati Pandas:

o = [{A:ship[(w,'A')].varValue, B:ship[(w,'B')].varValue, C:ship[(w,'C')].varValue}
     for w in warehouse]
print(pd.DataFrame(o, index=warehouse))
  • cicla sulle variabili del modello
  • salva i valori in un DataFrame pandas
Analytics per la supply chain con Python
# Solve Model
model.solve()
print(LpStatus[model.status])
o = [{A:ship[(w,'A')].varValue, B:ship[(w,'B')].varValue, C:ship[(w,'C')].varValue}
     for w in warehouse]
print(pd.DataFrame(o, index=warehouse))

  Output:

Status: Optimal
|       |A      |B      |C      |
|:------|:------|:------|:------|
|W1     |1500.0 |0.0    |0.0    |
|W2     |0.0    |900.0  |800.0  |
Analytics per la supply chain con Python

Risolvi il modello - funzione obiettivo ottima

Stampa il valore della funzione obiettivo ottimizzata:

print("Objective = ", value(model.objective))
Analytics per la supply chain con Python
# Solve Model
model.solve()
print(LpStatus[model.status])
output = []
for w in warehouse: t = [ship[(w,c)].varValue for c in cust] output.append(t)
opd = pd.DataFrame.from_records(output, index=warehouse, columns=cust)
print(opd)
print("Objective = ", value(model.objective))
Status: Optimal
|       |A      |B      |C      |
|:------|:------|:------|:------|
|W1     |1500.0 |0.0    |0.0    |
|W2     |0.0    |900.0  |800.0  |
Objective = 757700.0
Analytics per la supply chain con Python

Riepilogo

Risolvi il modello

  • Chiama solve()
  • Verifica lo stato della soluzione
  • Stampa i valori delle variabili decisionali
  • Stampa il valore della funzione obiettivo
Analytics per la supply chain con Python

Passons à la pratique !

Analytics per la supply chain con Python

Preparing Video For Download...