Динамические параметры: X: supplier.get(0).getX() Y: supplier.get(0).getY() dX: distributor.get(0).getX()-supplier.get(0).getX() dY: distributor.get(0).getY()-supplier.get(0).getY() При запуске модели отобразится дополнительный маршрут. Динамическое событие пополнения запасов дистрибьютора Создадим событие пополнения запасов дистрибьютора: DCStock=DCStock+DCEOQ; DCTrcost=DCTrcost+time*distributor.get(0).dctrrate; truck.get(8).rectangle.setVisible(false); truck.get(8).jumpTo(supplier.get(0).getX(),supplier.get (0).getY());
95 В отличие от RetReplenishment, используется только один параметр. Дистрибьютор в модели один, поэтому не требуется указывать индекс объекта. Диаграмма действий actionChart В системе могут быть три вида заказов: -заказ потребителя у розничной точки -заказ розничной точки у дистрибьютора -заказ дистрибьютора у поставщика. У розничных точек и дистрибьютора могут быть три состояния: -заказ не может быть выполнен -заказ может быть выполнен -заказ может быть выполнен, но уровень запаса ниже порогового. В первом и третьем состоянии вверх по цепочке поставок формируется новый заказ, если заказ уже не находится в пути. Каждый день генерируются восемь значений спроса потребителей – по одному для каждой розничной точки. Система работает по «тянущей» схеме движения материального потока. При каждом событии проверяется состояние всех элементов цепи от розничной точки до поставщика. Данное требование связано с тем, что в один день дистрибьютору могут поступить заказы от нескольких розничных точек, и не во всех случаях имеющегося запаса хватит для обслуживания спроса. Добавление еще одного эшелона цепи поставок усложняет алгоритм работы: 96 В версии «как должно быть (to be)» изменен код обработки заказов дистрибьютором(1), добавлено условие проверки порогового уровня запаса дистрибьютором(2), а также добавлен модуль выполнения заказа дистрибьютора у поставщика(3). Модифицируем диаграмму действий: 1)Модуль: «Обработка заказа дистрибьютором» Код: if (DCStock < retEOQ[j]){ DCShortage++; } else {
97 DCStock-= retEOQ[j]; create_RetReplenishment(ret.retDist/10,ret.retDist/10,j ); truck.get(j).rectangle.setVisible(true); truck.get(j).moveTo(ret.getX(),ret.getY()); } Если у дистрибьютора недостаточно запасов для выполнения заказа, учитывается случай возникновения дефицита. Если запаса достаточно, то выполняется заказ – создается динамическое событие RetReplenishment. 2)-3)Добавляем модули: Модуль: «Запас дистрибьютора ниже порогового уровня?» Условие: DCStock < DCROP && truck.get(8).isMoving() == false Дистрибьютор выполняет заказ у поставщика, если заказ не находится в пути, и запас ниже порогового уровня. Модуль: «Обработка заказа поставщиком» Код: 98 create_DCReplenishment (distributor.get(0).dcDist/10,distributor.get(0).dcDist /10); truck.get(8).rectangle.setVisible(true); truck.get(8).moveTo(distributor.get(0).getX(),distribut or.get(0).getY()); Добавим учет издержек дистрибьютора на хранение в событие ordering. Общие издержки включают издержки дистрибьютора: DCHoldingcost+=distributor.get(0).dcholdingrate*DCStock ; totalCost=retHoldingcost+retTrcost+DCHoldingcost+DCTrco st; Версия события ordering без использования диаграммы действий представлена в Приложении 2. Редактирование презентации Сделаем так, чтобы график отображал уровень запасов дистрибьютора:
99 Создадим текстовое поле для отображения уровня запаса дистрибьютора: X: distributor.get(0).getX()+8 Y: distributor.get(0).getY() Текст: DCStock Добавим отображение текущих издержек дистрибьютора при выполнении работы модели: Динамические параметры элементов Текст: Текст: "Издержки на содержание запаса, дистрибьютор: "+round(DCHoldingcost)
100 Текст: "Издержки на транспортировку, дистрибьютор: "+round(DCTrcost) - Также добавим на карту легенду условных обозначений - создаем четыре прямоугольника и четыре текстовых окна: При запуске модель примет следующий вид: Дополнительно поменяем текст, отображаемый перед запуском модели (text1), и переместим кнопку запуска (button):
101 Оптимизационный эксперимент Модифицируем оптимизационный эксперимент – добавим переменные управления запасами дистрибьютора и возможность изменять координаты дистрибьютора при поиске решения. Настройки параметров:
102 Перейдем к пункту Ограничения оптимизационного эксперимента: Создадим интерфейс эксперимента:
103
104 Задания: 1)Рассчитайте аналитически оптимальные параметры управления запасами для розничных точек и дистрибьютора при помощи формулы EOQ и формулы расчета страхового запаса при вероятностной структуре спроса. Сравните полученные значения с результатом оптимизационного эксперимента. 2)Измените тип распределения спроса на треугольное распределение triangular(0,demandMean*3,demandMean) и проведите
105 оптимизационный эксперимент. Как изменились параметры управления запасами и общие издержки системы? 3)Измените тип распределения спроса на детерминированный. Оцените изменение количества случаев возникновения дефицита у дистрибьютора, а также распределение запасов в системе. 4)Установите срок работы модели равным 10000 дней, изменив соответственно ограничения по допустимому уровню дефицита. Как изменились оптимальные значения параметров? 5)Модифицируйте модель: вместо ограничения по уровню сервиса добавьте штраф за каждую единицу потерянного потребительского спроса в размере 300 единиц. Как изменились оптимальные параметры управления запасами? 6)Поместите дистрибьютора на координатах (60;115). Заново создадите интерфейс при оптимизации. Насколько изменятся общие издержки системы?
106 Библиографический список 1.“Java For AnyLogic Users” http://www.xjtek.com/files/book/Java_for_AnyLogic_users.pdf 2.“Model time, date and calendar. Virtual and real time” http://www.xjtek.com/files/book/Model%20time%20date%20and%20calendar.%2 0Virtual%20and%20real%20time.pdf 3.Справочная система Anylogic 4. “Presentation and Animation: Working with Shapes, Groups, Colors” http://www.xjtek.com/files/book/Presentation_and_animation- working_with_shapes_groups_colors.pdf 5.Дыбская В.В., Зайцев Е.И., Сергеев В.И., Стерлигова А.Н. Логистика: полный курс МВА (учебник). – М.: ЭКСМО, 2008. – 944 с 6.”Distribution Game” http://web.lemoyne.edu/wright/trucks.htm 7. « Анализ размещения распределительного центра и управления складскими запасами в многоуровневой модели цепи поставок» Рожков М.И. Материалы V Всероссийской конференции студентов и аспирантов "Интеграция и координация логистических процессов в цепях поставок"
107 Оглавление Введение ………………………………………………………….……..………2 Благодарности……………………………………………………………………3 Раздел 1. Модели с детерминированным спросом …………..…………4 1.1 Модель с имманентным (мгновенным) пополнением запасов…………..4 Описание модели…………………………………………………………………4 Создание класса активного объекта……………………………………………4 Краткое описание пользовательского интерфейса AnyLogic………………….6 Добавление и настройка параметров……………………………………………8 Генерация событий в модели………………………………………….............10 Редактирование презентации………………………………………………….12 Запись данных в файл для последующей обработки…………………………18 1.2 Модель с розничной точкой-агентом……………….……………………20 Описание модели………………………………………………………………20 Добавление класса Retailer………………………………………………..20 Модификация класса Main……………………………………………….……24 Раздел 2.Модели со стохастическим спросом ………….………………30 2.1 Модель линейной цепи поставок со стохастическим спросом…………30 Описание модели……………………………………………………………….31 Добавление классов Distributor и Truck………………………..………31 Редактирование класса Main………………………………………….………32
108 Генерация спроса………………………………………………………………..35 Модификация алгоритма управления запасами……………………….……36 Диаграмма действий…………………………………………………….……..39 Работа с динамическими событиями в диаграмме действия………..………43 Учет случаев возникновения дефицита………………………………………49 Учет издержек…………………………………………………………..………50 Добавление данных на окно презентации…………………………………...53 Оптимизационный эксперимент………………………………………………55 Базовые настройки………………………………………………………………55 Уточнение величин параметров……………………………………………….61 2.2 Модель с несколькими розничными точками……….…….…….………64 Описание задачи………………………………………………….…….………64 Модификация класса Main……………………………………….…...………65 Изменение алгоритма управления запасами…………………….……..……71 Модификация событий………………………………………………..……….75 Добавление элементов презентации………………………………….………76 Отображение уровня запаса в текстовом поле………………………..…….78 Запись данных о ежедневном уровне запасов в текстовый файл……………81 Оптимизационный эксперимент………………………………………………84 Ограничения…………………………………………………………………….84 Поиск решения……………………………………………………..…………..87
109 2.3 Расширенная модель цепи поставок………………………………………89 Описание задачи…………………………………………………………..……89 Добавление класса поставщика…………………………………………..……90 Модификация класса Main……………………………………………..….….91 Динамическое событие пополнения запасов дистрибьютора………….…..94 Диаграмма действий actionChart……………………..…………………..95 Редактирование презентации…………………………….…………………….99 Оптимизационный эксперимент……………………………..……………….102 Библиографический список…………………………………….……………..106 Оглавление…………………………………………………….………………107 Приложение 1…………………………………………………………………..110 Приложение 2………………………………………………………………….116
110 Приложение 1. Создание 3D анимации работы модели Создадим трехмерную, более реалистичную анимацию работы модели. Перетаскиваем элемент 3D Окно панели 3D в окно редактирования класса Main: Меняем дополнительные свойства: При запуске презентации модели будут отображаться трехмерные объекты на белом фоне.
111 Изменим презентацию класса Truck. Перетащим из панели 3D Объекты объект Фура: Удаляем предыдущий объект презентации rectangle: Меняем масштаб на 20% и переименовываем 3D объект в rectangle: Повторяем подобную последовательность действий для классов Retailer, Distributor, Supplier. Используем следующие 3D объекты стандартной библиотеки AnyLogic:
112 Retailer – Магазин Distributor – Склад Supplier – Завод Масштаб объектов 20%. Для вложенных объектов класса Main активируем пункт Отображать на 3D сцене: Изменяем свойства вложенных объектов textRet и textDC:
113 Смещение по оси Z позволит лучше отобразить текстовое поле на трехмерной презентации. Доработаем линии, соединяющие звенья цепи: Запускаем презентацию. При помощи кнопок мыши и колеса прокрутки можно осуществлять навигацию по окну 3D презентации:
114
115 В качестве фона может быть использована карта местности. Как мы видим, при минимальных изменениях презентация стала более реалистичной. Дополнительная информация по работе с 3D в AnyLogic представлена в справочной системе[3].
116 Приложение 2. Код actionChart(). Может быть использован вместо вызова функции диаграммы действий: //модуль обработки спроса: for (Retailer ret: retailer){ int j=ret.getIndex(); //начало дня - рассчитываем издержки на хранение retHoldingcost=retHoldingcost+ret.retholdingrate*retStock[j]; //генерация спроса в розничных точках: ret.currentDemand =round( max (normal(demandStd[j],demandMean[j]),0)); //сравнение спроса с запасом: if ( ret.currentDemand > retStock[j]) { //учет дефицита: retShortage[j]++; //проверка нахождения заказа от дистрибьютора в пути: if (truck.get(j).isMoving() == false ){ //проверка нужного количества запаса у дистрибьютора: if (DCStock < retEOQ[j]){ DCShortage++; } else { DCStock-= retEOQ[j]; create_RetReplenishment(ret.retDist/10,ret.retDist/10,j); truck.get(j).rectangle.setVisible( true ); truck.get(j).moveTo(ret.getX(),ret.getY()); } } } else { //выполнение розничного заказа: retStock[j]-= ret.currentDemand; //проверка порогового уровня запаса и наличия заказа в пути: if (retStock[j] < retROP[j] && truck.get(j).isMoving() == false ){ //проверка наличия запаса у дистрибьютера: if (DCStock < retEOQ[j]){ DCShortage++; } else { DCStock-= retEOQ[j]; create_RetReplenishment(ret.retDist/10,ret.retDist/10,j); truck.get(j).rectangle.setVisible( true ); truck.get(j).moveTo(ret.getX(),ret.getY()); } } } //проверка порогового уровня запаса дистрибьютора: if (DCStock < DCROP && truck.get(8).isMoving() == false ){ //обработка заказа от поставщика truck.get(8).rectangle.setVisible( true ); truck.get(8).moveTo(distributor.get(0).getX(),distributor.get(0).getY()); create_DCReplenishment (distributor.get(0).dcDist/10,distributor.get(0).dcDist/10); } }
|