Опубликован: 07.11.2014 | Уровень: для всех | Доступ: платный
Лекция 6:

Модель функционирования системы связи

Имитация поступления средств связи

Создайте область просмотра на диаграмме класса Main для размещения объектов сегмента Постановка на дежурство.

  1. Из палитры Презентация перетащите элемент Область просмотра.
  2. На панели Свойства в поле Имя: введите постановка.
  3. Задайте Выравнивать по: Верхн. левому углу.
  4. Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  5. Перейдите на страницу Местоположение и размер. Введите в поля X: 0, Y: 0, Ширина: 700, Высота: 350.
  6. Перетащите элемент Скруглённый прямоугольник. Оставьте имя, предложенное системой. В нём мы разместим объекты сегмента Постановка на дежурство.
  7. Перейдите на страницу Местоположение и размер. Введите в поля X: 38, Y: 62, Ширина: 642, Высота: 268.
  8. На Область просмотра мы уже перетащили Скругленный прямоугольник. На нём мы будем размещать, как отмечалось ранее, объекты сегмента Постановка на дежурство.
  9. Перетащите на него элемент text и на панели Свойства в поле Текст: введите Постановка на дежурство. Поместите этот текст посредине в верхней части элемента Скругленный прямоугольник.
  10. Перетащите элемент Прямоугольник на Область просмотра. На странице Местоположение и размер введите в поля X: 50, Y: 100, Ширина: 170, Высота: 140.
  11. Перетащите элемент text на Прямоугольник и на панели Свойства в поле Текст: введите Имитация поступления СС.
  12. Перетащите объект source на Прямоугольник. Для записи и хранения параметров СС в поля заявок необходимо создать нестандартный тип агента. Создайте тип агента ComFacility.
  13. В панели Проекты Щёлкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
  14. Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса ComFacility.
  15. В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щёлкните Далее.
  16. Появится вторая страница Мастера создания Java класса. Добавьте следующие поля Java класса:
    tipCC          int;
    	timeMeanRem    double;
    	nach           double;
    	nach1          double;
    	timeOtkaz  		double;
  17. Оставьте выбранными флажки Создать конструктор и Создать метод toString ().
  18. Щёлкните кнопку Готово. Закройте редактор кода.
  19. Щёлкните правой кнопкой мыши в панели Проект только что созданный Java класс и в контекстном меню выберите Преобразовать Java класс в тип агента.
  20. Появится окно c автоматически созданными параметрами нестандартного типа заявок ComFacility. Закройте его.
  21. Выделите объект source.
  22. На панели Свойства уберите флажок Отображать имя.
  23. В полях Тип заявки: и Новая заявка: Agent замените ComFacility. Установите:
    • Прибывают согласно Интенсивности.
    • Интенсивность прибытия 1
    • Ограниченное количество прибытий установите флажок
    • Максимальное количество прибытий 1

    На странице Действия в поле При выходе: введите Java код:

    KolCC1=degurstvo.KCC1+degurstvo.KCCP1;
    degurstvo.DoxMaxCC1=
    round((degurstvo.KCC1*doxDegCC1)*ВремяРабСист*100);
    degurstvo.DoxMaxCC1=degurstvo.DoxMaxCC1/100;
    degurstvo.ZatrResCC1=
    round((degurstvo.KCCP1*zatrResCC1)*ВремяРабСист*100);
    degurstvo.ZatrResCC1=degurstvo.ZatrResCC1/100;
    KolCC2=degurstvo.KCC2+degurstvo.KCCP2;
    degurstvo.DoxMaxCC2=
    round((degurstvo.KCC2*doxDegCC2)*ВремяРабСист*100);
    degurstvo.DoxMaxCC2=degurstvo.DoxMaxCC2/100;
    degurstvo.ZatrResCC2=
    round((degurstvo.KCCP2*zatrResCC2)*ВремяРабСист*100);
    degurstvo.ZatrResCC2=degurstvo.ZatrResCC2/100;
    KolCC3=degurstvo.KCC3+degurstvo.KCCP3;
    degurstvo.DoxMaxCC3=
    round((degurstvo.KCC3*doxDegCC3)*ВремяРабСист*100);
    degurstvo.DoxMaxCC3=degurstvo.DoxMaxCC3/100;
    degurstvo.ZatrResCC3=
    round((degurstvo.KCCP3*zatrResCC3)*ВремяРабСист*100);
    degurstvo.ZatrResCC3=degurstvo.ZatrResCC3/100;
    KolCC4=degurstvo.KCC4+degurstvo.KCCP4;
    degurstvo.DoxMaxCC4=
    round((degurstvo.KCC4*doxDegCC4)*ВремяРабСист*100);
    degurstvo.DoxMaxCC4=degurstvo.DoxMaxCC4/100;
    degurstvo.ZatrResCC4=
    round((degurstvo.KCCP4*zatrResCC4)*ВремяРабСист*100);
    degurstvo.ZatrResCC4=degurstvo.ZatrResCC4/100;
    KolCC5=degurstvo.KCC5+degurstvo.KCCP5;
    degurstvo.DoxMaxCC5=
    round((degurstvo.KCC5*doxDegCC5)*ВремяРабСист*100);
    degurstvo.DoxMaxCC5=degurstvo.DoxMaxCC5/100;
    KolCC=KolCC1+KolCC2+KolCC3+KolCC4+KolCC5;
    degurstvo.ZatrResCC5=
    round((degurstvo.KCCP5*zatrResCC5)*ВремяРабСист*100);
    degurstvo.ZatrResCC5=degurstvo.ZatrResCC5/100;
    degurstvo.SumDoxMax=degurstvo.DoxMaxCC1+
    degurstvo.DoxMaxCC2+degurstvo.DoxMaxCC3+
    degurstvo.DoxMaxCC4+degurstvo.DoxMaxCC5;
    degurstvo.SumZatrRes=degurstvo.ZatrResCC1+
    degurstvo.ZatrResCC2+degurstvo.ZatrResCC3+
    degurstvo.ZatrResCC4+degurstvo.ZatrResCC5;

    Введённым кодом определяется количество СС всех типов, включая и резервные средства связи. Эти данные необходимы в последующем в объекте split. Количества СС как исходные данные будут размещены на агенте Degyrstvo, который мы создадим позже, поэтому в коде используется доступ к ним в виде, например, degyrstvo.KCC1.

    Кодом рассчитываются также максимальный доход от каждого типа СС и суммарный максимальный доход, а также затраты на содержание резервных СС по типам и суммарные затраты на содержание резервных СС всех типов.

    Такой подход к расчётам максимального дохода и затрат на содержание резервных СС принят для экономии машинного времени, поскольку эти показатели зависят только от продолжительности времени моделирования (ВремяРабСист), дохода от дежурства одного СС и затрат на содержание одного резервного СС. То есть данные для их расчёта не носят стохастический характер. Поэтому указанные показатели целесообразно рассчитать здесь, а затем использовать в конце моделирования при обработке накопленных статистических данных.

    Для вывода результатов моделирования с двумя знаками после запятой использовался метод round(). Предварительно результат умножался на 100, а потом делился на эту же величину. Например:

    degyrstvo.DoxMaxCC1=
    round((degyrstvo.KCC1*doxDegCC1)*ВремяРабСист*100);
    degyrstvo.DoxMaxCC1=degyrstvo.DoxMaxCC1/100;
  24. Добавьте объекты split и sink (Рис. 5.4).
  25. Выделите объект split. Установите свойства как на Рис. 5.5. Так как копии не унаследуют свойств от оригинала, поэтому на странице Действия в поле При выходе копии: введите Java код:
    Добавлены объекты split и sink

    Рис. 5.4. Добавлены объекты split и sink
    NumCC++;
    if (NumCC <= KolCC) 
      entity.tipCC = 5;
    if (NumCC <= (KolCC1+KolCC2+KolCC3+KolCC4))
       entity.tipCC = 4; 
    if (NumCC <= (KolCC1+KolCC2+KolCC3)) 
       entity.tipCC = 3;       
    if (NumCC <= (KolCC1+KolCC2)) 
       entity.tipCC = 2; 
    if (NumCC <= KolCC1) 
     entity.tipCC = 1;

