Опубликован: 07.11.2014 | Доступ: свободный | Студентов: 442 / 37 | Длительность: 15:17:00
ISBN: 978-5-9556-0161-8
Тема: САПР
Лекция 8:

Модель предоставления ремонтных услуг

< Лекция 7 || Лекция 8: 12345 || Лекция 9 >

Построение событийной части модели

Строить событийную часть модели будем последовательной реализацией средствами AnyLogic выделенных ранее сегментов (см. п. 8.1.4):

  • источники заявок;
  • диспетчеры;
  • мастера;
  • учёт выполненных заявок.
  1. Создайте область просмотра для размещения элементов модели на агенте Main. Из палитры Презентация перетащите элемент Область просмотра. Перейдите на страницу Основные панели Свойства. В поле Имя введите МодРемУслуги.
  2. Задайте, как будет располагаться область просмотра относительно ее якоря, с помощью элемента управления Выравнивать по: Верхн. левому углу.
  3. Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  4. На странице Местоположение и размер панели Свойства введите в поля X: 0, Y: 0, Ширина: 1240, Высота: 460.
  5. Из палитры Презентация перетащите элемент Прямоугольник. Оставьте имя, предложенное системой. В прямоугольнике мы разместим объект source для имитации поступления заявок.
  6. На странице Местоположение и размер панели Свойства введите в поля X: 20, Y: 120, Ширина: 100, Высота: 140.
  7. Перетащите элемент text на прямоугольник и на странице Текст панели Свойства введите Источники заявок.
  8. Перетащите ещё один элемент Прямоугольник. Оставьте имя, предложенное системой. В этом прямоугольнике мы разместим объекты сегмента Диспетчеры для имитации работы диспетчеров.
  9. На странице Местоположение и размер панели Свойства введите в поля X: 130, Y: 30, Ширина: 590, Высота: 410.
  10. Перетащите элемент text на прямоугольник и на странице Текст панели Свойства введите Диспетчеры.

На Рис. 8.3 показаны объекты двух сегментов: Источники заявок и Диспетчеры. Приступим к их построению.

Сегмент Источники заявок
  1. Из Библиотеки моделирования процессов перетащите объект source на прямоугольник с названием Источники заявок (см. Рис. 8.3). Создайте новый тип агента Заявка.
  2. В панели Проект щёлкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
    Сегменты Источники заявок и Диспетчеры

    увеличить изображение
    Рис. 8.3. Сегменты Источники заявок и Диспетчеры
  3. Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового типа агента Заявка.
  4. В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щёлкните Далее.
  5. Появится вторая страница Мастера создания Java класса. Добавьте следующие поля Java класса:
    double типЗ;
    	double видР;
    	double времяР;
  6. Оставьте выбранными флажки Создать конструктор и Создать метод toString ().
  7. Щёлкните кнопку Готово. Выделите правой кнопкой мыши созданный Java класс Заявка и выполните в контекстном меню Преобразовать Java класс в тип агента.
  8. Выделите объект source. На странице Основные панели Свойства уберите флажок Отображать имя. В полях Тип заявки: и Новая заявка Agent замените Заявка.

    Установите:

    • Прибывают согласно Времени между прибытиями
    • Время между прибытиями exponential(1/(Tp/n))
    • Действия При выходе:
        entity.типЗ=uniform();
         entity.видР=uniform();

Java-кодом в поля entity.типЗ и entity.видР заносятся равномерно распределённые случайные числа. Они нужны далее для розыгрыша кодов типов заявок и кодов видов ремонта.

Сегмент Диспетчеры

Сегмент Диспетчеры предназначен для распределения по группам мастеров заявок согласно их типам и видам ремонта в зависимости от занятости мастеров в текущий момент времени.

Данный сегмент реализуется шестью объектами selectOutput5, восемью объектами selectOutput, объектами queue, delay и sink (см. Рис. 8.3).

  1. Перетащите указанные объекты (или, перетащив один, скопируйте остальные, но перед копированием измените свойства, общие для всех копируемых объектов, например, класс заявки Заявка) из Основной библиотеки на диаграмму класса Main. Соедините их так, как показано на Рис. 8.3.
  2. Установите свойства объектов согласно Табл. 8.2.
