Решение главной проблемы MOQ (минимального объема заказа)

Жоаннес Верморель, декабрь 2016 г.

Минимальный объем заказа (MOQ) — это один из наиболее распространенных видов ограничений заказа в цепях поставок. MOQ используется, когда поставщик не принимает заказы на закупку, если их объем меньше определенного значения, которое обычно выражается в единицах товара или в долларах. Достаточно часто различные ограничения MOQ накладываются друг на друга, и все их обязательно нужно учитывать. Основная проблема MOQ заключается в (приблизительном) расчете оптимального объема заказа, который соответствовал бы всем ограничениям MOQ и позволял бы получать максимальную прибыль за каждую приобретаемую единицу товара.

Главная проблема MOQ заключается в сложной нелинейной оптимизации. Она считается сложной, потому что рассчитать оптимальный объем заказа обычно не получается. Тем не менее, несмотря на то, что оптимальных значений, как правило, получить нельзя, особые нелинейные алгоритмы расчета ограничений позволяют получить значения, близкие к оптимальным. В частности, ниже описана функция moqsolv, которая представляет собой сложный алгоритм Lokad для решения основной проблемы MOQ.

Стандартные ограничения MOQ

Ограничения MOQ могут принимать различные формы. Приведем несколько наиболее распространенных ограничений MOQ, с которыми мы сталкивались:

  • минимальный объем заказа, выраженный в единицах товара на SKU. Как правило, используется для предметов, которые слишком дешевы, чтобы продавать их поодиночке.
  • минимальный объем заказа, выраженный в долларах за весь заказ на закупку. Используется, когда поставщик не берет плату за доставку.
  • минимальный объем заказа, выраженый в единицах товара по категориям. Используется для товаров, которые изготавливаются на заказ, при минимальном объеме производственной партии.

Обработка одного ограничения на практике обычно не представляет большого труда. Тем не менее, если в расчет нужно брать сразу несколько разных ограничения MOQ, составление грамотного заказа на закупку становится намного сложнее.

Понятия

Прежде чем разбираться с числовой оптимизацией, давайте рассмотрим наиболее важные понятия, которые используются при решении основной проблемы MOQ. У нас есть:

  • наименования — непосредственно то, что приобретается. Обычно количество единиц товара выражается целым числом, однако это не является обязательным требованием.
  • объем заказа для каждого наименования (может быть равен нулю) — отражает потенциальное решение проблемы MOQ.
  • рентабельность каждой дополнительной единицы товара для каждого наименования — данные, получаемые с помощью функции рентабельности запасов (stock reward), однако использование данной функции не является обязательным требованием.
  • расходы на приобретаемые товары. Наша цель — максимально повысить прибыль с бюджета, выраженного в параметре расходы. Расходы на покупку одного товара обычно не меняются, но мы не можем полагаться на предположения, поэтому в расчет необходимо принимать скидки.
  • цели — отражают критерии завершения заказа, которые могут не являться фактическими расходами. Это достаточно сложное понятие, и мы рассмотрим его подробнее ниже.

Каноничным критерием завершения заказа по приоритетному списку закупок является максимальный бюджет: заказы на товары размещаются в порядке убывания их экономического эффекта, пока весь бюджет не будет расписан. Однако ограничение по бюджету не отражает эффективность приобретаемых товарных запасов. Таким образом, хотя цель остается неизменной (повышение экономической эффективности) независимо от используемых критериев, на практике рекомендуется использовать дополнительные критерии, например уровень пополнения.

Понятие цели вводится как универсальный механизм определения дополнительных критериев завершения заказа при работе с политикой приоритетных заказов. Проще говоря, мы рассчитываем такие заказы на закупку, которые дадут максимальный экономический эффект при минимальных вложениях и обеспечат достижение целей. Ниже приводится более точное определение данного процесса оптимизации.

