Коллеги, спасибо за очень информативный и полезный курс. Прошёл три лекции. Столкнулся с проблемой, что обе модели не могут закончить расчёт по причине ограничения бесплатной версии "создано максимально допустимое число динамически создаваемых агентов (50000)". По скриншотам Лекции 2 видно, что да, модель создает гораздо больше 50000 агентов. В принципе, мне то и диплом не особо нужен. Но хотелось бы выполнить практические работы. Нет ли возможности откорректировать эту проблему? Или может я чего не так делаю? Еще раз спасибо за прекрасный курс! |
Модель функционирования системы воздушных перевозок
Ввод исходных данных
Организуйте ввод исходных данных для модели в одном месте. Для удобства пользования, например, при модификации исходных данных, все их целесообразно разделить на две группы по признаку принадлежности к аэропорту 1 и аэропорту 2.
- Перетащите элемент Скруглённый прямоугольник на элемент Область просмотра с именем исхДанные.
- На странице Местоположение и размер панели Свойства введите в поля X: 30, Y: 1880, Ширина: 580, Высота: 450.
- Перетащите элемент text и в поле Текст: введите Исходные данные.
- Из библиотеки Основная перетащите элементы Параметр и поместите их так, как на Рис. 9.2.
- Значения свойств установите согласно Табл. 9.3.
Имя | Тип | Значение по умолчанию |
---|---|---|
Самолёты типа А | ||
колСамТипА | int | 2 |
грузПодСамА | int | 50 |
Аэропорт 1 | ||
минКонтПост1 | int | 1 |
максКонтПост1 | int | 15 |
срВрПостКонт1 | double | 0,5 |
погрКонтСам1А | int | 2 |
погрКонтСам1Б | int | 2 |
выгрКонтСам1А | int | 3 |
выгрКонтСам1Б | int | 3 |
срВрПогрКонтСам1А | double | 0,1 |
срВрПогрКонтСам1Б | double | 0,1 |
срВрВыгрКонтСам1А | double | 0,2 |
срВрВыгрКонтСам1Б | double | 0,2 |
срВрПолётаА12 | double | 3,4 |
отклВрПолётаА12 | double | 0,5 |
срВрПолётаБ12 | double | 3,2 |
отклВрПолётаБ12 | double | 0,5 |
Самолёты типа Б | ||
колСамТипБ | int | 1 |
грузПодСамБ | int | 100 |
Аэропорт 2 | ||
минКонтПост2 | int | 1 |
максКонтПост2 | int | 22 |
срВрПостКонт2 | double | 0,4 |
погрКонтСам2А | int | 2 |
погрКонтСам2Б | int | 2 |
выгрКонтСам2А | int | 2 |
выгрКонтСам2Б | int | 2 |
срВрПогрКонтСам2А | double | 0,2 |
срВрПогрКонтСам2Б | double | 0,1 |
срВрВыгрКонтСам2А | double | 0,2 |
срВрВыгрКонтСам2Б | double | 0,2 |
срВрПолётаА12 | double | 3,6 |
отклВрПолётаА12 | double | 0,6 |
срВрПолётаБ12 | double | 4,1 |
отклВрПолётаБ12 | double | 0,8 |
Вывод результатов моделирования
Организуйте вывод результатов моделирования. Их также, как и исходные данные, следует разбить на две группы по признаку принадлежности к соответствующему аэропорту, выделить итоговые показатели. На этой области просмотра можно поместить и вспомогательные переменные, предназначенные для накопления необходимых для расчёта показателей статистических данных.
- Перетащите элемент Скруглённый прямоугольник на элемент Область просмотра с именем Результаты.
- На странице Местоположение и размер панели Свойства введите в поля X: 25, Y: 2610, Ширина: 510, Высота: 450.
- Перетащите элемент text и на сранице Текст: введите Результаты моделирования.
- Из библиотеки Основная перетащите элементы Переменная и поместите их так, как на Рис. 9.3. Для всех переменных сохраните предлагаемый тип double, значение по умолчанию - 0.
- Перетащите ещё элементы text и введите пояснения к результатам моделирования как на Рис. 9.3.
- Перетащите элемент text и в поле Текст: введите Вспомогательные переменные.
- Перетащите элементы Переменная и поместите их согласно Рис. 9.3. Для всех переменных оставьте предлагаемый тип double, значение по умолчанию - 0.
- С целью сокращения машинного времени для вывода результатов моделирования используйте способ Событие (event). Код, который необходим для обработки статистических данных при наступлении события, вы напишите после построения событийной части модели.
Приступайте к построению событийной части модели, которая в соответствии со структурой системы воздушных перевозок включает имитацию функционирования аэропорта 1 (Рис. 9.4) и аэропорта 2 (Рис. 9.5).
Имитация функционирования аэропорта 1
Прибытие самолётов в аэропорт 1. Ожидание погрузки
Сегмент предназначен для имитации первоначального (последующего) прибытия самолётов в аэропорт 1, размещения их на стоянках, ожидания и отправки на погрузку (разгрузку) контейнеров.
- Из палитры Презентация перетащите элемент Прямоугольник.
- На странице Местоположение и размер панели Свойства введите в поля X: 30, Y: 50, Ширина: 310, Высота: 200.
- Перетащите элемент text и в поле Текст: введите Прибытие самолётов в аэропорт 1. Ожидание погрузки.
- Перетащите из Библиотеки моделирования процессов по два объекта source, enter, queue, hold и один объект exit. Поместите и соедините их так, как на Рис. 9.6.
При построении модели вам придётся воспользоваться Java-кодом, в котором потребуются дополнительные поля заявок. Для этого вы должны создать нестандартный тип заявки с дополнительными полями для записи и хранения параметров, о которых упоминалось ранее (см. п. 9.1.4).
Создайте тип заявок ТранспСредство.
- Выделите объект source.
- В панели Проект щёлкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
- Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса: ТранспСредство.
- В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щёлкните кнопку Далее.
- Появится вторая страница Мастера создания Java класса. Добавьте поля Java класса, показанные на Рис. 9.7.
- Оставьте флажки Создать конструктор и Создать метод toString (). Щёлкните Готово. Закройте редактор кода.
- Щёлкните правой кнопкой созданный Java класс и из меню выберите Преобразовать Java класс в тип агента.
- Аналогичным образом создайте типы заявок ГрузАэропорт1 и ГрузАэропорт2 с дополнительными полями колГрузоМест1 и колГрузоМест2 типа int соответственно. Эти классы заявок, как вы помните, будут использоваться при имитации поступления партий грузов в аэропорты 1 и 2 соответственно.
Продолжите построение сегмента имитации Прибытие самолётов в аэропорт 1 и ожидания погрузки.
Поочередно выделите объекты этого сегмента и установите их свойства согласно Табл. 9.4.
Свойство | Значения |
---|---|
source | |
Имя: | самолёт1 |
Тип заявки: | ТранспСредство |
Прибывают согласно | Времени между прибытиями |
Время между прибытиями | 0 |
Количество заявок, прибывающих за один раз | колСамТипА |
Ограниченное количество прибытий | Установить флажок |
Максимальное количество прибытий | 1 |
Новая заявка | ТранспСредство |
Действия При выходе: | entity.типТрансп=1; |
entity.колГрузоМест=грузПодСамА; | |
source1 | |
Имя: | самолёт2 |
Тип заявки: | ТранспСредство |
Прибывают согласно | Времени между прибытиями |
Время между прибытиями | 0 |
Количество заявок, прибывающих за один раз | колСамТипБ |
Ограниченное количество прибытий | Установить флажок |
Максимальное количество прибытий | 1 |
Новая заявка | ТранспСредство |
Действия При выходе: | entity.типТрансп=2; |
entity.колГрузоМест= грузПодСамБ; | |
queue | |
Имя: | стоянкаПогр1А |
Тип заявки: | ТранспСредство |
Вместимость | колСамТипА |
Включить сбор статистики | Установить флажок |
queue1 | |
Имя: | стоянкаПогр1Б |
Тип заявки: | ТранспСредство |
Вместимость | колСамТипБ |
Включить сбор статистики | Установить флажок |
hold | |
Тип заявки: | ТранспСредство |
Изначально заблокирован | Установить флажок |
hold1 | |
Тип заявки: | ТранспСредство |
Изначально заблокирован | Установить флажок |
exit | |
Имя: | наПогрузку1 |
Тип заявки: | ТранспСредство |
Действия При выходе: | if (entity.типТрансп==1) {hold.setBlocked(true); |
enter2.take(entity);} | |
else {hold1.setBlocked(true); | |
enter3.take(entity);} | |
enter | |
Тип заявки: | ТранспСредство |
enter1 | |
Тип заявки: | ТранспСредство |
Остановимся на замысле построения сегмента.
При запуске модели источники самолёт1 и самолёт2 генерируют число заявок, равное количеству самолётов типа А и типа Б соответственно. На этом активность источников прекращается.
Эти заявки-самолёты поступают на имитируемые объектами queue стоянки стоянкаПогр1А и стоянкаПогр1Б соответственно.
Элементы hold и hold1 изначально заблокированы, поэтому заявки-самолёты дальше не проходят.
Элементы hold и hold1 управляются сегментом Поступление и учёт контейнеров в аэропорту 1. Как только в аэропорт 1 поступит количество контейнеров, достаточное для полной загрузки самолёта типа А, и этот самолёт имеется на стоянке, а также нет самолётов типа А на погрузке, формируется команда на разблокировывание элемента hold.
Заявка-самолёт поступает на объект наПогрузку1 (объект exit) и далее на сегмент Погрузка контейнеров в аэропорту 1.
Если ожидающих погрузку самолётов типа А нет, а количество контейнеров достаточно для полной загрузки самолёта типа Б и он имеется в наличии, то аналогично формируется команда на разблокировывание элемента hold1. Заявка-самолёт также поступает на объект наПогрузку1 (объект exit) и далее на сегмент Погрузка контейнеров в аэропорту 1.
Элементы enter и enter1 увеличивают число входов объектов queue и queue1 соответственно. Через них поступают в последующем заявки-самолёты, прибывшие из аэропорта 2, разгруженные и теперь отправленные на стоянки ожидания погрузки в аэропорту 1.
Поступление и учёт контейнеров в аэропорту 1
Сегмент Поступление и учёт контейнеров в аэропорту 1 предназначен для имитации приёма поступающих от источников грузов (контейнеров), учёта их, определения необходимого количества контейнеров для загрузки соответствующего самолёта и формирования команды для отправки этого самолёта на погрузку контейнеров.
Создайте этот сегмент.
- Из палитры Презентация перетащите элемент Прямоугольник.
- На странице Местоположение и размер панели Свойства введите в поля X: 30, Y: 270, Ширина: 220, Высота: 200.
- Перетащите элемент text и в поле Текст: введите Поступление и учёт контейнеров в аэропорту 1.
- Перетащите из Библиотеки моделирования процессов по одному объекту source, selectOutput5 (имя selectOutput) и sink. Поместите и соедините их так, как на Рис. 9.8.
Установите свойства объектов согласно Табл. 9.5.
Объект source с именем истГрузов1 генерирует заявку-партию класса ГрузАэропорт1 поступивших контейнеров, число которых в партии распределено по равномерному закону. Заявка-партия поступает на объект selectOutput.
В условии 1 проверяется наличие числа контейнеров, достаточного для полной загрузки самолёта типа А. Если число контейнеров недостаточно, заявка-партия уничтожается. Так продолжается до тех пор, пока не выполнится условие 1.
Свойство | Значения |
---|---|
source | |
Имя: | истГрузов1 |
Тип заявки: | ГрузАэропорт1 |
Прибывают согласно | Времени между прибытиями |
Время между прибытиями | exponential(1/срВрПостКонт1) |
Количество заявок, прибывающих за один раз | 1 |
Новая заявка | ГрузАэропорт1 |
Действия При выходе | a=(uniform_discr(минКонтПост1,максКонтПост1)); |
всегоПостК1+=a; | |
текНалКонт1+=a; | |
selectOutput | |
Тип заявки: | ГрузАэропорт1 |
Использовать: | Условия |
Условие 1 | текНалК1<грузПодСамА |
Условие 2 | стоянкаПогр1А.size()>0&& |
погрузка1А.size()==0 | |
Действия При выходе 2 | текНалК1-=грузПодСамА; |
hold.setBlocked(false); | |
Условие 3 | текНалК1<грузПодСамБ |
Условие 4 | стоянкаПогр1Б.size()>0&& |
погрузка1Б.size()==0 | |
Действия При выходе 4 | текНалК1-=грузПодСамБ; |
hold1.setBlocked(false); | |
sink | |
Тип заявки: | ГрузАэропорт1 |
После выполнения условия 1 проверяется условие 2: наличие самолётов типа А на стоянке ожидания погрузки и незанятость пунктов погрузки.
При выполнении условия 2 формируется команда на разблокировывание элемента hold (см. п. 9.1.8.2) и самолёт типа А отправляется на погрузку.
Если условие 2 не выполняется, например, при отсутствии свободного самолёта типа А, проверяется условие 3.
Если условие 3 не выполняется, то есть недостаточно контейнеров для полной загрузки самолёта типа Б, заявка-партия уничтожается.
Если условие 3 выполняется (поступило число контейнеров, достаточное для полной загрузки самолёта типа Б), проверяется условие 4: наличие самолётов типа Б на стоянке ожидания погрузки и незанятость пунктов погрузки.
Если условие 4 не выполняется, заявка-партия уничтожается.
При выполнении условия 4 формируется команда на разблокировывание элемента hold1 (см. п. 9.1.8.2) и самолёт типа Б отправляется на погрузку.
Описанная последовательность проверок производится каждый раз при появлении в модели очередной заявки-партии. Все заявки типа ГрузАэропорт1 выводятся из модели.