Лабораторная работа
Создание модели
станции технического обслуживания
Описание модели:
1. Станция
может обслуживать три типа автомобилей.
2. Каждый
тип автомобилей обслуживается в своем боксе.
3. В
каждом боксе могут работать от одного до шести человек.
4. Каждый
человек обслуживает одну машину.
5. Одновременно
может обслуживаться такое количество машин, которое соответствует количеству
рабочих в боксе.
6. Машина
покидает станцию не обслуженной, если очередь перед нужным боксом более трех
машин.
Цели создания модели:
1. Получить
статистику по средней длине очереди перед каждым боксом.
2. Получить
статистику по количеству машин каждого типа, которые покинули станцию не
обслуженными.
3. Проведение
различных экспериментов путем варьирования численности служащих в каждом боксе
и изменения интенсивности прибытия машин каждого типа.
Реализация модели в среде AnyLogic:
Для создания модели будем использовать дискретно-событийное
(процессное) моделирование, объекты библиотеки Enterprise Library:
1.
Источники машин – объект Source;
2.
Боксы для обслуживания – объект Service;
3.
Переход машины в нужный бокс и
проверка длины очереди – объект SelectOutput;
4.
Обеспечение служащих – объект ResourcePool
5.
Выход машин с территории станции –
объект Sink.
Диаграмма процесса соответствующая поставленной задаче приведена
на рисунке 1
Рисунок 1 –
Диаграмма процесса модели станции технического обслуживания
Для
корректной работы модели и «красивой» анимации, каждому объекту Source должна соответствовать своя анимация, потому что в
дальнейшем определение принадлежности машины к тому или иному типу будет
осуществляться с помощью следующей конструкции: entity.getShape()
– функция возвращает, какая анимация закреплена за заявкой.
В
соответствии с этим и условием, что очередь перед боксом должна быть не более 3
машин, условие работы для первого объекта SelectOutput можно записать
следующим образом: entity.getShape()==lorry1 &
service.queueSize()<3, при
условии, что за первым источником закреплена анимация типа
lorry1.
Необходимо
доработать анимацию: ломаная из шести точек должна соответствовать месту для
рабочих (см. объект ResourcePool),
для каждого бокса целесообразно создать свою анимацию занятых и свободных
рабочих (желательно если цвет рабочих будет гармонировать с цветом машин,
которые обслуживаются в данном боксе), кроме этого необходимо нарисовать
ломанную, которая будет соответствовать очереди перед боксом (см. объект Service). На выполняемой модели эти линии не должны быть
видны! Примерная структура анимации модели приведена на рисунке 2.
Дополнительная анимация – это четыре
прямоугольника, цвет которых будет меняться в зависимости от прохождения машин
через боксы и последний выход для не обслуженных машин.
Рисунок 2 – Примерное расположение ломанных отвечающих
за анимацию местоположения рабочих и очередей в боксы.
Для реализации статистки можно использовать
столбиковую диаграмму (вкладка «Статистика»), данные для диаграммы (по длине
первой очереди) будут иметь вид: service.seize.queue.statsSize.mean()
Для подсчета машин покинувших станцию
не обслуженными можно использовать три простые переменные (вкладка «Основная»).
Тип переменных double (число с запятой) или int (простое целое), начальное значение 0. Переменным можно
дать свои названия, например: exit1, … При входе в последний объект Sink нужно выполнить проверку на принадлежность машины к тому
или иному типу и в соответствии с этим увеличить значение соответствующей
переменной на единицу. Примерным образом это будет выглядеть так:
if
(entity.getShape() == lorry1) {rectangle3.setFillColor(silver); exit1=exit1+1;}
else
if
(entity.getShape() ==lorry2) {rectangle3.setFillColor(blue); exit2=exit2+1;} else
if (entity.getShape()
==lorry3) {rectangle3.setFillColor(red); exit3=exit3+1;}
Конструкция rectangle3.setFillColor(silver) закрашивает последний
прямоугольник (rectangle3) в
серебряный цвет, который в данном примере соответствует цвету автомобиля
первого типа.
Для
реализации статистики распределения не обслуженных машин лучше всего
использовать круговую диаграмму, источником данных для которой будут служить
простые переменные созданные ранее.
Для
расширения эксперимента следует добавить бегунки для варьирования численностью
рабочих (бегунок нужно связывать с resourcePool.capacity, минимальное значение 1, максимальное 6) и
интенсивности прибытия машин (бегунок нужно связывать с source.rate). Для того, чтобы знать текущее значение интенсивности прибытия машин каждого типа
нужно создать еще три простых переменных (например с именами rate1, …), значения которых в начальный момент должны
ровняться начальному значению интенсивности для каждого объекта Source. Для того, чтобы значение переменных изменялось с
каждым движением бегунка следует в действие бегунка записать конструкцию типа: rate1=source.rate.
Все бегунки должны быть подписаны! (объект text
с панели «Презентация»).
Примерный вид работающей модели приведен на рисунке 3.
Рисунок
3 Работающая модель.
Для
того, чтобы модель не останавливалась необходимо внести соответствующие
корректировки (Simulation, вкладка «Модельное время»).
На
последнем шаге необходимо дать необходимо описание модели на начальной странице
эесперемента.
После
выполнения модели и демонстрации ее работы преподавателю следует:
1.
Одну из ветвей диаграммы процесса видоизменить: заменить объект service
эквивалентной последовательностью объектов (см. справку).
2.
Добавить еще одну столбиковую диаграмму значениями, которой будут
отношения числа машин заданного типа покинувших станцию не обслуженными к числу
машин этого же типа прибывших на станцию.