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

Аналитика цепочек поставок на Python

Aaren Stubberfield

Supply Chain Analytics Mgr.

Определение теневой цены

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

  • Входные данные для ограничений модели часто являются оценочными
  • Влияют ли изменения входных данных на решение?

Теневые цены:

  • Изменение оптимального значения целевой функции на единицу увеличения правой части ограничения при неизменности всех остальных условий.
Аналитика цепочек поставок на Python

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

Ресурс Прод. A Прод. B Прод. C
Производственные часы 6 5 8
Площадь склада (кв. фт.) 10,5 20 10
Прибыль (USD) $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

Пример решения

Решение:

Продукты Прод. A Прод. B Прод. 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:

  • Количество неиспользованного ресурса.

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 — ограничение связывающее
  • Изменение связывающего ограничения меняет решение

Напомним ограничения:

  1. ограниченные производственные мощности
  2. ограниченная вместимость склада
  3. макс. производство A
Аналитика цепочек поставок на Python

Итоги

  • Как вычислить:
    • shadow prices
    • slack ограничения
  • Определение связывающих ограничений
    • slack = 0 — связывающее
    • slack > 0 — несвязывающее
Аналитика цепочек поставок на Python

Давайте потренируемся!

Аналитика цепочек поставок на Python

Preparing Video For Download...