Таблица 8.2.
Свойства Значение
Имя типЗаявки
Использовать Условия
Условие 1 entity.типЗ<=p1
Действия При выходе 1 entity.типЗ=1;
постЗаявТип1++;
постЗаявТип++;
Условие 2 entity.типЗ<=p2
Действия При выходе 2 entity.типЗ=2;
постЗаявТип2++;
постЗаявТип++;
Условие 3 entity.типЗ<=p3
Действия При выходе 3 entity.типЗ=3;
постЗаявТип3++;
постЗаявТип++;
Условие 4 entity.типЗ<=p4
Действия При выходе 4 entity.типЗ=4;
постЗаявТип4++;
постЗаявТип++;
Имя oтказ
Выход true выбирается C заданной вероятностью
Вероятность 0,98
Имя поТипамЗаяв
Использовать Условия
Условие 1 entity.типЗ==1
Условие 2 entity.типЗ==2
Условие 3 entity.типЗ==3
Условие 4 entity.типЗ==4
Имя видРемЗаяв1
Использовать Условия
Условие 1 entity.видР<=p11
Действия При выходе 1 entity.видР=1;
entity.времяР=exponential(1/T11);
Условие 2 entity. видР<=p12
Действия При выходе 2 entity.видР=2;
entity.времяР=exponential(1/T12);
Условие 3 entity.видР=<p13
Действия При выходе 3 entity.видР=3;
entity.времяР=exponential(1/T13);
Имя видРемЗаяв2
Использовать Условия
Условие 1 entity.видР<=p21
Действия При выходе 1 entity.видР=1;
entity.времяР=exponential(1/T21);
Условие 2 entity. видР<=p22
Действия При выходе 2 entity.видР=2;
entity.времяР=exponential(1/T22);
Условие 3 entity.видР=<p23
Действия При выходе 3 entity.видР=3;
entity.времяР=exponential(1/T23);
Имя видРемЗаяв3
Использовать Условия
Условие 1 entity.видР<=p31
Действия При выходе 1 entity.видР=1;
entity.времяР=exponential(1/T31);
Условие 2 entity. видР<=p32
Действия При выходе 2 entity.видР=2;
entity.времяР=exponential(1/T32);
Условие 3 entity.видР=<p33
Действия При выходе 3 entity.видР=3;
entity.времяР=exponential(1/T33);
Имя видРемЗаяв4
Использовать Условия
Условие 1 entity.видР<=p41
Действия При выходе 1 entity.видР=1;
entity.времяР=exponential(1/T41);
Условие 2 entity. видР<=p42
Действия При выходе 2 entity.видР=2;
entity.времяР=exponential(1/T42);
Условие 3 entity.видР=<p43
Действия При выходе 3 entity.видР=3;
entity.времяР=exponential(1/T43);
Имя свобМастер1_2
Выход true выбирается При выполнении условия
Условие (очМастеров1.size()==0)&&
(мастера1.size()<колМастеров1)&&
(мастера2.size()!=0)
Имя свобМастер1_3
Выход true выбирается При выполнении условия
Условие (очМастеров1.size()==0)&&
(мастера1.size()<колМастеров1)&&
(мастера3.size()!=0)
Имя свобМастер1_4
Выход true выбирается При выполнении условия
Условие (очМастеров1.size()==0)&&
(мастера1.size()<колМастеров1)&&
(мастера4.size()!=0)
Имя свобМастер2_3
Выход true выбирается При выполнении условия
Условие (очМастеров2.size()==0)&&
(мастера2.size()<колМастеров2)&&
(мастера3.size()!=0)
Имя свобМастер2_4
Выход true выбирается При выполнении условия
Условие (очМастеров2.size()==0)&&
(мастера2.size()<колМастеров2)&&
(мастера4.size()!=0)
Имя свобМастер3_4
Выход true выбирается При выполнении условия
Условие (очМастеров3.size()==0)&&
(мастера3.size()<колМастеров3)&&
(мастера4.size()!=0)
Имя очДисп
Макс. вместимость Установить флажок
Имя Дисп
Тип Определённое время
Время задержки normal(To1,T1)
Вместимость колДисп
Действия при выходе коэфИспДисп=дисп.statsUtilization.mean();

Объектом типЗаявки разыгрывается код типа заявки. Например, в поступившей заявке entity.типЗ=0.723. Проверяется условие 0: entity.типЗ=0.723<=p1=0.5. Условие 0 не выполняется. Тогда проверяется условие 1: entity.типЗ= 0.723 <=p2=0.75. Условие 1 выполняется. Заявка пропускается на выход 1. При этом выполняется код, записанный в поле Действия При выходе 1,

entity.типЗ=2;
постЗаявТип2++;
постЗаявТип++;

Кроме записи кода 2 в поле entity.типЗ=2, учитывается количество поступивших заявок 2 типа и количество всех типов поступивших заявок. Последнее в дальнейщем используется для определения вероятности выполнения заявок.

С выходов 0…3 объекта типЗаявки заявки поступают в очДисп (объект queue) с максимальной вместимостью, а затем в объект дисп (delay), имитирующий время работы одного из диспетчеров с одной заявкой.

Объект отказ (selectOutput) предназначен для розыгрыша отказа в принятии заявки с вероятностью q = 2 %. Заявки, получившие отказ, уничтожаются объектом sink.

Принятые к выполнению заявки распределяются по типам объектом поТипамЗаяв. С выходов 0…3 этого объекта заявки поступают на объекты видРемЗаяв1…видРемЗаяв4 соответственно. Аналогичным образом как объектом типЗаявки этими объектами разыгрываются для заявок 1…4 типов коды видов 1…3 ремонтов.

Функции остальных объектов сегмента Диспетчеры рассмотрим в п. 8.1.7.3.

< Лекция 7 || Лекция 8: 12345 || Лекция 9 >
Игорь Маникин
Игорь Маникин

Коллеги, спасибо за очень информативный и полезный курс. Прошёл три лекции. Столкнулся с проблемой, что обе модели не могут закончить расчёт по причине ограничения бесплатной версии "создано максимально допустимое число динамически создаваемых агентов (50000)". По скриншотам Лекции 2 видно, что да, модель создает гораздо больше 50000 агентов. В принципе, мне то и диплом не особо нужен. Но хотелось бы выполнить практические работы. Нет ли возможности откорректировать эту проблему? Или может я чего не так делаю?

Еще раз спасибо за прекрасный курс!

Артём Нагайцев
Артём Нагайцев

Выдает ошибку "entity cannot be resolved to a variable" при попытке запуска. В чем может быть причина? Ошибка в строках

entity.time_vxod=time(); 

time_obrabotki.add(time()-entity.time_vxod);