Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 1 в Anylogic.docx
Скачиваний:
59
Добавлен:
17.09.2019
Размер:
1.29 Mб
Скачать

Лабораторная работа в Anylogic №2. Моделирование работы сто.

Условие задачи:

На автомагистрали проектируется станция технического обслуживания автомобилей индивидуальных владельцев. Требуется определить, какое количество моечных постов необходимо иметь на этой станции, если известно, что станция будет работать 16 ч. в сутки. Маркетинговым отделом компании было проведено исследование, в результате которого установлено среднее количество автомобилей проходящих за час по магистрали и нуждающихся в мойке ( ). Среднее время мойки автомобиля составляет 10 минут. Оплата за мойку одного автомобиля 250 руб. Содержание одного поста в сутки составляет 4000 руб. Если в момент прибытия на станцию автомобиля все моечные посты будут заняты, владелец авто не будет ждать и станция потеряет клиента.

Решение:

Обычно при решении такой задачи рассуждают следующим образом: мойка автомобиля длиться 10 мин, значит за 1 час на одном посту будет обслужено 6 автомобилей. Так как требуется в час обслужить 12 автомобилей, то необходимо иметь на станции поста мойки.

Однако при таком рассуждении совершенно не учитывается случайный характер данного процесса об­служивания. Ведь автомобили могут следовать по ма­гистрали не строго через каждые 5 мин, и время их мойки в зависимости от загрязнения может колебать­ся около 10 мин.

Таким образом, описанный выше пример относится к замкнутому типу систем массового обслуживания с отказом.

Критерием качества функционирования систем такого типа часто принимается вероятность занятости всех аппаратов обслуживания или отказа в обслуживании в момент поступления очередного тре­бования на обслуживание, которая рассчитывается по формуле:

где вероятность занятости всех аппаратов или отказа в обслуживании; п — число обслуживающих аппаратов; т — ко­личество требований на обслуживание. , а так как .

Т.к. коэффициент загрузки системы в нашей задаче равен двум: делаем вывод, что на станции необходимо иметь как минимум два поста мойки.

Вычислим при наличии на станции двух моеч­ных постов:

Таким образом, при наличии двух моечных постов вероятность отказа составляет 0,4, или из 100 прохо­дящих по магистрали автомобилей 40 найдут посты за­нятыми и уедут, а 60 будут- обслужены. Так как за 1 ч по магистрали в среднем проходит 12 автомобилей, а станция будет работать 16 ч в день, общее число об­служенных автомобилей за сутки составит из общего числа проходящих автомобилей за это время, которое равно .Таким обра­зом 77 автомобилей не будут обслужены.

Результаты расчетов вероятности отказа в обслуживании, доходов, расходов и чистой прибыли занесем в таблицу. Видно, что с экономи­ческой точки зрения целесообразно иметь четыре, а не два моечных поста.

N

Доход, тыс.руб

Расход, руб

Прибыль, тыс.руб

2

0,4

28,80

8

20,8

3

0,211

37,89

12

25,89

4

0,095

43,43

16

27,43

5

0,037

46,24

20

26,24

6

0,012

47,42

24

23,42

7

0,003

47,83

28

19,83

Аналитическое решение задачи в среде Mathcad:

Имитационное моделирование СТО в среде Anylogic:

Для закрепления полученного в первой работе материала давайте создадим нашу модель СТО «с нуля».

Создайте новую модель.

Так как модель станции технического обслуживания, как и заправочной станции, представляет собой систему массового обслуживания, для её моделирования мы воспользуемся библиотекой Enterprise Library.

Добавьте на лист презентации объект Source из библиотеки Enterprise Library.

Наша модель СТО является пуассоновской СМО, поэтому прибытие заявок в систему организуем с помощью соответствующего закона.

