close

Вход

Забыли?

вход по аккаунту

?

ЛРNo.3 (2)

код для вставкиСкачать
Лабораторная работа №3
Дискретно-событийные модели.
Цель работы: 1. Общие сведения
Дискретно-событийный подход применяется для моделирования систем массового обслуживания.
СМО содержит элементы определяющие структуру модели:
* устройства обслуживания
* очереди
* маршрутизаторы
* генераторы заявок * динамические объекты - заявки (транзакции)
2. Ход работы
В банковском отделении находятся банкомат и стойки банковских кассиров, что позволяет быстро и эффективно обслуживать посетителей банка. Операции с наличностью клиенты банка производят с помощью банкомата, а более сложные операции, такие как оплата счетов - с помощью кассиров. 2.1 Модель отделения банка.
1. Щелкните мышью по кнопке панели инструментов Создать . Появится диалоговое окно Новая модель.
Задайте имя новой модели. В поле Имя модели введите Bank Office.
Щелкните мышью по кнопке Далее. Откроется вторая страница Мастера создания модели.
Здесь Вам будет предложено выбрать шаблон модели, на базе которого Вы будете разрабатывать Вашу модель. Поскольку мы хотим создать новую дискретно-событийную модель, установите флажок Использовать шаблон модели и выберите Дискретно-событийное моделирование в расположенном ниже списке. Щелкните мышью по кнопке Далее. На следующей странице Мастера Вам будет предложено выбрать, хотите ли Вы сразу же добавить в создаваемую модель ресурсы, график, отображающий длину очереди к сервису, анимацию обслуживающихся и ожидающих обслуживания или гистограмму, отображающую распределение времени пребывания людей в моделируемой системе. Оставьте все как есть и закончите создание модели, щелкнув мышью по кнопке Готово.
2. Если Вы обратите внимание на диаграмму класса Main, то Вы увидите, что диаграмма нашего простейшего процесса была автоматически создана Мастером создания модели, поскольку такая модель является ничем иным, как простейшей системой массового обслуживания, наиболее часто используемой в качестве отправной точки создания процессно-ориентированных моделей и выбранной поэтому в качестве базового шаблона при разработке процессно-ориентированных моделей. В нашем случае объект создает заявки через заданный временной интервал. Давайте немного изменим интенсивность прихода клиентов в наше банковское отделение. Для этого введите в поле Интенсивность прибытия 0.67. 3. Следующий объект - Queue. Он моделирует очередь заявок, ожидающих приема объектами, следующими за данным в диаграмме процесса. В нашем случае он будет моделировать очередь клиентов, ждущих освобождения банкомата. Задайте максимальную длину очереди. Введите в поле Вместимость 15. В очереди будут находиться не более 15 человек. Установите флажок Включить сбор статистики, чтобы включить сбор статистики для этого объекта. В этом случае по ходу моделирования будет собираться статистика по количеству человек в очереди. Если же Вы не установите этот флажок, то данная функциональность будет недоступна, поскольку по умолчанию она отключена для повышения скорости выполнения модели. 4. Следующим в нашей диаграмме процесса следует объект Delay. Он задерживает заявки на заданный период времени, представляя в нашей модели банкомат, у которого посетитель банковского отделения тратит свое время на проведение необходимой ему операции. Обслуживание одного клиента занимает примерно 1 минуту. Задайте время обслуживания, распределенное по треугольному закону со средним значением, равным 1, минимальным - равным 0.8 и максимальным - 1.3 минутам - введите в поле Время задержки triangular(0.8, 1, 1.3)
Функция triangular() является стандартной функцией генератора случайных чисел AnyLogic. AnyLogic предоставляет функции и других случайных распределений, таких как нормальное, равномерное, треугольное, и т.д. Установите флажок Включить сбор статистики. Последним в диаграмме нашего процесса следует объект Sink. Этот объект уничтожает поступившие заявки. Обычно он используется в качестве конечной точки потока заявок (и диаграммы процесса соответственно). 5. Вначале откройте закладку Презентация панели Палитра. Перетащите элемент Овал из палитры Презентация на диаграмму класса активного объекта. Поместите его, как показано на рисунке ниже: Давайте сделаем так, что цвет этого кружка будет меняться в зависимости от того, обслуживает ли банкомат в данный момент времени клиента или нет. Для этого выделите нарисованную нами фигуру на диаграмме и перейдите на страницу Динамические панели свойств. Здесь Вы увидите список полей, в которых задаются значения динамических свойств фигуры. Если Вам нужно, чтобы по ходу моделирования то или иное свойство фигуры меняло свое значение в зависимости от каких-то условий, то Вы можете ввести в поле соответствующего динамического свойства выражение, которое будет постоянно вычисляться заново при выполнении модели, и возвращаемый результат этого вычисления будет присваиваться текущему значению этого свойства. Мы с Вами хотим, чтобы во время моделирования менялся цвет нашей фигуры - поэтому перейдите в поле Цвет заливки и введите там следующую строку: delay.size() > 0 ? red : white 6. Нарисуйте ломаную, как показано на рисунке ниже. Чтобы нарисовать ломаную, сделайте двойной щелчок мышью по элементу Ломаная в палитре. Очень важно, какую точку ломаной Вы создаете первой. Заявки будут располагаться вдоль нарисованной Вами ломаной в направлении от конечной к начальной. Поэтому начните рисование ломаной слева и поместите рядом с банкоматом конечную точку ломаной, которая будет соответствовать в этом случае началу очереди. 7. Теперь мы должны задать созданные анимационные объекты в качестве анимационных фигур блоков диаграммы нашего процесса. На странице свойств объекта queue, введите polyline в поле Фигура анимации.
Введите в поле Фигура анимации имя нашего овала: oval. Выберите из выпадающего списка Тип анимации Одиночная. В нашем случае, если банкомат будет занят, то мы будем показывать в фигуре банкомата обслуживающегося в нем клиента, а поскольку единовременно наш банкомат не обслуживает больше одного клиента, то мы и выбираем тип анимации Одиночная. 8. По умолчанию заявки (то есть, наши посетители банковского отделения) будут отображаться на анимации маленькими прямоугольниками различных цветов. Чтобы анимация выглядела более наглядно, давайте зададим в качестве фигуры анимации клиента фигурку человека. Откройте палитру Картинки. Эта палитра содержит набор картинок, которые наиболее часто используются пользователями AnyLogic при создании моделей. Перетащите элемент Человек из палитры на диаграмму графического редактора: 9. Теперь нам нужно сообщить объекту source, чтобы он использовал добавленную нами фигурку в качестве фигуры анимации заявки (то есть, клиента банка).Выделите объект source в графическом редакторе. В полк Фигура анимации заявки введите имя нашей фигурки человека: person.
10. Откройте палитру Статистика. Эта палитра содержит элементы сбора данных и статистики, а также диаграммы для визуализации данных и результатов моделирования. Перетащите элемент Столбиковая диаграмма из палитры Статистика на диаграмму класса и измените ее размер, как показано на рисунке ниже: Перейдите на страницу Основные панели Свойства. Щелкните мышью по кнопке Добавить элемент данных. При этом появится секция свойств того элемента данных, который будет отображаться на этой диаграмме. Измените Заголовок на ATM utilization.
Введите delay.statsUtilization.mean() в поле Значение. Здесь delay - это имя нашего объекта Delay. У каждого объекта Delay есть встроенный набор данных statsUtilization, занимающийся сбором статистики использования этого объекта. Функция mean() возвращает среднее из всех измеренных этим набором данных значений. Вы можете использовать и другие методы сбора статистики, такие, как min() или max(). Перейдите на страницу Внешний вид панели Свойства. Выберите первую опцию из набора кнопок Расположение, чтобы изменить расположение легенды относительно диаграммы (мы хотим, чтобы она отображалась справа). 11. Аналогичным образом добавьте еще одну столбиковую диаграмму. Измените ее размер так, как показано на рисунке: Перейдите на страницу Внешний вид панели Свойства и выберите первую опцию в секции свойств Направление, чтобы столбцы столбиковой диаграммы росли влево. 12. Добавьте элемент данных, который будет отображаться на диаграмме. Задайте Заголовок: Queue length и задайте Значение:queue.statsSize.mean().
13. Добавьте объект Service. Этот объект захватывает для заявки заданное количество ресурсов, задерживает заявку, а затем освобождает захваченные ею ресурсы. В нашей модели этот обхект будет моделировать обслуживание клиента кассиром (или каким-то другим служащим банковского отделения). Чтобы добавить объект библиотеки Enterprise Library на диаграмму класса активного объекта, вначале откройте одноименную палитру этой библиотеки (Enterprise Library), а затем перетащите нужный Вам объект из палитры в то место диаграммы, куда Вы хотите его поместить. Измените свойства объекта: Ко всем кассирам будет вести одна общая очередь. Задайте максимальное количество человек в этой очереди в поле Вместимость очереди: 20. Мы полагаем, что время обслуживания имеет треугольное распределение с минимальным значением равным 2.5, средним - 6, и максимальным - 11 минутам. Введите в поле Время задержки: triangular( 2.5, 6, 11 )
14. Добавьте объект ResourcePool. Объект ResourcePool задает ресурсы определенного типа (в нашей модели это будут банковские клерки). Назовите объект tellers. Задайте число кассиров в поле Количество ресурсов: 4
Удалите соедиинитель между объектами Source и Queue и добавьте на его место объект SelectOutput. Объект SelectOutput является блоком принятия решения. В зависимости от заданного Вами условия, заявка, поступившая в объект, будет поступать на один из двух выходных портов объекта.
Оставьте все свойства объекта без изменений. Пусть Выход true выбирается С заданной вероятностью, а Вероятность [0..1] равна 0.5. В этом случае к кассирам и банкомату будет приходить примерно равное количество клиентов. Соедините блоки диаграммы процесса, как показано на рисунке:
Вы можете заметить, что большинство установленных нами соединений - это соединения порта, расположенного на правой стороне объекта с портом, расположенного на левой стороне следующего за ним объекта. Это связано с тем, что в диаграмме процесса выходные порты объектов соединяются со входными, а обычно входные порты располагаются на левой границе библиотечного объекта, а выходные - на правой. Исключение в нашем случае пока будет только одно - мы соединяем нижний порт объекта service с верхним портом объекта tellers - именно так должны подсоединяться объекты, задающие ресурсы, к объектам, моделирующим занятие и освобождение этих ресурсов.
Поскольку наша модель изменилась, мы должны изменить и ее анимацию.
15. Нарисуйте ломаную, которая будет отображать очередь клиентов, ожидающих обслуживания кассирами. Рисуйте ее, как и раньше, слева направо. Назовите ломаную queueBeforeTellers.
Справа от этой ломаной нарисуйте еще одну, из четырех точек, чтобы указать на анимации места, в которых будут находиться банковские служащие. Назовите эту ломаную tellerPlaces.
Теперь мы нарисуем на презентации кассиров. Мы будем отображать их одной из двух картинок - одна будет показывать занятого кассира, а другая - свободного. 16. Перетащите элемент Изображение из палитры Презентация в место диаграммы, показанное на рисунке синим прямоугольником:
Перейдите в панель Свойства. Введите в поле Имя новое имя этого изображения: busyTeller.
Выберите файл изображения, которое будет отображать данная фигура. Щелкните мышью по кнопке Добавить и выберите файл busy.png. Вы можете найти этот файл в каталоге <каталог AnyLogic>\resources\tutorials\Bank Office. Когда Вы выберете файл, Вы увидите его в области предпросмотра в панели Свойства.
Чтобы сохранить исходный размер изображения, установите флажок Исходный размер (в этом случае Вы не сможете изменить размер изображения, и оно будет отображаться в оригинальном масштабе, без искажений.
Аналогично создайте еще одно изображение, показывающее отдыхающего клерка. Назовите фигуру idleTeller и выберите в качестве отображаемого файла idle.png (из того же каталога, что и чуть ранее).
Теперь нам нужно изменить анимационные свойства блоков нашей диаграммы процесса, задав нарисованные нами фигуры в качестве соответствующих фигур анимаций объектов.
17. Задайте нарисованную нами ломаную queueBeforeTellers в качестве фигуры анимации очереди объекта service. Для этого измените свойства этого объекта следующим образом: Введите queueBeforeTellers (имя ломаной, задающей форму очереди, ведущей к кассирам) в поле Фигура анимации (queue) Чтобы наши клерки отображались на анимации с помощью добавленных нами картинок, задайте следующие свойства объекта tellers:
В поле Фигура анимации введите имя ломаной, задающей местоположение кассиров на презентации: tellerPlaces Выберите Набор из выпадающего списка Тип анимации В поле Фигура анимации свободного ресурса введите имя изображения свободного клерка: idleTeller В поле Фигура анимации занятого ресурса введите busyTeller
В текущей модели количество клерков, присутствующих в банковском отделении, не изменяется и всегда равно заданному значению. Давайте сделаем так, чтобы у нас была возможность динамически изменять их количество во время моделирования. Такую задачу можно решить с помощью элементов управления AnyLogic.
Добавьте на презентацию специальный элемент управления - бегунок, часто используемый для изменения значения численной переменной или параметра. В нашем случае мы будем изменять с его помощью количество клерков в нашей модели, проверяя, какое количество будет оптимально удовлетворять текущей интенсивности прихода клиентов в банковское отделение. 18. Элементы управления добавляются на диаграмму так же, как и фигуры презентации. Откройте палитру Элементы управления и перетащите элемент Бегунок из палитры на диаграмму класса Main. Поместите бегунок под объектом ResourcePool, чтобы было понятно, что с помощью этого бегунка будет меняться количество ресурсов, задаваемых именно этим объектом. Мы хотим дать возможность пользователю варьировать количество клерков от 0 до 4. Поэтому введите 4 в поле Максимальное значение. Введите tellers.capacity в поле Переменная. Вы можете изменять количество клерков с помощью бегунка. Теперь, изменяя количество кассиров во время работы модели, Вы можете сделать вывод о том, сколько служащих необходимо для нормальной работы банковского отделения при заданной интенсивности прихода клиентов.
Мы хотим знать, сколько времени клиент проводит в банковском отделении и сколько времени он теряет, ожидая своей очереди. Мы соберем эту статистику с помощью специальных объектов сбора данных и отобразим собранную статистику распределения времен обслуживания клиентов с помощью гистограмм.
Теперь мы создадим Java класс Customer. Экземпляры этого класса будут испольоваться в нашей модели в качестве заявок и будут представлять клиентов банковского отделения. Мы создадим в этом классе специальные поля для запоминания необходимой нам информации о проведенном клиентом времени.
19. В панели Проекты, щелкните правой кнопкой мыши по элементу модели и выберите Создать|Java класс из контекстного меню. Появится диалоговое окно Новый Java класс. В поле Имя введите имя нового класса: Customer. Сделайте так, что этот класс будет наследоваться от базового класса заявки Entity. Для этого выберите из выпадающего списка Базовый класс полное имя этого класса: com.xj.anylogic.libraries.enterprise.Entity. Щелкните мышью по кнопке Далее, чтобы перейти к следующей странице Мастера создания Java класса. На второй странице Мастера Вы можете задать параметры создаваемого Java класса. Создайте два параметра:
enteredSystem типа double для сохранения момента времени, когда клиент пришел в банковское отделение, startWaiting типа double для сохранения момента времени, когда клиент встал в очередь к банкомату. Щелкните мышью по кнопке Готово. Вы увидите редактор кода созданного класса. Можете закрыть его, щелкнув мышью по крестику в закладке с его названием. 20. Чтобы добавить объект сбора данных гистограммы на диаграмму, перетащите элемент Данные гистограммы с палитры Статистика на диаграмму активного класса. Задайте свойства элемента.
Измените Имя на waitTimeDistr. Измените Заголовок на Waiting time distribution. Сделайте Кол-во интервалов равным 50. Задайте Начальный размер интервала: 0.01. Создайте еще один элемент сбора данных гистограммы. Ctrl+перетащите только что созданный объект данных гистограммы, чтобы создать его копию. Измените Имя этого элемента на timeInSystemDistr, а Заголовок на Time in system distribution. 21. Измените свойства объекта source:
Введите new Customer() в поле Новая заявка. Теперь этот объект будет создавать заявки нашего типа Customer. Введите Customer в поле Класс заявки. Это позволит напрямую обращаться к полям класса заявки Customer в коде динамических параметров этого объекта.
Введите entity.enteredSystem = time(); в поле Действие при выходе. Этот код будет сохранять время создания заявки-клиента в переменной enteredSystem нашего класса заявки Customer. Функция time() возвращает текущее значение модельного времени.
22. Измените свойства объекта queue: Введите Customer в поле Класс заявки. Введите entity.startWaiting = time(); в поле Действие при входе. Этот код запоминает время начала ожидания клиентом его очереди на обслуживание в переменной startWaiting нашего класса заявки Customer. Введите waitTimeDistr.add(time() - entity.startWaiting); в поле Действие при выходе. Этот код добавляет время, в течение которого клиент ожидал обслуживания, в объект сбора данных waitTimeDistr.
23. Измените свойства объекта sink:
Введите Customer в поле Класс заявки. Введите timeInSystemDistr.add(time()-entity.enteredSystem); в поле Действие при входе. Этот код добавляет полное время пребывания клиента в банковском отделении в объект сбора данных гистограммы timeInSystemDistr. Запустите модель и просмотрите статистику с помощью окон инспекта. Открыть окно инспекта можно щелкнув мышью по значку объекта сбора данных. Здесь Вы увидите стандартные для статистического анализа данные, приведенные для значений, собранных в данном объекте сбора статистики (см. рисунок): 24. Чтобы добавить гистограмму на диаграмму класса активного объекта, перетащите элемент Гистограмма из палитры Статистика в то место графического редактора, куда Вы хотите ее поместить. Укажите, какой элемент сбора данных хранит данные, которые Вы хотите отображать на гистограмме: щелкните мышью по кнопке Добавить данные и введите в поле Данные имя соответствующего элемента: waitTimeDistr. Добавьте еще одну гистограмму и расположите ее под ранее добавленной. В поле Данные введите имя элемента, хранящего данные, которые будут отображаться на гистограмме: timeInSystemDistr. Измените Заголовок отображаемых данных на Распр. времени пребывания в системе. Запустите модель. Включите режим виртуального времени и понаблюдайте за тем, какой вид примет распределение времен ожидания и пребывания клиента в системе.
Документ
Категория
Рефераты
Просмотров
85
Размер файла
874 Кб
Теги
лрno
1/--страниц
Пожаловаться на содержимое документа