Rezolvarea modelului PuLP

Analitică în lanțul de aprovizionare cu Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Procesul comun de modelare în PuLP

  1. Inițializarea modelului
  2. Definirea variabilelor de decizie
  3. Definirea funcției obiectiv
  4. Definirea constrângerilor
  5. Rezolvarea modelului
    • apelarea metodei solve()
    • verificarea stării soluției
    • afișarea variabilelor de decizie optime
    • afișarea funcției obiectiv optimizate
Analitică în lanțul de aprovizionare cu Python

Rezolvarea modelului - metoda solve

.solve(solver=None)
  • solver = Opțional: solverul specific utilizat; implicit, solverul predefinit.
Analitică în lanțul de aprovizionare cu 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()
Analitică în lanțul de aprovizionare cu Python

Rezolvarea modelului - starea soluției

LpStatus[model.status]
  • Nerezolvat: Starea anterioară rezolvării problemei.
  • Optimal: A fost găsită o soluție optimă.
  • Infezabil: Nu există soluții fezabile (ex.: constrângerile x ≤ 1 și x ≥ 2).
  • Nemărginit: Funcția obiectiv nu este mărginită; maximizarea sau minimizarea tinde spre infinit (ex.: singura constrângere este x ≥ 3).
  • Nedefinit: Soluția optimă poate exista, dar nu a fost găsită.
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}}
Analitică în lanțul de aprovizionare cu 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
Analitică în lanțul de aprovizionare cu Python

Afișarea variabilelor la ieșirea standard:

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

Structură de date 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))
  • iterare prin variabilele modelului
  • stocarea valorilor într-un DataFrame Pandas
Analitică în lanțul de aprovizionare cu 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))

  Rezultat:

Status: Optimal
|       |A      |B      |C      |
|:------|:------|:------|:------|
|W1     |1500.0 |0.0    |0.0    |
|W2     |0.0    |900.0  |800.0  |
Analitică în lanțul de aprovizionare cu Python

Rezolvarea modelului - funcția obiectiv optimizată

Afișarea valorii funcției obiectiv optimizate:

print("Objective = ", value(model.objective))
Analitică în lanțul de aprovizionare cu 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
Analitică în lanțul de aprovizionare cu Python

Rezumat

Rezolvarea modelului

  • Apelarea metodei solve()
  • Verificarea stării soluției
  • Afișarea valorilor variabilelor de decizie
  • Afișarea valorii funcției obiectiv
Analitică în lanțul de aprovizionare cu Python

Să exersăm!

Analitică în lanțul de aprovizionare cu Python

Preparing Video For Download...