Коллеги, спасибо за очень информативный и полезный курс. Прошёл три лекции. Столкнулся с проблемой, что обе модели не могут закончить расчёт по причине ограничения бесплатной версии "создано максимально допустимое число динамически создаваемых агентов (50000)". По скриншотам Лекции 2 видно, что да, модель создает гораздо больше 50000 агентов. В принципе, мне то и диплом не особо нужен. Но хотелось бы выполнить практические работы. Нет ли возможности откорректировать эту проблему? Или может я чего не так делаю? Еще раз спасибо за прекрасный курс! |
Модель функционирования системы воздушных перевозок
Погрузка контейнеров в аэропорту 1
Сегмент Погрузка контейнеров в аэропорту 1 предназначен для имитации погрузки в самолёты и отправки загруженных самолётов в полёт в аэропорт назначения.
Создайте сегмент Погрузка контейнеров в аэропорту 1.
- Из палитры Презентация перетащите элемент Прямоугольник.
- На странице Местоположение и размер панели Свойства введите в поля X: 350, Y: 50, Ширина: 460, Высота: 200.
- Перетащите элемент text и в поле Текст: введите Погрузка контейнеров в аэропорту 1.
- Перетащите из Библиотеки моделирования процессов по два объекта enter, split, queue, delay, selectOutput и по одному объекту exit и sink. Поместите и соедините их так, как на Рис. 9.9.
- Установите свойства объектов согласно Табл. 9.6.
Свойство | Значения |
---|---|
enter2 | |
Тип заявки: | ТранспСредство |
enter3 | |
Тип заявки: | ТранспСредство |
split | |
Типы заявок: | |
Оригинал, Копия | ТранспСредство, ТранспСредство |
Количество копий | entity.колГрузоМест-1 |
Новая заявка (копия) | ТранспСредство |
Действия При выходе копии: | entity.типТрансп=original.типТрансп; |
entity.колГрузоМест=original.колГрузоМест; | |
entity.tPolet=original.tPolet; | |
entity.разные =original.разные; | |
split1 | |
Типы заявок: | |
Оригинал, Копия | ТранспСредство, ТранспСредство |
Количество копий | entity.колГрузоМест-1 |
Новая заявка (копия) | ТранспСредство |
Действия При выходе копии: | entity.типТрансп=original.типТрансп; |
entity.колГрузоМест=original.колГрузоМест; | |
entity.врПолёта=original.врПолёта; | |
entity.разные =original.разные; | |
Имя: | очПогр1А |
Тип заявки: | ТранспСредство |
Максимальная вместимость | Установить флажок |
Действия При выходе | entity.разные=срВрПогрКонтСам1А; |
Включить сбор статистики | Установить флажок |
queue1 | |
Имя: | очПогр1Б |
Тип заявки: | ТранспСредство |
Максимальная вместимость | Установить флажок |
Действия При выходе | entity.разные=срВрПогрКонтСам1Б; |
Включить сбор статистики | Установить флажок |
delay | |
Имя: | погрузка1А |
Тип заявки: | ТранспСредство |
Задержка задаётся | Определённое время |
Время задержки | exponential(1/entity.разные) |
Вместимость | погрКонтСам1А |
Действия При подходе к выходу | погрКонтА1++; |
Включить сбор статистики | Установить флажок |
delay1 | |
Имя: | погрузка1Б |
Тип заявки: | ТранспСредство |
Задержка задаётся | Определённое время |
Время задержки | exponential(1/entity.разные) |
Вместимость | погрКонтСам1Б |
Действия При подходе к выходу | погрКонтБ1++; |
Включить сбор статистики | Установить флажок |
selectOutput1 | |
Тип заявки: | ТранспСредство |
Выход true выбирается | При выполнении условия |
Условие | entity.колГрузоМест==погрКонтА1 |
Действия При выходе (true) | entity.врПолёта=normal(отклВрПолётаА12,срВрПолётаА12); |
погрКонтА1=0; | |
selectOutput2 | |
Тип заявки: | ТранспСредство |
Выход true выбирается | При выполнении условия |
Условие | entity.колГрузоМест==погрКонтБ1 |
Действия При выходе (true) | entity.врПолёта=normal(отклВрПолётаБ12,срВрПолётаБ12); |
погрКонтБ1=0; | |
exit | |
Имя: | наВзлёт12 |
Тип заявки: | ТранспСредство |
Действия При выходе | if (entity.типТрансп==1) enter4.take(entity); |
else enter5.take(entity); | |
sink | |
Тип заявки: | ТранспСредство |
Предположим, что из сегмента ожидания погрузки через объект enter2 поступила заявка-самолёт типа А в объект split. Объектом split заявка размножается на число заявок, равное количеству контейнеров, которые должны быть погружены в самолёт. Заявка-оригинал из модели не выводится.
Таким образом, далее каждая заявка интерпретируется как заявка-контейнер. Тем не менее, каждой копии присваиваются значения полей оригинала, так как после погрузки все заявки-контейнеры, кроме последней, будут выведены из модели.
Заявки-контейнеры занимают очередь к объекту погрузка1А, имитирующему непосредственно погрузку контейнеров в самолёт типа А в аэропорту 1. При покидании очереди выполняется код entity.разные=срВрПогрКонтСам1А, записывающий в поле с именем разные заявки-контейнера среднее время погрузки одного контейнера.
После объекта погрузка1А, на выходе которого ведётся счёт погруженных контейнеров (погрКонтА1++), заявки-контейнеры входят в объект selectOutput1.
Этот объект проверяет условие (entity.колГрузоМест ==погрКонтБ1): полная ли загрузка самолёта? При выполнении этого условия, а оно будет выполнено тогда, когда будет загружен последний контейнер, последняя заявка теперь уже в качестве заявки-самолёта поступит в объект наВзлёт (exit).
Из этого объекта заявка-самолёт типа А с полным грузом поступит в сегмент имитации полёта из аэропорта 1 в аэропорт 2.
Аналогичным образом имитируется погрузка в самолёт типа Б. Имитация начинается с поступления заявки-самолёта через объект enter3 в объект split1.
Полёт из аэропорта 1 в аэропорт 2
Сегмент Полёт из аэропорта 1 в аэропорт 2 предназначен для имитации полёта самолётов с грузом из аэропорта 1 в аэропорт 2.
Создайте сегмент.
- Из палитры Презентация перетащите элемент Прямоугольник.
- На странице Местоположение и размер панели Свойства введите в поля X: 830, Y: 50, Ширина: 240, Высота: 200.
- Перетащите элемент text и в поле Текст: введите Полёт из аэропорта 1 в аэропорт 2.
- Перетащите из Библиотеки моделирования процессов по два объекта enter, delay и один объект exit. Поместите и соедините их так, как на Рис. 9.10.
- Установите свойства объектов согласно Табл. 9.7.
Предположим, что поступила заявка-самолёт типа А в объект enter4 и далее в объект с именем полётА12 (delay). Идентификатор полётА12 означает, что объект имитирует непосредственно полёт из аэропорта 1 в аэропорт 2. В аэропорту 2 заявка-самолёт входит в сегмент ожидания разгрузки.
Свойство | Значения |
---|---|
enter4 | |
Тип заявки: | ТранспСредство |
enter5 | |
Тип заявки: | ТранспСредство |
delay | |
Имя: | полётА12 |
Тип заявки: | ТранспСредство |
Задержка задаётся | Определённое время |
Время задержки | entity.врПолёта |
Вместимость | колСамТипА |
Включить сбор статистики | Установить флажок |
delay1 | |
Имя: | ПолётБ12 |
Тип заявки: | ТранспСредство |
Задержка задаётся | Определённое время |
Время задержки | entity.врПолёта |
Вместимость | колСамТипБ |
Включить сбор статистики | Установить флажок |
exit | |
Действия При выходе: | if (entity.типТрансп==1) enter10.take(entity); |
else enter11.take(entity); |
Ожидание разгрузки в аэропорту 1
Сегмент Ожидание разгрузки в аэропорту 1 предназначен для имитации ожидания разгрузки самолётов, прибывающих с грузом из аэропорта 2.
Создайте сегмент.
- Из палитры Презентация перетащите элемент Прямоугольник.
- На странице Местоположение и размер панели Свойства введите в поля X: 270, Y: 270, Ширина: 310, Высота: 200.
- Перетащите элемент text и в поле Текст: введите Ожидание разгрузки в аэропорту 1.
- Перетащите из Библиотеки моделирования процессов по два объекта enter, queue, hold и один объект exit. Поместите и соедините их так, как на Рис. 9.11.
- Установите свойства объектов согласно Табл. 9.8.
Предположим, что поступила заявка-самолёт из аэропорта 2 в объект enter6. Если средства разгрузки свободны, то есть выполняется условие (разгрузка1А.size()==0), разблокировывается объект hold2 и заявка-самолёт входит в объект наРазгрузку1 и далее в сегмент имитации разгрузки.
Свойство | Значения |
---|---|
enter6 | |
Тип заявки: | ТранспСредство |
Действие при входе | if (разгрузка1А.size()==0) hold2.setBlocked(false); |
enter7 | |
Тип заявки: | ТранспСредство |
Действие при входе | if (разгрузка1Б.size()==0) hold3.setBlocked(false); |
queue | |
Имя: | стоянкаРазгр1А |
Тип заявки: | ТранспСредство |
Вместимость | колСамТипА |
Включить сбор статистики | Установить флажок |
queue1 | |
Имя: | стоянкаРазгр1Б |
Тип заявки: | ТранспСредство |
Вместимость | колСамТипБ |
Включить сбор статистики | Установить флажок |
hold2 | |
Тип заявки: | ТранспСредство |
Изначально заблокирован | Установить флажок |
hold3 | |
Тип заявки: | ТранспСредство |
Изначально заблокирован | Установить флажок |
exit | |
Имя: | наРазгрузку1 |
Действия При выходе: | if (entity.типТрансп==1) {hold2.setBlocked(true); |
enter8.take(entity);} | |
else {hold3.setBlocked(true); | |
enter9.take(entity);} |
При выходе из объекта наРазгрузку1 блокируется объект hold2 кодом hold2.setBlocked(true), так как теперь средства разгрузки самолётов типа А аэропорта 1 заняты.
Если поступает заявка-самолёт типа Б, то она входит в сегмент через объект enter7. Имитация ожидания разгрузки заявкой-самолётом типа Б производится аналогично.
Разгрузка самолётов в аэропорту 1
Сегмент Разгрузка самолётов в аэропорту 1 предназначен для имитации разгрузки самолётов, прибывающих с грузом из аэропорта 2.
Создайте сегмент.
- Из палитры Презентация перетащите элемент Прямоугольник.
- На странице Местоположение и размер панели Свойства введите в поля X: 600, Y: 270, Ширина: 470, Высота: 200.
- Перетащите элемент text и в поле Текст: введите Разгрузка самолётов в аэропорту 1.
- Перетащите по два объекта enter, split, queue, delay, selectOutput и по одному объекту exit и sink. Поместите и соедините их так, как на Рис. 9.12.
- Установите свойства объектов согласно Табл. 9.9.
Предположим, что из сегмента ожидания разгрузки через объект enter8 поступила заявка-самолёт типа А в объект split2. Объектом split2 заявка размножается на число заявок, равное количеству контейнеров, которые должны быть выгружены из самолёта. Заявка-оригинал из модели не выводится.
Таким образом, далее каждая заявка интерпретируется как заявка-контейнер. Тем не менее, каждой копии присваиваются значения полей оригинала, так как после выгрузки все заявки-контейнеры, кроме последней, будут выведены из модели. Однако неизвестно какая из заявок будет последней - оригинал или копия. Поэтому и присваиваются копиям значения полей оригинала.
Свойство | Значения |
---|---|
enter8 | |
Тип заявки: | ТранспСредство |
enter9 | |
Тип заявки: | ТранспСредство |
split2 | |
Типы заявок: | |
Оригинал, Копия | ТранспСредство, ТранспСредство |
Количество копий | entity.колГрузоМест-1 |
Новая заявка (копия) | ТранспСредство |
Действия При выходе копии: | entity.типТрансп=original.типТрансп; |
entity.колГрузоМест=original.колГрузоМест; | |
entity.врПолёта=original.врПолёта; | |
entity.разные=original.разные; | |
split3 | |
Типы заявок: | |
Оригинал, Копия | ТранспСредство, ТранспСредство |
Количество копий | entity.колГрузоМест-1 |
Новая заявка (копия) | ТранспСредство |
Действия При выходе копии: | entity.типТрансп=original.типТрансп; |
entity.колГрузоМест=original.колГрузоМест; | |
entity.врПолёта=original.врПолёта; | |
entity.разные =original.разные; | |
queue | |
Имя: | очРазгр1А |
Тип заявки: | ТранспСредство |
Максимальная вместимость | Установить флажок |
Действия При выходе: | entity.разные=срВрВыгрКонтСам1А |
Включить сбор статистики | Установить флажок |
queue1 | |
Имя: | очРазгр1Б |
Тип заявки: | ТранспСредство |
Максимальная вместимость | Установить флажок |
Действия При выходе | entity.разные=срВрВыгрКонтСам1Б |
Включить сбор статистики | Установить флажок |
delay | |
Имя: | разгрузка1А |
Тип заявки: | ТранспСредство |
Задержка задаётся | Определённое время |
Время задержки | exponential(1/entity.разные) |
Вместимость | выгрКонтСам1А |
Действия При подходе к выходу | выгрКонтА1++; |
Включить сбор статистики | Установить флажок |
delay1 | |
Имя: | разгрузка1Б |
Тип заявки: | ТранспСредство |
Задержка задаётся | Определённое время |
Время задержки | exponential(1/entity.разные) |
Вместимость | выгрКонтСам1Б |
Действия При подходе к выходу | выгрКонтБ1++; |
Включить сбор статистики | Установить флажок |
selectOutput3 | |
Тип заявки: | ТранспСредство |
Выход true выбирается | При выполнении условия |
Условие | entity.колГрузоМест==выгрКонтА1 |
Действия При выходе (true): | выгрКонтА1=0; |
достКА21+=entity.колГрузоМест; | |
hold2.setBlocked(false); | |
selectOutput4 | |
Тип заявки: | ТранспСредство |
Выход true выбирается | При выполнении условия |
Условие | entity.колГрузоМест==выгрКонтБ1 |
Действия При выходе (true): | выгрКонтБ1=0; |
достКБ21+=entity.колГрузоМест; | |
hold3.setBlocked(false); | |
exit | |
Имя: | наОжПогр1 |
Тип заявки: | ТранспСредство |
Действия При выходе | достК21+=entity.колГрузоМест; |
if (entity.типТрансп==1) enter.take(entity); | |
else enter1.take(entity); | |
sink2 | |
Тип заявки: | ТранспСредство |
Заявки-контейнеры занимают очередь к объекту разгрузка1А, имитирующему непосредственно выгрузку контейнеров из самолёта типа А в аэропорту 1. При покидании очереди выполняется код entity.разные=срВрВыгрКонтСам1А, записывающий в поле с именем разные заявки-контейнера среднее время выгрузки одного контейнера.
После объекта разгрузка1А, на выходе которого ведётся счёт выгруженных контейнеров (выгрКонтА1++), заявки-контейнеры входят в объект selectOutput3.
Этот объект проверяет условие (entity.колГрузоМест ==выгрКонтА1): полная ли выгрузка самолёта? При выполнении этого условия, а оно будет выполнено тогда, когда будет выгружен последний контейнер, последняя заявка теперь уже в качестве заявки-самолёта поступит в объект наОжПогр1 (exit).
При выходе из объекта selectOutput3 переменной выгрКонтА1 присваивается значение 0, так она должна участвовать в очередной имитации выгрузки. Кроме того, разблокировывается объект hold2, так как теперь средства выгрузки аэропорта 1 самолётов типа А свободны
Из объекта наОжПогр1 (exit) заявка-самолёт типа А поступит в сегмент имитации ожидания погрузки самолётов типа А аэропорта 1.
Аналогичным образом имитируется выгрузка из самолёта типа Б. Имитация начинается с поступления заявки-самолёта через объект enter9 в объект split3.