Переменная NumCC предназначена для последовательного счёта СС всех типов. Она используется для определения принадлежности СС к соответствующему типу и занесения кода этого типа СС в поле entity.tipCC, например, entity.tipCC = 5, который необходим для нормального функционирования модели, то есть отличия СС по типам.

  1. Объект sink уничтожает заявку-оригинал.
Объект split с установленными свойствами

увеличить изображение
Рис. 5.5. Объект split с установленными свойствами
Распределитель средств связи

Блок Распределитель средств связи предназначен для распределения СС согласно их типам, т. е. общее количество поступивших СС он должен разделить по типам.

Данный блок реализуется четырьмя объектами selectOutput и одним объектом queue (Рис. 5.6). Возможна реализация этого блока и одним объектом selectOutput5 совместно также с объектом queue.

Объект queue предназначен для приема, хранения и отправки на дежурство исправных СС, поступающих из ремонта.

  1. Перетащите четыре объекта selectOutput и один объект queue из Библиотеки моделирования процессов на диаграмму агента Main. Соедините их так, как показано на Рис. 5.6.
  2. Установите на панели Свойства свойства объектов selectOutput согласно Табл. 5.2 (при использовании объекта selectOutput5 условия разделения СС по типам останутся такими же).
    Добавлены объекты SelectOutput и queue

    увеличить изображение
    Рис. 5.6. Добавлены объекты SelectOutput и queue
    Таблица 5.2.
    Имя Отображать имя Тип заявки: Выход true выбирается Условие
    СС1 Установите флажки ComFacility При выполнении условия entity.tipCC==1
    СС2 ComFacility entity.tipCC==2
    СС3 ComFacility entity.tipCC==3
    СС4 ComFacility entity.tipCC==4
  3. СС пятого типа будут направлены на выход false элемента СС4, поэтому пятый объект selectOutput не нужен.
  4. Оставьте имя объекта queue и не устанавливайте флажок Отображать имя.
  5. Оставьте Вместимость 100 и на странице Специфические установите флажок Включить сбор статистики.
  6. Перетащите из палитры Презентация три элемента text и в соответствующих полях Текст: введите текст, как на Рис. 5.6.
