Menyelesaikan model PuLP

Analitik Rantai Pasok dengan Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Proses pemodelan umum di PuLP

  1. Inisialisasi model
  2. Definisikan variabel keputusan
  3. Definisikan fungsi objektif
  4. Definisikan kendala
  5. Selesaikan model
    • panggil metode solve()
    • periksa status solusi
    • cetak variabel keputusan optimal
    • cetak nilai fungsi objektif
Analitik Rantai Pasok dengan Python

Selesaikan model - metode solve

.solve(solver=None)
  • solver = Opsional: solver spesifik yang akan dipakai, default ke solver bawaan.
Analitik Rantai Pasok dengan 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()
Analitik Rantai Pasok dengan Python

Selesaikan model - status solusi

LpStatus[model.status]
  • Not Solved: Status sebelum pemecahan masalah.
  • Optimal: Solusi optimal ditemukan.
  • Infeasible: Tidak ada solusi layak (mis. jika kendala x ≤ 1 dan x ≥ 2).
  • Unbounded: Fungsi objektif tak berbatas; memaksimalkan atau meminimalkan menuju tak hingga (mis. jika satu-satunya kendala x ≥ 3).
  • Undefined: Solusi optimal mungkin ada tetapi belum ditemukan.
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}}
Analitik Rantai Pasok dengan 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
Analitik Rantai Pasok dengan Python

Cetak variabel ke output standar:

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

Struktur data 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))
  • loop variabel model
  • simpan nilai ke DataFrame pandas
Analitik Rantai Pasok dengan 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  |
Analitik Rantai Pasok dengan Python

Selesaikan model - fungsi objektif optimal

Cetak nilai fungsi objektif optimal:

print("Objective = ", value(model.objective))
Analitik Rantai Pasok dengan 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
Analitik Rantai Pasok dengan Python

Ringkasan

Selesaikan model

  • Panggil metode solve()
  • Periksa status solusi
  • Cetak nilai variabel keputusan
  • Cetak nilai fungsi objektif
Analitik Rantai Pasok dengan Python

Ayo berlatih!

Analitik Rantai Pasok dengan Python

Preparing Video For Download...