В свойствах объекта Source задайте интенсивность прибытия как poisson(12), где poisson – встроенная в Anylogic функция вероятности для закона Пуассона; 12 – интенсивность поступления автомобилей (задана в исходных данных).

  • Обратите внимание, что интенсивность поступления автомобилей мы задачи в часах. Т.о. в дальнейшем все временные параметры, такие как время работы станции и время мойки автомобилей также необходимо будет задавать в часах.

В строке «Новая заявка» свойств объекта Source введите:

new EntityStats( time() )

Эта запись позволит нам в дальнейшем собирать статистику по поступлению заявок на обслуживание.

Также измените фигуру анимации заявок на автомобиль как в первой работе.

Не забудьте убрать фигурку автомобиля за окно презентации, чтобы в процессе выполнения модели её не было видно (см. рис 1).

Окончательно свойства объекта Source представлены на рис. 2:

В нашей системе часть поступивших заявок может покидать систему, если все обслуживающие посты будут заняты. Следовательно, сразу после поступления требования на обслуживание, мы должны проверить, есть ли свободные моечные посты или все они в данный момент заняты. Если хотя бы один пост мойки свободен, то автомобиль должен поступить на обслуживание, в противном случае получить отказ и покинуть систему. Для реализации такой проверки добавим новый для нас объект библиотеки Enterprise Library – SelectOutput.

Найдите SelectOutput объект и перенесите его в окно презентации.

Объект SelectOutput имеет один входной канал и два выходных (True – правда и False – ложь).

Выход заявок в один из двух выходных каналов может быть организован двумя способами:

  1. С заданной вероятностью.

  2. При выполнении условия.

Нам подходит второй вариант, т.к. при поступлении на мойку автомобилей мы проверяем, заняты ли все посты обслуживания или нет, т.е. проверяем некоторое условие занятости постов.

Условие запишем следующим образом:

service.delaySize() < N

delaySize() – встроенный метод объекта service (объект, представляющий собой систему обслуживающих постов, который будет введен чуть ниже), возвращающий количество заявок в системе обслуживания. N – количество постов обслуживания.

Дальше наш алгоритм будет реализован следующим образом: если условие выполняется, значит в данный момент заняты обслуживанием не все посты и вновь поступающий на мойку автомобиль может поступить на свободный пост. Если же условие не выполняется, значит, в текущий момент времени заняты все посты и клиент покидает систему, получив отказ в обслуживании.

Окно свойств объекта показано на рис 3.

Для расчетов полученной за день прибыли нам необходимо знать количество автомобилей, обслуженных на станции. Вести учет поступающих на мойку автомобилей можно все в том же объекте SelectOutput. Реализуется учет автомобилей очень просто. Давайте введем переменную, которая отвечала бы за количество поступивших на обслуживание автомобилей.

На палитре Основная найдите объект «Простая переменная» и переместите его на окно презентации.

В свойствах переменной смените имя на Income, задайте начальное значение равное нулю и определите тип переменной как «целое число» int (см. рис 4):

Далее в строчке действие при выходе напишите:

Income++ ;

Теперь как только очередной автомобиль будет поступать на мойку, суммарное их количество увеличится на единицу.

Осталось только соединить объект SelectOutput вместе с генератором заявок Source. Главное окно модели будет выглядеть следующим образом:

Организация обслуживания на станции.

Т.к. на нашей станции технического обслуживания предусматривается несколько моечных постов, наиболее эффективным способ реализации будет использование объекта Service из библиотеки Enterprise Library.

Добавьте объект Service и соедините его с SelectOutput.

Подключите к объекту Service объект ResoursePool все из той же библиотеки EnterpriseLibrary, так как показано на рисунке. Он будет моделировать обслуживающие посты мойки.

После того, как автомобили поступили на мойку и были обслужены, они должны покинуть станцию технического обслуживания. Соответственно нам осталось добавить в модель объект, который нам уже известен, объект Sink.

Добавьте объект Sink в окно презентации и соедините его с объектом Servise (см. рис)