Создание нового активного объекта

На Рис. 5.7 показан в окончательном виде сегмент Постановка на дежурство после добавления блока На дежурство. Для добавления этого блока, который должен выполнять "связь" между сегментом Постановка на дежурство и сегментом Имитация дежурства, создадим новый тип агента. Экземпляром этого типа агента и будет нужный нам объект - блок На дежурство.

Сегмент Постановка на дежурство

увеличить изображение
Рис. 5.7. Сегмент Постановка на дежурство
  1. На панели Проекты Щёлкните правой кнопкой мыши Main, с которым вы работаете в данный момент, и выберите из контекстного меню Создать/Тип агента.
  2. Откроется окно Шаг 1. Создание нового типа агента.
  3. Оставьте Не использовать шаблоны типов агентов.
  4. Задайте в поле Имя нового агента: Degurstvo.
  5. Если нужно, в поле Описание: введите описание сущности, моделируемой этим типом агента.
  6. Щёлкните кнопку Готово.

Создайте область просмотра на типе агента Degurstvo для размещения элементов сегмента Имитация дежурства.

  1. В Палитре выделите Презентация. Перетащите элемент Область просмотра.
  2. Перейдите на панель Свойства.
  3. В поле Имя: введите дежурство.
  4. Задайте, как будет располагаться область просмотра относительно ее якоря, с помощью элемента управления Выравнивать по: Верхн. левому углу.
  5. Выберите режим масштабирования из выпадающего списка Масштабирование: Подогнать под окно.
  6. Перейдите на страницу Местоположение и размер. Введите в поля X: 40, Y: 0, Ширина: 730, Высота: 420.
Создание экземпляра нового типа агента

Созданный новый тип агента Degyrstvo является вложенным объектом. Как вы помните, нам нужно сделать так, чтобы СС передавались на дежурство в сегмент Имитация дежурства из сегмента Постановка на дежурство, а отремонтированные СС после ремонта из сегмента Имитация дежурства возвращались в сегмент Постановка на дежурство.

  1. Перетащите элемент Прямоугольник. На панели Свойства оставьте флажки Исключить и Отображается на верхнем уровне.
  2. Перейдите на страницу Местоположение и размер. Введите в поля X: 110, Y: 130, Ширина: 100, Высота: 180.
  3. Перетащите шесть элементов Порт из палитры Основная и разместите так, как показано на Рис. 5.8. Для всех элементов Порт оставьте только флажок Отображается на верхнем уровне.
  4. Возвратитесь на агента Main.
    Добавлены на Degyrstvo шесть портов

    Рис. 5.8. Добавлены на Degyrstvo шесть портов
  5. Из панели Проекты перетащите экземпляр типа агента Degyrstvo, и соедините так, как на Рис. 5.7. При этом следует иметь в виду, что положение портов на экземпляре типа агента Degyrstvo изменить нельзя. Это можно сделать лишь на самом типе агента.
Игорь Маникин
Игорь Маникин

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

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

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

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

entity.time_vxod=time(); 

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

Ja Sto
Ja Sto
Германия, Hessen
Бекмурза Иван
Бекмурза Иван
Киргизия, Ош