Simülasyon testi çözümü

Python ile Tedarik Zinciri Analitiği

Aaren Stubberfield

Supply Chain Analytics Mgr.

Dikkat

  • Çözmesi uzun süren problemler LP veya IP ile kullanılmamalı

uyarı görseli, kayan adam

Python ile Tedarik Zinciri Analitiği

Genel kavram

Genel kavram:

  • Seçtiğin temel girdilere rastgele gürültü ekle
  • Modeli tekrar tekrar çöz
  • Dağılımı gözlemle
Python ile Tedarik Zinciri Analitiği

Neden denemeli

Neden:

  • Girdiler çoğu zaman tahmindir; hatalı olma riski vardır.
  • Önceki Duyarlılık Analizi yalnızca bir girdiği aynı anda değiştirdi.
Python ile Tedarik Zinciri Analitiği

Bağlam

Bağlam - Cam Şirketi - Kaynak Planlama:

Kaynak Ürün A Ürün B Ürün C
Kâr $US $500 $450 $600

Kısıtlar:

  • Talep, üretim kapasitesi ve depo kapasitesi kısıtları var

Riskler:

  • Kâr tahminleri hatalı olabilir
Python ile Tedarik Zinciri Analitiği
# Initialize Class, & Define Variables
model = LpProblem("Max Glass Co. Profits", LpMaximize)
A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
C = LpVariable('C', lowBound=0)

# Define Objective Function
model += 500 * A + 450 * B + 600 * C

# Define Constraints & Solve
model += 6 * A + 5 * B + 8 * C <= 60
model += 10.5 * A + 20 * B + 10 * C <= 150
model += A  <= 8
model.solve()
Python ile Tedarik Zinciri Analitiği

Kod örneği - adım 2

a, b, c = normalvariate(0,25), 
          normalvariate(0,25),
          normalvariate(0,25)
# Define Objective Function
model += (500+a)*A + (450+b)*B + (600+c)*C
# Initialize Class, & Define Variables
model = LpProblem("Max Glass Co. Profits", 
                   LpMaximize)

A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
C = LpVariable('C', lowBound=0)
a, b, c = normalvariate(0,25), 
          normalvariate(0,25), 
          normalvariate(0,25)
# Define Objective Function
model += (500+a)*A + (450+b)*B + (600+c)*C

# Define Constraints & Solve
model += 6 * A + 5 * B + 8 * C <= 60
model += 10.5 * A + 20 * B + 10 * C <= 150
model += A  <= 8
model.solve()
Python ile Tedarik Zinciri Analitiği
def run_pulp_model():
    # Initialize Class
    model = LpProblem("Max Glass Co. Profits", LpMaximize)
    A = LpVariable('A', lowBound=0)
    B = LpVariable('B', lowBound=0)
    C = LpVariable('C', lowBound=0)
    a, b, c = normalvariate(0,25), normalvariate(0,25), normalvariate(0,25)

    # Define Objective Function
    model += (500+a)*A + (450+b)*B + (600+c)*C

    # Define Constraints & Solve
    model += 6 * A + 5 * B + 8 * C <= 60
    model += 10.5 * A + 20 * B + 10 * C <= 150
    model += A  <= 8
    model.solve()
    o = {'A':A.varValue, 'B':B.varValue, 'C':C.varValue, 'Obj':value(model.objective)}
    return(o)
Python ile Tedarik Zinciri Analitiği

Kod örneği - adım 4

def run_pulp_model():
    # Initialize Class
    model = LpProblem("Max Glass Co. Profits",
                       LpMaximize)
    A = LpVariable('A', lowBound=0)
    B = LpVariable('B', lowBound=0)
    C = LpVariable('C', lowBound=0)
    a, b, c = normalvariate(0,25), 
              normalvariate(0,25),
              normalvariate(0,25)

    # Define Objective Function
    model += (500+a)*A + (450+b)*B + 
             (600+c)*C
    # Define Constraints & Solve
    model += 6 * A + 5 * B + 8 * C <= 60
    model += 10.5 * A + 20 * B + 10 * C <= 150
    model += A  <= 8
    model.solve()
    o = {'A':A.varValue, 'B':B.varValue, 
         'C':C.varValue, 
         'Obj':value(model.objective)}
    return(o)
for i in range(100):
    output.append(run_pulp_model())
df = pd.DataFrame(output)
Python ile Tedarik Zinciri Analitiği

Kod örneği - adım 5

print(df['A'].value_counts())
print(df['B'].value_counts())
print(df['C'].value_counts())

Çıktı: (sonuçlar farklı olabilir)

6.666667    73
0.000000    14
8.000000    13
Name: A, dtype: int64
4.000000    73
5.454546    14
2.400000    13
Name: B, dtype: int64
0.000000    86
4.090909    14
Name: C, dtype: int64
Python ile Tedarik Zinciri Analitiği

Histogram olarak görselleştir

Ürün A: ürün a, b, c ve amaç için histogram

Ürün B: ürün b için histogram

Ürün C: ürün c için histogram

Amaç Değerleri: amaç değerlerinin histogramı

Python ile Tedarik Zinciri Analitiği

Özet

  • Çözmesi uzun süren problemler için kullanılmamalı
  • Yararlar

    • Model girdileri değiştikçe en iyi sonuçların nasıl değiştiğini gör
  • Adımlar

    1. Standart PuLP model koduyla başla
    2. Python'un normalvariate'i ile temel girdilere gürültü ekle
    3. PuLP kodunu, model çıktısını döndüren bir fonksiyona sar
    4. Yeni fonksiyonu çağıran bir döngü kur ve sonuçları DataFrame'de sakla
    5. Sonuç DataFrame'ini görselleştir
Python ile Tedarik Zinciri Analitiği

Hadi pratik yapalım!

Python ile Tedarik Zinciri Analitiği

Preparing Video For Download...