PuLP modelini çöz

Python ile Tedarik Zinciri Analitiği

Aaren Stubberfield

Supply Chain Analytics Mgr.

PuLP için yaygın modelleme süreci

  1. Modeli Başlat
  2. Karar Değişkenlerini Tanımla
  3. Amaç Fonksiyonunu Tanımla
  4. Kısıtları Tanımla
  5. Modeli Çöz
    • solve() metodunu çağır
    • çözüm durumunu kontrol et
    • optimize edilmiş karar değişkenlerini yazdır
    • optimize edilmiş amaç fonksiyonunu yazdır
Python ile Tedarik Zinciri Analitiği

Modeli çöz - solve metodu

.solve(solver=None)
  • solver = İsteğe bağlı: kullanılacak belirli çözücü; varsayılan çözücüyü kullanır.
Python ile Tedarik Zinciri Analitiği
# 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()
Python ile Tedarik Zinciri Analitiği

Modeli çöz - çözüm durumu

LpStatus[model.status]
  • Not Solved: Sorun çözülmeden önceki durum.
  • Optimal: En iyi çözüm bulundu.
  • Infeasible: Uygulanabilir çözüm yok (örn. kısıtlar x ≤ 1 ve x ≥ 2 ise).
  • Unbounded: Amaç fonksiyonu sınırsız; maksimize veya minimize etmek sonsuza gider (örn. tek kısıt x ≥ 3 ise).
  • Undefined: En iyi çözüm olabilir ama bulunmamış olabilir.
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}}
Python ile Tedarik Zinciri Analitiği
# 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
Python ile Tedarik Zinciri Analitiği

Değişkenleri standart çıktıya yazdır:

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

Pandas veri yapısı:

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))
  • model değişkenlerini döngüle
  • değerleri bir pandas DataFrame'inde sakla
Python ile Tedarik Zinciri Analitiği
# 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))

  Çıktı:

Status: Optimal
|       |A      |B      |C      |
|:------|:------|:------|:------|
|W1     |1500.0 |0.0    |0.0    |
|W2     |0.0    |900.0  |800.0  |
Python ile Tedarik Zinciri Analitiği

Modeli çöz - optimize amaç fonksiyonu

Optimize edilmiş amaç fonksiyonunun değerini yazdır:

print("Objective = ", value(model.objective))
Python ile Tedarik Zinciri Analitiği
# 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
Python ile Tedarik Zinciri Analitiği

Özet

Modeli Çöz

  • solve() metodunu çağır
  • Çözüm durumunu kontrol et
  • Karar değişkenlerinin değerlerini yazdır
  • Amaç fonksiyonunun değerini yazdır
Python ile Tedarik Zinciri Analitiği

Hadi pratik yapalım!

Python ile Tedarik Zinciri Analitiği

Preparing Video For Download...