Перевірка рішення моделюванням

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

Aaren Stubberfield

Supply Chain Analytics Mgr.

Увага

  • Завдання, що довго розв'язуються, не варто вирішувати за допомогою LP або IP

знак обережно, людина посковзнулась

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

Загальна концепція

Загальна ідея:

  • Додайте випадковий шум до вибраних ключових вхідних даних
  • Багаторазово розв'яжіть модель
  • Простежте розподіл
Аналітика ланцюга постачань у Python

Навіщо спробувати

Чому:

  • Входи часто є оцінками. Є ризик неточності.
  • Попередній аналіз чутливості змінював лише один вхід за раз.
Аналітика ланцюга постачань у Python

Контекст

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

Ресурс Прод. A Прод. B Прод. C
Прибуток $US $500 $450 $600

Обмеження:

  • Є обмеження попиту, виробничих потужностей і складу

Ризики:

  • Оцінки прибутків можуть бути неточні
Аналітика ланцюга постачань у Python
# 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

Приклад коду — крок 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
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

Приклад коду — крок 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

Приклад коду — крок 5

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

Вивід: (результати можуть відрізнятися)

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

Візуалізація як гістограму

Продукт A: гістограма продуктів a, b, c та цільової функції

Продукт B: гістограма продукту b

Продукт C: гістограма продукту c

Значення цільової функції: гістограма значень цільової функції

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

Підсумок

  • Не варто застосовувати до задач, що довго розв'язуються
  • Переваги

    • Бачити, як змінюються оптимальні результати зі зміною входів моделі
  • Кроки

    1. Почніть зі стандартного коду моделі PuLP
    2. Додайте шум до ключових входів через Python normalvariate
    3. Обгорніть код PuLP у функцію, що повертає вихід моделі
    4. Створіть цикл для виклику нової функції й збереження результатів у DataFrame
    5. Візуалізуйте DataFrame з результатами
Аналітика ланцюга постачань у Python

Спробуйте!

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

Preparing Video For Download...