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

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

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

Событийная часть сегмента, назовём её блок Абонент1, предназначена для имитации отправителя-получателя сообщений, поступления сообщений через случайные интервалы времени, розыгрыша параметров сообщений и счёта количества всего отправленных-полученных сообщений по категориям и абонентам, запоминания времени поступления каждого сообщения, используемого в последующем для расчёта минимального, максимального и среднего времени передачи одного сообщения.

Алгоритм блока Абонент1 приведен на рис. 4.7, а его реализация средствами AnyLogic - на рис. 4.8.

  1. Из палитры Презентация перетащите элемент Прямоугольник.
  2. Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 50, Ширина: 450, Высота: 380.
  3. Перетащите элемент text и в поле Текст: введите Абонент1.
    Алгоритм блока Абонент1

    увеличить изображение
    Рис. 4.7. Алгоритм блока Абонент1
  4. Перетащите из Основной библиотеки (Enterprise Library) объект source. Поместите его так же, как на рис. 4.8. Остальные объекты блока Абонент1 вы будете размещать по мере необходимости.

При построении модели нам придётся воспользоваться Java-кодом, в котором потребуются дополнительные поля сообщений. Для этого мы должны создать нестандартный класс заявки с дополнительными полями для записи и хранения параметров, о которых мы упоминали ранее (см. п. 4.1.4).

Реализация блока Абонент1 средствами AnyLogic

Рис. 4.8. Реализация блока Абонент1 средствами AnyLogic

Создайте класс заявки Message.

  1. Выделите объект source.
  2. В панели Проект щелкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
  3. Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса: Message.
  4. В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса (в ранних версиях - anylogic.libraries.enterprise.Entity). Щелкните кнопку Далее.
  5. Появится вторая страница Мастера создания Java класса. Добавьте поля Java класса, показанные на рис. 4.9.
    Дополнительные поля класса заявок Message

    Рис. 4.9. Дополнительные поля класса заявок Message
  6. Оставьте выбранными флажки Создать конструктор и Создать метод toString ().
  7. Щелкните Готово. Закройте редактор кода.

