Файл: Разработка имитационных моделей управления запасами в цепях поставок Москва 2011 2 Введение.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.12.2023
Просмотров: 86
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Национальный Исследовательский Университет – Высшая Школа
Экономики
Отделение логистики
Кафедра информационных систем и технологий в логистике
М.И. Рожков
Разработка имитационных моделей управления запасами в
цепях поставок
Москва 2011
2
Введение
Целью данного практикума является изучение влияния параметров управления запасами в цепи поставок на производительность цепи с использованием метода имитационного моделирования.
Для этого разрабатываются несколько моделей с постепенным расширением их функциональности. Модели основаны на агентном подходе моделирования и отражают работу цепи поставок.
В практикуме развиваются идеи, заложенные в известной программе- симуляторе распределительной сети Distribution Game[6]. Главной особенностью Distribution Game является вероятностная структура спроса на товар в трех розничных точках. Несмотря на внешнюю простоту, подбор оптимальной стратегии управления запасами в программе вручную является достаточно сложной и трудоемкой задачей. В данном практикуме работа системы автоматизирована, также добавлена возможность поиска оптимальных значений параметров управления запасами в цепи поставок.
Процесс моделирования каждой из рассмотренных систем можно поделить на две части:
-моделирование объектов сети
-моделирование «управляющего контура» системы
Таким образом, объектно-ориентированный подход в разработке имитационных моделей согласуется с объектной декомпозицией цепей поставок[5].
Следует заметить, что работа с AnyLogic требует знания основ языка программирования Java, поэтому процесс моделирования относительно сложен. При разработке данного практикума активно использовались материалы “Java for AnyLogic Users”[1], а также учебные примеры моделей:
3
Supply Chain, Two Stocks Problem, Event Generating New Agents и Dynamic
Event Models Product Delivery.
При первом упоминании циклических конструкций, модулей принятия решения, переменных, массивов в тексте практикума будут приведены ссылки на соответствующий раздел “Java for AnyLogic Users”. Также подробное описание элементов среды может быть найдено в справочной системе AnyLogic[3].
Модели, рассмотренные в практикуме, по возможности сохраняют преемственность кода и общей структуры. В начале каждого раздела используется модель, построенная в конце предыдущего.
Благодарности
Автор выражает благодарность Заходякину Глебу Викторовичу за содействие в работе над содержанием практикума, а также Зиновьеву
Константину Михайловичу, Овсову Сергею Павловичу и Столяр Екатерине
Юрьевне за помощь в редактировании текста.
4
Раздел 1. Модели с детерминированным спросом
Данный раздел ориентирован на работу с теоретическими моделями управления запасами. Модели максимально упрощены и не учитывают многие факторы. Основная задача – рассмотреть реализацию подобных систем в среде имитационного моделирования AnyLogic.
1.1 Модель с имманентным (мгновенным) пополнением запасов
Описание модели
Допустим, спрос детерминированный и составляет 80 единиц за один период. В модели одна розничная точка. При уровне запасов равном нулю осуществляется имманентное (мгновенное) пополнение запасов. Данные о текущем уровне запаса фиксируются в начале периода. Размер оптимального заказа составляет 400 единиц.
Задача: смоделировать процесс изменения уровня запаса.
t1 – момент перезаказа.
Создание класса активного объекта
Открываем среду разработки AnyLogic. Создаем новую модель:
5
Выбираем название для модели:
Создаем модель «с нуля»:
6
Нажимаем Готово.
Краткое описание пользовательского интерфейса AnyLogic
В левой части рабочей области будет находиться панель Проекты.
Панель Проекты обеспечивает легкую навигацию по элементам моделей, открытых в текущий момент времени. Поскольку модель организована иерархически, то она отображается в виде дерева: сама модель образует верхний уровень дерева; эксперименты, классы активных объектов и Java
7 классы образуют следующий уровень; элементы, входящие в состав активных объектов, вложены в соответствующую подветвь дерева класса активного объекта и т.д.
В правой рабочей области будет отображаться панель Палитра, а внизу
- панель Свойства. Панель Палитра содержит разделенные по категориям элементы, которые могут быть добавлены на диаграмму класса активного объекта или эксперимента. Панель Свойства используется для просмотра и изменения свойств выбранного в данный момент элемента (или элементов) модели.
В центре рабочей области AnyLogic Вы увидите графический редактор диаграммы класса активного объекта Main. [3]
8
Добавление и настройка параметров
В AnyLogic нет строгих различий между переменными и параметрами при работе модели. Параметры обычно используются для задания статических характеристик объекта. Переменные обычно используются для моделирования изменяющихся характеристик объекта или для хранения результатов работы модели.[2] [1,p8]
В нашей модели будут использоваться три параметра: уровень спроса, текущий уровень запаса, величина оптимального размера заказа.
Спрос составляет 80 единиц. Создадим параметр currentDemand, который будет соответствовать текущему уровню спроса. Дважды щелкаем мышью на Retailer в панели Проекты:
Перетаскиваем мышью Параметр из палитры [1,p8]:
Переименовываем параметр и меняем его тип:
9
Имя: currentDemand, Тип: double. Значение по умолчанию: 80.
Int соответствует целым числам. Double – числам с дробной частью.
Дополнительная информация о типах данных в “Java for AnyLogic
Users”[1,p2].
По аналогии создаем параметры EOQ и переменную retStock: retStock будет соответствовать текущему уровню запаса, EOQ – размеру заказа при пополнении запаса (EOQ – Economic Order Quantity). Тип обоих параметров также int.
Начальное значение EOQ : 400
Начальное значение retStock:400
Здесь и далее не используется привязка значений переменных и параметров к единицам измерения.
10
Генерация событий в модели
В нашей модели происходят два вида событий:
1. каждый день запас уменьшается на величину спроса;
2. если текущий уровень запаса равен нулю, то выполняется пополнение запасов.
Для моделирования событий используется элемент Event (Событие).
Добавим Событие в окно редактирования [2]:
Поменяем Основные Свойства события:
Имя: ordering, Режим: циклический, Время первого срабатывания:
0, Период: 1.
Добавим код в окно Действие:
11
Действие:
retStock-= currentDemand;
Данная строка уменьшает уровень запасов на величину дневного спроса
Добавим код проверки текущего уровня запасов. Заказ формируется, если текущий запас равен нулю: if(retStock==0){ retStock+=EOQ;
}
Для реализации условия используется блок if.[1,p35] Граница блока обозначается фигурными скобками. Первая строка сравнивает уровень запаса розничной точки и ноль. Если запас равен нулю, то выполняется пополнение запаса на величину EOQ (EOQ = 400).
В Java можно комментировать код, используя комбинации символов
«//»
(для комментирования строки) или «/* */» (для комментирования большего объема кода).[1,p41] Прокомментированный код может выглядеть, например, так:
12
//обновление уровня запасов retStock-= currentDemand;
//проверка условия пополнения запасов if(retStock==0){
//пополнение запасов retStock+=EOQ;
}
Далее в практикуме не используется комментирование кода, так как все нужные комментарии приведены в тексте. В общем случае при разработке моделей рекомендуется комментировать код.
Редактирование презентации
Для отображения работы модели при запуске используем элемент
Временной график панели Статистика:
Нажимаем Добавить элемент данных:
13
График должен показывать динамику изменения уровня запаса, поэтому в поле Значение вписываем retStock:
В AnyLogic есть удобная система автоподстановки значений через контекстное меню[1,p13]. Начнем набирать «re» в поле Значение и нажмем
Ctrl+Пробел:
Появляется контекстное меню, где можно выбрать нужный параметр, начинающийся с данного сочетания букв. В нашем случае – retStock.
Поменяем настройки отображения графика:
14
Изменим значение дополнительных свойств – увеличим размер окна графика:
Ширина: 500
Высота:400
Перейдем в редактирование настроек симуляции:
15
Модель будет работать в течение 100 дней. Запустим симуляцию:
Нажимаем кнопку Запустить модель и открыть презентацию класса
Main:
16
При запуске динамически формируются график значений параметра retStock:
17
Проанализируем полученные данные:
18
Точками 1 – 5 показаны моменты генерации спроса – события ordering (1 раз за период). В пятый день работы модели текущий запас равен нулю, выполняется мгновенное пополнение запасов на величину EOQ, равную 400, поэтому «ступеньки» от 80 до 0 на графике нет.
Запись данных в файл для последующей обработки
Добавим в модель возможность записи данных об уровне запаса в текстовый файл. Запись данных в файл, так же, как и презентация, позволяет выявить возможные ошибки и лучше понять алгоритм работы модели. Для этого перенесем элемент Файл на рабочую область (класс Main):
19
Имя: filestock, Режим: запись, выбираем место расположения файла.
(Перед этим нужно создать пустой *.txt файл по указанному адресу)
Данные будут записываться в файл каждый день, поэтому отредактируем событие ordering – добавим код для записи данных об уровне запасов в файл. Для записи используем метод println() – данные будут записываться в один столбец. filestock.println(retStock);
Запустим модель и откроем текстовый файл, в который были записаны данные во время работы симуляции:
20
В текстовом файле сто значений ежедневного уровня запаса по состоянию на начало периода.
1.2 Модель с розничной точкой-агентом
Описание модели
В предыдущей версии разбиралась работа с абстрактной моделью. Для расширения возможностей модели системы добавим класс активного объекта типа «агент». Агент соответствует звену цепи поставок.
В данной промежуточной версии продемонстрируем, каким образом можно использовать объектно-ориентированный подход для решения поставленной в данном разделе задачи.
Задача: добавить обособленный элемент цепи поставок – розничную точку.
Добавление класса Retailer
Создадим Среду environment, в которой будут находиться агенты:
21
Добавим популяцию агентов в класс Main:
22
В окне Палитра, находящемся справа на рабочей области, выделяем пункт Прямоугольник и, не отпуская кнопку мыши, перетаскиваем его в окно редактирования агента.
Корректируем Основные свойства прямоугольника:
23
Меняем дополнительные параметры
Ширина,
Высота
прямоугольника, а также расположение:
Теперь у класса Retailer появилось вложенное меню Презентация
Удаляем retailer из вложенных объектов класса Main и создаем снова, перетаскивая Retailer в окно редактирования Main. После этого презентация класса (retailer_presentation) отображается корректно:
Указываем среду и начальное количество агентов:
24
Прямоугольник rectangle – упрощенное отображение розничной точки на окне презентации модели. AnyLogic представляет широкие возможности по работе с презентацией модели, включая использование трехмерной графики, но в рамках данного практикума используется максимально упрощенная анимация. Вопросы работы с анимацией подробно рассмотрены в материале “Presentation and Animation: Working with Shapes,
Groups, Colors”, представленном на сайте XjTek [4]. Добавление трехмерной графики в последнюю версию модели рассмотрено в Приложении 1.
Модификация класса Main
В новой версии модели агенты (звенья цепи поставок) генерируются и размещаются в пространстве по определенному алгоритму.
Добавим переменные значений координат розничной точки в класс
Main:
Имя: retailCoordx и retailCoordy, обе переменные типа int, значения по умолчанию 10. В этой модели удобнее использовать целые числа для отображения координат.
25
Модифицируем модель так, чтобы при инициализации создавался один объект класса Retailer и размещался в презентации в соответствии с указанными координатами.
Инициализируем агент Retailer:
Retailer a = add_retailer();
Строка Retailer a = add_retailer(); добавляет новую розничную точку. [1,33] В дальнейшем можно в данной части модели
(действие при запуске класса Main) использовать переменную “a” для ссылки на объект класса Retailer.
После создания агента нужно определить некоторые дополнительные параметры только что добавленного объекта: a.setXY(4*retailCoordx,4*retailCoordy);
Метод setXY() предназначается для определения начальных координат объекта. Каждая координата умножается на 4; когда мы добавим дополнительных агентов в модель, они будут более равномерно размещены на окне презентации.
Вырежем (Ctrl+X) параметр currentDemand из окна редактирования класса Main и вставим (Ctrl+V) в окно редактирования класса Retailer:
26
Теперь отредактируем событие ordering:
Было в предыдущей версии: retStock-= currentDemand;
Стало в новой версии модели: retStock-=retailer.get(0).currentDemand;
В новой версии модели параметр currentDemand размещен не в классе Main, а в классе retailer, вложенном в класс Main. Поэтому чтобы обратиться к данному параметру, требуется более сложный синтаксис.
«retailer.» – указывает, что объект вложенный, «get(0)» – указывает, какой по счету требуется объект из класса retailer. Несмотря на то, что в нашей модели имеется только одна розничная точка, в языке java в большинстве случаев требуется указывать индекс (порядковый номер)