Преобразование распределения в таблице с помощью Envision

Разложение распределения в таблице












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

Функции распределения в Envision очень эффективны, так как они поддерживаются алгеброй распределения. Однако для создания решений, связанных с управлением запасами, зачастую требуется преобразовать эти распределения обратно в таблицу, в которой перечислены значения распределения — обычно в виде вероятности. При использовании такой таблицы становится возможным создание окончательной таблицы, содержащей объемы заказа на закупку товаров или предложения по перемещению запасов. В данной статье мы рассказываем, как функцию extend.distrib() можно использовать для этой цели.


Таблицы и распределения

Таблицы содержат списки сегментов гистограммы, по одной гистограмме на каждое распределение, по одной строке на сегмент гистограммы. Обычно такие таблицы имеют четыре поля:

  • Id — идентификатор элемента
  • Min — нижняя граница сегмента гистограммы (включенная)
  • Max — верхняя граница сегмента гистограммы (включенная)
  • Value — значение, связанное с сегментом гистограммы

Для каждого элемента в таблице может содержаться набор сегментов, который отражает полную гистограмму распределения. Если распределение является случайной переменной, то значение сегмента можно интерпретировать как вероятность распределения по конкретному сегменту.

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

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

Синтаксис функции extend.distrib()

Функция распределения Envision позволяет использовать мощные алгебраические расчеты, которые позволяют избежать запутанных вычислений вероятности в списках. Тем не менее существуют ситуации, где простого списка вероятностей вполне достаточно, и его использование даже предпочтительно. Расширение распределения extend.distrib() преобразует вектор распределения в таблицу, как показано в следующем сценарии:
table T = extend.distrib(D)
T.Probability = int(D, T.Min, T.Max)
show table "Distribution details" with 
  Id
  T.Min
  T.Max
  T.Probability
Аргумент D должен представлять собой обычный вектор распределения, создаваемый системой вероятностного прогнозирования Lokad. Таблица T вводится как расширение оригинальной таблицы — скрытой таблицы Items в сценарии выше. Таблица T заполняется тремя полями:

  • T.Min: нижняя граница сегмента, выраженная целым числом и включающая его
  • T.Max: верхняя граница сегмента, выраженная целым числом и включающая его
  • T.Probability: сумма распределения по диапазону с включением крайних значений

Поле Probability отражает сумму распределений по возвращенному диапазону. Обратите внимание, что данное поле не заполняется функцией extend.distrib(). Если вам необходимо использовать это поле, его нужно создавать отдельно в строке 2.

Для более компактной записи распределения длина всех сегментов равна 1, поэтому T.Min == T.Max. Тем не менее, если распределение идет по более высоким значениям, то использование сегментов длиной в 1 приведет к созданию миллионов строк, обработка которых нецелесообразна. Именно поэтому при работе с такими случаями распределения Envision автоматически объединяет такие значения по более крупным сегментам. Алгоритмы прописаны таким образом, чтобы размеры таблиц оставались в разумных пределах.

Функция extend.distrib() всегда выделяет нулевой сегмент. Как следствие, сегмент [0;0] всегда получает отдельную строку в созданной таблице. Это полезно во многих ситуациях, связанных с бизнесом, когда нулевой спрос является крайним случаем (как и безграничное покрытие запасами), для которого требуется отдельный алгоритм.

Затем добавляется три дополнительных перегрузки для extend.distrib(), чтобы лучше контролировать детализацию созданной таблицы.

Промежуток

Первая перегрузка нужна для создания списка приоритетных закупок с учетом текущего уровня запасов. Синтаксис данной функции выглядит так:
table T = extend.distrib(D, S)
Первый аргумент D был описан выше. Второй аргумент S должен представлять собой целое число. При наличии второго аргумента создаваемая таблица всегда будет включать две строки, предназначенные для двух сегментов [0;0] и [1;S]. Дополнительные сегменты создаются автоматически, начиная с S+1, как описано выше. Если значение данного аргумента не указано, оно по умолчанию приравнивается к нулю.

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

Коэффициент

Вторая перегрузка нужна для таких случаев, когда используются коэффициенты партий. В таких случаях таблица должна повторять сегменты определенного размера. Можно использовать следующий синтаксис:
table T = extend.distrib(D, S, M)
Аргументы D и S были описаны выше. Третий аргумент M должен представлять собой целое число. Он отражает желаемую длину сегмента. Таким образом, таблица включает в себя список сегментов [0;0], [1;S], [S+1;S+M] [S+M+1;S+2M] и т. д. Если аргумент M равен нулю, то функция автоматически выбирает размер сегментов.

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

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

Достижение

Третья перегрузка нужна для таких случаев, когда используются минимальный объем заказа (MOQ). В таких случаях таблица должна быть достаточно длинной, чтобы достигнуть определенных значений. Можно использовать следующий синтаксис:
table T = extend.distrib(D, S, M, R)
Аргументы D, S и M были описаны выше. Четвертый аргумент R должен представлять собой неотрицательное целое число. Он представляет собой искомое максимальное значение, которого можно достичь с помощью решетки. Иначе говоря, есть строка, где значение T.Max больше или равно R. Если значение данного аргумента не указано, оно по умолчанию приравнивается к нулю.

На практике данный аргумент используется для работы с большим количеством ограничений по минимальному объему заказа (MOQ), которые можно обойти, если полученные распределения достигают значений MOQ.

Как правило, мы не рекомендуем использовать данную перегрузку кроме случаев, когда необходимо достичь конкретных показаний MOQ. В таких случаях значение R должно быть как можно меньшим. Малое значение R не мешает таблице T достигать более высоких значений, а лишь обеспечивает получение большего количества значений.