Пример: Фрэнк, менеджер поставок, устанавливает целевой уровень пополнения на 90 %. Для решения проблемы MOQ необходимо рассчитать объем заказа, который при минимальных расходах принесет максимальную прибыль и обеспечит уровень пополнения на 90%. Такой заказ НЕ БУДЕТ ЯВЛЯТЬСЯ минимально необходимым для достижения 90-процентного уровня пополнения, так как такой заказ будет ориентирован именно на уровень пополнения. Здесь же речь идет о минимальном заказе, направленном на повышение рентабельности, но при этом достаточно объемном для получения 90% уровня пополнения. Делать упор на уровень пополнения было бы нерационально, потому что при таком заказе не учитываются расходы на хранение неликвидных товаров.

Формальное определение основной проблемы MOQ

В данном разделе основная проблема MOQ описана в виде формальной нелинейной задачи на оптимизацию. Достаточно очевидно, что данная проблема является НП-трудной. Основная проблема MOQ тесно связана с https://ru.wikipedia.org/wiki/Задача_об_упаковке_в_контейнеры, которая также является НП-трудной. Таким образом, основная проблема MOQ является, по меньшей мере, такой же трудной, как и задача об упаковке в контейнеры. Несмотря на то, что проблема является НП-трудной, надо сказать, что на практике для нее можно найти очень хорошие решения.

Пусть $I$ — набор наименований, которые необходимо заказать. Пусть $q_i$ при $i \in I$ — количество единиц наименования $i$, которое необходимо заказать.

Мы получим несколько функций.

  • Пусть $r_i(q)$ — рентабельность при хранении $q$ единиц наименования $i$.
  • Пусть $c_i(q)$ — расходы на приобретение $q$ единиц наименования $i$.
  • Пусть $t_i(q)$ — цель при хранении $q$ единиц наименования $i$.

Функция рентабельности может возвращать как положительные, так и отрицательные значения, тогда как функции расходов и цели являются строго положительными. $$\forall i, \forall q, c_i(q) > 0 \text{ and } t_i(q) >0$$ Пусть $M$ — набор ограничений MOQ. Для всех $m \in M$ есть $I_m$ — список наименований, принадлежащих ограничению $m$, и $Q_m$ — минимальный объем, который должен быть достигнут для преодоления ограничения. Пусть $m_i(q)$ — функция, которая определяет влияние наименование $i$ на ограничение MOQ $m$ при приобретении $q$ единиц товара. Ограничение $m$ будет преодолено в следующем случае: $$\forall i \in I_m, q_i = 0 \text{ or } \sum_{i \in I_m}m_i(q_i) \geq Q_m$$ Таким образом, все ограничения MOQ могут быть удовлетворены двумя способами: с помощью достижения порога MOQ или если объем заказа для всех наименований равен нулю.

Пусть $C$ — максимальные расходы на закупку. Тогда наилучший заказ на закупку $\textbf{q}_C=(q_i)_i$ будет выглядеть следующим образом: $$\textbf{q}_C = \underset{q}{\operatorname{argmax}} \left\{ \sum_i r_i(q_i) \text{ with $m$ satisfied } \forall m\in M \right\}$$ Данный заказ является "лучшим" в том смысле, что он позволяет получить максимальную прибыль для указанного бюджета. Решение $\textbf{q}_C$ не является единственно возможным, однако проблема MOQ слишком сложна, чтобы сразу же высчитать точные значения. Для простоты будем считать, что данное решение является единственным.

Пусть $T$ — минимальная цель, тогда $\textbf{q}^T$ будет выражено с помощью $$C^T = \underset{C}{\operatorname{min}} \left\{ \left(\sum_{q_i \in \textbf{q}_C} t_i(q_i) \right) \geq T \right\}$$ and $$\mathbf{q}^T = \textbf{q}_{C^T}$$ Решение $\mathbf{q}^T$ основывается на $\textbf{q}_C$, а значит, это наименьшее оптимальное (с точки зрения бюджета) решение, дающее максимальный экономический эффект и обеспечивающее достижение цели.