Построение модели банковского отделения
§ Построим простую модель системы обслуживания – филиал банка.
Начнем с клиентов, использующих только банкомат, установленный в офисе.
Сделаем следующие предположения:
Ø Интервал времени между приходом клиентов распределен экспоненциально с интенсивностью прихода 0,67 человек в минуту (пуассоновский поток)
Ø Время обслуживания одного клиента распределено по треугольному закону с параметрами 0,8, 1 и 1,3
Ø В очереди может находиться не больше 15 человек
Начинаем строить модель.
§ Создаем новый проект Файл – Создать
§ Вводим имя проекта Банковское отделение
§ Выбираем вкладку Библиотеки
§ Выбираем библиотеку Enterprise Library
§ Находим объект источника source
§ Перетаскиваем данный объект в поле структурной диаграммы из окна Библиотеки
§ Добавляем таким же образом объекты queue, delay, sink
§ Соединяем объекты, перетаскивая порты один на другой
§ Переименовываем объект delay в ATM (для этого нужно щелкнуть по объекту мышью и ввести новое имя объекта в поле Имя закладки Общие)
§ Теперь можно запустить модель, нажав на кнопку Запустить (F5)
§ Пропишем свойства объектов:
Ø Для объекта source в поле interarrivalTime задаем значение exponential( 0.67 )
Ø Для объекта queue в поле capacity задаем значение 15
Ø Для объекта АТМ в поле delayTime задаем значение triangular( 0.8, 1, 1.3 )
§ Теперь можно переходить к построению анимации для данной модели.
Для объектов библиотеки Enterprise Library предусмотрена анимация. Общая идея построения анимации такова – нужно связывать с объектом блок схем, в котором могут находиться заявки, «направляющею» фигуру на анимации, и задать тип для этой анимации.
§ Для создания анимации выбираем Main – Новая анимация.
Анимировать будем следующие элементы:
Ø Анимирование клиентов, стоящих в очереди и перед банкоматом
Ø Визуализация состояния банкомата (свободен/занят)
Ø Индикатор усредненного размера очереди и среднего коэффициента использования банкомата
Очередь отразим ломаной. Для этого выберем на панели инструментов объект Ломаная и поместим первую точку объекта щелчком мыши на поле анимации. Для добавления промежуточных точек щелкнем мышью в других местах поля анимации. Для добавления последней точки щелкнем двойным щелчком по мыши. В поле Имя вкладки Общие назовем объект polyline.
Состояние банкомата отразим прямоугольником, окрашенным в зеленый цвет при состоянии Свободен, или окрашенным в красный цвет при состоянии Занят. Добавляем на поле анимации объект Прямоугольник и вводим имя rectangle. В поле Цвет заливки вводим ATM.size > 0 ?Color.red : Color.green.
Банкомат и заявки, которые обслуживаются, отразим овалом. Добавляем на поле анимации объект Овал и называем его oval.
Усредненный размер очереди и средний коэффициент использования банкомата отразим столбцовыми индикаторами. Добавим на поле анимации 2 объекта Столбцовый индикатор.
Возвращаемся в поле диаграммы и в свойствах объектов прописываем анимацию:
Объект queue: полю statsEnabled присваиваем значение true (сбор статистики по столбцовым индикаторам); полю animationShape присваиваем значение animation.polyline (очередь будет отражаться ломаной); полю animationForward присваиваем значение false (определяет направление построения клиентов в очереди).
Объект ATM: полю statsEnabled присваиваем значение true (сбор статистики по столбцовым индикаторам); полю animationShape присваиваем значение animation.oval (банкомат и обрабатываемые заявки будут отображаться овалом); полю animationType присваиваем значение single (анимация будет отображаться только одним объектом).
Для столбцовых индикаторов в поле анимации в свойстве Отображает закладки Столбцовый индикатор пропишем отображаемые значение: для одного индикатора значение queue.getStatsSize().mean(), для другого индикатора - ATM.getStatsUtilization().mean() (сбор статистики по усредненному значению очереди и среднему использованию банкомата с возвращением данного значения).
§ Теперь можно запускать модель и анализировать анимацию
Существуют следующие типы анимаций:
Ø Arranged
Ø Queue
Ø Single
Ø Bag
Ø Linear (Movement)
Ø Set
Ø Conveyor
Ø Lane
Ø Robot/RobotPortal
§ Теперь создадим анимацию заявок от клиентов
Подзаявкой в библиотеке понимается:
Ø Классические заявки – продукт, потребитель, пакет данных, документ
Ø Транспортеры – поезд, автобус, корабль, автопогрузчик
Класс Entity является базовым классом для всех сообщений, которые посылаются между объектами библиотеки. Заявки могут содержать в себе другие заявки, могут занимать ресурсы. Заявки расширяются дополнительными полями данных и пользовательскими методами. По умолчанию заявки анимируются прямоугольниками случайно выбранного цвета, но с заявкой можно связать и пользовательскую анимацию.
Базовый класс Entity – функции и переменные:
Ø Переменные – int priority (приоритет заявки; используется объектами queue; чем больше значение, тем выше приоритет); vector contents (содержимое заявки; другие заявки, содержащиеся в этой заявке); vector resources (ресурсы, которыми владеет данная заявка)
Ø Цвет для анимации по умолчанию – setColor ( Color c ) (устанавливает цвет с); Color getColor (возвращает текущий цвет)
§ Создадим подкласс класса Entity
Во вкладке Проект в модели Main создадим новый класс сообщения, выбрав элемент Новый класс сообщения на панели инструментов, и назовем его Customer. Этот класс должен наследовать свойства базового класса Entity, поэтому в свойствах объекта во вкладке Общие укажем значение поля Базовый класс равное Entity. Можем также определить необходимые поля у объекта. Чтобы получить из объекта доступ к данному классу, нужно привести заявку к ее типу Customer, поэтому в свойствах объекта source в поле newEntity вкладки Общие указываем значение Customer.class.
§ Создадим анимацию заявок
На поле анимации нарисуем схематично клиента, поступающего с заявкой. Клиент может быть нарисован из линий и овалов. С помощью объекта Группа фигур объединяем все нарисованные элементы в один элемент. Устанавливаем флажок Шаблон на вкладке Общие окна свойств элемента и задаем имя ShapeCustomer. В поле Проект двойным щелчком мыши выбираем свойства подкласса Customer и задаем описание поля Код конструктора:
Ø shape.setup();
Ø setAnimation( shape );
Ø enableRotation (false);
Также задаем описание поля Дополнительный код класса:
Ø Main._Group.ShapeCustomer shape = ((Main)Engine.getRoot()).animation.new ShapeCustomer();
§ Теперь можем снова запустить модель и проанализировать анимацию
§ Преобразуем данную модель в модель с классическими ресурсами
Под ресурсами в библиотеке понимаются операторы, станки, критические секции, автомобили. Ресурсы – это объекты базового класса Entity или созданного подкласса этого класса. Ресурсы расширяются дополнительными полями данных и пользовательскими методами. Ресурсы по умолчанию анимируются прямоугольниками случайно выбранного цвета, но для ресурсов можно создать и пользовательскую анимацию.
Добавим в модель ресурсы – банковских служащих. Разделим клиентов на обычных и VIP-клиентов. Обычные клиенты будут продвигаться по уже описанному пути – к банкомату. VIP-клиенты будут переходить к кассирам на VIP-обслуживание. К кассирам и банкомату приходит примерно равное число клиентов (вероятности выбора одинаковы).
Сделаем следующие предположения:
Ø Время обслуживания одного VIP-клиента распределено по треугольному закону с параметрами 2,5, 6 и 11
Ø В офисе работает 4 кассира
Ø В очереди к кассирам может находиться не больше 20 человек
Для этого вводим в модель 3 дополнительных объекта: selectOutput, processQ, resource.
Объект processQ переименовываем в service. Укажем в поле delayTime вкладки Общие объекта service значение triangular(2.5,6,11). Размер очереди в поле queueCapacity вкладки Общие объекта service укажем равным 20.
Для объекта resource устанавливаем значение capacity равное 4 и соединяем данный объект с объектом service.
Выходы добавленного объекта selectOutput соединяем с входом очереди перед банкоматом и входом объекта service.
§ Запускаем данную модель и анализируем ее работу
§ Для данной модели можно также увеличить анимацию, отображая свободных и занятых кассиров разными рисунками и добавляя ползунок для изменения числа кассиров. Анимация в данном случае строится по аналогии с построением анимации, описанным выше.