Моделирование управления запасами

Постановка задачи

Рассмотрим следующую задачу. Компания продает один вид продукции. Промежутки времени между заказами покупателей на товар являются независимыми и представлены случайными величинами, имеющими одинаковое экспоненциальное распределение, со средним значением 0.1 месяца. Объемы заказов Q также являются независимыми и одинаково распределенными случайными величинами: 1 штука с вероятностью 1/6, 2 штуки с вероятностью 1/3, 3 штуки с вероятностью 1/3, 4 штуки. с вероятностью 1/6. В начале каждого месяца компания пересматривает уровень запасов и решает, какое количество товара заказать у оптового поставщика. В случае, когда компания заказывает Z единиц товара, она будет нести затраты, равные K+k*Z, где K – фиксированная стоимость выполнения заказа, k –затраты на единицу заказанного товара (K=20, k=3). Если Z=0, какие-либо затраты отсутствуют. Время между заказом оптовой партии товара и ее доставкой является случайной величиной, равномерно распределенной между 0.5 и 1 мес. Компания использует постоянную стратегию управления запасами (Smin, Sr), чтобы определить, какое количество товара заказывать: q(заказ) = Sr-S, если S<Smin, где S - уровень запасов на начала месяца, Sr - уровень запасов после поступления, Smin - минимальный уровень запаса на складе. Если S>=Smin, то заказывать на склад ничего не надо. При возникновении спроса на товар он немедленно удовлетворяется, если уровень запасов, по меньшей мере, равен спросу на товар. Если спрос превышает уровень запасов, поставка той части товара, которая превышает спрос над предложением, откладывается и выполняется при будущих поставках (что приводит к отрицательному уровню запасов). При поступлении заказа товар в первую очередь используется для максимально возможного выполнения отложенных поставок (если такие имеются); остаток заказа добавляется в запасы.  Пусть в нашей системе затраты h на хранение в месяц составят 1 денежную единицу на единицу товара, имеющегося в (положительных) запасах. Издержки, связанные с отложенными поставками, равны 5 денежных единиц на единицу товара в отложенной поставке за месяц. Предположим, что исходный уровень запасов равен на складе I(0)=60 ед. и у компании нет неполученных заказов. Смоделируйте работу системы в течении T=120 мес., вычислите средние общие расходы в месяц, чтобы сравнить следующие девять стратегий поставок оптовых партий:

НЕ нашли? Не то? Что вы ищете?

Smin 20 20 20 20  40 40 40  60 60

Sr  40 60 80 100 60 80 100 80 100

Модель в целом

Из постановки задачи видно, что в модели должны функционировать как минимум три параллельных процесса:

    формирование заказов покупателей; оптовые поставки. деятельность компании – выполнение заказов покупателей, формирование заказов оптовых партий, получение оптовых партий;

Поскольку параллельные процессы могут протекать только в различных объектах, модель в целом (класс Model) будет иметь следующую структуру (Рис. 1).

Рис. 1 Структурная схема модели

Формирование заказов покупателей имитируется объектом Customers (экземпляр класса CCustomers). Деятельность компании имитируется объектом Seller (экземпляр класса  CSeller). Действительные значения параметров Smin и Sr этого объекта равны аналагичным параметрам класса Model. Оптовые поставки имитируются объектом Wholesaler (экземпляр класса  CWholesaler). Объекты взаимодействуют путем посылки сигналов по связям. Посылка заказа товара или оптовой партии осуществляется с помощью сигналов Order с параметром Q – количество заказываемого товара. Прием заказа осуществляется с помощью сигнала OrderReceipt. Пересылка заказанного товара или оптовой партии осуществляется с помощью сигнала SendOn с параметром Q – количество пересылаемого товара. Получение заказанного товара или оптовой партии товара осуществляется с помощью сигнала SecureOrder.

Параметр модели Texp задает время работы системы, для которого оцениваются затраты. По истечении этого времени значение затрат сохраняется в переменной E и модель останавливается (Рис. 2).

Рис. 2 Карта поведения класса Model

Формирование заказов покупателей

Карта поведения класса CCustomers показана на Рис. 3.

Рис. 3 Карта поведения класса CCustomers

