Имитационное моделирование – один из самых эффективных способов описания и анализа процессов. Оно является частным случаем математического моделирования, но в отличие от него в имитационном моделировании присутствует возможность достаточно точно описывать большое число объектов, для которых не разработаны аналитические модели или методы решения их моделей.
Обеспечение управления бизнес-процессами, решение задач проектирования и исследования технических, экономических, организационных и прочих разновидностей систем в современности невозможно без привлечения математического моделирования в качестве системной категории. Одним из актуальнейших направлений является имитационное моделирование с использованием компьютерных технологий.
В рамках этой статьи создадим имитационную модель системы массового обслуживания с общей очередью и несколькими каналами обслуживания. В качестве предметной области был выбран процесс выдачи книг по запросам читателей библиотеки. Для моделирования воспользуемся программным комплексом AnyLogic. Данный продукт способен составлять модели с использованием основных парадигм имитационного моделирования, таких как дискретно-событийное моделирование, системная динамика и агентное моделирование. Прибегнем к использованию агента в системе, который будет играть роль каждого посетителя библиотеки, вводить их в очередь и затем выводить после обслуживания на одном из каналов.
Пусть количество каналов будет равно трём, в понятиях предметной области это будет значит, что читателей будет обслуживать три библиотекаря. Сам процесс обслуживания меняться от числа каналов не будет, изменения будут претерпевать количество условий перехода на конкретный канал обслуживания, что можно заметить по приведённой ниже блок-схеме.
Рисунок 1 – Блок-схема обслуживания посетителей
Теперь перейдём к непосредственному моделированию системы массового обслуживания. Для этого достаточно будет стандартных блоков программы. Ниже представлено изображение созданной модели.
Рисунок 2 – Моделирование деятельности библиотеки
Для незнакомых с инструментарием AnyLogic приведём описание каждого блока системы. Индекс n обозначает номер канала обслуживания.
Таблица 1 – Описание блоков системы AnyLogic
Название блока |
Тип блока |
Описание |
Посетители |
Source |
Равномерный поток с почасовой интенсивностью генерации заявок |
ОчВход/ОчВыход |
TimeMeasureStart/TimeMeasureEnd |
Подсчёт времени, проводимого в очереди |
Очередь |
Queue |
Очередь неограниченного размера |
Старт/Финиш |
TimeMeasureStart/TimeMeasureEnd |
Подсчёт времени в ожидании книги |
Библиотекарь[n] |
SelectOutput |
Выбор на основе того, присутствует ли дольше бездействующий библиотекарь |
Ушёл[n] |
Hold |
Блокируется при уходе библиотекаря в хранилище |
Хранилище[n] |
Delay |
Triangular-распределение затраченного на поход в хранилище времени |
Поиск[n] |
Delay |
Normal-распределение затраченного на поиск книг времени |
Найдены[n] |
Queue |
Очередь перед блокиратором |
Обратно[n] |
Hold |
Блокируется до нахождения всех книг |
Выдача[n] |
Delay |
Triangular-распределение затраченного на возвращение |
Обслужены |
Sink |
Заявка уничтожается |
Также немаловажными являются дополнительные параметры агента, используемые для определения поведения читателя библиотеки. Приведём их в отдельной таблице.
Таблица 2 – Параметры агента
Название параметра |
Назначение |
free[n] |
Подсчёт времени бездействия библиотекарей через событие event |
busy[n] |
Булевый оператор бездействия, при false идёт подсчёт времени бездействия |
req[n] |
Хранение числа забранных библиотекарем заявок, используется для вычисления времени задержек |
Стоит упомянуть, что в AnyLogic допускается использование языка Java для описания событий, их обработчиков и прочего. Например, упомянутое в таблице выше событие event подсчитывает время бездействия каждого библиотекаря, активируясь каждую единицу модельного времени:
System.out.println(“—–”);
if (this.busy1==false) {this.free1++;} else {this.free1=0;} System.out.println(free1);
if (this.busy2==false) {this.free2++;} else {this.free2=0;} System.out.println(free2);
if (this.busy3==false) {this.free3++;} else {this.free3=0;} System.out.println(free3);
System.out.println(“—–”);
В некоторых блоках модели также используется Java-код, продемонстрируем её в ещё одной таблице.
Таблица 3 – Использование Java-кодов в модели
Название блока |
Код блока |
Очередь |
При входе: queuesize.update() |
Библиотекарь[n] |
Условие (в зависимости от количества следующих библиотекарей, в данной случае такой один): Ушёл[n].isBlocked()==false && !(agent.free[n+1]==max(agent.free[n+1],agent.free[n]) && Ушёл[n+1].isBlocked()==false) При выходе (true): agent.busy[n]=true; agent.free[n]=0; |
Хранилище[n] |
Время задержки: triangular( 0.5, 1, 1.5 ) При входе: if (Хранилище[n].size()==4 || Очередь.size()==0) Ушёл[n].block() При подходе к выходу: agent.req[n]=Хранилище[n].size(); if(Хранилище[n].size()>0) {reqdistr[n].update(); reqdistr_sum.update();} |
Поиск[n] |
Время задержки: normal(agent.req[n]*0.2,agent.req[n]*3) При входе: Обратно[n].block() |
Найдены[n] |
При входе: if (Поиск[n].size()==0) Обратно[n].unblock() |
Выдача[n] |
Время задержки: triangular( 1, 2, 3)*agent.req[n] При выходе: if(Хранилище[n].size()==0 && Поиск[n].size()==0 && Выдача[n].size()==0) Ушёл[n].unblock(); agent.busy[n]=false; |
Таким образом, модель воплотила первоначальную задумку и стала полностью функциональной. Будет нелишним собрать некоторую статистику с созданной модели, чему могут поспособствовать элементы AnyLogic из палитры Презентация. На скриншоте ниже показана статистика, собираемая во время работы системы с пятью каналами.
Рисунок 3 – Сбор статистики в окне симуляции
Модель также возможно представить в трёх измерениях, отдельно разметив точки размещения агентов при прохождении определённых блоков системы. Примером такого отображения модели показан ниже.
Рисунок 4 – Трёхмерная анимация модели с пятью библиотекарями
Подведём итог: моделирование уже давно является одним из важнейших аспектов, принимаемых в расчёт в процессе принятия решений, при использовании автоматизированных программных пакетов и имитационного моделирования, на основе которого и реализуется такое ПО, полезность моделирования как такового повышается за счёт возможности увидеть воочию, как будет вести себя имитируемый процесс и насколько эффективны будут его показатели.
Библиографический список
- Борщев А. Практическое агентное моделирование и его место в арсенале аналитика [Электронный ресурс]. – Режим доступа: http://simulation.su/uploads/files/default/borchev.pdf
- Бунцев И.А. Создание и реализация имитационных моделей в программной среде AnyLogic: Учебное пособие для вузов. – М.: Горячая линия – Телеком, 2015. – 154 с.
- Карташевский В.Г. Основы теории массового обслуживания: Учебник. – М.: Горячая Линия – Телеком, 2013. – 132 с.
- Климов Г.П. Теория массового обслуживания. – М.: Изд-во Московского университета, 2011. – 312 с.
- Салмина Н.Ю. Имитационное моделирование: Учебное пособие. – Томск: Эль Контент, 2012. – 90 с.