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

Решение главной проблемы 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$, а значит, это наименьшее оптимальное (с точки зрения бюджета) решение, дающее максимальный экономический эффект и обеспечивающее достижение цели.

Функция moqsolv в Envision

В системе Envision есть нелинейный алгоритм для решения основной проблемы MOQ. Данный алгоритм выполняется с помощью функции moqsolv, и он снимает необходимость в громоздких вычислениях, необходимых для учета ограничений MOQ. Функция moqsolv предназначена для обработки серии векторов, привязанной к таблице типа Id(*), которую обычно получают за счет продления вектора распределения с помощью оператора extend.distrib() (см. также статью про алгебру распределения).

Для данной функции необходимы следующие аргументы:

moqsolv(Id, Min, Reward, Cost, Target, threshold, g0, oq0, moq0, g1, oq1, moq1, ...)

При этом:

  • Id — колонка группировки наименований
  • Min — колонка заказа единиц товара, как и в Grid.Min
  • Reward — рентабельность каждой позиции — рассчитывается с помощью функции рентабельности запасов stockrwd
  • Cost — расходы на позицию — как правило, PurchasePrice * Grid.Q
  • Target — целевой объем заказа — может быть равен параметру Cost при простом ограничении по бюджету. Используя Target == Cost, вы требуете от системы выполнить бюджетную оптимизацию (соответственно, Target != Cost — это целевая оптимизация).
  • threshold — скалярное значение, выступающее в роли порога для цели. При бюджетной оптимизации ее стоимость является верхней границей целевого значения. При целевой оптимизации целевое значение определяет нижнюю границу стоимости. Если пороговое значение отрицательно, то знак минуса интерпретируется как булев флаг для достижения (положительной) цели снизу, а не сверху. Символ порогового значения используется для указания направления отклонения, пороговое значение всегда считается положительным.
  • g0, oq0, moq0 — три вектора, связанных с разными ограничениями MOQ (см. подробное описание ниже).

См. также Приоритетные закупки с ограничениями — обучающую статью, посвященную тому, как функция moqsolv может использоваться для формирования заказа на закупку, удовлетворяющего все ограничения MOQ.

Функция возвращает вектор bool, где все строки, удовлетворяющие цели, отмечены как true. Все строки со значениемtrue являются решением для проблемы MOQ. Алгоритм решения задачи округляет решение $\textbf{q}^T$, как описано в предыдущем разделе. Как следует из определений, приведенных в предыдущем разделе, аргументы Cost, Target и threshold должны быть строго положительными.

Все ограничения MOQ определяются триплетами векторов:

  • G — группировка MOQ, может быть равен Id в случае MOQ по наименованию
  • OQ — влияние позиции на объем заказа при ограничении MOQ.
  • MOQ — пороговое значение, которое необходимо достичь для преодоления ограничения MOQ.

Группы, заданные вектором G, должны определять https://ru.wikipedia.org/wiki/Разбиение_множества идентификаторов наименований. Пороговое значение MOQ должно быть одинаковым для всех позиций с одним значением G. Все значения OQ должны быть строго положительными. Значения MOQ должны быть положительными, однако они могут быть равны нулю, что отражает отсутствие ограничения MOQ.

С помощью разных триплетов векторов можно задавать различные MOQ. Envision поддерживает одновременное использование до 4 ограничений MOQ.

Для поставщиков


Для прогнозистов


Ошибочные подходы


Расценки