Начальным состоянием является состояние Waiting. Через случайный интервал времени, распределенный по экспоненциальному закону со средним значением T (параметр) срабатывает переход в вероятностную точку ветвления. Далее с указанными вероятностями срабатывают альтернативные переходы в состояние Ordering. В действиях альтернативных переходов определяется количество заказываемого товара n. Во входных действиях состояния Ordering посылается выходной сигнал Order с параметром n и вычисляется общее количество заказанного товара N. Далее срабатывает безусловный переход в исходное состояние Waiting. Все действия по формированию и посылке заказа являются мгновенными.

Оптовые поставки

Поскольку мы создаем модель для нашей конкретной задачи, то для упрощения модели оптовых поставок можно использовать тот факт, что согласно условиям задачи поставка оптовой партии всегда выполняется до поступления нового заказа. Поэтому можно задать достаточно простую карту поведения класса CWholesaler (Рис. 5). При посуплении сигнала OrderReceipt срабатывает переход из состояния OrderWaiting в состояние FillingOrder, в действиях которого разыгрывается случайное значение времени выполнения заказа T, равномерно распределеное между значениями TauMin и TauMax (параметры). По истечении этого времени срабатывает переход в исходное состояние OrderWaiting, в действиях которого посылается сигнал SendOn с параметром – количеством товара в партии – и вычисляется общее количество поставленного товара Q. Пределы применимости такой модели: заказы могут поступать только от одного источника, и интервал между заказами не может быть меньше TauMax.

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

Рис. 4 Карта поведения класса CWholesaler

Деятельность компании

Карта поведения класса CSeller приведена на Рис. 6.

Рис. 5 Карта поведения класса CSeller

Через интервал T (параметр) при выполнении охраняющего условия S<Smin срабатывает переход в то же самое состояние Waiting, в действиях которого посылается выходной сигнал заказа оптовой партии Order со значением параметра Q, равным Sr-S.

Прием заказа и обработка поступления оптовой партии имитируются внутренними переходами в состоянии Waiting, показанными на Рис. 7.

Рис. 6 Внутренние переходы в состоянии Waiting

При поступлении заказа (сигнал OrderReceipt) товара проверяется, есть ли товар на складе и посылается сигнал SendOn с полным или частичным количеством заказанного товара в качестве параметра. Если полностью заказ выполнить невозможно, то увеличивается количество отложенных поставок товара SD.

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

Эти переходы должны быть внутренними, так как при поступлении соответствующих сигналов текущее состояние должно сохраняться. Если сделать эти переходы внешними из Waiting в Waiting, то после обработки сигналов и повторном входе в состояние отсчет интервала времени для перехода с условием «after» начнется сначала.

Затраты на хранение товара на складе пропорциональны времени хранения, количеству единиц товара на складе и размеру отложенных поставок. MvStudium 7 позволяет вычислить их самым простым способом – приписав состоянию Waiting дифференциальное уравнение – непрерывная деятельность “expense” (Рис. 8). Таким образом, значение переменной E (суммарные затраты) линейно увеличивается, когда объект Seller находится в состоянии Waiting и меняется скачком в момент поступления оптовой партии товара. Значения производной меняются скачком в момент поступления оптовой партии товара и возможно в момент получения заказа от покупателя, если величина SD не нулевая. Таким образом, мы получили гибридную (непрерывно-дискретную) модель.

Рис. 7 Дифференциальное уравнение динамики затрат

Вычислительный эксперимент

Создадим визуальную модель и запустим ее. Вы можете открыть нужные окна и наблюдать анимацию работы карт поведения всех объектов модели (Рис. 8). Вы можете выполнять модель по тактам, задавать условия останова по времени, по срабатыванию переходов, по входу в состояние, по логическому выражению и т. д. Для наглядности можно использовать 2D и 3D-анимацию (на Рис. 8 показана 2D-анимация, показывающая значения запасов товара и отложенных поставок в виде динамических столкиков зеленого и красного цветов). С использованием интерактивных возможностей вы проводите отладку модели и убеждаетесь в ее правильной работе. Наконец мы запускаем модель в автоматическом режиме и доходим до конечного состояния.

Рис. 8 Визуальная модель

Система моделирования MvStudium всегда создает модель в виде выполняемого программного модуля (DLL или EXE), поэтому вычисления выполняются быстро, что важно для стохастических вычислительных экспериментов.

Выполнив прогон модели, мы получим какое-то значение затрат, например, E=14669 единиц. Следует, однако, понимать, что это значение само является случайным. Если вы выполните еще один прогон модели, то получите немного другое значение и т. д. Для уверенной оценки величины E нужно определить ее математическое ожидание и среднеквадратическое отклонение.

