PuLP-Modell lösen

Supply Chain Analytics mit Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Typischer Modellierungsprozess mit PuLP

  1. Modell initialisieren
  2. Entscheidungsvariablen definieren
  3. Zielfunktion definieren
  4. Nebenbedingungen definieren
  5. Modell lösen
    • rufe die Methode solve() auf
    • prüfe den Lösungsstatus
    • gib optimierte Entscheidungsvariablen aus
    • gib optimierte Zielfunktion aus
Supply Chain Analytics mit Python

Modell lösen – solve-Methode

.solve(solver=None)
  • solver = Optional: der zu verwendende Solver; sonst Standardsolver.
Supply Chain Analytics mit 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()
Supply Chain Analytics mit Python

Modell lösen – Status der Lösung

LpStatus[model.status]
  • Not Solved: Status vor dem Lösen des Problems.
  • Optimal: Es wurde eine optimale Lösung gefunden.
  • Infeasible: Es gibt keine zulässigen Lösungen (z. B. bei Nebenbedingungen x ≤ 1 und x ≥ 2).
  • Unbounded: Die Zielfunktion ist unbeschränkt; Maximieren/Minimieren strebt gegen unendlich (z. B. wenn die einzige Nebenbedingung x ≥ 3 ist).
  • Undefined: Eine optimale Lösung könnte existieren, wurde aber nicht gefunden.
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}}
Supply Chain Analytics mit 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
Supply Chain Analytics mit Python

Gib Variablen auf der Standardausgabe aus:

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

Pandas-Datenstruktur:

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))
  • über alle Modellvariablen iterieren
  • Werte in einem pandas-DataFrame speichern
Supply Chain Analytics mit 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))

  Ausgabe:

Status: Optimal
|       |A      |B      |C      |
|:------|:------|:------|:------|
|W1     |1500.0 |0.0    |0.0    |
|W2     |0.0    |900.0  |800.0  |
Supply Chain Analytics mit Python

Modell lösen – optimierte Zielfunktion

Gib den Wert der optimierten Zielfunktion aus:

print("Objective = ", value(model.objective))
Supply Chain Analytics mit 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
Supply Chain Analytics mit Python

Zusammenfassung

Modell lösen

  • Rufe die Methode solve() auf
  • Prüfe den Lösungsstatus
  • Gib die Werte der Entscheidungsvariablen aus
  • Gib den Wert der Zielfunktion aus
Supply Chain Analytics mit Python

Lass uns üben!

Supply Chain Analytics mit Python

Preparing Video For Download...