Продолжим построение блока Абонент1.

  1. Выделите объект source. На странице Основные панели Свойства установите следующие свойства:
    • Класс заявки: Message
    • Заявки прибывают согласно Времени между прибытиями
    • Время между прибытиями exponential(1/timeAbonent)
    • Количество заявок, прибывающих за один раз 1
    • Новая заявка new Message()
    • Действие при выходе
      double a=0;
      double b=kolAbonent;
         // Розыгрыш номера получателя сообщения
          a=uniform();
       for (int i=1; i<(kolAbonent+1); i++)
           {if (a<=((1/kolAbonent)*b))
              entity.numAbPol=i;
               b=b-1;}   
      entity.timeOtpr=time();
      entity.numAbOtpr=numAbonent;

    Объект source будет генерировать сообщения с интервалами времени, распределёнными по экспоненциальному закону. Принято, что сообщения от данного абонента-отправителя с равной вероятностью могут быть отправлены любому абоненту сети. Поэтому разыгрывается номер абонента-получателя сообщения, и заносится в numAbPol. В поле timeOtpr заносится время отправления сообщения.

    Замечание. Основная библиотека (Enterprise Library) содержит объекты TimeMeasureStart и TimeMeasureEnd, позволяющие измерять время прохождения заявки между двумя заданными точками диаграммы процесса. TimeMeasureStart запоминает момент времени, в который заявка проходит через этот объект. TimeMeasureEnd вычисляет для поступившей в него заявки разность между текущим временем и запомненным объектом TimeMeasureStart, на который ссылается этот объект. Эта разность добавляется в элементы сбора статистики, встроенные в объект TimeMeasureEnd.
  2. Перетащите объект selectOutput. Соедините его вход с выходом объекта source. Объект selectOutput выделяет и направляет объекту sink на уничтожение сообщения, адресованные абоненту-отправителю, то есть самому себе. Перетащите объект sink. Его вход соедините с выходом T объекта selectOutput.
  3. Перетащите объект selectOutput5. Данный объект предназначен для розыгрыша категорий отправляемых сообщений. Его вход соедините с выходом F объекта selectOutput. На странице Основные панели Свойства установите свойства согласно табл. 4.4. Эти свойства являются кодом. Код предназначен для счёта отправленных сообщений за сеть связи в целом и по категориям сообщений, определения количества отправленных сообщений за один прогон, розыгрыша длин сообщений по категориям, вывода расчётов по каждому абоненту, а также за сеть связи в целом.
  4. Перетащите два объекта selectOutput5 (имена selectOutput1 и selectOutput2). Объекты предназначены для разделения и счёта отправляемых сообщений по абонентам.
    Таблица 4.4.
    Свойство selectOutput
    Класс заявки: Message
    Выход true выбирается При выполнении условия
    Условие entity.numAbOtpr==entity.numAbPol
    Класс заявки: Message
    Использовать: Условия
    Действие при входе: a=uniform();
    f++;
    kolOtpr=f/kolProg;
    editbox5.setText(kolOtpr, true);
    get_Main().f++;
    get_Main().всегоОтпр=get_Main().f/
    kolProg;
    get_Main().editbox5.setText(get_Main().
    всегоОтпр, true);
    Условие 0 a<=verKat.get(1)
    Действие при выходе 0 entity.numKat=1;
    b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat));
    entity.dlina=(int)(b);
    d1++;
    kolOtprKat1=d1/kolProg;
    editbox6.setText(kolOtprKat1, true);
    get_Main().d1++;
    get_Main().всегоОтпрКат1=get_Main().d1/kolProg;
    get_Main().editbox6.setText(get_Main().всегоОтпрКат1, true);
    Условие 1 a<=ver verKat.get(2)
    Действие при выходе 1 entity.numKat=2;
    b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat));
    entity.dlina = (int)(b);
    d2++;
    kolOtprKat2=d2/kolProg;
    editbox7.setText(kolOtprKat2, true);
    get_Main().d2++;
    get_Main().всегоОтпрКат2=get_Main().d2/kolProg;
    get_Main().editbox7.setText(get_Main().всегоОтпрКат2, true);
    Условие 2 a<=verKat.get(3)
    Действие при выходе 2 entity.numKat=3;
    b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat));
    entity.dlina=(int)(b);
    d3++;
    kolOtprKat3=d3/kolProg;
    editbox8.setText(kolOtprKat3, true);
    get_Main().d3++;
    get_Main().всегоОтпрКат3=get_Main().d3/ kolProg;
    get_Main().editbox8.setText(get_Main().всегоОтпрКат3, true);
    Условие 3 a<=verKat.get(4)
    Действие при выходе 3 entity.numKat=4;
    b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat));
    entity.dlina=(int)(b);
    d4++;
    kolOtprKat4=d4/kolProg;
    editbox9.setText(kolOtprKat4, true);
    get_Main().d4++;
    get_Main().всегоОтпрКат4=get_Main().d4/kolProg;
    get_Main().editbox9.setText(get_Main().всегоОтпрКат4, true);
    Свойство selectOutput1
    Класс заявки: Message
    Использовать: Условия
    Условие 0 entity.numAbPol==1
    Условие 1 entity.numAbPol==2
    Действие при выходе 1 отпрАб2++;
    get_Main().отпр12=отпрАб2;
    Условие 2 entity.numAbPol==3
    Действие при выходе 2 отпрАб3++;
    get_Main().отпр13=отпрАб3;
    Условие 3 entity.numAbOtpr==entity.numAbPol
    Свойство selectOutput2
    Класс заявки: Message
    Использовать: Условия
    Условие 0 entity.numAbPol==4
    Действие при выходе 0 отпрАб4++;
    get_Main().отпр14=отпрАб4;
    Условие 1 entity.numAbPol==5
    Действие при выходе 1 отпрАб5++;
    get_Main().отпр15=отпрАб5;
    Условие 2 entity.numAbPol==6
    Действие при выходе 2 отпрАб6++;
    get_Main().отпр16=отпрАб6;
  5. Перетащите объект queue. Укажите его свойства: Имя:Буфер. Класс заявки: Message. Вместимость 100. Соедините выходы 0…3 selectOutput1 с входом элемента Буфер (см. рис. 4.8).
  6. Соедините выход по умолчанию selectOutput1 с входом selectOutput2. Через этот выход будут проходить на selectOutput2 сообщения, адресованные абонентам 4, 5 и 6.
  7. Выделите selectOutput2 и установите значения свойств, указанных также в табл. 4.4. Соедините все выходы selectOutput2 с входом элемента Буфер.
Алексей Гроссман
Алексей Гроссман

Здравствуйте, прошел курс "Концептуальное проектирование систем в AnyLogic и GPSS World". Можно ли получить по нему сертификат? У нас в институте требуют сертификаты для создания портфолио.

Елена Блинаева
Елена Блинаева