Это можно сделать с помощью соответствующего типового вычислительного эксперимента MvStudium. Задав абсолютную погрешность 50 единиц (ширина доверительного интервала 100) и доверительную вероятность 0.95, получим значения математического ожидания и среднеквадратического отклонения переменной E (Рис. 9). Для заданной точности понадобилось 453 прогона модели. Установив соответствующий флажок, можно посмотреть и гистограмму распределения.

Рис. 9 Определение математического ожидания значения затрат

Можно также провести типовой вычислительный эксперимент по определению вероятности события – того, что затраты не превышают заданного порога. На  показаны результаты вычислительного эксперимента по определению вероятности того, что E<=14800 (с вероятностью 0.95 значение вероятности выполнения этого условия находится в доверительном интервале 0.89..0.91).

Рис. 10 Определение вероятности выполнения условия

Теперь для решения поставленной задачи «сравнить девять стратегий поставок оптовых партий» необходимо еще восемь раз изменить пары параметров (S_min, S_r) и найти математическое ожидание затрат E.

S_min

S_r

E (матем. ожидание)

20

40

14123 +-50

20

60

13567 +-50

20

80

14034 +-50

20

100

14765 +-50

40

60

13969 +-50

40

80

14382 +-50

40

100

15246 +-50

60

80

16128 +-50

60

100

16546 +-50


В принципе, поставленная задача решена. Однако, хотелось бы посмотреть, например, зависимости затрат от S_r для различных значений S_min и т. п. Для него необходимо перевести нахождение математического ожидания E в саму модель.

Модель для определения математического ожидания величины затрат

Сохраним отлаженную модель под другим именем и начнем ее преобразовывать. Сначала сохраним класс Model, который умеет находить одно случайное значение затрат, как независимый глобальный класс InvControl.

Новый класс Model должен уметь находить математическое ожидание затрат с заданной точностью. В пакете Statistics уже имеется «заготовка» такого класса – класс StochasticExp_mx. Этот класс вычисляет математическое ожидание и среднеквадратическое отклонение некоторой величины «x», однократное случайное значение которой вычисляется соответствующей деятельностью, которая должна выполняться в состоянии «Испытание». Поэтому нам нужно сначала просто определить класс Model как потомка класса Statistics. StochasticExp_mx (Рис. 11)..

Рис. 11 Класс Model как потомок класса Statistics. StochasticExp_mx

Теперь нужно доопределить класс Model применительно к нашей конкретной задаче (Рис. 12):

    добавить параметры P_Smin, P_Sr; состоянию «Испытание» приписать в качестве локальной деятельности экземпляр класса InvControl с соответствующими действительными параметрами и режимом «ортогонального» времени; в выходных действиях состояния «Испытание» связать переменную «x» с реальной переменной «Испытание. E»; настроить значения унаследованных параметров точности вычисления, указав значения, которые использовались в типовом эксперименте (Рис. 9): Nmin=40, Q=0.95, epsilon=50 (Рис. 13);

Рис. 12 Доопределенный класс Model

Обратите внимание: деятельность в состоянии «Испытание» выполняется в «ортогональном» времени – время основной модели не меняется, пока вычисляется отдельное значение величины затрат, карта поведения экземпляра класса InvControl выполняется в своем независимом времени. Таким способом можно строить «эксперименты в эксперименте» любой глубины вложенности.

Рис. 13 Настройка унаследованных парметров

Запускаем новую модель и получаем такое же (в пределах заявленной точности) значение затрат (переменная «mx» в данной модели), что и при выполнении типового эксперимента.

Теперь мы можем сравнить предложенные 9 стратегий без ручных манипуляций с моделью, чреватых ошибками, а с помощью типового вычислительного эксперимента «Расчет вариантов» (Рис. 13).

Рис. 14 Окно вычислительного эксперимента «Расчет вариантов»

Далее построим зависимости затрат от P_Sr при P_Smin=20,30,40 (Рис. 13). Из графиков видно, что оптимальной является стратегия (P_Smin=30, P_Sr=55), которая отсутствует в предложенном для анализа перечне.

               

                       а)                        б)                                в)

Рис. 15  Зависимости затрат от P_Sr при P_Smin=20 (а), 30 (б) и 40(в).