Розглянемо задачу про оптимальний розмір замовлення (Economic Order Quantity, EOQ). Це модель, яка шукає баланс між витратами на логістику (які падають при збільшенні партії) та витратами на зберігання (які ростуть при збільшенні партії).
Економічна кількість замовлення (EOQ), також відома як фінансова кількість закупівель або економічна кількість закупівель [5], – це кількість замовлення, яка мінімізує загальні витрати на зберігання та витрати на замовлення в управлінні запасами. Це одна з найстаріших класичних моделей планування виробництва. Модель була розроблена Фордом В. Гаррісом у 1913 році, але консультант Р. Х. Вілсон широко застосовував її, і йому та К. Андлеру надається визнання за їхній глибокий аналіз.
Основна мета моделі – знайти такий обсяг замовлення Q, при якому загальні річні витрати T будуть мінімальними. Витрати складаються з трьох частин:
- Вартість замовлень – це витрати на оформлення та логістику.
- Вартість утримання – оренда складу та обслуговування запасів.
- Вартість самого товару – загальна ціна придбаних одиниць за рік.
Цільова функція загальних витрат T записується так:

де: D – річна потреба (одиниць);
К – вартість одного замовлення;
h – річна вартість утримання одиниці;
P – ціна за одиницю товару;
Q – обсяг замовлення (змінна, яку ми оптимізуємо).
Як видно з аналітичного виведення, оптимальне значення Q* досягається в точці, де похідна функції дорівнює нулю, що приводить нас до формули Вілсона:

Переходячи до програмної реалізації, ми фактично моделюємо цю систему, де точка мінімуму функції T є ідеальним управлінським рішенням, що дозволяє бізнесу витрачати найменшу кількість ресурсів.
Вихідні дані для розрахунку: річна потреба D: 10 000 одиниць продукції, це загальна кількість товару, яку компанія планує продати за рік; вартість одного замовлення K: 40 (умовних одиниць або тис. грн) – це фіксовані витрати на кожну доставку (транспорт, оформлення документів, мито), які не залежать від обсягу партії; ціна одиниці товару P: 50 грн; витрати на утримання запасів h: складаються з двох компонентів базова вартість зберігання: 4 грн за одиницю на рік (оренда складу, охорона), ринковий інтерес (альтернативні витрати): 2% від вартості одиниці товару (Р⨯2%) – це заморожений капітал, який міг би приносити дохід, якби не був вкладений у товар на складі.
Задача 1. Торговельна компанія планує обсяги закупівель товару на наступний рік. Керівництво прагне мінімізувати сукупні річні витрати, пов’язані з логістикою та утриманням складу. Необхідно знайти такий обсяг одного замовлення (Q), при якому витрати будуть найменшими.
Тоді: грн за одиницю на рік.
Для вирішення завдання ми використовуємо цільову модель (рис. 1.3).

Цільова модель витрат
Знайти оптимальний обсяг замовлення Q*, можна використовуючи чисельні методи оптимізації в Python (бібліотека SciPy).
Нижче наведено лістинг коду, який можна скопіювати
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize_scalar
# ==========================================================
# 1. ПАРАМЕТРИ МОДЕЛІ (Згідно з вашим прикладом)
# ==========================================================
D = 10000 # Річна потреба (одиниць)
K = 40 # Вартість одного замовлення (тис. грн)
P = 50 # Вартість одиниці товару (грн)
h_base = 4 # Базова вартість утримання одиниці
interest = 0.02 # Ринковий інтерес (2%)
# Повна вартість утримання: h = 4 + (50 * 0.02) = 5
h = h_base + (P * interest)
# ==========================================================
# 2. ЦІЛЬОВА ФУНКЦІЯ
# ==========================================================
def total_cost_function(Q, D, K, h, P, include_fixed=True):
"""
Q: обсяг замовлення (змінна)
include_fixed: чи додавати вартість закупівлі P*D (для розрахунків - так, для графіку - ні)
"""
if Q <= 0: return np.inf
setup_costs = (D * K) / Q # Витрати на логістику
holding_costs = (h * Q) / 2 # Витрати на склад
fixed_costs = P * D if include_fixed else 0
return setup_costs + holding_costs + fixed_costs
# ==========================================================
# 3. ОПТИМІЗАЦІЯ
# ==========================================================
# Чисельний пошук мінімуму (метод Брента)
result = minimize_scalar(total_cost_function, args=(D, K, h, P, True),
bounds=(1, D), method='bounded')
optimal_Q = result.x
min_total_cost = result.fun
# Теоретичний розрахунок за формулою Вілсона (для перевірки)
Q_wilson = np.sqrt((2 * D * K) / h)
print(f"--- РЕЗУЛЬТАТИ ---")
print(f"Оптимальний обсяг замовлення (Q*): {optimal_Q:.2f} од.")
print(f"Теоретичний обсяг (Формула): {Q_wilson:.2f} од.")
print(f"Мінімальні загальні витрати: {min_total_cost:.2f} грн.")
# ==========================================================
# 4. ВІЗУАЛІЗАЦІЯ (З ОПТИМАЛЬНИМ МАСШТАБОМ)
# ==========================================================
# Створюємо діапазон значень Q навколо точки оптимуму (від 50 до 1000)
Q_range = np.linspace(50, 1000, 400)
# Розраховуємо компоненти витрат БЕЗ фіксованої вартості товару
y_setup = [(D * K) / q for q in Q_range]
y_holding = [(h * q) / 2 for q in Q_range]
y_variable_total = [s + hold for s, hold in zip(y_setup, y_holding)]
plt.figure(figsize=(12, 7))
# Основна крива сумарних змінних витрат
plt.plot(Q_range, y_variable_total, label='Загальні змінні витрати', color='black', lw=3)
# Компоненти, що формують "чашу"
plt.plot(Q_range, y_setup, '--', label='Витрати на замовлення (DK/Q)', color='royalblue', alpha=0.8)
plt.plot(Q_range, y_holding, '--', label='Витрати на утримання (hQ/2)', color='forestgreen', alpha=0.8)
# Позначення точки мінімуму
plt.scatter(optimal_Q, (D*K/optimal_Q + h*optimal_Q/2), color='red', s=150, zorder=5,
label=f'Оптимум (Q = {optimal_Q:.0f})')
# Вертикальна лінія для акценту на Q=400
plt.axvline(optimal_Q, color='red', linestyle=':', alpha=0.4)
# НАЛАШТУВАННЯ МАСШТАБУ (Y-axis)
# Обмежуємо зверху так, щоб бачити "яму", а не нескінченність логістики
plt.ylim(0, (D*K/optimal_Q + h*optimal_Q/2) * 2.5)
plt.title('Візуалізація моделі EOQ (Оптимізація змінних витрат)', fontsize=14)
plt.xlabel('Обсяг замовлення (Q), одиниць', fontsize=12)
plt.ylabel('Змінні витрати, грн', fontsize=12)
plt.legend(fontsize=10)
plt.grid(True, linestyle='--', alpha=0.6)
plt.tight_layout()
plt.show()
В результаті виконання проєкту буде визначено оптимальний обсяг замовлення, мінімальні загальні витрати. Результат виконання буде відображатись в консолі. На нижньому показано візуалізацію моделі.

Вивід результатів в консольний додаток

Візуалізація рішення з визначення оптимального обсягу замовлення
Тепер перейдемо до інших задач.
На представленому відео є розбір цієї задачі.
Якщо Ви не знаєте, як встановити бібліотеки і як завантажити Python то перегляньте наступне відео
Також Вам стане в нагоді наступне відео
Сподіваюсь, що цей допис був для Вас корисним.