А что же с автомобилями, которые получили отказ в обслуживании по причине занятости всех постов мойки? Получив отказ, они должны покинуть систему. В нашей модели для этого достаточно соединить второй (False) выход объекта SelectOutput с объектом уничтожения заявок Sink.

Окончательно схема модели будет выглядеть следующим образом:

Теперь давайте по очереди изменим свойства добавленных объектов.

Выделите объект Servise и измените в его свойствах время задержки на

exponential( 6 )

Выделите объект resourcePool и в с строчке Количество ресурсов введите N

Т.о. за количество постов в нашей модели будет отвечать параметр N. Чтобы задать его, с палитры Основная выберите Параметр и поместите его рядом с переменной Income.

В свойствах параметра поменяйте имя на N , тип на int (целое число) и установите значение по умолчанию равное двум.

Когда какой либо из параметров модели приходится постоянно менять, неудобно заходить каждый раз в его свойства. Удобнее воспользоваться встроенными в Anylogic Элементами Управления. Давайте создадим для нашего параметра N элемент управления. Выберите на панели Палитра закладку Элементы управления и выберите там элемент Бегунок. Поместите его рядом с параметром N в окне презентации.

В свойствах бегунка задайте привязку к объекту N и укажите минимальное (1) и максимальное (7) значение.

Давайте введем в модель Параметр, отвечающий за стоимость содержания моечных постов. Назовем его EquipmentCost. В свойствах его укажите значение 33 и тип параметра int (целое число).

Аналогично введите еще один параметр, отвечающий за стоимость мойки автомобиля. Назовите его Price. Тип параметра – целое число int, значение по умолчанию 1.

Теперь у нас все готово, для того, чтобы ввести целевую функцию чистого дохода, который мы будем получать от мойки автомобилей за вычетом расходов, связанных с содержанием моечным постов. По максимуму этой функции мы будем искать оптимальное количество постов.

На Палитре Основная выберите объект Функция и переместите его в окно презентации.

В свойствах функции на закладке Основные выберите тип возвращаемого значения int ( наша прибыль измеряется в рублях, без копеек)

На закладке Код введите:

return Income*Price - EquipmentCost* N;

(чистая прибыль будет вычисляться как разница дохода от мойки автомобилей и расходов на содержание моечных постов).

Динамику изменения прибыли во время работы очень удобно наблюдать на графике.

Давайте зададим для нашей функции графическое отображение. Для этого с Палитры Статистика добавьте на презентацию График и Диаграмму с накоплением. В каждом из этих объектов нажмите кнопку Добавить элемент данных и введите в качестве значения нашу функцию: benefit()

Тоже самое проделайте и для графика. По оси Х которого мы будем откладывать время, задаваемое в Anylogic с помощью встроенной функции time ().

Сбор статистики по времени обслуживания

Мы хотим знать, сколько времени проводит клиент на станции технического обслуживания. Мы соберем эту статистику с помощью специальных объектов сбора данных и отобразим собранную статистику распределения времен обслуживания клиентов с помощью гистограмм.

 Создайте Java класс EntityStats

В панели Проект, щелкните правой кнопкой мыши по элементу модели и выберите Создать|Java класс из контекстного меню. 

Появится диалоговое окно Новый Java класс. В поле Имя введите имя нового класса: EntityStats

Сделайте так, что этот класс будет наследоваться от базового класса заявки Entity. Для этого выберите из выпадающего списка Базовый класс полное имя этого класса: com.xj.anylogic.libraries.enterprise.Entity.

Щелкните мышью по кнопке Далее, чтобы перейти к следующей странице Мастера создания Java класса. На второй странице Мастера Вы можете задать параметры создаваемого Java класса. Параметр у нас будет один: ArrivalTime, типа double. Этот параметр будет фиксировать время прибытия заявок на станцию.

Щелкните мышью по кнопке Готово. Вы увидите редактор кода созданного класса. Можете закрыть его, щелкнув мышью по крестику в закладке с его названием. 

