Общий вид терминала показан на рис. 7.1. Территория терминала обозначена A, примыкающая городская территория - B.
(рис 7.1) Схема терминала
Когда со стороны терминала готово транспортное средство для его погрузки-разгрузки (заявка на обслуживание автомобиля выполнена), и имеется свободная ячейка для обработки автомобиля в зоне H, автомобиль подъезжает к свободной ячейке для погрузки. Среднее время движения 2 мин. Если заявка была выполнена до приезда автомобиля и имеется свободная ячейка, автомобиль может прямо подъехать к ячейке, минуя парковку 6. Среднее время обслуживания автомобиля 5 мин.
Необходимо разработать имитационную модель и промоделировать функционирование терминала в течение 8 ч.
Определить:
В модели автомобили следует представить транзактами. Все остальные элементы терминала (парковку D, офис Е, полосы у ворот F и J, места у зон I и Z) - многоканальными устройствами (МКУ). Дадим МКУ имена согласно постановке задачи, добавив знак подчеркивания, например, D_.
Введем масштабирование: 1 единица модельного времени соответствует 1 мин, то есть, например, время моделирования равно 8*60 = 480 единиц модельного времени.
В постановке задачи на разработку модели указаны средние значения времени поступления автомобилей и их обработки. Примем, что интервалы времени во всех случаях распределены по экспоненциальному закону.
Декомпозиция терминала и состав сегментов модели определяются разработчиком. Введем следующие сегменты:
Как видно, в данном случае можно обойтись без разделения событийной части модели на сегменты.
Ниже приводится программа модели.
; Модель функционирования терминала ; Многоканальные устройства D_ Storage 10 ;Имитирующее парковку D E_ Storage 5 ;Имитирующее офис Е F_ Storage 5 ;Имитирующее полосы ворот F I_ Storage 7 ;Имитирующее места у зоны I ZP_ Storage 2 ;Имитирующее места в зоне Z J_ Storage 7 ;Имитирующее ворота J ; Исходные данные timeA EQU 9 ;Среднее время приезда транспорта timeD EQU 2 ;Среднее время парковки на D timeE EQU 10 ;Среднее время оформления документов в офисе Е timeF EQU 2 ;Среднее время досмотра на воротах F timeFH EQU 2 ;Среднее время движения от F к Н timeZ EQU 10 ;Среднее время выполнения заказа на обслуживание автомобиля timeI EQU 5 ;Среднее время обслуживания автомобиля в зоне I timeIJ EQU 2 ;Среднее время движения от I к J timeJ EQU 2 ;Среднее время досмотра на воротах J timeMod EQU 480 ;Время моделирования ; Статистические таблицы C_ QTABLE C_,1,1,50 E_ QTABLE E_,1,1,30 ZP_ QTABLE ZP_,1,1,40 TMeanP TABLE M1,40,1,80 ; Событийная часть модели GENERATE (Exponential(371,0,timeA));Имитация прибытия автотранспорта KolPrib QUEUE C_ ;Занять очередь на парковку D ENTER D_ ;Занять одно место на парковкеD DEPART C_ ;Покинуть очередь на парковку ADVANCE (Exponential(83,0,timeD));Имитация парковки на D QUEUE E_ ;Встать в очередь в офис Е ENTER E_ ;Занять окошко в офисе Е DEPART E_ ;Покинуть очередь в офис Е ADVANCE (Exponential(113,0,timeE)) ;Имитация оформления документов в офисе Е LEAVE E_ ;Покинуть офис Е SPLIT 1,,1 ;Расщепление для отправки заявки TEST E P1,1,Met1 ;Автотранспорт к воротам F, заявка в Z QUEUE ZP_ ;Занять очередь в зону Z ENTER ZP_ ;Занять место обслуживания заявки в зоне Z DEPART ZP_ ;Покинуь очередь в зону Z ADVANCE (Exponential(213,0,timeZ));Имитация выполнения заявки в зоне Z LEAVE ZP_ ;Освободить место обслуживания заявки в зоне Z TRANSFER ,Met2 Met1 QUEUE F_ ;Встать в очередь к воротам F ENTER F_ ;Занять полосу у ворот F DEPART F_ ;Покинуть очередь к воротам F LEAVE D_ ;Освободить место на парковке ADVANCE (Exponential(183,0,timeF));Имитация досмотра у ворот F LEAVE F_ ;Освободить полосу у ворот F ADVANCE (Exponential(163,0,timeFH));Имитация движения от F к H Met2 ASSEMBLE *1 ;Фиксация - выполнение заявки ENTER I_ ;Занять ячейку I ADVANCE (Exponential(315,0,timeI)) ;Имитация обслуживания в зоне I LEAVE I_ ;Освободить ячейку I ADVANCE (Exponential(511,0,timeIJ));Имитация движения от I к J ENTER J_ ;Занять место на воротах J ADVANCE (Exponential(703,0,timeJ)) ;Имитация осмотра на воротах J LEAVE J_ ;Освободить место на воротах J KolObr SAVEVALUE timeSum+,M1 TABULATE TMeanP TERMINATE ; Задание времени моделирования и расчет результатов GENERATE TimeMod TEST L X$Prog,TG1,Met3 SAVEVALUE Prog,TG1 Met3 TEST E TG1,1,Met4 SAVEVALUE TimeObr,(X$TimeSum/N$KolObr) ; Среднее время обработки транспорта SAVEVALUE KoefIsp,(N$KolObr/N$KolPrib) ; Коеффициент использования терминала SAVEVALUE KolObrCar,(N$KolObr/X$Prog) ; Количество обработанных транспортов Met4 TERMINATE 1 START 10000
Параметр и Бегунок. Выполните команду Файл/Создать/Модель на панели инструментов.
Имя модели диалогового окна Новая модель введите Терминал. Выберите каталог, в котором будут сохранены файлы модели. Щелкните кнопку Далее.
Мастера создания модели выберите Начать создание модели "с нуля". Щелкните кнопку Далее.Создадим две области просмотра. Первую для ввода исходных данных и вывода результатов моделирования, вторую - для размещения элементов модели.
Main. Из палитры Презентация перетащите в любое место элемент Область просмотра.
Основные панели Свойства. В поле Имя: введите Модель_Терминал.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Дополнительные панели Свойства. Введите в поля X: 0, Y: 0, Ширина: 680, Высота: 370.
Презентация перетащите элемент Прямоугольник. Оставьте имя, предложенное системой.
Дополнительные панели Свойства. Введите в поля X: 20, Y: 20, Ширина: 640, Высота: 340.
Презентация перетащите второй элемент Область просмотра.
Основные панели Свойства. В поле Имя: введите Данные.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Дополнительные панели Свойства. Введите в поля X: 0, Y: 1000, Ширина: 560, Высота: 400.
Презентация перетащите элемент Скруглённый прямоугольник. Оставьте имя, предложенное системой.
Дополнительные панели Свойства. Введите в поля X: 20, Y: 1030, Ширина: 520, Высота: 350.
text и на странице Основные панели Свойства в поле Текст: введите Исходные данные и результаты моделирования.
Палитре выделите Основная. Перетащите элементы Параметр на элемент с именем Исходные данные и результаты моделирования. Разместите их и дайте имена так, как показано на рис. 7.2.
Палитре выделите Элементы управления. Перетащите элементы Бегунок. Разместите их так, как показано на рис. 7.2. Значения свойств установите согласно табл. 7.1.
| Параметр | Бегунок | ||||
|---|---|---|---|---|---|
| Имя | Тип | Значение по умолчанию | Связать с | Минимальное значение | Максимальное значение |
D_ | int | 10 | D_ | 1 | 50 |
E_ | int | 5 | E_ | 1 | 50 |
F_ | int | 5 | F_ | 1 | 50 |
I_ | int | 7 | I_ | 1 | 50 |
ZP_ | int | 2 | ZP_ | 1 | 50 |
J_ | int | 7 | J_ | 1 | 50 |
timeD | double | 2 | timeD | 1 | 50 |
timeE | double | 10 | timeE | 1 | 50 |
timeF | double | 2 | timeF | 1 | 50 |
timeI | double | 5 | timeI | 1 | 50 |
timeZ | double | 10 | timeZ | 1 | 50 |
timeJ | double | 2 | timeJ | 1 | 50 |
timeA | double | 9 | timeA | 1 | 50 |
timeFH | double | 2 | timeFH | 1 | 50 |
timeIJ | double | 2 | timeIJ | 1 | 50 |
Простая переменная. В Палитре выделите Основная. Перетащите элементы Простая переменная. Разместите их и дайте им имена так, как показано на рис. 7.2. Тип переменных double.В GPSS World коэффициенты использования элементов терминала, длины к ним очередей определяются системой автоматически и выводятся в стандартном отчёте.
Коэффициенты использования элементов терминала (в нашей модели их будут имитировать объекты delay) автоматически определяются и в AnyLogic. Тем не менее, для удобства их чтения в ходе и по окончании моделирования мы ввели переменные KoefIsp_E, KoefIsp_F, KoefIsp_Z, KoefIsp_I, KoefIsp_J.
Для определения максимальных длин очередей к этим элементам терминала нами также введены переменные очередь_Е, очередь_F, очередь_Z, очередь_I, очередь_J.
Переменные KolObrCar, TimeObr, KoefIsp имеют тот же смысл, что и в GPSS-модели.
(рис 7.2) Размещение элементов для ввода исходных данных и вывода результатов моделирования
Переменная kolJ введена для счета количества обработанных транспортов. Переменная TimeSum введена для счета суммарного времени обработки всех транспортов. По значениям этих переменных рассчитывается среднее время обработки TimeObr одного транспорта.
В последующем для определения количественных значений каждой из этих переменных мы напишем соответствующие Java-коды.
Объекты событийной части модели показаны на рис. 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.
(рис 7.3) Элементы модели Terminal
| Имя | Свойства | Значения |
|---|---|---|
| поток_транспорта | Отображать имя | Установите флажок |
| Класс заявки | 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) незначительно. Коэффициенты использования элементов терминала и максимальные длины очередей к ним одинаковые.
Далее поступим так. Проведем эксперименты с моделями в GPSS World и AnyLogic. В GPSS World это будет дисперсионный анализ, а в AnyLogic - оптимизация стохастических моделей. В результате мы получим оптимальные значения факторов и показатели функционирования терминала, которые и оценим.
Сущность этого эксперимента (мы назвали его первым потому, что проведём два отсеивающих эксперимента) состоит в проведении многофакторного дисперсионного анализа с целью выявления степени влияния различных факторов и их комбинаций (взаимодействий) на значение целевой функции (функции отклика, представленной в виде уравнения регрессии).
В условиях модели функционирования терминала в первом эксперименте требуется исследовать зависимость времени обработки одного автомобиля от шести факторов (это максимальные возможности GPSS World), например, при следующих их минимальных и максимальных значениях (табл. 7.6):
| Уровни факторов | Факторы | |||||
|---|---|---|---|---|---|---|
| timeA | timeЕ | timeF | timeI | timeZ | timeFH | |
| Нижний | 10 | 10 | 2 | 5 | 10 | 2 |
| Верхний | 20 | 15 | 4 | 10 | 15 | 4 |
Terminal. Выберите Edit / Insert Experiment / Screening … (Правка / Вставить эксперимент / Отсеивающий …). Откроется диалоговое окно Screening Experiment Generator (Генератор отсеивающего эксперимента). Приступите к заполнению полей диалогового окна.
Experiment Name (Имя эксперимента) и Run Procedure Name (Имя процедуры запуска) введите, например, Terminal и RunTerminal соответственно (рис. 7.4). Имена эксперименту и процедуре запуска эксперимента дает пользователь.
Name (User Variable) (Имя (Переменная пользователя)) введите имя фактора, в поля Value1 и Value2 - его нижний и верхний уровни соответственно. Запомните соответствие между факторами и именами переменных.
Fraction (Часть полного эксперимента). Установите Full, что соответствует полному факторному эксперименту. Справа под Run Count появится число 64, так как $$2^6=64$$. Это число наблюдений, которое нужно сделать в эксперименте. Количество прогонов в каждом наблюдении определим позже при тактическом планировании эксперимента.
(рис 7.4) Диалоговое окно (заполненное) Screening ExperimentGenerator (Генератор отсеивающего эксперимента)
Expression (Выражение) группы Result (Результат) введите выражение, по которому вычисляется время обработки одного автомобиля: X$TimeSum/N$KolObr.
Result (Результат) расположены два флажка, позволяющие выбирать опции. При выборе опции Generate Run Procedure вместе с экспериментом создается стандартная процедура запуска, которую пользователь может корректировать согласно своим требованиям. Выбор второй опции Load F11 with CONDUCT Command закрепляет команду CONDUCT за функциональной клавишей F11. Тогда после создания объекта "Процесс моделирования" для запуска эксперимента нужно только нажать функциональную клавишу F11. Выберите обе опции.
Plus - операторы и вставьте их в нижнюю часть модели Terminal. Для этого нажмите кнопку Insert Experiment (Вставить эксперимент), расположенную в левой нижней части диалогового окна Screening Experiment Generator (Генератор отсеивающего эксперимента) (см. рис. 7.4). Так как была выбрана опция Generate Run Procedure, то создана стандартная процедура запуска.
Появится её диалоговое окно, дающее возможность пользователю изменить процедуру запуска согласно своим требованиям.
Set up your own run conditions (Задайте свои условия наблюдения) имеются две команды START, между которыми находится команда RESET (рис. 7.5). Поясним назначение этих команд.
START
DoCommand("START 100,NP"); /*Get past the Startup Period. */
определяется количество прогонов в неустоявшемся режиме. Команда RESET сбрасывает в ноль накопленную в этом режиме статистику без удаления транзактов из процесса моделирования.
START
DoCommand("START 1000,NP"); /*Run the Simulation. */
определяется количество прогонов в одном наблюдении. В обеих командах используется операторNP - стандартный отчёт не выводится. На рис. 7.5 показаны условия стандартной процедуры запуска после корректировки. Обе команды START мы оставили без изменения, а вот после команды RESET вставили строку
DoCommand("SAVEVALUE TimeSum,0");/*Run the Simulation. */
которая обнуляет ячейку TimeSum.
В этой ячейке накапливается суммарное время обработки всех автомобилей в одном наблюдении эксперимента. Содержимое сохраняемых ячеек при переходе к следующему наблюдению системой (командой RESET) не обнуляется. Поэтому и введена эта команда, в противном случае результаты моделирования будут неверными.
Ok. Сгенерированный код Plus - эксперимента появится ниже программы GPSS-модели.
(рис 7.5) Условия стандартной процедуры запуска после корректировки
Command / Create Simulation (Команда / Создать процесс моделирования).
(рис 7.6) Окно Journal (Журнал) с сообщением об успешном создании объекта "Процесс моделирования"
Journal (Журнал) появится сообщение (см. рис. 7.6).
CONDUCT. Ранее за функциональной клавишей [F11] была закреплена команда CONDUCT (Edit/Settings/Function Keys (Правка/Настройки /Функциональные клавиши)) выбором соответствующей опции (см. рис. 7.4). Нажмите функциональную клавишу [F11]. Эксперимент начинает работать.
Journal (Журнал) объекта "Процесс моделирования". В отчете содержатся Yield - целевая функция, значения её и значения факторов, при которых получены эти значения целевой функции.
Run33 … Run36) показан на рис. 7.7. К этим данным и условиям выбора именно этого фрагмента отчёта мы обратимся позднее.
(рис 7.7) Окно Journal (Журнал) с отчётом первого эксперимента
DispTerminalTimeObr. Во втором эксперименте требуется исследовать зависимость количества обработанных автомобилей за 8 часов в зависимости от тех же факторов и их значений, что и в первом эксперименте.
Согласно постановке на второй эксперимент поступите так.
DispTerminalTimeObr.
DispTerminalKolObrCar.
Edit/Insert Experiment/Screening … (Правка/Вставить эксперимент/Отсеивающий …). Откроется диалоговое окно Screening Experiment Generator (Генератор отсеивающего эксперимента) с заполненными полями.
Expression (Выражение) группы Result (Результат) выражение, по которому вычисляется время обработки одного автомобиля X$TimeSum/N$KolObr, выражением N$KolObr/X$Prog для расчета количества обработанных автомобилей.
Run1…Run4) показан на рис. 7.8. К этим данным мы также обратимся позже.
(рис 7.8) Окно Journal (Журнал) с отчетом второго эксперимента
Создайте первый эксперимент Оптимизация стохастических моделей в AnyLogic. Цель эксперимента: определение минимального времени обработки одного автомобиля в зависимости от тех же факторов и их значений, что и в отсеивающем эксперименте.
Terminal.
Проект щелкните правой кнопкой мыши элемент модели Terminal и из меню выберите Coздать/ Эксперимент.
Тип эксперимента: выберите Оптимизация.
Имя введите имя эксперимента, например, OptTerminal. Имя эксперимента должно начинаться с заглавной буквы - таково правило названия классов в Java.
Корневой класс модели: выберите Main. Этим выбором вы задали корневой (главный) класс эксперимента. Объект этого класса будет играть роль корня дерева объектов модели, запускаемой экспериментом.
Копировать установки модельного времени из: и выберите эксперимент из справа выпадающего списка.
Фиксированное начальное число (воспроизводимые прогоны). В поле начальное число введите 1687. В этом случае при каждом запуске модели генератор случайных чисел будет инициализироваться этим числом. Поэтому прогоны будут воспроизводимыми при очередном запуске модели, что полезно при отладке модели.
Готово. Появится страница Основные панели Свойства. Установите опцию минимизировать.
Целевая функция введите root.TimeObr, так как корневой активный объект модели доступен здесь как root.
Количество итераций:. Под итерацией понимается один опыт (одно наблюдение). Количество итераций - это цель стратегического планирования эксперимента - определение количества наблюдений и уровней факторов в них для получения полной и достоверной информации о модели.
timeA, timeЕ, timeF, timeI, timeZ, timeFH. Примем, что каждый фактор имеет два уровня k=2, m=6, тогда число итераций $$I=k^m=2^6=64$$.
Количество итераций: установите 64. Задайте параметры, зна-чения которых будут меняться. В таблице на рис. 7.9 пере-числены все параметры корневого объекта Main.
timeA. Щелкните мышью в ячейке Тип. Выберите тип параметра, отличный от значения фиксированный. Чтобы параметры изменялись точно так же, как и в отсеивающем эксперименте GPSS World, то есть имели два уровня (нижний и верхний или минимальное и максимальное значения), выберите тип дискретный.
(рис 7.9) Страница Основные панели Свойства эксперимента
Мин минимальное значение 10, в ячейку Макс максимальное значение 20. Так как параметр дискретный, в ячейке Шаг укажите величину шага 10.
Репликации панели Свойства.
Использовать репликации.
Фиксированное количество репликаций и в соответствующем поле установите 400.
Основные и щелкните Создать интерфейс.
Кнопка находится в правом верхнем углу страницы Основные. После щелчка удаляется презентация эксперимента и создаётся интерфейс эксперимента заново согласно его текущим установкам (набору оптимизационных параметров и их свойствам и т. д.). Поэтому создавать интерфейс нужно только после окончания задания параметров эксперимента. На интерфейсе будут видны знаки вопросов напротив оптимизационных параметров.
Terminal1/OptTerminal.
Запустить оптимизацию. Начнет выполняться эксперимент. Во время эксперимента можно видеть на графике изменение значения целевой функции (вертикальная ось). После выполнения 400*64=25 600 прогонов (рис. 7.10) эксперимент остановится.Создайте второй эксперимент Оптимизация стохастических моделей в AnyLogic. Цель эксперимента: определение максимального количества обработанных автомобилей в зависимости от тех же факторов и их значений, что и в первом эксперименте.
(рис 7.10) Результаты первого оптимизационного эксперимента
Terminal.
Проект щелкните правой кнопкой мыши элемент модели Terminal и из контекстного меню выберите Coздать/ Эксперимент. В появившемся диалоговом окне из спискаТип эксперимента: выберите Оптимизация.
Имя введите имя эксперимента, например, OptTerminal2.
максимизировать.
Целевая функция введите root.KolObrCar.
Фиксированное количество репликаций и в соответствующем поле установите 4.
Основные и щелкните Создать интерфейс.
Terminal1/OptTerminal2.
Запустить оптимизацию. После выполнения 4*64=256 прогонов (рис. 7.11) эксперимент остановится. На второй итерации (втором наблюдении) четвертой репликации (прогоне) получено оптимальное значение функционала: 48,08.Перейдем к рассмотрению результатов экспериментов.
Результаты экспериментов с имитационными моделями функционирования терминала сведены в табл. 7.7 и 7.8.
| Показатели, параметры | Системы моделирования | |
|---|---|---|
| GPSS World | AnyLogic | |
| Первый эксперимент | ||
TimeObr | 31,844 | 31,799 |
timeA | 20 | 20 |
timeE | 10 | 10 |
timeF | 2 | 2 |
timeI | 5 | 5 |
timeZ | 10 | 10 |
timeFH | 2 | 2 |
TimeObr | 31,605 | 31,799 |
timeA | 20 | 20 |
timeE | 10 | 10 |
timeF | 4 | 2 |
timeI | 5 | 5 |
timeZ | 10 | 10 |
timeFH | 4 | 2 |
(рис 7.11) Результаты второго оптимизационного эксперимента
Как уже отмечалось, значения факторов (параметров) в отсеивающих экспериментах GPSS World и оптимизационных экспериментах AnyLogic изменялись одинаково. Следовательно, в отчете GPSS World об отсеивающем эксперименте можно найти значение целевой функции, рассчитанное по параметрам, которые определены AnyLogic в эксперименте как оптимальные. Показатели и параметры при таком подходе к сравнительной оценке результатов моделирования в табл. 7.7 и 7.8 выделены жирным шрифтом.
| Второй эксперимент | ||
|---|---|---|
KolObrCar | 48,049 | 48,08 |
timeA | 10 | 10 |
timeE | 10 | 10 |
timeF | 2 | 2 |
timeI | 5 | 5 |
timeZ | 10 | 10 |
timeFH | 2 | 2 |
KolObrCar | 48,3 | 48,08 |
timeA | 10 | 10 |
timeE | 15 | 10 |
timeF | 4 | 2 |
timeI | 5 | 5 |
timeZ | 15 | 10 |
timeFH | 4 | 2 |
В первом эксперименте минимальное время обработки одного автомобиля, определенное оптимизатором AnyLogic, составляет TimeObr = 31,799 мин (см. рис. 7.10) при следующих значениях параметров: timeA = 20, timeЕ = 10, timeF = 2, timeI = 5, timeZ = 10, timeFH = 2.
По значениям оптимальных параметров находим в отчете GPSS World (см. рис. 7.7) TimeObr = 31,844 мин. Как видим, отличие составляет 0,045 мин.
Во втором оптимизационном эксперименте максимальное количество обработанных автомобилей, определенное AnyLogic, составляет KolObrCar = 48,08 (см. рис. 7.11) при следующих значениях параметров: timeA = 10, timeЕ = 10, timeF = 2, timeI = 5, timeZ = 10, timeFH = 2.
По значениям оптимальных параметров находим в отчете GPSS World (см. рис. 7.8) KolObrCar = 48,049. Как видим, результаты практически одинаковы, если учесть измерение показателя целыми значениями (разница 0,03).
Теперь попробуем в отчётах GPSS World найти значения целевой функции, которые превышают значения, полученные при оптимальных параметрах AnyLogic. Такие значения нашлись, и также включены в табл. 7.7 и 7.8 (не выделены жирным шрифтом). Но и они свидетельствуют о близости полученных результатов моделирования в GPSS World и AnyLogic.
Общий вид терминала показан на рис. 7.1. Территория терминала обозначена A, примыкающая городская территория - B.
(рис 7.1) Схема терминала
Когда со стороны терминала готово транспортное средство для его погрузки-разгрузки (заявка на обслуживание автомобиля выполнена), и имеется свободная ячейка для обработки автомобиля в зоне H, автомобиль подъезжает к свободной ячейке для погрузки. Среднее время движения 2 мин. Если заявка была выполнена до приезда автомобиля и имеется свободная ячейка, автомобиль может прямо подъехать к ячейке, минуя парковку 6. Среднее время обслуживания автомобиля 5 мин.
Необходимо разработать имитационную модель и промоделировать функционирование терминала в течение 8 ч.
Определить:
В модели автомобили следует представить транзактами. Все остальные элементы терминала (парковку D, офис Е, полосы у ворот F и J, места у зон I и Z) - многоканальными устройствами (МКУ). Дадим МКУ имена согласно постановке задачи, добавив знак подчеркивания, например, D_.
Введем масштабирование: 1 единица модельного времени соответствует 1 мин, то есть, например, время моделирования равно 8*60 = 480 единиц модельного времени.
В постановке задачи на разработку модели указаны средние значения времени поступления автомобилей и их обработки. Примем, что интервалы времени во всех случаях распределены по экспоненциальному закону.
Декомпозиция терминала и состав сегментов модели определяются разработчиком. Введем следующие сегменты:
Как видно, в данном случае можно обойтись без разделения событийной части модели на сегменты.
Ниже приводится программа модели.
; Модель функционирования терминала ; Многоканальные устройства D_ Storage 10 ;Имитирующее парковку D E_ Storage 5 ;Имитирующее офис Е F_ Storage 5 ;Имитирующее полосы ворот F I_ Storage 7 ;Имитирующее места у зоны I ZP_ Storage 2 ;Имитирующее места в зоне Z J_ Storage 7 ;Имитирующее ворота J ; Исходные данные timeA EQU 9 ;Среднее время приезда транспорта timeD EQU 2 ;Среднее время парковки на D timeE EQU 10 ;Среднее время оформления документов в офисе Е timeF EQU 2 ;Среднее время досмотра на воротах F timeFH EQU 2 ;Среднее время движения от F к Н timeZ EQU 10 ;Среднее время выполнения заказа на обслуживание автомобиля timeI EQU 5 ;Среднее время обслуживания автомобиля в зоне I timeIJ EQU 2 ;Среднее время движения от I к J timeJ EQU 2 ;Среднее время досмотра на воротах J timeMod EQU 480 ;Время моделирования ; Статистические таблицы C_ QTABLE C_,1,1,50 E_ QTABLE E_,1,1,30 ZP_ QTABLE ZP_,1,1,40 TMeanP TABLE M1,40,1,80 ; Событийная часть модели GENERATE (Exponential(371,0,timeA));Имитация прибытия автотранспорта KolPrib QUEUE C_ ;Занять очередь на парковку D ENTER D_ ;Занять одно место на парковкеD DEPART C_ ;Покинуть очередь на парковку ADVANCE (Exponential(83,0,timeD));Имитация парковки на D QUEUE E_ ;Встать в очередь в офис Е ENTER E_ ;Занять окошко в офисе Е DEPART E_ ;Покинуть очередь в офис Е ADVANCE (Exponential(113,0,timeE)) ;Имитация оформления документов в офисе Е LEAVE E_ ;Покинуть офис Е SPLIT 1,,1 ;Расщепление для отправки заявки TEST E P1,1,Met1 ;Автотранспорт к воротам F, заявка в Z QUEUE ZP_ ;Занять очередь в зону Z ENTER ZP_ ;Занять место обслуживания заявки в зоне Z DEPART ZP_ ;Покинуь очередь в зону Z ADVANCE (Exponential(213,0,timeZ));Имитация выполнения заявки в зоне Z LEAVE ZP_ ;Освободить место обслуживания заявки в зоне Z TRANSFER ,Met2 Met1 QUEUE F_ ;Встать в очередь к воротам F ENTER F_ ;Занять полосу у ворот F DEPART F_ ;Покинуть очередь к воротам F LEAVE D_ ;Освободить место на парковке ADVANCE (Exponential(183,0,timeF));Имитация досмотра у ворот F LEAVE F_ ;Освободить полосу у ворот F ADVANCE (Exponential(163,0,timeFH));Имитация движения от F к H Met2 ASSEMBLE *1 ;Фиксация - выполнение заявки ENTER I_ ;Занять ячейку I ADVANCE (Exponential(315,0,timeI)) ;Имитация обслуживания в зоне I LEAVE I_ ;Освободить ячейку I ADVANCE (Exponential(511,0,timeIJ));Имитация движения от I к J ENTER J_ ;Занять место на воротах J ADVANCE (Exponential(703,0,timeJ)) ;Имитация осмотра на воротах J LEAVE J_ ;Освободить место на воротах J KolObr SAVEVALUE timeSum+,M1 TABULATE TMeanP TERMINATE ; Задание времени моделирования и расчет результатов GENERATE TimeMod TEST L X$Prog,TG1,Met3 SAVEVALUE Prog,TG1 Met3 TEST E TG1,1,Met4 SAVEVALUE TimeObr,(X$TimeSum/N$KolObr) ; Среднее время обработки транспорта SAVEVALUE KoefIsp,(N$KolObr/N$KolPrib) ; Коеффициент использования терминала SAVEVALUE KolObrCar,(N$KolObr/X$Prog) ; Количество обработанных транспортов Met4 TERMINATE 1 START 10000
Параметр и Бегунок. Выполните команду Файл/Создать/Модель на панели инструментов.
Имя модели диалогового окна Новая модель введите Терминал. Выберите каталог, в котором будут сохранены файлы модели. Щелкните кнопку Далее.
Мастера создания модели выберите Начать создание модели "с нуля". Щелкните кнопку Далее.Создадим две области просмотра. Первую для ввода исходных данных и вывода результатов моделирования, вторую - для размещения элементов модели.
Main. Из палитры Презентация перетащите в любое место элемент Область просмотра.
Основные панели Свойства. В поле Имя: введите Модель_Терминал.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Дополнительные панели Свойства. Введите в поля X: 0, Y: 0, Ширина: 680, Высота: 370.
Презентация перетащите элемент Прямоугольник. Оставьте имя, предложенное системой.
Дополнительные панели Свойства. Введите в поля X: 20, Y: 20, Ширина: 640, Высота: 340.
Презентация перетащите второй элемент Область просмотра.
Основные панели Свойства. В поле Имя: введите Данные.
Выравнивать по: Верхн. левому углу.
Масштабирование: Подогнать под окно.
Дополнительные панели Свойства. Введите в поля X: 0, Y: 1000, Ширина: 560, Высота: 400.
Презентация перетащите элемент Скруглённый прямоугольник. Оставьте имя, предложенное системой.
Дополнительные панели Свойства. Введите в поля X: 20, Y: 1030, Ширина: 520, Высота: 350.
text и на странице Основные панели Свойства в поле Текст: введите Исходные данные и результаты моделирования.
Палитре выделите Основная. Перетащите элементы Параметр на элемент с именем Исходные данные и результаты моделирования. Разместите их и дайте имена так, как показано на рис. 7.2.
Палитре выделите Элементы управления. Перетащите элементы Бегунок. Разместите их так, как показано на рис. 7.2. Значения свойств установите согласно табл. 7.1.
| Параметр | Бегунок | ||||
|---|---|---|---|---|---|
| Имя | Тип | Значение по умолчанию | Связать с | Минимальное значение | Максимальное значение |
D_ | int | 10 | D_ | 1 | 50 |
E_ | int | 5 | E_ | 1 | 50 |
F_ | int | 5 | F_ | 1 | 50 |
I_ | int | 7 | I_ | 1 | 50 |
ZP_ | int | 2 | ZP_ | 1 | 50 |
J_ | int | 7 | J_ | 1 | 50 |
timeD | double | 2 | timeD | 1 | 50 |
timeE | double | 10 | timeE | 1 | 50 |
timeF | double | 2 | timeF | 1 | 50 |
timeI | double | 5 | timeI | 1 | 50 |
timeZ | double | 10 | timeZ | 1 | 50 |
timeJ | double | 2 | timeJ | 1 | 50 |
timeA | double | 9 | timeA | 1 | 50 |
timeFH | double | 2 | timeFH | 1 | 50 |
timeIJ | double | 2 | timeIJ | 1 | 50 |
Простая переменная. В Палитре выделите Основная. Перетащите элементы Простая переменная. Разместите их и дайте им имена так, как показано на рис. 7.2. Тип переменных double.В GPSS World коэффициенты использования элементов терминала, длины к ним очередей определяются системой автоматически и выводятся в стандартном отчёте.
Коэффициенты использования элементов терминала (в нашей модели их будут имитировать объекты delay) автоматически определяются и в AnyLogic. Тем не менее, для удобства их чтения в ходе и по окончании моделирования мы ввели переменные KoefIsp_E, KoefIsp_F, KoefIsp_Z, KoefIsp_I, KoefIsp_J.
Для определения максимальных длин очередей к этим элементам терминала нами также введены переменные очередь_Е, очередь_F, очередь_Z, очередь_I, очередь_J.
Переменные KolObrCar, TimeObr, KoefIsp имеют тот же смысл, что и в GPSS-модели.
(рис 7.2) Размещение элементов для ввода исходных данных и вывода результатов моделирования
Переменная kolJ введена для счета количества обработанных транспортов. Переменная TimeSum введена для счета суммарного времени обработки всех транспортов. По значениям этих переменных рассчитывается среднее время обработки TimeObr одного транспорта.
В последующем для определения количественных значений каждой из этих переменных мы напишем соответствующие Java-коды.
Объекты событийной части модели показаны на рис. 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.
(рис 7.3) Элементы модели Terminal
| Имя | Свойства | Значения |
|---|---|---|
| поток_транспорта | Отображать имя | Установите флажок |
| Класс заявки | 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) незначительно. Коэффициенты использования элементов терминала и максимальные длины очередей к ним одинаковые.
Далее поступим так. Проведем эксперименты с моделями в GPSS World и AnyLogic. В GPSS World это будет дисперсионный анализ, а в AnyLogic - оптимизация стохастических моделей. В результате мы получим оптимальные значения факторов и показатели функционирования терминала, которые и оценим.
Сущность этого эксперимента (мы назвали его первым потому, что проведём два отсеивающих эксперимента) состоит в проведении многофакторного дисперсионного анализа с целью выявления степени влияния различных факторов и их комбинаций (взаимодействий) на значение целевой функции (функции отклика, представленной в виде уравнения регрессии).
В условиях модели функционирования терминала в первом эксперименте требуется исследовать зависимость времени обработки одного автомобиля от шести факторов (это максимальные возможности GPSS World), например, при следующих их минимальных и максимальных значениях (табл. 7.6):
| Уровни факторов | Факторы | |||||
|---|---|---|---|---|---|---|
| timeA | timeЕ | timeF | timeI | timeZ | timeFH | |
| Нижний | 10 | 10 | 2 | 5 | 10 | 2 |
| Верхний | 20 | 15 | 4 | 10 | 15 | 4 |
Terminal. Выберите Edit / Insert Experiment / Screening … (Правка / Вставить эксперимент / Отсеивающий …). Откроется диалоговое окно Screening Experiment Generator (Генератор отсеивающего эксперимента). Приступите к заполнению полей диалогового окна.
Experiment Name (Имя эксперимента) и Run Procedure Name (Имя процедуры запуска) введите, например, Terminal и RunTerminal соответственно (рис. 7.4). Имена эксперименту и процедуре запуска эксперимента дает пользователь.
Name (User Variable) (Имя (Переменная пользователя)) введите имя фактора, в поля Value1 и Value2 - его нижний и верхний уровни соответственно. Запомните соответствие между факторами и именами переменных.
Fraction (Часть полного эксперимента). Установите Full, что соответствует полному факторному эксперименту. Справа под Run Count появится число 64, так как $$2^6=64$$. Это число наблюдений, которое нужно сделать в эксперименте. Количество прогонов в каждом наблюдении определим позже при тактическом планировании эксперимента.
(рис 7.4) Диалоговое окно (заполненное) Screening ExperimentGenerator (Генератор отсеивающего эксперимента)
Expression (Выражение) группы Result (Результат) введите выражение, по которому вычисляется время обработки одного автомобиля: X$TimeSum/N$KolObr.
Result (Результат) расположены два флажка, позволяющие выбирать опции. При выборе опции Generate Run Procedure вместе с экспериментом создается стандартная процедура запуска, которую пользователь может корректировать согласно своим требованиям. Выбор второй опции Load F11 with CONDUCT Command закрепляет команду CONDUCT за функциональной клавишей F11. Тогда после создания объекта "Процесс моделирования" для запуска эксперимента нужно только нажать функциональную клавишу F11. Выберите обе опции.
Plus - операторы и вставьте их в нижнюю часть модели Terminal. Для этого нажмите кнопку Insert Experiment (Вставить эксперимент), расположенную в левой нижней части диалогового окна Screening Experiment Generator (Генератор отсеивающего эксперимента) (см. рис. 7.4). Так как была выбрана опция Generate Run Procedure, то создана стандартная процедура запуска.
Появится её диалоговое окно, дающее возможность пользователю изменить процедуру запуска согласно своим требованиям.
Set up your own run conditions (Задайте свои условия наблюдения) имеются две команды START, между которыми находится команда RESET (рис. 7.5). Поясним назначение этих команд.
START
DoCommand("START 100,NP"); /*Get past the Startup Period. */
определяется количество прогонов в неустоявшемся режиме. Команда RESET сбрасывает в ноль накопленную в этом режиме статистику без удаления транзактов из процесса моделирования.
START
DoCommand("START 1000,NP"); /*Run the Simulation. */
определяется количество прогонов в одном наблюдении. В обеих командах используется операторNP - стандартный отчёт не выводится. На рис. 7.5 показаны условия стандартной процедуры запуска после корректировки. Обе команды START мы оставили без изменения, а вот после команды RESET вставили строку
DoCommand("SAVEVALUE TimeSum,0");/*Run the Simulation. */
которая обнуляет ячейку TimeSum.
В этой ячейке накапливается суммарное время обработки всех автомобилей в одном наблюдении эксперимента. Содержимое сохраняемых ячеек при переходе к следующему наблюдению системой (командой RESET) не обнуляется. Поэтому и введена эта команда, в противном случае результаты моделирования будут неверными.
Ok. Сгенерированный код Plus - эксперимента появится ниже программы GPSS-модели.
(рис 7.5) Условия стандартной процедуры запуска после корректировки
Command / Create Simulation (Команда / Создать процесс моделирования).
(рис 7.6) Окно Journal (Журнал) с сообщением об успешном создании объекта "Процесс моделирования"
Journal (Журнал) появится сообщение (см. рис. 7.6).
CONDUCT. Ранее за функциональной клавишей [F11] была закреплена команда CONDUCT (Edit/Settings/Function Keys (Правка/Настройки /Функциональные клавиши)) выбором соответствующей опции (см. рис. 7.4). Нажмите функциональную клавишу [F11]. Эксперимент начинает работать.
Journal (Журнал) объекта "Процесс моделирования". В отчете содержатся Yield - целевая функция, значения её и значения факторов, при которых получены эти значения целевой функции.
Run33 … Run36) показан на рис. 7.7. К этим данным и условиям выбора именно этого фрагмента отчёта мы обратимся позднее.
(рис 7.7) Окно Journal (Журнал) с отчётом первого эксперимента
DispTerminalTimeObr. Во втором эксперименте требуется исследовать зависимость количества обработанных автомобилей за 8 часов в зависимости от тех же факторов и их значений, что и в первом эксперименте.
Согласно постановке на второй эксперимент поступите так.
DispTerminalTimeObr.
DispTerminalKolObrCar.
Edit/Insert Experiment/Screening … (Правка/Вставить эксперимент/Отсеивающий …). Откроется диалоговое окно Screening Experiment Generator (Генератор отсеивающего эксперимента) с заполненными полями.
Expression (Выражение) группы Result (Результат) выражение, по которому вычисляется время обработки одного автомобиля X$TimeSum/N$KolObr, выражением N$KolObr/X$Prog для расчета количества обработанных автомобилей.
Run1…Run4) показан на рис. 7.8. К этим данным мы также обратимся позже.
(рис 7.8) Окно Journal (Журнал) с отчетом второго эксперимента
Создайте первый эксперимент Оптимизация стохастических моделей в AnyLogic. Цель эксперимента: определение минимального времени обработки одного автомобиля в зависимости от тех же факторов и их значений, что и в отсеивающем эксперименте.
Terminal.
Проект щелкните правой кнопкой мыши элемент модели Terminal и из меню выберите Coздать/ Эксперимент.
Тип эксперимента: выберите Оптимизация.
Имя введите имя эксперимента, например, OptTerminal. Имя эксперимента должно начинаться с заглавной буквы - таково правило названия классов в Java.
Корневой класс модели: выберите Main. Этим выбором вы задали корневой (главный) класс эксперимента. Объект этого класса будет играть роль корня дерева объектов модели, запускаемой экспериментом.
Копировать установки модельного времени из: и выберите эксперимент из справа выпадающего списка.
Фиксированное начальное число (воспроизводимые прогоны). В поле начальное число введите 1687. В этом случае при каждом запуске модели генератор случайных чисел будет инициализироваться этим числом. Поэтому прогоны будут воспроизводимыми при очередном запуске модели, что полезно при отладке модели.
Готово. Появится страница Основные панели Свойства. Установите опцию минимизировать.
Целевая функция введите root.TimeObr, так как корневой активный объект модели доступен здесь как root.
Количество итераций:. Под итерацией понимается один опыт (одно наблюдение). Количество итераций - это цель стратегического планирования эксперимента - определение количества наблюдений и уровней факторов в них для получения полной и достоверной информации о модели.
timeA, timeЕ, timeF, timeI, timeZ, timeFH. Примем, что каждый фактор имеет два уровня k=2, m=6, тогда число итераций $$I=k^m=2^6=64$$.
Количество итераций: установите 64. Задайте параметры, зна-чения которых будут меняться. В таблице на рис. 7.9 пере-числены все параметры корневого объекта Main.
timeA. Щелкните мышью в ячейке Тип. Выберите тип параметра, отличный от значения фиксированный. Чтобы параметры изменялись точно так же, как и в отсеивающем эксперименте GPSS World, то есть имели два уровня (нижний и верхний или минимальное и максимальное значения), выберите тип дискретный.
(рис 7.9) Страница Основные панели Свойства эксперимента
Мин минимальное значение 10, в ячейку Макс максимальное значение 20. Так как параметр дискретный, в ячейке Шаг укажите величину шага 10.
Репликации панели Свойства.
Использовать репликации.
Фиксированное количество репликаций и в соответствующем поле установите 400.
Основные и щелкните Создать интерфейс.
Кнопка находится в правом верхнем углу страницы Основные. После щелчка удаляется презентация эксперимента и создаётся интерфейс эксперимента заново согласно его текущим установкам (набору оптимизационных параметров и их свойствам и т. д.). Поэтому создавать интерфейс нужно только после окончания задания параметров эксперимента. На интерфейсе будут видны знаки вопросов напротив оптимизационных параметров.
Terminal1/OptTerminal.
Запустить оптимизацию. Начнет выполняться эксперимент. Во время эксперимента можно видеть на графике изменение значения целевой функции (вертикальная ось). После выполнения 400*64=25 600 прогонов (рис. 7.10) эксперимент остановится.Создайте второй эксперимент Оптимизация стохастических моделей в AnyLogic. Цель эксперимента: определение максимального количества обработанных автомобилей в зависимости от тех же факторов и их значений, что и в первом эксперименте.
(рис 7.10) Результаты первого оптимизационного эксперимента
Terminal.
Проект щелкните правой кнопкой мыши элемент модели Terminal и из контекстного меню выберите Coздать/ Эксперимент. В появившемся диалоговом окне из спискаТип эксперимента: выберите Оптимизация.
Имя введите имя эксперимента, например, OptTerminal2.
максимизировать.
Целевая функция введите root.KolObrCar.
Фиксированное количество репликаций и в соответствующем поле установите 4.
Основные и щелкните Создать интерфейс.
Terminal1/OptTerminal2.
Запустить оптимизацию. После выполнения 4*64=256 прогонов (рис. 7.11) эксперимент остановится. На второй итерации (втором наблюдении) четвертой репликации (прогоне) получено оптимальное значение функционала: 48,08.Перейдем к рассмотрению результатов экспериментов.
Результаты экспериментов с имитационными моделями функционирования терминала сведены в табл. 7.7 и 7.8.
| Показатели, параметры | Системы моделирования | |
|---|---|---|
| GPSS World | AnyLogic | |
| Первый эксперимент | ||
TimeObr | 31,844 | 31,799 |
timeA | 20 | 20 |
timeE | 10 | 10 |
timeF | 2 | 2 |
timeI | 5 | 5 |
timeZ | 10 | 10 |
timeFH | 2 | 2 |
TimeObr | 31,605 | 31,799 |
timeA | 20 | 20 |
timeE | 10 | 10 |
timeF | 4 | 2 |
timeI | 5 | 5 |
timeZ | 10 | 10 |
timeFH | 4 | 2 |
(рис 7.11) Результаты второго оптимизационного эксперимента
Как уже отмечалось, значения факторов (параметров) в отсеивающих экспериментах GPSS World и оптимизационных экспериментах AnyLogic изменялись одинаково. Следовательно, в отчете GPSS World об отсеивающем эксперименте можно найти значение целевой функции, рассчитанное по параметрам, которые определены AnyLogic в эксперименте как оптимальные. Показатели и параметры при таком подходе к сравнительной оценке результатов моделирования в табл. 7.7 и 7.8 выделены жирным шрифтом.
| Второй эксперимент | ||
|---|---|---|
KolObrCar | 48,049 | 48,08 |
timeA | 10 | 10 |
timeE | 10 | 10 |
timeF | 2 | 2 |
timeI | 5 | 5 |
timeZ | 10 | 10 |
timeFH | 2 | 2 |
KolObrCar | 48,3 | 48,08 |
timeA | 10 | 10 |
timeE | 15 | 10 |
timeF | 4 | 2 |
timeI | 5 | 5 |
timeZ | 15 | 10 |
timeFH | 4 | 2 |
В первом эксперименте минимальное время обработки одного автомобиля, определенное оптимизатором AnyLogic, составляет TimeObr = 31,799 мин (см. рис. 7.10) при следующих значениях параметров: timeA = 20, timeЕ = 10, timeF = 2, timeI = 5, timeZ = 10, timeFH = 2.
По значениям оптимальных параметров находим в отчете GPSS World (см. рис. 7.7) TimeObr = 31,844 мин. Как видим, отличие составляет 0,045 мин.
Во втором оптимизационном эксперименте максимальное количество обработанных автомобилей, определенное AnyLogic, составляет KolObrCar = 48,08 (см. рис. 7.11) при следующих значениях параметров: timeA = 10, timeЕ = 10, timeF = 2, timeI = 5, timeZ = 10, timeFH = 2.
По значениям оптимальных параметров находим в отчете GPSS World (см. рис. 7.8) KolObrCar = 48,049. Как видим, результаты практически одинаковы, если учесть измерение показателя целыми значениями (разница 0,03).
Теперь попробуем в отчётах GPSS World найти значения целевой функции, которые превышают значения, полученные при оптимальных параметрах AnyLogic. Такие значения нашлись, и также включены в табл. 7.7 и 7.8 (не выделены жирным шрифтом). Но и они свидетельствуют о близости полученных результатов моделирования в GPSS World и AnyLogic.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.