Приоритетные заказы и вероятностные прогнозы — оптимизация

Расстановка приоритетов для экономичных закупок












Главная » Ресурсы » Здесь

Вероятностные прогнозы позволяют гораздо подробнее просчитывать перспективу по сравнению с традиционными методами прогнозирования, и именно благодаря им мы смогли полностью переосмыслить процесс закупок. В данной статье мы описываем, как можно создать приоритетный список закупок с помощью Lokad. Два главных преимущества этого подхода по сравнению с определением точек возобновления заказа заключаются в следующем: во-первых, не нужно поддерживать и подстраивать вероятность обслуживания, и во-вторых, можно использовать более гибкие методы расчета закупок, которые позволяют эффективно учитывать ограничения цепи поставок.

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

Шаблон сценария для приоритетного списка

Для создания приоритетного списка необходим небольшой сценарий Envision (см. ниже). Этот сценарий можно создать в учетной записи Lokad, нажав кнопку Create Envision script. После создания нового проекта откроется редактор исходного кода. Скопируйте приведенный ниже код в редактор и нажмите Save.
read "/sample/Lokad_Items.tsv" with Supplier: text, Category: text, SubCategory: text
read "/sample/Lokad_Orders.tsv" as Orders
read "/sample/Lokad_PurchaseOrders.tsv" as PO

orderingLeadtime := 7 // 7 дней

where PO.DeliveryDate > PO.Date // за исключением недоставленных заказов
  Leadtime = forecast.leadtime(
    hierarchy: Category, SubCategory
    present: (max(Orders.Date) by 1) + 1
    leadtimeDate: PO.Date
    leadtimeValue: PO.DeliveryDate - PO.Date + 1)

Demand = forecast.demand(
  horizon: Leadtime +* dirac(orderingLeadtime)
  hierarchy: Category, SubCategory
  present: (max(Orders.Date) by 1) + 1
  demandDate: Orders.Date
  demandValue: Orders.Quantity)

show form "Purchase simulator" a1b3 tomato with Form.budget as "Max budget"

M = SellPrice - BuyPrice
S = - 0.25 * SellPrice // убытки из-за дефицита товара
C = - 0.3 * BuyPrice * mean(Leadtime) / 365 // 0,3% — ежегодные расходы на содержание
MB = 0.5 * SellPrice // невыполненный заказ
SB = 0.5 * SellPrice // невыполненный заказ
AM = 0.3 // возможность закупить товар позже
AC = 1 - 0.2 * mean(Leadtime) / 365 // 0,2% — ежегодная скидка

RM = MB * uniform(1, Backorder) + (stockrwd.m(Demand, AM) * M) >> Backorder
RS = SB * uniform(1, Backorder) + zoz(stockrwd.s(Demand) * S) >> Backorder
RC = (stockrwd.c(Demand AC) * C) >> BackOrder
R = RM + RS + RC // простая переборка

table G = extend.distrib(Demand >> BackOrder, StockOnHand + StockOnOrder, LotMultiplier)

where G.Max > StockOnHand + StockOnOrder
  G.Q = G.Max - G.Min + 1
  G.Reward = int(R, G.Min, G.Max) // интеграл функции прибыльности запасов
  G.Score = G.Reward / max(1, BuyPrice * G.Q)

  G.Rank = rank(G.Score, Id, -G.Max) // сначала максимальные показатели, ранжирование по парам (Id, G.Max)
  G.Invest = cumsum(BuyPrice * G.Q, G.Rank)

  where G.Invest < Form.budget + 0
  where exists(G.Q)
    show table "Purchase priority list with $\{Form.budget}" c1g3 tomato with
      Id as "Id"
      Supplier as "Supplier"
      StockOnHand as "OnHand"
      StockOnOrder as "OnOrder"
      sum(G.Q) as "Qty"
      mean(Leadtime) as "Leadtime"
      sum(G.Reward) as "Reward" unit:"$"
      sum(BuyPrice * G.Q) as "Cost" unit:"$"
      group by Id
      order by avg(G.Score) desc

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

Image

Разберем сценарий. Первая строка позволяет считать данные из папки /sample, где должны находиться образцы файлов.

В файле Lokad_Items.tsv, который должен содержать список товаров или SKU, должно присутствовать два "особых" столбца:

  • SellPrice: цена продажи товара (без налогов)
  • BuyPrice: цена закупки товара (без налогов)

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

В самом начале сценария вводится два вызова системы вероятностного прогнозирования Lokad — они нужны для прогнозирования времени выполнения заказа и спроса соответственно.

Кроме того, мы ввели экономические переменные, необходимые для расчета функции прибыльности запасов:
  • M: прибыль (валовая) за каждую проданную единицу товара из запасов.
  • S: расходы за каждую единицу, понесенные если запасов недостаточно для удовлетворения спроса.
  • C: ежегодные затраты на содержание единицы товара.
  • AM: скидка с наценки
  • AM: скидка с расходов на хранение

Основная часть алгоритма расстановки приоритетов заключается в расчете значений G.Reward и G.Score.
  • G.Reward: отражает экономическую прибыль от G.Q дополнительных единиц товара (обычно G.Q равно 1).
  • G.Score: отражает прибыль от определенного количества единиц товара в долларах за каждый доллар, вложенный в запасы.

Фильтр where, который указан далее, исключает ситуации, в которых точка возобновления заказа находится ниже текущего уровня запасов. Мы исключаем эти ситуации, потому что они нужны только тогда, когда мы закупаем товары с целью увеличить запас. В этом блоке мы вводим вторую серию вычислений, которая определяет непосредственно расстановку приоритетов:

  • G.Rank: сортировка всех записей в схеме по уровню прибыльности. Особенность операции сортировки: при новом порядке отображения порядок возобновления заказа сохраняется.
  • G.Invest: показывает, как создать интегральное вычисление. Мы рассчитываем общие вложения (интегрально), предполагая, что все товары закупаются в соответствии со списком.

Наконец, сценарий заканчивается оператором show table, и все строки квантильной схемы объединяются по параметру Id, чтобы получился список, где каждое наименование появляется только 1 раз.

Оптимизация приоритетов

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

Сначала сценарий может показаться слишком сложным, однако на практике мы заметили, что с его помощью можно учитывать самые разные ситуации, с которыми сталкивается компания. Сценарий Envision обладает теми же преимуществами, что и таблицы Excel.

Если говорить о доходах, то сценарий, приведенный выше, просто максимизирует валовую прибыль. Тем не менее, если ваша компания зарабатывает в основном на товарах, стоимость которых невелика, но чьи продажи достигают высоких объемов (например, клиент покупает смартфон, доход от которого составляет 2,5 %, и два аксессуара, доход от которых составляет уже 50 %), это может негативно сказаться на бизнесе. В таких случаях можно ввести фактор "деловой репутации", представленный отсроченной прибылью, которая характерна для таких флагманских товаров.

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

FORMATTER ERROR (Transcluded inexistent page or this same page)