Здравствуйте, прошел курс "Концептуальное проектирование систем в AnyLogic и GPSS World". Можно ли получить по нему сертификат? У нас в институте требуют сертификаты для создания портфолио. |
Модель функционирования терминала
Событийная часть модели
Объекты событийной части модели показаны на рис. 7.3.
Для построения использованы следующие двадцать объектов библиотеки Enterprise Library (в скобках после имени каждого объекта указано их количество в событийной части модели):
- source (один);
- queue (восемь);
- delay (восемь);
- split (один);
- match (один);
- sink (один).
Создадим событийную часть модели. Для неё мы уже создали область присмотра с именем Модель_Терминал и перетащили элемент Прямоугольник, в котором и разместим все элементы.
- Перетащите объект source. Установите его свойства согласно табл. 7.2.
- Создайте нестандартный класс заявки Car с полями:
int id; double vxod;
Дополнительное поле id нестандартного класса заявки Car введено для проверки объектом match условия объединения двух заявок в одну.
Поле vxod предназначено для записи времени входа заявки в модель. И в последующем для вычисления времени обработки заявки, хотя можно было бы обойтись и без этого поля, а использовать объект TimeMeasureStart вместе с TimeMeasureEnd для определения того же времени.
Перетащите остальные объекты, соедините так, как показано на рис. 7.3. Последовательно выделяя эти объекты, установите их свойства согласно табл. 7.3.
Имя | Свойства | Значения |
---|---|---|
поток_транспорта | Отображать имя | Установите флажок |
Класс заявки | Car | |
Заявки прибывают согласно | Времени между прибытиями | |
Время между прибытиями | exponential(1/timeA) | |
Количество заявок, прибывающих за один раз | 1 | |
Новая заявка | new Car() | |
Действие при выходе | entity.id = | |
поток_транспорта.count(); | ||
entity.vxod = time(); |
Свойства | Значение |
---|---|
Имя | очередь_на_D_ |
Отображать имя | Установить флажок |
Класс заявки | Car |
Максимальная вместимость | Установить флажок |
Включить сбор статистики | Установить флажок |
Имя | парковка_D_ |
Отображать имя | Установить флажок |
Класс заявки | Car |
Задержка задается | Явно |
Время задержки | exponential(1/timeD) |
Вместимость | D_ |
Включить сбор статистики | Установить флажок |
Имя | очередь_в_офис_E_ |
Отображать имя | Установить флажок |
Класс заявки | Car |
Вместимость | 10 |
Действие при подходе к выходу | if (очередь_E < |
очередь_в_офис_E_.size()) | |
очередь_E = | |
очередь_в_офис_E_.size(); | |
Включить сбор статистики | Установить флажок |
Имя | оформл_докум_в_офисе_Е_ |
Отображать имя | Установить флажок |
Класс заявки | Car |
Задержка задается | Явно |
Время задержки | exponential(1/timeE) |
Вместимость | E_ |
Имя | отправка_заявки_в_Z |
Отображать имя | Установить флажок |
Класс заявки | Car |
Количество копий | 1 |
Новая заявка (копия) | new Car |
Действие при выходе копии | entity.id = original.id; |
entity.vxod = original.vxod; | |
Имя | очередь_в_зону_Z_ |
Отображать имя | Установить флажок |
Класс заявки | Car |
Вместимость | 100 |
Действие при подходе к выходу | if (очередь_Z < очередь_в_зону_Z_.size()) |
очередь_Z = | |
очередь_в_зону_Z_.size(); | |
Включить сбор статистики | Установить флажок |
Имя | выполн_заявки_в_зоне_Z_ |
Отображать имя | Установить флажок |
Класс заявки | Car |
Задержка задается | Явно |
Время задержки | exponential(1/timeZ) |
Вместимость | ZP_ |
Включить сбор статистики | Установить флажок |
Имя | фиксация_выполн_заявки_в_Z_ |
Отображать имя | Установить флажок |
Класс заявки | Car |
Условие соответствия | entity1.id == entity2.id |
Вместимость 1 | 100 |
Вместимость 2 | 100 |
Действие при выходе 1 | entity.id = 0; |
Действие при выходе 2 | if (очередь_I < фиксация_выполн_заявки_в_Z_.size2()) |
очередь_I = фиксация_выполн_заявки_в_Z_.size2(); | |
Время задержки | exponential(1/timeIJ) |
Вместимость | 10 |
Включить сбор статистики | Установить флажок |
Имя | очередь_на_ворот_J_ |
Отображать имя | Установить флажок |
Класс заявки | Car |
Вместимость | 10 |
Действие при подходе к выходу | if (очередь_J < очередь_на_ворот_J_.size()) |
очередь_J = очередь_на_ворот_J_.size(); | |
Включить сбор статистики | Установить флажок |
Имя | осмотр_на_ворот_J_ |
Отображать имя | Установить флажок |
Класс заявки | Car |
Задержка задается | Явно |
Время задержки | exponential(1/timeJ) |
Вместимость | J_ |
Поясним необходимость и целесообразность применения некоторых объектов. В модели заявка имитирует транспорт. Объект split предназначен для расщепления одной заявки в нашей модели на две заявки. Одна поступает, как документ, в зону Z, а вторая, как транспорт, продолжает движение. Когда в зоне Z необходимые для обработки транспорта действия выполнены (подготовлены документы), объект match фиксирует этот момент, то есть синхронизирует дальнейшее движение транспорта. Вторая заявка направляется в объект sink и уничтожается. Как известно, объединить две заявки в одну (а значит не использовать объект sink) можно с помощью объекта combine. Однако в нашем случае combine использовать нельзя, так как он не проверяет выполнение у заявок условий, необходимых для их уничтожения. Поэтому могут быть объединены различные заявки. Объект match проверяет условия объединения, установленные в нашем случае разработчиком модели в дополнительном поле id нестандартного класса заявки Car (entity1.id == entity2.id), именно двух заявок в одну. То есть синхронизации движения заявки как документа и заявки как автомобиля при применения объекта combine не обеспечивается.
В табл. 7.4 указаны свойства объекта sink.
Свойства | Значение |
---|---|
Имя | выход_J |
Отображать имя | Установить флажок |
Класс заявки | |
Действие при входе | Car |
if (entity.id != 0){ | |
kolJ ++ ; | |
KolObrCar = kolJ/10000; | |
KoefIsp = kolJ/поток_транспорта.count(); | |
TimeSum += (time() - entity.vxod); | |
TimeObr = TimeSum / kolJ; | |
KoefIsp_E = оформл_докум_в_офисе_E_.statsUtilization.mean(); | |
KoefIsp_F = досмотр_у_ворот_F_.statsUtilization.mean(); | |
KoefIsp_Z = выполн_заявки_в_зоне_Z_.statsUtilization.mean(); | |
KoefIsp_I = обслуж_в_зоне_I_.statsUtilization.mean(); | |
KoefIsp_J = осмотр_на_ворот_J_.statsUtilization.mean();} |
Остановимся на коде свойства Действие при входе. Заявки с выхода 1 объекта match можно было бы не направлять на этот объект sink, а добавить еще объект sink и уничтожать их там. Но у нас ознакомительная версия, которая не позволяет иметь в модели на диаграмме одного класса больше двадцати объектов (в образовательной версии это возможно). Нам не хватило ровно одного объекта, поэтому пришлось поступить так (размещать объекты на разных диаграммах ради этого мы посчитали нецелесообразным). Для реализации такого приема на выходе 1 объекта match entity.id = 0, то есть поле id обнуляется и все заявки с таким полем игнорируются. Но в количестве заявок, вошедших в объект sink, они учитываются. Поэтому пришлось для счета количества обработанных транспортов ввести переменную kolJ, хотя имеется стандартная функция count(), которая возвращает количество заявок, вошедших в данный объект. Любых заявок, без какого-либо их разделения.
Результаты моделирования
Результаты проведенных нами на построенных моделях экспериментов сведены в табл. 7.5. В этот раз мы выполнили по одному эксперименту на каждой модели. В GPSS-модели начальные числа генераторов случайных чисел устанавливали произвольно, а в AnyLoic-модели установили число 1876. В GPSS World выполнили 10 000 прогонов, а в AnyLogic увеличили время моделирования в 10 000 раз, то есть моделировали в течение 4 800 000 мин.
Показатели | Системы моделирования | |
---|---|---|
GPSS World | AnyLogic | |
KolObrCar | 53,31 | 53,41 |
TimeObr | 35,485 | 36,109 |
KoefIsp | 1 | 1 |
KoefIsp_E | 0,222 | 0,222 |
KoefIsp_F | 0,044 | 0,044 |
KoefIsp_Z | 0,556 | 0,556 |
KoefIsp_I | 0,079 | 0,08 |
KoefIsp_J | 0,032 | 0,032 |
очередь_E | 5 | 5 |
очередь_F | 1 | 1 |
очередь_Z | 21 | 20 |
очередь_I | 22 | 22 |
очередь_J | 1 | 1 |
Машинное время | 25 мин 34 с | 25 c |
Как видно, результаты моделирования идентичны. Кроме машинного времени, которое в GPSS World составляет 25 мин 34 с, то есть примерно в 65 раз больше, чем в AnyLogic. Различие в количестве обработанных в течение 8 часов автомобилей (KolObrCar) и среднего времени обработки одного автомобиля (TimeObr) незначительно. Коэффициенты использования элементов терминала и максимальные длины очередей к ним одинаковые.