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

Экономическая приоретизация закупок












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

Вероятностные прогнозы позволяют гораздо подробнее просчитывать перспективу по сравнению с традиционными методами прогнозирования, и именно благодаря им мы смогли полностью переосмыслить процесс закупок. В данной статье мы описываем, как можно создать приоритетный список закупок с помощью 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
// 0,3% — ежегодные расходы на хранение
C = - 0.3 * BuyPrice * mean(Leadtime) / 365
// задолженный заказ
MB = 0.5 * SellPrice
MBU = MB * uniform(1, Backorder)
// задолженный заказ
SB = 0.5 * SellPrice
SBU = SB * uniform(1, Backorder)
// возможность совершить закупки позже
AM = 0.3
// 0,2% — ежегодная скидка
AC = 1 - 0.2 * mean(Leadtime) / 365

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

Stock = StockOnHand + StockOnOrder

DBO = Demand >> BackOrder
table G = extend.distrib(DBO, Stock, LotMultiplier)

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

  // сортировка от высших значений к низшим
  // сохранение сортировки пар (Id, G.Max)
  G.Rank = rank(G.Score, Id, -G.Max)
  G.Invest = cumsum(BuyPrice * G.Q) sort [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)