Analiza wrażliwości ceny dualnej

Analityka łańcucha dostaw w Pythonie

Aaren Stubberfield

Supply Chain Analytics Mgr.

Definicja ceny dualnej

Problemy modelowania:

  • Dane wejściowe dla ograniczeń są często szacunkami
  • Czy zmiany danych wpłyną na rozwiązanie?

Ceny dualne:

  • Zmiana optymalnej wartości funkcji celu na jednostkę wzrostu prawej strony ograniczenia, przy założeniu niezmienności pozostałych danych.
Analityka łańcucha dostaw w Pythonie

Kontekst – firma szklarska – planowanie zasobów:

Zasób Prod. A Prod. B Prod. C
Godziny produkcji 6 5 8
Pojemność mag. m² 10.5 20 10
Zysk USD $500 $450 $600

Ograniczenia:

  • Godziny zdolności produkcyjnej ≤ 60
  • Pojemność magazynu ≤ 150 m²
  • Maksymalna produkcja A ≤ 8
Analityka łańcucha dostaw w Pythonie

Przykład kodu

# Initialize Class, Define Vars., and Objective
model = LpProblem("Max Glass Co. Profits", 
                   LpMaximize)
A = LpVariable('A', lowBound=0)
B = LpVariable('B', lowBound=0)
C = LpVariable('C', lowBound=0)
model += 500 * A + 450 * B + 600 * C

# Constraint 1
model += 6 * A + 5 * B + 8 * C <= 60

# Constraint 2
model += 10.5 * A + 20 * B + 10 * C <= 150
# Constraint 3
model += A  <= 8

# Solve Model
model.solve()
print("Model Status: 
        {}".format(LpStatus[model.status]))
print("Objective = ", value(model.objective))
for v in model.variables():
    print(v.name, "=", v.varValue)
Analityka łańcucha dostaw w Pythonie

Przykładowe rozwiązanie

Rozwiązanie:

Produkty Prod. A Prod. B Prod. C
Skrzynki produkcji 6.667 4 0

Wartość funkcji celu: $5133.33

Analityka łańcucha dostaw w Pythonie

Przegląd ograniczeń

Zmienna decyzyjna:

  • A do C = Liczba skrzynek odpowiednich produktów A do C

Ograniczenia:

  • 6A + 5B + 8C ≤ 60 (ograniczona zdolność produkcyjna)
  • 10A + 20B + 10C ≤ 150 (ograniczona pojemność magazynu)
  • A ≤ 8 (maksymalna produkcja A)
Analityka łańcucha dostaw w Pythonie

Wydruk ceny dualnej

Kod Pythona:

o = [{'name':name, 'shadow price':c.pi} 
     for name, c in model.constraints.items()]
print(pd.DataFrame(o))
Analityka łańcucha dostaw w Pythonie

Objaśnienie cen dualnych

Wynik:

  name  shadow price
   _C1     78.148148
   _C2      2.962963
   _C3     -0.000000

Przypomnienie ograniczeń:

  1. ograniczona zdolność produkcyjna
  2. ograniczona pojemność magazynu
  3. maksymalna produkcja A
Analityka łańcucha dostaw w Pythonie

Luz ograniczenia

slack:

  • Ilość niewykorzystanego zasobu.

Python:

o = [{'name':name, 'shadow price':c.pi, 'slack': c.slack} 
     for name, c in model.constraints.items()]
print(pd.DataFrame(o))
Analityka łańcucha dostaw w Pythonie

Objaśnienie luzu ograniczenia

Wynik:

  name  shadow price     slack
   _C1     78.148148 -0.000000
   _C2      2.962963 -0.000000
   _C3     -0.000000  1.333333

O ograniczeniach wiążących:

  • slack = 0, wtedy wiążące
  • Zmiana ograniczenia wiążącego zmienia rozwiązanie

Przypomnienie ograniczeń:

  1. ograniczona zdolność produkcyjna
  2. ograniczona pojemność magazynu
  3. maksymalna produkcja A
Analityka łańcucha dostaw w Pythonie

Podsumowanie

  • Jak obliczać:
    • shadow prices
    • luz slack ograniczenia
  • Identyfikacja ograniczeń wiążących:
    • slack = 0, wtedy wiążące
    • slack > 0, wtedy niewiążące
Analityka łańcucha dostaw w Pythonie

Wypróbuj!

Analityka łańcucha dostaw w Pythonie

Preparing Video For Download...