Аналіз чутливості тіньових цін

Аналітика ланцюга постачань у Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Визначення тіньової ціни

Проблеми моделювання:

  • Вхідні дані для обмежень моделі часто є оцінками
  • Чи змінять зміни у вхідних даних наше розв'язання?

Тіньові ціни:

  • Зміна оптимального значення цільової функції на одиницю збільшення правої частини обмеження, за незмінності всього іншого.
Аналітика ланцюга постачань у Python

Контекст — скляна компанія — планування ресурсів:

Ресурс Prod. A Prod. B Prod. C
Виробничі години 6 5 8
Місткість складу, кв. фути 10.5 20 10
Прибуток $US $500 $450 $600

Обмеження:

  • Виробнича потужність, год ≤ 60
  • Місткість складу ≤ 150 кв. фт
  • Макс. випуск A ≤ 8
Аналітика ланцюга постачань у Python

Приклад коду

# 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)
Аналітика ланцюга постачань у Python

Приклад розв'язання

Розв'язання:

Продукти Prod. A Prod. B Prod. C
Випуск, кейси 6.667 4 0

Значення цілі: $5133.33

Аналітика ланцюга постачань у Python

Перегляд обмежень

Змінні рішення:

  • A–C = кількість кейсів відповідних продуктів A–C

Обмеження:

  • 6A + 5B + 8C ≤ 60 (обмежена виробнича потужність)
  • 10A + 20B + 10C ≤ 150 (обмежена місткість складу)
  • A ≤ 8 (макс. випуск A)
Аналітика ланцюга постачань у Python

Вивід тіньової ціни

Код Python:

o = [{'name':name, 'shadow price':c.pi} 
     for name, c in model.constraints.items()]
print(pd.DataFrame(o))
Аналітика ланцюга постачань у Python

Пояснення тіньових цін

Вивід:

  name  shadow price
   _C1     78.148148
   _C2      2.962963
   _C3     -0.000000

Пригадайте обмеження:

  1. обмежена виробнича потужність
  2. обмежена місткість складу
  3. макс. випуск A
Аналітика ланцюга постачань у Python

Резерв обмеження (slack)

slack:

  • Кількість ресурсу, що не використано.

Python:

o = [{'name':name, 'shadow price':c.pi, 'slack': c.slack} 
     for name, c in model.constraints.items()]
print(pd.DataFrame(o))
Аналітика ланцюга постачань у Python

Пояснення резерву обмеження

Вивід:

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

Детальніше про «зв'язані» обмеження

  • якщо slack = 0 — обмеження binding
  • зміна binding-обмеження змінює розв'язання

Пригадайте обмеження:

  1. обмежена виробнича потужність
  2. обмежена місткість складу
  3. макс. випуск A
Аналітика ланцюга постачань у Python

Підсумок

  • Як обчислити:
    • shadow prices
    • slack обмежень
  • Визначити зв'язані обмеження
    • якщо slack = 0 — binding
    • якщо slack > 0 — not-binding
Аналітика ланцюга постачань у Python

Спробуйте!

Аналітика ланцюга постачань у Python

Preparing Video For Download...