Добавьте элементы сбора статистики по времени ожидания. Эти элементы будут запоминать соответствующие значения времен для каждого клиента и предоставят пользователю стандартную статистическую информацию: среднее, минимальное, максимальное из измеренных значений, среднеквадратичное отклонение, доверительный интервал для среднего и т.д.

 Добавьте элементы сбора данных

Чтобы добавить объект сбора данных гистограммы на диаграмму, перетащите элемент Данные гистограммы с палитры Статистика на диаграмму активного класса. 

Задайте свойства элемента.

  • Измените Имя на TimeInSystemHist.

  • Сделайте Кол-во интервалов равным 20.

  • Задайте Начальный размер интервала: 0.01.

Теперь нам нужно изменить свойства блоков нашей диаграммы процесса. 

 Измените свойства блоков диаграммы процесса

  1. Измените свойства объекта sink:

    • Введите EntityStats в поле Класс заявки.

    • Введите TimeInSystemHist.add( time() - entity.ArrivalTime ) в поле Действие при входе. Этот код добавляет полное время пребывания автомобиля в объект сбора данных гистограммы timeInSystemDistr.

Теперь давайте добавим на диаграмму нашего класса гистограммы, которые будут отображать собранную нами временную статистику.

 Добавьте две гистограммы для отображения распределений времен пребывания клиента в системе

  1. Чтобы добавить гистограмму на диаграмму класса активного объекта, перетащите элемент Гистограмма из палитры Статистика в то место графического редактора, куда Вы хотите ее поместить.

  1. Укажите, какой элемент сбора данных хранит данные, которые Вы хотите отображать на гистограмме: щелкните мышью по кнопке Добавить данные и введите в поле Данные имя соответствующего элемента: TimeInSystemHist.

Запустите модель. Включите режим виртуального времени и понаблюдайте за тем, какой вид примет распределение времени ожидания.

Просмотрите статистику с помощью окон инспекта. Открыть окно инспекта можно щелкнув мышью по значку объекта сбора данных. Здесь Вы увидите стандартные для статистического анализа данные, приведенные для значений, собранных в данном объекте сбора статистики (см. рисунок):

Вы могли заметить, что модель выполняется, довольно таки длительное время. Все потому, что мы забыли указать точное время работы станции.

В меню Проект выделите Основной эксперимент Simulation: Main и в свойствах эксперимента на вкладке Модельное время установите время работы станции равное 16 (станция работает 16 часов в сутки). А в качестве единицы модельного времени выберите час.

Создание анимации модели

Нарисуйте в окне ломаную линию Polyline, которая будет анимировать в нашей модели поступающие на станцию автомобили и два прямоугольника, один для анимации находящихся на обслуживании автомобилей, а другой для анимации занятости постов.

Нарисуйте 2 маленьких овала и поместите их рядом в автомобилем за границами области презентации. Один назовите OvalIdle и задайте ему зеленый цвет заливки.

Другой назовите Ovalbusy и задайте ему красный цвет заливки. Первый овал будет у нас в качестве фигуры анимации свободного поста мойки, второй, в качестве занятого поста.

Чтобы удобнее было рисовать овал маленького размера рекомендуется увеличить масштаб отображения.

Изменение фигуры анимации объекта Service

Выделите объект Service . В качестве фигуры анимации задержки (queue) задайте нашу ломаную polyline, а в качестве фигуры анимации задержки выберите прямоугольник rectangle и тип анимации Мешок.

Теперь выделите объект resourcePool

В качестве фигуры анимации введите имя второго прямоугольника (по умолчанию rectangle1 и тип анимации Упорядоченная). В качестве Фигуры анимации свободного ресурса введите ovalIdle, а в качестве Фигуры анимации занятого ресурса введите ovalBusy.

Построение модели закончено. Сохраните и запустите модель. Пронаблюдайте за её работой.