Концептуальное проектирование систем в AnyLogic 7 и GPSS World

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

Разбить на страницы
Показывать лекцию целиком

Модель в AnyLogic

Постановка задачи

В сети связи имеются $$n_1$$ абонентов, обменивающихся между собой сообщениями. Адресация сообщений организована посредством маршрутизаторов. На маршрутизатор поступают сообщения через случайные промежутки времени от $$n_1$$ абонентов со средними интервалами времени $$T_1, T_2, T_{n_1}$$.

Сообщения могут быть $$n_2$$ категорий с вероятностями их появления $$p_{k1}, p_{k2}, p_{kn{_2}}$$ $$(p_{k1}+p_{k2}+...+p_{kn{_2}}=1)$$ и вычислительными сложностями обработки $$S_1, S_2,...,S_{n_{2}}$$ операций соответственно.

Маршрутизатор имеет k входов и k выходов, входной буфер 1 ёмкостью $$L_1$$ байт для хранения сообщений, ожидающих обработки. В маршрутизаторе сообщения обрабатываются вычислительным комплексом (ВК) с производительностью Q операций/с. В случае полного заполнения буфера 1 поступающие на маршрутизатор сообщения теряются. Принято допущение, что одна операция вычислительной сложности соответствует одному байту при размещении сообщения в буфере.

После обработки сообщения в зависимости от направления передачи поступают в соответствующие буферы, стоящие на входах каждого i-го направления связи, $$i=\overline{1,k}$$. Каждый буфер имеет ёмкость $$L_{2i}$$ байт, $$i=\overline{1,k}$$. В случае полного заполнения буфера направления поступающее сообщение теряется.

Из буферов сообщения передаются по своим направлениям. Каждое направление имеет основной и резервный каналы связи. Скорость передачи сообщений по основному и резервному каналам связи каждого из направлений $$V_{пi}$$ бит/с, $$i=\overline{1,k}$$.

ВК и основные каналы связи имеют конечную надёжность. Интервалы времени $$T_{отВК}$$ и $$T_{отК_{1}}, T_{отК_{2}}, …,T_{отК_{n}}$$ между отказами ВК и каналов связи случайные. Длительности восстановления ВК и каналов связи $$T_{вВК}}$$ и $$T_{вК_{1}}, T_{вК_{2}}, …,T_{вК_{n}}$$также случайные.

При отказе обрабатываемые ВК и передаваемые по каналам связи сообщения теряются.

Исходные данные

$$n_1=6; k=4;$$ $$Exponential(T_{1})=Exponential(T_{2})=…= Exponential(T_{6})=Exponential(30);$$ $$n_2=4; p_{k1}=0,3; p_{k2}=0,2; p_{k3}=0,2; p_{k4}=0,3; $$ $$Q=40000 оп/с; L_1=5000000;$$ $$normal(S_1, S_{o1}=normal(53000, 6100);$$ $$normal(S_3, S_{o3}=normal(66000, 7000);$$ $$normal(S_4, S_{o4}=normal(50000, 500);$$ $$exponential(T_{отК_{1}})=…= exponential(T_{отК_{8}})=exponential(360);$$ $$exponential(T_{вК_{1}})=…= exponential(T_{вК_{8}})=exponential(3.2);$$ $$exponential(T_{отВК})=exponential(360), exponential(T_{вВК})=exponential(3.7);$$ $$V_{пi}=5000 бит/с, n_{3i}=1, L_{2i}=250000, i=\overline{1,4}.$$

Задание на исследование

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

Формализованное описание модели

Сообщения поступают от $$n_1=6$$ источников. Интервалы поступления сообщений, интервалы между отказами и время восстановления работоспособности распределяются по экспоненциальному закону (exponential), а вычислительные сложности сообщений в зависимости от категорий - по нормальному закону (normal). Для некоторых одинаковых параметров с целью упрощения принято, что они имеют равные значения, например, средние значения интервалов поступления сообщений. Модель же будет построена в некотором приближении универсальной так, что все эти значения могут быть любыми.

Вариант сети связи при принятых исходных данных (в том числе количестве входов и выходов маршрутизатора) может быть представлен в следующем виде (Рис. 4.1).

(рис 4.1) Вариант схемы сети связи

Сообщения абонентов А1 и А2 поступают на вход 1 маршрутизатора М1, абонентов А3 и А4 - на вход 2 маршрутизатора М1, абонента А5 - на вход 3 маршрутизатора М1, абонента А6 - на вход 4 маршрутизатора М1.

Маршрутизатор М1 настроен таким образом, что сообщения, адресованные абонентам А1 и А2 поступают на вход 1 маршрутизатора М2, а абонентам А3 и А4 - на вход 2 маршрутизатора М2.

Маршрутизатор М2 настроен так, что его выходы 1…4 подключены к каналам связи, по которым передаются сообщения, адресованные абонентам А1…А4 соответственно.

Видно, что система связи представляет собой многофазную многоканальную систему массового обслуживания замкнутого типа с ограниченными ёмкостями буферов (накопителей), то есть с отказами.

Теперь представим маршрутизатор также как систему массового обслуживания и в общем виде (Рис. 4.2).

(рис 4.2) Маршрутизатор как система массового обслуживания

В маршрутизаторе выделены блок контроля 1, накопитель (буфер) ВК, непосредственно ВК, блок контроля 2, накопители направлений связи.

Назначение и функции выделенных в структуре сети связи и маршрутизаторе блоков будет рассмотрено позже в ходе изложения технологии построения модели в AnyLogic.

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

Сообщения, поступающие на маршрутизатор, должны иметь следующие параметры:

  • numAbOtpr - номер абонента-отправителя сообщения;
  • numAbPol - номер абонента-получателя сообщения;
  • numKat - номер категории сообщения;
  • timeOtpr - время отправления сообщения абонентом;
  • dlina - длина сообщения, байт;
  • timeObr - время обработки сообщения ВК, с;
  • timePered - время передачи сообщения по каналу связи, с.
  • Эти параметры получаются путем розыгрыша по следующим исходным данным:

  • kolAbonent - количество абонентов;
  • timeAbonent - среднее время отправления сообщений абонентом, с;
  • verKat={verKat1, verKat2, verKat3, verKat4} - вероятности распределения видов сообщений первой, второй, третьей и четвёртой категорий соответственно,
  • verKat1+verKat2+verKat3+verKat4=1; dlKat={dlKat1, dlKat2, dlKat3, dlKat4} - средние длины сообщений, байт, первой, второй, третьей и четвёртой категорий соответственно;
  • dlKat0={dlKat01, dlKat02, dlKat03, dlKat04} - стандартные отклонения длин сообщений, байт, первой, второй, третьей и четвёртой категорий соответственно;
  • proizvod - производительность ВК при обработке сообщения, оп/c;
  • skorPeredKan - среднее время передачи сообщений по каналу связи, бит/с;
  • skorPeredKanR - среднее время передачи сообщений по резервному каналу связи, бит/с;
  • timeBklKanR - время включения резервного канала связи.
  • В ходе моделирования собирается следующая статистика:

  • kolOtprKat1, kolOtprKat2, kolOtprKat3,kolOtprKat4, kolOtpr - количество отправленных абонентом сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • kolPolKat1, kolPolKat2,kolPolKat3,kolPolKat4, kolPol - количество полученных абонентом сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • всегоОтпрКат1, всегоОтпрКат2, всегоОтпрКат3, всегоОтпрКат4, всегоОтпр - количество отправленных в сети сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • всегоПолКат1, всегоПолКат2, всегоПолКат3, всегоПолКат4, всегоПол - количество полученных в сети сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • количество отправленных сообщений каждым абонентом каждому абоненту сети;
  • количество полученных сообщений каждым абонентом от каждого абонента сети.
  • По этим статистическим данным рассчитываются:

  • коэффициенты пропускной способности между всеми абонентами сети;
  • коэфПропСпособ - коэффициент пропускной способности сети связи;
  • врПередачи - среднее время передачи абоненту одного сообщения;
  • врПередСооб - среднее время передачи в сети связи одного сообщения.
  • Коэффициенты пропускной способности определяются как отношение количества полученных сообщений к отправленным сообщениям.

    В модели также для выполнения условий ограничения ёмкостей буферов необходимо использовать:

  • emkBuferVx - ёмкость входного буфера абонента, байт;
  • tekEmkBuferVx - текущую ёмкость входного буфера абонента, байт;
  • emkBufer1 - ёмкость входного буфера маршрутизатора, байт;
  • tekEmkBufer1 - текущая ёмкость входного буфера, байт;
  • emkBuferNapr1,emkBuferNapr2,emkostBuferNapr3, emkBuferNapr4 - ёмкости на входах каналов связи первого, второго, третьего и четвёртого направлений соответственно, байт;
  • tekEmkNapr1, tekEmkNapr2, tekEmkNapr3, tekEmkNapr4 - текущие ёмкости на входах каналов связи первого, второго, третьего и четвёртого направлений соответственно, байт.
  • Отказы и восстановление ВК и каналов связи разыгрываются по следующим данным:

  • timeOtkВК - среднее время между отказами ВК;
  • timeVosstВК - среднее время восстановления ВК;
  • timeOtkKan - среднее время между отказами канала связи;
  • timeVosstKan - среднее время восстановления канала связи.
  • Создание новых типов агентов

    Построение модели начнём с создания активных объектов - экземпляров типов агентов. Напомним, что согласно Рис. 4.1 в сети связи выделены следующие сегменты (компоненты):

  • абонент;
  • маршрутизатор;
  • канал.
  • Реализуем эти сегменты средствами AnyLogic, а потом из них, как из созданных нами объектов, будем строить сеть на корневом объекте Main.

    Создайте три новых типа агентов: Абонент, Канал, Маршрутизатор.

  • Выполните команду Файл/Создать/Модель на панели инструментов. Появится диалоговое окно Новая модель.
  • Задайте имя новой модели. В поле Имя модели введите Сеть_связи. Выберите каталог, в котором будут сохранены файлы модели. Щёлкните Готово.
  • На панели Проекты щёлкните правой кнопкой Main и выберите из контекстного меню Создать/Тип агента.
  • Откроется диалоговое окно Новый тип агента.
  • Введите в поле Имя: имя нового типа агента Абонент.
  • Щёлкните Готово.
  • Также создайте типы агентов Канал и Маршрутизатор.
  • Создание областей просмотра

    Последовательно переходите на типы агентов Main, Абонент, Канал, Маршрутизатор и создайте на каждом области просмотра. На них мы будем размещать элементы событийной части модели, а также исходные данные, переменные для промежуточных вычислений и результаты моделирования.

    Значения свойств элементов Область просмотра установите согласно Табл. 4.1.

    Для всех областей просмотра оставьте Выравнивать по: Верхнему левому углу, установите из списка Масштабирование: Подогнать под окно.

    СвойстваОбъекты
    MainАбонентМаршрутизаторКанал
    Имя:облСетьоблАбонентоблМарш1облКанал
    Х:0000
    Y:0000
    Ширина:770810740400
    Высота:470360470340
    Имя:viewDataviewDataviewDataviewData
    Х:870000
    Y:600700550700
    Ширина:470450330400
    Высота:620420250180
    Имя:viewResultviewResult
    Х:00
    Y:6001200
    Ширина:442470
    Высота:820432

    Приступим к созданию сегментов сети связи.

    Сегмент Абонент

    Исходные данные

  • Откройте тип агента Абонент.
  • Перейдите на область просмотра viewData.
  • Перетащите из палитры Презентация элемент Скругленный прямоугольник. На странице Основные оставьте Имя:, предложенное системой.
  • На странице Местоположение и размер панели Свойства введите в поля X: 5, Y: 745, Ширина: 435, Высота: 365.
  • Перетащите два элемента text и на странице Текст панели Свойства вместо text введите Исходные данные и Результаты соответственно (Рис. 4.3).
  • Переход между областями просмотра в ходе моделирования организуйте позднее. Поэтому на относящиеся к этому элементы Сеть и Абонент1 пока не обращайте внимания. (рис 4.3) Размещение элементов Параметр и Переменная
  • Перетащите из палитры Основная элементы Переменная, разместите и дайте им имена согласно Рис. 4.3. Тип всех простых переменных, кроме tekEmkBuferVx, установите double. Тип tekEmkBuferVx - int. Переменные предназначены для промежуточных вычислений и сбора статистических данных за одного абонента сети.
  • Перетащите элементы Параметр, разместите и дайте имена как на Рис. 4.3. Тип всех элементов Параметр, кроме emkBuferVx и numAbonent, double. Тип emkBuferVx и numAbonent - int. Значения свойств установите согласно Табл. 4.2.
  • ИмяМассивРазмерностьЗначение по умолчанию
    kolAbonent 6
    timeAbonent 30
    kolProg 100
    numAbonent 1
    emkBuferVx 80000
    verKatУстановить флажкиKolKat{0.3, 0.5, 0.7, 1.0}
    dlKatKolKat{53000,86000,66000,50000}
    dlKatOKolKat{6100,5000,7000,500}

    На Рис. 4.2 видно, что элементы verKat, dlKat, dlKatO используются как массивы, размерность которых равна числу категорий сообщений. Создайте размерность KolKat.

  • Щёлкните правой кнопкой мышки в панели Проекты и в контекстном меню выберите Размерность.
  • В открывшемся окне Размерность в поле Имя: введите KolKat. Если введёте kolKat, в окне Ошибки появится сообщение: По соглашению, имена типов Java обычно начинаются с заглавной буквы.
  • Установите Тип размерности: Диапазон.
  • В открывшееся поле Диапазон: введите 1-4.
  • Щёлкните Готово.
  • Теперь создайте массив verKat.

  • Выделите элемент Параметр (см. Рис. 4.3).
  • На странице Основные панели Свойства установите флажок Массив. Откроется окно Размерности. Щёлкните по расположенной справа от окна и подсвеченной зелёным кнопке.
  • Откроется окно Edit dimensions. В окошке Возможные размерности: выделите KolКат.
  • Щёлкните по кнопке . Размерность KolКат появится в окошке Выбранные размерности.
  • Закройте окно. Вы вернётесь на панель Свойства. В окошке Размерности вы увидите размерность KolКат.
  • Щёлкните Редактировать значения массива. Откроется одноимённое диалоговое окно.
  • В левой части окна стрелками показано размещение элементов массива. Оставим горизонтальное. Элементы массива имеют разные значения. Поэтому не используем [ВСЕ].
  • В правой части окна введите значения элементов массива:
    0.3, 0.5, 0.7, 1.0
  • Создайте также массивы dlKat, dlKatO одинаковой размерности KolKat. Данные в поле По умолчанию введите из Табл. 4.2.
  • Для получения стандартной статистической информации о времени передачи сообщений по каждому абоненту добавьте элемент сбора статистики.

  • Перетащите элемент Данные гистограммы с палитры Статистика.
  • Задайте свойства элемента:
  • измените Имя: на врПередачи;
  • сделайте Количество интервалов: равным 10;
  • задайте Нач. размер интервалов: 0.01.
  • Теперь можно было бы приступить к построению событийной части сегмента. Однако вы решили вывести результаты моделирования в более презентабельном виде. Поэтому целесообразнее организовать этот вывод, поскольку полученные при этом данные (имена, опции и др.) необходимы будут в дальнейшем при написании кода в событийной части сегмента.

    Результаты моделирования по каждому абоненту

    Вариант размещения элементов для вывода результатов моделирования показан на Рис. 4.4.

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

    (рис 4.4) Размещение элементов для вывода результатов моделирования
  • В Палитре выделите Презентация. Перетащите элемент Скругленный прямоугольник в область просмотра облАбонент.
  • На странице Основные в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
  • На странице Местоположение и размер панели Свойства. Введите в поля X: 13, Y: 1250, Ширина: 447, Высота: 371.
  • Перетащите элемент text. В поле Текст: введите Результаты моделирования.
  • В Палитре выделите Элементы управления. Перетащите элементы Текстовое поле на элемент Результаты моделирования. Разместите их так, как показано на Рис. 4.4. Значения свойств установите согласно Табл. 4.3. У элементов editbox и editbox5 Ширина: 100, Высота: 31. У остальных - Ширина: 50.
  • Осталось поместить элемент для обработки и вывода статистической информации о времени передачи одного сообщения.

  • В Палитре выделите Статистика.
  • Перетащите элемент Гистограмма. Характеристики его размещения даны в Табл. 4.3.
    Всего сообщений полученоПолучено сообщений по категориям
    editboxeditbox1editbox2editbox3editbox4
    X: 21X: 177X: 247X: 317X: 389
    Y: 1310Y: 1310Y: 1310Y: 1310Y: 1310
    Всего сообщений отправленоОтправлено сообщений по категориям
    editbox5editbox6editbox7editbox8editbox9
    X: 19X: 179X: 249X: 319X: 389
    Y: 1390Y: 1390Y: 1390Y: 1390Y: 1390
    Время передачи сообщения
    МинимальноеМаксимальноеСреднее
    editbox13editbox12editbox15
    X: 319X: 319X: 319
    Y: 1470Y: 1520Y: 1570
    сhart-Гистограмма
    X: 19Y: 1450Ширина: 240Высота: 160
  • На странице Основные панели Свойства в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
  • Щёлкните кнопку Добавить данные и введите в поле Данные: имя врПередачи.
  • В поле Заголовок: введите Время передачи.
  • Значения остальных свойств (цвет и др.) установите по собственному усмотрению.
  • Добавьте остальные элементы презентации (номера категорий сообщений, другую текстовую информацию, например, Всего сообщений получено и др.) согласно Рис. 4.4.
  • И снова, прежде чем перейти к построению событийной части сегмента Абонент, разместим на корневом агенте Main необходимые элементы для сбора статистических данных, обработки, расчёта показателей качества обслуживания сети и их вывода. Это необходимо сделать по той причине, что также имена этих элементов нужны будут при написании кода в сегменте Абонент.

    Показатели качества обслуживания сети связи

  • Откройте корневой объект Main.
  • Перейдите на область просмотра ViewData. (рис 4.5) Элементы для сбора и вывода данных за сеть в целом
  • Перетащите или скопируйте элементы Переменная, разместите и дайте имена согласно Рис. 4.5.
  • Тип всех переменных double. Переменные отпр11…отпр66 предназначены для накопления статистических данных о количестве отправленных сообщений абонент - абонент. Например, отпр23 - количество сообщений, отправленных абонентом 2 абоненту 3, а отпр32 - количество сообщений, отправленных абонентом 3 абоненту 2. По этим данным рассчитываются коэффициенты пропускной способности кПрСп12…кПрСп66 абонент - абонент.
  • Выровняйте элементы. Выделите нужные элементы, Щёлкните правой кнопкой мышки, выберите Выравнивание.
  • Перетащите элемент Данные гистограммы с палитры Статистика.
  • Задайте свойства элемента:
  • измените Имя: на врПередСооб;
  • сделайте Количество интервалов: равным 10;
  • задайте Нач. размер интервалов: 0.01.
  • Теперь организуем вывод в более презентабельном виде. На Рис. 4.6 показаны элементы для вывода количественных показателей качества обслуживания сети связи. Часть результатов моделирования будем выводить в таком же виде и такие же, как и для каждого абонента.

  • Перейдите на область просмотра ViewResult.
  • Откройте объект Абонент.
  • Скопируйте элементы в скруглённом прямоугольнике с именем Результаты моделирования.
  • Перейдите на корневой объект Main и вставьте скопированные элементы в верхнюю часть области просмотра ViewResult (см. Рис. 4.6).
  • Добавьте элемент Текстовое поле (editbox10) для вывода коэффициента пропускной способности сети.
  • Внесите правки в текстовые сообщения согласно Рис. 4.6.
  • В Палитре выделите Статистика. Перетащите элемент Гистограмма.
  • На странице Основные панели Свойства в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя. (рис 4.6) Вывод показателей качества обслуживания сети
  • Щёлкните кнопку Добавить данные и введите в поле Данные: имя врПередачи.
  • В поле Заголовок: введите Время передачи.
  • Значения остальных свойств (цвет и др.) установите по собственному усмотрению.
  • В Палитре выделите Презентация. Перетащите элемент Скругленный прямоугольник в область просмотра результатов ViewResult.
  • На странице Основные в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
  • На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 1000, Ширина: 420, Высота: 410.
  • Перетащите элемент text. В поле Текст: введите Коэффициенты пропускной способности абонент-абонент.
  • В Палитре выделите Элементы управления. Перетащите элемент Текстовое поле. Разместите X: 20, Y: 1078, Ширина: 48, Высота: 25. В поле Имя: введите КПрСп11. Сбросьте флажок Отображать имя.
  • Перетащите элемент text. В поле Текст: введите КПрСп11.
  • Скопируйте элементы text и Текстовое поле. Вставьте их пять раз согласно Рис. 4.6. При этом в полях Имя: последовательно меняются имена КПрСп12… КПрСп16. Но поле Текст: останется неизменным, т.е. КПрСп11. Внесите правки в соответствии с Рис. 4.6. Элемент text добавлен потому, что в ходе моделирования имя элемента Текстовое поле не отображается.
  • Аналогичным образом добавьте остальные элементы text и Текстовое поле согласно Рис. 4.6.
  • Теперь можно перейти к построению событийной части сегмента.

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

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

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

  • Из палитры Презентация перетащите элемент Прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 50, Ширина: 450, Высота: 380.
  • Перетащите элемент text и в поле Текст: введите Абонент1. (рис 4.7) Алгоритм блока Абонент1
  • Перетащите из Библиотеки моделирования процессов объект source. Поместите его так же, как на Рис. 4.8. Остальные объекты блока Абонент1 вы будете перетаскивать и размещать по мере необходимости.
  • (рис 4.8) Реализация блока Абонент1 средствами AnyLogic

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

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

  • Выделите объект source.
  • В панели Проект щёлкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
  • Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса: Message.
  • В поле Базовый класс: выберите из выпадающего списка Entity . Щёлкните кнопку Далее. (рис 4.9) Дополнительные поля класса заявок Message
  • Появится вторая страница Мастера создания Java класса. Добавьте поля Java класса, показанные на Рис. 4.9.
  • Оставьте флажки Создать конструктор и Создать метод toString (). Щёлкните Готово. Закройте редактор кода.
  • Щёлкните правой кнопкой мыши в панели Проект только что созданный Java класс и в контекстном меню выберите Преобразовать Java класс в тип агента. Закройте окно с параметрами.
  • Продолжим построение блока Абонент1.

  • Выделите объект source. На странице Основные панели Свойства установите следующие свойства:
  • Тип заявки: Message
  • Прибывают согласно Времени между прибытиями
  • Время между прибытиями exponential(1/timeAbonent)
  • Новая заявка 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 заносится время отправления сообщения.

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

  • Из палитры Презентация перетащите элемент Скруглённый прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 210, Y: 100, Ширина: 65, Высота: 60.
  • Из палитры Основная перетащите два элемента порт. Разместите их как на Рис. 4.8. В поле Имя: замените предложенное системой на вх и вых.
  • Обратите внимание на то, чтобы у элементов Скруглённый прямоугольник и порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Абонент1 этот флажок должен быть сброшенным. В противном случае вы обнаружите их также на верхнем уровне - на диаграмме Main.
  • Итак, отправляемое сообщение поступило в канал связи, подключённый к порту вых.

    Через порт вх сообщения поступают из канала связи. Продолжим построение блока Абонент1.

  • Перетащите объект selectOutput (имя selectOutput3). Он предназначен для контроля текущей ёмкости входного буфера. В случае заполнения буфера, сообщения теряются.
  • Соедините порт вх с входом объекта selectOutput3.
  • Перетащите объект sink (имя sink1). Его вход соедините с выходом F объекта selectOutput3.
  • Выделите объект selectOutput3 и установите его свойства:
  • Тип заявки: Message
  • Выход true выбирается При выполнении условия
  • Условие emkBuferVx-tekEmkBuferVx>=entity.dlina
  • Перетащите объект queue. Укажите его свойства:
  • Имя: БуферВх
  • Тип заявки: Message
  • Вместимость emkBuferVx
  • Действие при входе tekEmkBuferVx+=entity.dlina;
  • Действия При выходе tekEmkBuferVx-=entity.dlina;
  • Соедините его вход с выходом Т объекта selectOutput3.

  • Перетащите selectOutput5 (имя selectOutput4). Он необходим для разделения потока полученных сообщений по категориям.
  • На страницах панели Свойства установите свойства согласно Табл. 4.5. Эти свойства также являются кодом. Код предназначен для:
  • счёта полученных сообщений за сеть связи в целом и по категориям сообщений,
  • определения числа полученных сообщений за один прогон,
  • вывода расчётов за каждого абонента, а также за сеть связи в целом.
  • Соедините выход элемента БуферВх с выходом объекта selectOutput4.
  • Перетащите два объекта selectOutput5 (имена selectOutput5 и selectOutput6). Объекты предназначены для разделения и счёта получаемых сообщений по абонентам. Значения свойств установите также согласно Табл. 4.5. Выход по умолчанию объекта selectOutput5 соедините с входом объекта selectOutput6.
    СвойствоselectOutput4
    Тип заявки:Message
    Условия
    Использовать:g++;
    Действия При входе:kolPol=g/kolProg;
    editbox.setText(kolPol, true);
    main.g++;
    main.всегоПол=main.g/kolProg;
    main.editbox.setText(main.всегоПол, true);
    Условие 1entity.numKat==1
    Действия При выходе 1k1++;
    kolPolKat1=k1/kolProg;
    editbox1.setText(kolPolKat1, true);
    main.k1++;
    main.всегоПолКат1=main.k1/kolProg;
    main.editbox1.setText(main.всегоПолКат1, true);
    Условие 2entity.numKat==2
    Действия При выходе 2k2++;
    kolPolKat2=k2/kolProg;
    editbox2.setText(kolPolKat2, true);
    main.k2++;
    main.всегоПолКат2=main.k2/kolProg;
    main.editbox2.setText(main.всегоПолКат2, true);
    Условие 3entity.numKat==3
    Действия При выходе 3k3++;
    kolPolKat3=k3/kolProg;
    editbox3.setText(kolPolKat3, true);
    main.k3++;
    main.всегоПолКат3=main.k3/kolProg;
    main.editbox3.setText(main.всегоПолКат3, true);
    Условие 4entity.numKat==4
    Действия При выходе 4k4++;
    kolPolKat4=k4/kolProg;
    editbox4.setText(kolPolKat4, true);
    main.k4++;
    main.всегоПолКат4=main.k4/kolProg;
    main.editbox4.setText(main.всегоПолКат4, true);
    СвойствоselectOutput5
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==1
    Условие 2entity.numAbOtpr==2
    Действия При выходе 2отАб2++;
    main.кПрСп21=отАб2/main.отпр21;
    main.КПрСп21.setText(main.кПрСп21, true);
    Условие 3entity.numAbOtpr==3
    Действия При выходе 3отАб3++;
    main.кПрСп31=отАб3/main.отпр31;
    main.КПрСп31.setText(main.кПрСп31, true);
    Условие 4entity.numAbOtpr==4
    Действия При выходе 4отАб4++;
    main.кПрСп41=отАб4/main.отпр41;
    main.КПрСп41.setText(main.кПрСп41, true);
    СвойствоselectOutput6
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==5
    Действия При выходе 1отАб5++;
    main.кПрСп51=отАб5/main. отпр51;
    main.КПрСп51.setText(main.кПрСп51, true);
    Условие 2entity.numAbOtpr==6
    Действия При выходе 2отАб6++;
    main.кПрСп61=отАб6/main.отпр61;
    main.КПрСп61.setText(main.кПрСп61, true);
  • Перетащите объект sink2. Его вход соедините с выходами 1…4 объекта selectOutput5 и выходами объекта selectOutput6.
  • Установите свойства объекта sink2 согласно Табл. 4.6. Код предназначен для расчёта коэффициента пропускной способности сети связи и времени передачи одного сообщения.
  • Свойствоsink2
    Тип заявки:Message
    Действия При входе:врПередачи.add(time()-entity.timeOtpr);
    editbox11.setText(врПередачи.mean(), true);
    editbox12.setText(врПередачи.max(), true);
    editbox13.setText(врПередачи.min(), true);
    main.коэфПропСпособ=main.всегоПол/main.всегоОтпр;
    main.editbox10.setText(main.коэфПропСпособ, true);
    main.врПередСооб.add(time()-entity.timeOtpr);
    main.editbox11.setText(main.врПередСооб.mean(), true);
    main.editbox12.setText(main.врПередСооб.max(), true);
    main.editbox13.setText(main.врПередСооб.min(), true);

    Приступим к построению сегмента Маршрутизатор.

    Сегмент Маршрутизатор

    Исходные данные

  • Откройте тип агента Маршрутизатор.
  • Перейдите на область просмотра viewData.
  • Перетащите из палитры Презентация элемент Скругленный прямоугольник. На странице Основные в поле Имя: оставьте имя, предложенное системой.
  • На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 600, Ширина: 314, Высота: 190.
  • Перетащите элемент text и в поле Текст: введите Исходные данные (Рис. 4.9.).
  • Перетащите элементы Параметр и Переменная. Разместите их и дайте имена согласно Рис. 4.10.
  • Значения по умолчанию элементов Параметр установите согласно Табл. 4.7.
  • Тип timeOtkBK, timeVosstBK, proizvod установите double, остальных параметров и простых переменных - int.
  • (рис 4.10) Исходные данные сегмента Маршрутизатор
    ИмяЗначение по умолчаниюИмяЗначение по умолчанию
    emkBufer15000000emkBuferNapr1250000
    timeOtkBK3600emkBuferNapr2250000
    timeVosstBK3,7emkBuferNapr3250000
    proizvod40000emkBuferNapr4250000

    Событийная часть сегмента Маршрутизатор

    Элементы событийной части сегмента Маршрутизатор показаны на Рис. 4.11. Сегмент включает Вычислительный комплекс, Буфер 2, порты входа-выхода, Имитатор отказов вычислительного комплекса.

    В свою очередь вычислительный комплекс содержит Блок контроля 1, Буфер 1, Блок обработки сообщений.

    Построим событийную часть сегмента Маршрутизатор.

    Блок контроля 1

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

    Алгоритм работы Блока контроля 1 представлен на Рис. 4.12.

    В AnyLogic этот алгоритм реализуется блоками selectOutput, hold и sink.

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля: X: 26, Y: 50, Ширина: 154, Высота: 150.
  • Перетащите объекты selectOutput, hold и sink на диаграмму типа агента Маршрутизатор, разместите и соедините так, как показано на Рис. 4.11.
  • Перетащите элемент text и на странице Текст панели Свойства вместо text введите Блок контроля 1.
  • Выделите объект selectOutput.
  • В поле Имя: вместо selectOutput введите blokKontrol_1.
  • В поле Тип заявки: Agent замените Message. (рис 4.11) Событийная часть сегмента Маршрутизатор (рис 4.12) Алгоритм работы Блока контроля 1
  • Установите Выход true выбирается При выполнении условия.
  • В поле Условие введите условие:
    (emkostBufer1-tekEmkostBufer1>=entity.dlina)
    (hold.isBlocked()==false)

    При выполнении условия заявка направляется на выход T (выходной порт для заявок, для которых выбирается выход true) и на выход F (выходной порт для заявок, для которых выбирается выход false), если условие не выполняется, соответственно.

  • Выделите объект sink. В поле Тип заявки: Agent замените Message.
  • В поле Действие при входе введите kolPotBK++; для счёта количества сообщений, потерянных при отказе вычислительного комплекса.
  • Выделите элемент hold. В поле Тип заявки: Agent замените Message.
  • Блок Буфер 1

    Блок Буфер 1 предназначен для приема, размещения и хранения поступающих на обработку сообщений.

    Алгоритм работы блока Буфер 1 приведен на Рис. 4.13.

    В AnyLogic алгоритм блока Буфер 1 реализуется объектом queue, который выполняет функции очереди (FIFO).

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 190, Y: 50, Ширина: 126, Высота: 100.
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не ставьте флажок Отображать имя.
  • Перетащите элемент text и на странице Текст панели

    Свойства вместо text введите Буфер 1.

    (рис 4.13) Алгоритм работы блока Буфер 1
  • Выделите объект queue.
  • В поле Имя: вместо queue введите bufer1.
  • В поле Тип заявки: Agent замените Message.
  • В поле Вместимость введите emkBufer1.
  • При помещении сообщения в буфер его текущая емкость увеличивается, поэтому в поле Действия При входе введите:
    tekEmkBufer1 += entity.dlina;
  • При выходе сообщения из буфера его текущая емкость уменьшается, поэтому в поле Действия При выходе введите:
    tekEmkBufer1 -= entity.dlina;
    entity.timeObr=entity.dlina/proizvod;
  • Поставьте флажок Включить сбор статистики.
  • Блок обработки сообщений

    Блок предназначен для имитации обработки сообщений.

    Алгоритм работы блока приведен на Рис. 4.14.

    (рис 4.14) Алгоритм работы Блока обработки сообщений

    Для реализации алгоритма Блока обработки сообщений в AnyLogic используется объект delay.

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Также не устанавливайте флажок Отображать имя.
  • На странице Местоположение и размер панели Свойства введите в поля X: 336, Y: 50, Ширина: 194, Высота: 100.
  • Перетащите элемент text и на странице Текст панели Свойства вместо text введите название Блок обработки сообщений.
  • Перетащите объект delay, разместите и соедините с bufer_1 так, как на Рис. 4.11.
  • Выделите объект delay. На странице Основные панели Свойства в поле Имя: вместо delay введите сomputer.
  • В поле Тип заявки: Agent замените Message.
  • Задержка задаётся установите Определённое время.
  • В поле Время задержки введите:
    exponential(1/entity.timeObr)
  • Оставьте Вместимость 1.
  • Действие при выходе
    коэфЗагрВК1=computer.statsUtilization.mean();
  • Установите флажок Включить сбор статистики.
  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не ставьте флажок Отображать имя.
  • На странице Местоположение и размер панели Свойства введите в поля X: 20, Y: 40, Ширина: 520, Высота: 170.
  • Перетащите элемент text и на странице Текст панели Свойства вместо слова text введите название Вычислительный комплекс.
  • Блок контроля 2

    Блок контроля 2 предназначен для распределения сообщений по направлениям и контроля текущих ёмкостей буферов (накопителей) направлений передачи сообщений.

    Алгоритм работы Блока контроля 2 приведен на Рис. 4.15.

    (рис 4.15) Алгоритм работы блока Блок контроля 2

    Вначале определяется номер направления, по которому должно быть передано поступившее сообщение. Затем определяется наличие достаточной свободной памяти в буфере этого направления. При отсутствии нужного объёма памяти сообщение теряется.

    Для распределения сообщений по направлениям можно было бы использовать объекты selectOutput5 и sink. Однако мы используем другие объекты AnyLogic: exit и enter. Они позволяют организовать сложную маршрутизацию, вследствие чего на Рис. 4.11 Блок контроля 2 не выделен, хотя функционально он существует.

  • Перетащите объект exit, вход которого соедините с выходом computer (Рис. 4.10).
  • В поле Тип заявки: Agent замените Message.
  • В поле Действия При выходе введите код:
    int i;
    	i=entity.numIstPol;
    	 {
    			switch (i) 
    {
    				case 1:if (emkBuferNapr1-tekEmkNapr1>=entity.dlina) {
    							enter1.take(entity);
    							break;}
    						else {enter.take(entity);
    							break;}  
    				case 2:if (emkBuferNapr1-tekEmkNapr1>=entity.dlina) {
    							enter1.take(entity);
    							break;}
    						else {enter.take(entity);
    		    				break;}  
    				case 3:if (emkBuferNapr2-tekEmkNapr2>=entity.dlina) {
    							enter2.take(entity);
    							break;}
    						else {enter.take(entity);
    						    break;}  
    				case 4:if (emkBuferNapr2-tekEmkNapr2>=entity.dlina) {
    							enter2.take(entity);
    							break;}
    						else {enter.take(entity);
    	    					break;}
    	    		case 5:if (emkBuferNapr3-tekEmkNapr3>=entity.dlina) {
    							enter3.take(entity);
    							break;}
    						else {enter.take(entity);
    	    					break;}
    				case 6:if (emkBuferNapr4-tekEmkNapr4>=entity.dlina) {
    							enter4.take(entity);
    							break;}
    						else {enter.take(entity);
    	    					break;}     
    			}
    		}
  • Маршрутизатор настраивается определённым образом, например, таблицей маршрутизации. В данном случае он настраивается программным путём так, что сообщения первого и второго отправителей передаются по первому направлению, третьего и четвёртого отправителей - по второму направлению, пятого отправителя - по третьему и шестого отправителя - по четвёртому направлению. Такой вариант принят с учётом построения в дальнейшем сети связи (см. Рис. 4.1).

    Блок Буфер 2

    Блок Буфер 2 предназначен для приема и хранения сообщений, передаваемых по каналам направлений. Он состоит из четырёх буферов - для каждого направления свой буфер.

    Алгоритм работы буфера каждого из направлений такой же, как и алгоритм работы буфера 1 (см. Рис. 4.13).

    Реализуется каждый из буферов также объектом queue.

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник (см. Рис. 4.11).
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
  • На странице Местоположение и размер панели Свойства введите в поля X: 550, Y: 20, Ширина: 140, Высота: 290.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Буфер 2.
  • Перетащите пять объектов enter, четыре объекта queue и один объект sink, разместите, дайте имена и соедините так, как на Рис. 4.11.
  • Выделите элемент buferNapr1, вход которого соединён с выходом enter1 и установите значения свойств.
  • В поле Тип заявки: Agent замените Message.
  • Вместимость emkBuferNapr1
  • В поле Действия При входе введите:
    tekEmkNapr1 += entity.dlina;
  • В поле Действия При выходе введите:
    tekEmkNapr1 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Выделите элемент buferNapr2, вход которого соединен с выходом enter2 и установите значения свойств.
  • В поле Тип заявки: Agent замените Message.
  • Вместимость emkBuferNapr2
  • В поле Действия При входе введите:
    tekEmkNapr2 += entity.dlina;
  • В поле Действия При выходе введите:
    tekEmkNapr2 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Выделите элемент buferNapr3, вход которого соединен с выходом enter3 и установите значения свойств.
  • В поле Тип заявки: Agent замените Message.
  • Вместимость emkBuferNapr3
  • В поле Действия При входе введите:
    tekEmkNapr3 += entity.dlina;
  • В поле Действия При выходе введите:
    tekEmkNapr3 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Выделите элемент buferNapr4, вход которого соединен с выходом enter4 и установите значения свойств.
  • В поле Тип заявки: Agent замените Message.
  • Вместимость emkBuferNapr4
  • В поле Действия При входе введите:
    tekEmkNapr4 += entity.dlina;
  • В поле Действия При выходе введите:
    tekEmkNapr4 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Организация входных и выходных портов

    Также как и для источника сообщений, для маршрутизатора нужно создать выходы, через которые отправлять сообщения, и входы, по которым получать сообщения. Создайте эти входы и выходы.

  • Перетащите элемент Скруглённый прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 536, Y: 340, Ширина: 83, Высота: 110.
  • Из палитры Основная перетащите восемь элементов Порт. Разместите их как на Рис. 4.11. В полях Имя: предложенные системой имена замените согласно Рис. 4.11. Установите флажки Отображать имя.
  • Обратите также внимание на то, чтобы у элементов Скруглённый прямоугольник и Порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Маршрутизатор этот флажок должен быть сброшенным.
  • Соедините выходы элементов buferNapr1… buferNapr4 с соответствующими портами вых1… вых4, а порты вх1… вх4 - с входом элемента blokKontrol_1 (Блок контроля 1).
  • Имитатор отказов вычислительного комплекса

    Принято, что вычислительный комплекс может выходить из строя и отказывать в обработке сообщений. Можно было бы построить имитатор отказов так, что генератор вырабатывает заявки-отказы в количестве, определяемом длительностью времени моделирования. Однако мы сделаем так, что генератор вырабатывает одну заявку, а затем этот процесс повторяется через интервалы времени, равные наработке до очередного отказа.

  • Перетащите элемент Прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 160, Y: 224, Ширина: 340, Высота: 140.
  • Перетащите объект source и два объекта delay. Разместите и соедините их как на Рис. 4.11.
  • Выделите source и установите значения его свойств:
  • Прибывают согласно Интенсивности
  • Интенсивность прибытия 1
  • Количество заявок, прибывающих за один раз 1
  • Ограниченное количество прибытий 1
  • Максимальное количество прибытий 1
  • Выделите первый объект delay и установите значения его свойств:
  • Имя: розыгрыш_инт_до_отказа
  • Задержка задаётся Определённое время
  • Время задержки exponential(1/timeOtkBK)
  • Вместимость 1
  • Действия При выходе
    hold.setBlocked(true);
    if (computer.size()!=0) {
    computer.remove((Message)computer.get(0));
    kolPoterBK ++;}
  • Выделите второй объект delay и установите значения его свойств:
  • Имя: имитация_восст_ВК
  • Задержка задаётся Определённое время
  • Время задержки exponential(1/timeVosstBK)
  • Вместимость 1
  • Действия При выходе
    hold.setBlocked(false)
  • Сегмент Канал

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

    Для его реализации в AnyLogic используется имитационная модель направления связи (глава 2), которое состоит из основного и резервного каналов.

    Исходные данные

  • Откройте объект Канал. Перейдите на область просмотра viewData.
  • Перетащите элемент Скруглённый прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 752, Ширина: 377, Высота: 118.
  • Перетащите элементы Параметр и Переменная, разместите и дайте им имена согласно Рис. 4.16.
  • Типы и значения по умолчанию установите согласно Табл. 4.8.
  • ИмяТипЗначение по умолчанию
    skorPeredKandouble5000
    skorPeredKanRdouble5000
    timeOtkKan double360
    timeVosstKandouble3,2
    timeBklResKdouble0,1
    всего_потеряно_сообщint0

    Событийная часть сегмента Каналы

  • Перейдите на область просмотра облКаналы.
  • Перетащите элемент Прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 186, Y: 50, Ширина: 200, Высота: 135.
  • Перетащите объект selectOutput, разместите как на Рис. 4.17.
  • Оставьте предложенные системой имена и флажок Отображать имя.
  • В поле Тип заявки: Agent замените Message. (рис 4.16) Исходные данные сегмента Канал (рис 4.17) Объекты событийной части сегмента Канал
  • Выход true выбирается: При выполнении условия.
  • Условие: основной_канал_работает.
  • При выходе (true):
    entity.timePered=entity.dlina/skorPeredKan;
  • В поле Вместимость введите 1.
  • При выходе (false):
    if (а==0)
    entity.timePered=entity.dlina/skorPeredKanR;
    if (а==1)
    {entity.timePered=entity.dlina/skorPeredKanR +
    timeBklResK;
    а=0;}
    а=1;
  • Установите флажок Включить сбор статистики.
  • Скопируйте объект delay. Вставьте его один раз. При этом изменится имя на основной_канал, а остальные свойства останутся неизменными.
  • Замените имя основной_канал на резерв_канал.
  • Действия При выходе
    коэфЗагрРезК=резерв_канал.statsUtilization.mean();
    коэфЗагрКан=коэфЗагрОснК+коэфЗагрРезК;
  • Соедините согласно Рис. 4.17 объекты selectOutput и delay.
  • Организация входного и выходного портов

  • Перетащите элемент Скруглённый прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 50, Y: 80, Ширина: 60, Высота: 52.
  • Из палитры Основная перетащите два элемента Порт. Разместите их как на Рис. 4.17. В полях Имя: предложенные системой имена замените согласно Рис. 4.17. Установите флажки Отображать имя.
  • Обратите также внимание на то, чтобы у элементов Скруглённый прямоугольник и Порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Канал этот флажок должен быть сброшенным.
  • Соедините выходы элементов основной_канал и резерв_канал с портом вых, а порт вх - с входом элемента selectOutput.
  • Имитатор отказов каналов связи

    Имитатор отказов основного канала связи построен аналогично имитатору отказов вычислительного комплекса.

  • Перетащите элемент Прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 212, Ширина: 380, Высота: 120.
  • Перетащите объект source и два объекта delay. Разместите и соедините их как на Рис. 4.17.
  • Выделите source и установите значения его свойств:
  • Отображать имя установите флажок
  • Прибывают согласно Интенсивности
  • Интенсивность прибытия 1
  • Количество заявок, прибывающих за один раз 1
  • Ограниченное количество прибытий установите флажок
  • Максимальное количество прибытий 1
  • Действия При выходе
  • Выделите первый объект delay и установите значения его свойств:
  • Имя: розыг_инт_до_отказа
  • Отображать имя установите флажок
  • Задержка задаётся Определённое время
  • Время задержки exponential(1/timeOtkKan)
  • Вместимость 1
  • Действия При выходе:
    основной_канал_работает = false;
    if (основной_канал.size()!=0){
    	Message m = основной_канал.get(0);
    	основной_канал.stopDelayForAll();
    	всего_потеряно_сообщ ++;}
  • Выделите второй объект delay и установите значения его свойств:
  • Имя имитация_восст_осн_кан
  • Отображать имя установите флажок
  • Задержка задаётся Определённое время
  • Время задержки exponential(1/timeVosstkKan)
  • Вместимость 1
  • Действия При выходе:
    основной_канал_работает = true;
  • Построение модели сети связи

    Все необходимое для построения модели сети из активных объектов Абонент, Канал и Маршрутизатор нами создано. Приступим к построению модели сети.

  • Перейдите на Main к области просмотра облСеть.
  • Из окна Проекты перетащите объект абонент1 и поместите как на Рис. 4.18.
  • Объект абонент1 имитирует абонента 1. В свойствах абонент1 записан код для расчёта коэффициентов пропускной способности абонентов 2…6 с абонентом 1. Следовательно, абонент2 должен иметь код для расчёта коэффициентов пропускной способности абонентов 1, 3…6 с абонентом 2 и т.д.
  • Создайте типы агентов Абонент2…Абонент6.
  • Откройте Абонент1. Скопируйте все объекты.
  • Вставьте скопированные объекты на объекты Абонент2 … Абонент6.
  • Внесите правки в коды согласно Табл. 4.9.
  • Из окна Проекты перетащите объекты абонент2 … абонент6.
  • Из окна Проекты перетащите объект канал и поместите вверху (см. Рис. 4.18). В поле Имя: добавьте к предложенному имени 1.
  • Скопируйте объект канал1. Вставьте пять объектов. Разместите их как на Рис. 4.18. Нам потребуются ещё несколько каналов связи, но мы их образуем позже после создания второго маршрутизатора.
  • Выходы объектов абонент1…абонент6 соедините с соответствующими входами объектов канал1…канал6.
  • Из окна Проекты перетащите объект маршрутизатор. В поле Имя: установите маршрут1.
  • Соедините выходы первого и второго абонентов с вх1, выходы третьего и четвёртого - с вх2, пятого - с вх3, шестого - с вх4 объекта маршрут1.
  • (рис 4.18) Элементы модели функционирования сети связи
    Абонент2
    СвойствоselectOutput
    Тип заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbPol == numAbonent
    numAbonent2
    СвойствоselectOutput1
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==1
    Действия При выходе 1отпрАб1++;
    main.отпр21=отпрАб1;
    Условие 2entity.numAbPol==2
    Условие 3entity.numAbPol==3
    Действия При выходе 3отпрАб3++;
    main.отпр23=отпрАб3;
    Условие 4entity.numAbPol==4
    Действия При выходе 4отпрАб4++;
    main.отпр24=отпрАб4;
    СвойствоselectOutput2
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==5
    Действия При выходе 1отпрАб5++;
    main.отпр25=отпрАб5;
    Условие 2entity.numAbPol==6
    Действия При выходе 2отпрАб6++;
    main.отпр26=отпрАб6;
    СвойствоselectOutput5
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==1
    Действия При выходе 1отАб1++;
    main.кПрСп12=отАб1/main.отпр12;
    main.КПрСп12.setText(main.кПрСп12, true);
    Условие 2entity.numAbOtpr==2
    Условие 3entity.numAbOtpr==3
    Действия При выходе 3отАб3++;
    main.кПрСп32=отАб3/main.отпр32;
    main.КПрСп32.setText(main.кПрСп32, true);
    Условие 4entity.numAbOtpr==4
    Действия При выходе 4отАб4++;
    main.кПрСп42=отАб4/main.отпр42;
    main.КПрСп42.setText(main.кПрСп42, true);
    СвойствоselectOutput6
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==5
    Действия При выходе 1отАб5++;
    main.кПрСп52=отАб5/main.отпр52;
    main.КПрСп52.setText(main.кПрСп52, true);
    Условие 2entity.numAbOtpr==6
    Действия При выходе 2отАб6++;
    main.кПрСп62=отАб6/main.отпр62;
    main.КПрСп62.setText(main.кПрСп62, true);
    Абонент3
    СвойствоselectOutput
    Тип заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbPol == numAbonent
    numAbonent3
    СвойствоselectOutput1
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==1
    Действия При выходе 1отпрАб1++;
    main.отпр31=отпрАб1;
    Условие 2entity.numAbPol==2
    Действия При выходе 3отпрАб2++;
    main.отпр32=отпрАб2;
    Условие 3entity.numAbPol==3
    Условие 4entity.numAbOtpr==4
    Действия При выходе 4отпрАб4++;
    main.отпр34=отпрАб4;
    СвойствоselectOutput2
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==5
    Действия При выходе 1отпрАб5++;
    main.отпр35=отпрАб5;
    Условие 2entity.numAbPol==6
    Действия При выходе 2отпрАб6++;
    main.отпр36=отпрАб6;
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==1
    СвойствоselectOutput5
    Действия При выходе 1отАб1++;
    main.кПрСп13=отАб1/main.отпр13;
    main.КПрСп13.setText(main.кПрСп13, true);
    Условие 2entity.numAbOtpr==2
    Действия При выходе 2отАб2++;
    main.кПрСп23=отАб2/main.отпр23;
    main.КПрСп23.setText(main.кПрСп23, true);
    Условие 3entity.numAbOtpr==3
    Условие 4entity.numAbOtpr==4
    Действия При выходе 4отАб4++;
    main.кПрСп43=отАб4/main.отпр43;
    main.КПрСп43.setText(main.кПрСп43, true);
    СвойствоselectOutput6
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==5
    Действия При выходе 1отАб5++;
    main.кПрСп53=отАб5/main.отпр53;
    main.КПрСп53.setText(main.кПрСп53, true);
    Условие 2entity.numAbOtpr==6
    Действия При выходе 2отАб6++;
    main.кПрСп63=отАб6/main.отпр63;
    main.КПрСп63.setText(main.кПрСп63, true);
    Абонент4
    СвойствоselectOutput
    Тип заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbPol == numAbonent
    numAbonent4
    СвойствоselectOutput1
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==1
    Действия При выходе 1отпрАб1++;
    main.отпр41=отпрАб1;
    Условие 2entity.numAbPol==2
    Действия При выходе 3отпрАб2++;
    main.отпр42=отпрАб2;
    Условие 3entity.numAbPol==3
    Действия При выходе 3отпрАб3++;
    main.отпр43=отпрАб3;
    Условие 4entity.numAbOtpr==4
    СвойствоselectOutput2
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==5
    Действия При выходе 1отпрАб5++;
    main.отпр45=отпрАб5;
    Условие 2entity.numAbPol==6
    Действия При выходе 2отпрАб6++;
    main.отпр46=отпрАб6;
    СвойствоselectOutput5
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==1
    Действия При выходе 1отАб1++;
    main.кПрСп14=отАб1/main.отпр14;
    main.КПрСп14.setText(main.кПрСп14, true);
    Условие 2entity.numAbOtpr==2
    Действия При выходе 2отАб2++;
    main.кПрСп24=отАб2/main.отпр24;
    main.КПрСп24.setText(main.кПрСп24, true);
    Условие 3entity.numAbOtpr==3
    Действия При выходе 3отАб3++;
    main.кПрСп34=отАб3/main.отпр34;
    main.КПрСп34.setText(main.кПрСп34, true);
    Условие 4entity.numAbOtpr==4
    СвойствоselectOutput6
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==5
    Действия При выходе 1отАб5++;
    main.кПрСп54=отАб5/main.отпр54;
    main.КПрСп54.setText(main.кПрСп54, true);
    Условие 2entity.numAbOtpr==6
    Действия При выходе 2отАб6++;
    main.кПрСп64=отАб6/main.отпр64;
    main.КПрСп64.setText(main.кПрСп64, true);
    Абонент5
    СвойствоselectOutput
    Тип заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbPol == numAbonent
    numAbonent5
    СвойствоselectOutput1
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==1
    Действия При выходе 1отпрАб1++;
    main.отпр51=отпрАб1;
    Условие 2entity.numAbPol==2
    Действия При выходе2отпрАб2++;
    main.отпр52=отпрАб2;
    Условие 3entity.numAbPol==3
    Действия При выходе 3отпрАб3++;
    main.отпр53=отпрАб3;
    Условие 4entity.numAbOtpr==4
    Действия При выходе 4отпрАб4++;
    main.отпр54=отпрАб4;
    СвойствоselectOutput2
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==5
    Условие 2entity.numAbPol==6
    Действия При выходе 2отпрАб6++;
    main.отпр56=отпрАб6;
    Тип заявки:Message
    Использовать:Условия
    СвойствоselectOutput5
    Условие 1entity.numAbOtpr==1
    Действия При выходе 1отАб1++;
    main.кПрСп15=отАб1/main.отпр15;
    main.КПрСп15.setText(main.кПрСп15, true);
    Условие 2entity.numAbOtpr==2
    Действия При выходе 2отАб2++;
    main.кПрСп25=отАб2/main.отпр25;
    main.КПрСп25.setText(main.кПрСп25, true);
    Условие 3entity.numAbOtpr==3
    Действия При выходе 3отАб3++;
    main.кПрСп35=отАб3/main.отпр35;
    main.КПрСп35.setText(main.кПрСп35, true);
    Условие 4entity.numAbOtpr==4
    Действия При выходе 4отАб4++;
    main.кПрСп45=отАб4/main.отпр45;
    main.КПрСп45.setText(main.кПрСп45, true);
    СвойствоselectOutput6
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==5
    Условие 2entity.numAbOtpr==6
    Действия При выходе 2отАб6++;
    main.кПрСп65=отАб6/main.отпр65;
    main.КПрСп65.setText(main.кПрСп65, true);
    Абонент6
    СвойствоselectOutput
    Тип заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbPol == numAbonent
    numAbonent6
    СвойствоselectOutput1
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==1
    Действия При выходе 1отпрАб1++;
    main.отпр61=отпрАб1;
    Условие 2entity.numAbPol==2
    Действия При выходе 2отпрАб2++;
    main.отпр62=отпрАб2;
    Условие 3entity.numAbPol==3
    Действия При выходе 3отпрАб3++;
    main.отпр63=отпрАб3;
    Условие 4entity.numAbPol==4
    Действия При выходе 4отпрАб4++;
    main.отпр64=отпрАб4;
    СвойствоselectOutput2
    Условие 1entity.numAbPol==5
    Действия отпрАб5++;
    При выходе 1main.отпр65=отпрАб5;
    Условие 1entity.numAbPol==6
    СвойствоselectOutput5
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==1
    Действия При выходе 1отАб1++;
    main.кПрСп16=отАб1/main.отпр16;
    main.КПрСп16.setText(main.кПрСп16, true);
    Условие 2entity.numAbOtpr==2
    Действия При выходе 2отАб2++;
    main.кПрСп26=отАб2/main.отпр26;
    main.КПрСп26.setText(main.кПрСп26, true);
    Условие 3entity.numAbOtpr==3
    Действия При выходе 3отАб3++;
    main.кПрСп35=отАб3/main.отпр35;
    main.КПрСп35.setText(main.кПрСп35, true);
    Условие 4entity.numAbOtpr==4
    Действия При выходе 4отАб3++;
    main.кПрСп36=отАб3/main.отпр36;
    main.КПрСп36.setText(main.кПрСп36, true);
    СвойствоselectOutput6
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==5
    Действия При выходе 1отАб5++;
    main.кПрСп56=отАб5/main.отпр56;
    main.КПрСп56.setText(main.кПрСп56, true);
    Условие 2entity.numAbOtpr==6

    Для того чтобы связь была между всеми абонентами и они могли бы обмениваться сообщениями, нам потребуется ещё один маршрутизатор. Но мы не можем использовать второй экземпляр этого же типа абонента, так как программно он настроен именно на наш вариант организации связи.

  • Создайте ещё тип агента Маршрутизатор1.
  • Откройте объект Маршрутизатор.
  • Выделите все объекты и скопируйте их.
  • Вставьте на Маршрутизатор1 скопированные объекты.
  • Выделите элемент exit и в поле Действия При выходе замените имеющийся там код следующим кодом:
    int i;
    	i=entity.numAbPol;
    	 {
    			switch (i) {
    				case 1:if (emkBuferNapr1-tekEmkNapr1>=entity.dlina) 
    {enter1.take(entity);
    							break;}
    						else {enter.take(entity);
    							break;}  
    				case 2:if (emkBuferNapr2-tekEmkNapr2>=entity.dlina) {
    							enter2.take(entity);
    							break;}
    						else {enter.take(entity);
    		    				break;}  
    				case 3:if (emkBuferNapr3-tekEmkNapr3>=entity.dlina) {
    							enter3.take(entity);
    							break;}
    						else {enter.take(entity);
    						    break;}  
    				case 4:if (emkBuferNapr4-tekEmkNapr4>=entity.dlina) {
    							enter4.take(entity);
    							break;}
    						else {enter.take(entity);
    	    					break;}
    	    	}
    		}
  • Теперь Маршрутизатор1 настроен так, что сообщения от абонентов 1…4 будут направляться на его выходы 1…4.
  • Из окна Проекты перетащите элемент маршрутизатор1. В поле Имя: установите маршрут2.
  • Соедините вых1 маршрут1 с вх1 маршрут2, а вых2 с вх2.
  • Скопируйте элемент канал1. Вставьте шесть элементов. Разместите их как на Рис. 4.18.
  • Соедините вых3 маршрут1 с вх канал11, вых4 - с вх канал12.
  • Соедините вых1…вых4 маршрут2 с вх канал7…канал10 соответственно.
  • Соедините вых канал7…канал12 с входами абонент1…абонент6 соответственно.
  • Построение модели сети связи завершено. Но надо ещё организовать переключение между областями просмотра.

    Переключение между областями просмотра

    Переключение между областями просмотра организуем так, чтобы можно было из сети переходить к любому абоненту, каналу, маршрутизатору и обратно. В каждом активном объекте - к данным и обратно к событийной части объекта или в сеть.

    Для переключения используем элемент button из палитры Элементы управления.

  • Перетащите элемент button (см. Рис. 4.18).
  • На странице Основные панели Свойства укажите:
  • Метка: Абонент1
  • Действие: абонент1.облАбонент1.navigateTo()
  • Скопируйте кнопку Абонент1. Вставьте пять раз. Последовательно откройте и внесите соответствующие правки в полях Метка: и Действие:, например:
  • Метка: Абонент2
  • Действие: абонент2.облАбонент2.navigateTo()
  • Перетащите элемент button. Укажите свойства:
  • Метка: Результаты
  • Действие: viewData.navigateTo()
  • Перетащите элемент button. Укажите свойства:
  • Метка: маршрутизатор1
  • Действие: маршрут1.облМарш1.navigateTo()
  • Скопируйте кнопку маршрутизатор1. Её свойства:
  • Метка: маршрутизатор2
  • Действие: маршрут2.облМарш2.navigateTo()
  • (рис 4.19) Область просмотра облКан

    Так как каналов 12, то давайте создадим ещё одну область просмотра облКан, и на ней разместим 12 кнопок (Рис. 4.19).

  • Перетащите из палитры Презентация элемент Область просмотра. На странице Основные в поле Имя: введите облКан.
  • Перейдите на страницу Местоположение и размер панели Свойства. Введите в поля X: 0, Y: 1780, Ширина: 450, Высота: 200.
  • Перетащите элемент button.
  • На странице Основные панели Свойства укажите:
  • Метка: Канал1
  • Действие: канал1.облКан.navigateTo()
  • Скопируйте кнопку Канал1. Вставьте одиннадцать раз. Последовательно откройте и внесите соответствующие правки в полях Метка: и Действие:. Например:
  • Метка: Канал2
  • Действие: канал2.облКан.navigateTo()
  • Перетащите элемент button.
  • На странице Основные панели Свойства укажите:
  • Метка: Сеть
  • Действие: облСеть.navigateTo()
  • Перейдите на область просмотра облСеть. Перетащите элемент button.
  • На странице Основные панели Свойства укажите:
  • Метка: Каналы
  • Действие: облКан.navigateTo()
  • Нам осталось добавить элементы для переключения между областями просмотра на активных объектах и возвращения на корневой объект Main на область просмотра облСеть.

    Последовательно переходите от объекта к объекту, добавляя на них нужное число элементов button и устанавливая значения свойств согласно Табл. 4.10. Размещение этих элементов было уже показано на Рис. 4.34.6, 4.8, 4.10, 4.11, 4.164.18.

    ОбъектОбласть просмотраСвойстваЗначение
    АбонентоблАбонентМетка:Сеть
    Действие:main.облСеть.navigateTo()
    облАбонентМетка:Исходные данные
    Действие:viewData.navigateTo()
    viewDataМетка:Сеть
    Действие:main.облСеть.navigateTo()
    viewDataМетка:Абонент
    Действие:облАбонент.navigateTo()
    КаналоблКанМетка:Сеть
    Действие:main.облСеть.navigateTo()
    облКанМетка:Данные
    Действие:viewData.navigateTo()
    viewDataМетка:Канал
    Действие:облКан.navigateTo()
    МаршрутизатороблМаршМетка:Сеть
    Действие:main.облСеть.navigateTo()
    облМаршМетка:Данные
    Действие:viewData.navigateTo()
    viewDataМетка:Сеть
    Действие:main.облСеть.navigateTo()
    viewDataМетка:Маршрутизатор
    Действие:облМарш.navigateTo()
    Маршрутизатор1облМаршМетка:Сеть
    Действие:main.облСеть.navigateTo()
    облМаршМетка:Данные
    Действие:viewData.navigateTo()
    viewDataМетка:Сеть
    Действие:main.облСеть.navigateTo()
    viewDataМетка:Маршрутизатор
    Действие:облМарш.navigateTo()

    Запуск и отладка модели

    Прежде чем запустить модель:

  • В окне Проекты выделите Сеть_связи.
  • На странице Основные в поле Единицы модельного времени: установите секунды.
  • В окне Проекты выделите Simulation: Main.
  • На странице Модельное время установите:
  • Режим выполнения: Виртуальное время (максимальная скорость)
  • Остановить: В заданное время.
  • В поле Конечное время: введите 3600000. Время моделирования увеличено в 1000 раз по числу прогонов модели.
  • На странице Случайность установите Фиксированное начальное число (воспроизводимые "прогоны").
  • В поле Начальное число: введите 897.
  • Запустите модель. Если появятся ошибки, исправьте их.
  • При правильном построении модели вы получите результаты, показанные на Рис. 4.20.

    Среди них показатели качества обслуживания сети связи: коэффициент пропускной способности 0,815 и среднее время передачи одного сообщения 6,050. Коэффициент пропускной способности, например, абонент 2 - абонент 3 равен 0,816. Обратите внимание на существенную разницу между минимальным и максимальным временами передачи сообщения. Она объясняется принятым экспоненциальным законом распределения времени передачи сообщений: максимальное значение может отличаться от среднего значения в восемь раз.

    Количество отправленных и полученных сообщений всего и по категориям рассчитано за один прогон модели, то есть за 3600 сек. Для расчёта, как вы помните, был введён параметр kolProg=1000 и в 1000 раз было увеличено модельное время. Всего отправлено сообщений 600,559, получено всего абонентами - 490,035. Если разделить число полученных сообщений на число отправленных, то и будет получен коэффициент пропускной способности сети.

    Точно такие же результаты моделирования, коэффициенты пропускной способности, выводятся и по каждому абоненту сети.

    Перейдите в область просмотра Сеть, щёлкнув кнопку Сеть. Затем, щёлкните, например, кнопку Абонент2. Вы увидите результаты моделирования, показанные на Рис. 4.21.

    (рис 4.20) Результаты моделирования сети связи (рис 4.21) Результаты моделирования по абоненту 2 сети связи

    Модель в GPSS World

    Состав GPSS-модели

    Модель в GPSS World разработана согласно постановке и включает следующие элементы:

  • задание исходных данных:
  • определение матриц;
  • описание функций, задающих исходные данные;
  • арифметические выражения;
  • сегмент имитации поступления сообщений от источников:
  • розыгрыш абонентов-получателей сообщений;
  • розыгрыш категории сообщения и счёта сообщений;
  • розыгрыш характеристик сообщений;
  • сегмент имитации работы основных каналов 1-6;
  • сегмент имитации работы маршрутизатора 1;
  • сегмент имитации работы маршрутизатора 2;
  • сегмент имитации работы основных каналов 7-10;
  • сегмент имитации работы основных каналов 11-12;
  • сегмент имитации получения сообщений;
  • сегмент имитации работы резервных каналов 13-18;
  • сегмент имитации работы резервных каналов 19-24;
  • сегмент имитации работы резервных каналов 19-24;
  • сегмент имитации отказов ВК1;
  • сегмент имитации отказов ВК2;
  • сегмент имитации отказов каналов связи 1-6;
  • сегмент имитации отказов каналов связи 7-12;
  • сегмент счёта переданных и потерянных сообщений и расчёт вероятностей передачи сообщений;
  • задание времени моделирования и расчёт результатов.
  • GPSS-программа

    Ввод данных в виде массивов организован таким образом, во-первых, чтобы в программе было меньшее количество строк, во-вторых, чтобы удобнее было использовать эти данные при написании программы модели и, в-третьих, чтобы при изменении числа элементов массива требовалась бы незначительная коррекция. Для организации такого ввода использованы функции. Например, функцией S_ задаются средние вычислительные сложности (длины) сообщений. Выборка соответствующей средней длины в зависимости от категории осуществляется по аргументу, представляющему собой параметр транзакта Р1. В этот параметр заранее посредством розыгрыша заносится код категории.

    Сообщения имитируются транзактами с параметрами, необходимыми согласно логике работы модели. Каналы связи и ВК имитируются одноканальными устройствами (ОКУ): основные каналы связи - ОКУ1…ОКУ12, резервные каналы - ОКУ13…ОКУ24, ВК1 - ОКУ25, ВК2 - ОКУ26.

    Для одновременной проверки выполнения каких-либо условий используются булевы переменные. Например, булева переменная Prov2 проверяет исправность ВК1 и наличие свободной ёмкости входного буфера, достаточной для размещения поступившего сообщения. Эти проверки можно выполнить и по отдельности, но использование булевой переменной более эффективно. Булева переменная Prov1 используется для выделения сообщений, адресованных абонентам 5 и 6.

    Количество отправленных сообщений каждым абонентом каждому абоненту сети накапливается в матрице Otpr, а количество полученных сообщений каждым абонентом от каждого абонента сети - в матрице Pol. По эти статистическим данным рассчитываются коэффициенты пропускной способности абонент-абонент и записываются в матрицу KPS.

    Коэффициент пропускной способности сети (КПС) связи в целом сохраняется в ячейке VPerS. А среднее время передачи одного сообщения - в ячейке TimeS.

    GPSS-программа приведена ниже.

    ; Модель функционирования сети связи
     Определение матриц
    Otpr	MATRIX	,6,6	; Матрица для записи отправленных сообщений
    Pol	MATRIX	,6,6 ; Матрица для записи полученных сообщений
    KPS	MATRIX	,6,6 ; Матрица для записи коэффициентов пропускной способности
    ; Задание исходных данных
    VrMod EQU	  3600	; Время моделирования,1 ед. мод. вр.=1с
    KolAb EQU		6		; Количество абонентов сообщений
    Q_  	 EQU		40000  ; Производительность ВК, оп/c
    V_     EQU	40000	; Скорость передачи, бит/с
    MaxKat	EQU	4	; Количество категорий сообщений
    NKan		EQU	12	; Количество каналов передачи данных
    KolNapr	EQU	4	; Количество направлений в маршрутизаторе
    KolBK	EQU	2	; Количество ВК
    T5		EQU	0.1	; Время включения резервного канала
    EmkBK1	EQU	5000000	; Ёмкость входного буфера ВК1
    EmkBK2	EQU	5000000	; Ёмкость входного буфера ВК2
    ; Описание функций, задающих исходные данные
    NaprM1	FUNCTION	P$NumPol,D6 ; Таблица адресов в маршрутизаторе 1
    1,1/2,1/3,2/4,2/5,3/6,4
    NaprM2	FUNCTION	P$NumPol,D4 ; Таблица адресов в маршрутизаторе 2
    1,1/2,2/3,3/4,4
    TOtkBK	FUNCTION	P4,D2  ; Среднее время между отказами ВК
    1,3600/2,3600
    TVosstBK	FUNCTION P4,D2; Среднее время восстановления ВК
    1,3.7/2,3.7
    TOtkKan 	FUNCTION	P4,D12 ; Среднее время между отказами каналов
    1,3600/2,3600/3,3600/4,3600/5,3600/6,3600/7,3600/
    8,3600/9,3600/10,3600/11,3600/12,3600
    TVosstKan	FUNCTION	P4,D12 ; Среднее время восстановления каналов
    1,3.2/2,3.2/3,3.2/4,3.2/5,3.2/6,3.2/7,3.2/8,3.2/
    9,3.2/10,3.2/11,3.2/12,3.2
    TimeAb	FUNCTION	P$NumOtpr,D6 ; Среднее время передачи сообщений от абонентов
    1,30/2,30/3,30/4,30/5,30/6,30
    Kat	FUNCTION	RN897,D4 ; Вероятности видов категорий
    .3,1/.5,2/.7,3/1,4
    S_	FUNCTION	P1,D4	; Средние вычислительные сложности сообщений (длины), оп (байт) по категориям
    1,53000/2,86000/3,66000/4,50000
    So_	FUNCTION	P1,D4	; Среднеквадратические отклонения вычислительных сложностей (длин) сообщений, оп (байт) по категориям
    1,6100/2,5000/3,7000/4,500
    EmkNaprM1	FUNCTION	P$NumNapr,D4 ; Ёмкости накопителей направлений, байт
    1,250000/2,250000/3,250000/4,250000
    EmkNaprM2	FUNCTION	P$NumNapr,D4 ; Ёмкости накопителей направлений, байт
    5,250000/6,250000/7,250000/8,250000
    BufAb	FUNCTION	P$NumPol,D6  ; Ёмкости входных буферов абонентов
    1,80000/2,80000/3,80000/4,80000/5,80000/6,80000
    Prov1	BVARIABLE	(P$NumPol'E'5)'OR'(P$NumPol'E'6)
    Prov2 BVARIABLE	(FV*NumBK1)'AND'(P2'LE'(EmkBK1-Q*NumBK1))
    Prov3	 BVARIABLE	(FV*NumBK2)'AND'(P2'LE'(EmkBK2-Q*NumBK2))
     Арифметические выражения вычисления
    DL	VARIABLE	INT(NORMAL(897,FN$S_,FN$So_))	; Длин (вычислительных сложностей) сообщений
    VrPer	VARIABLE	(P2/V_) ; Времени передачи сообщения
    VrObr	VARIABLE	P2/Q_  ; Времени обработки сообщения
    ; Сегмент имитации поступления сообщений от источников
    	GENERATE	,,,KolAb    ; Число транзактов по числу абонентов
    	SAVEVALUE	Num+,1;Нумерация абонента-отправителя
    	ASSIGN	NumOtpr,X$Num ; Номер абонента-отправителя в NumOtpr
    Soob	ADVANCE	(Exponential(897,0,FN$TimeAb))	; Время отправления сообщений
    	SPLIT	1,Soob	; Создание двойника сообщения
     Розыгрыш абонентов-получателей сообщений
    Met1	SAVEVALUE	VerAb,(RN897/1000); Получение РРСЧ
    Met2	ASSIGN	NumPol+,1 ; В Р$NumPol номер абонента-получателя сообщения
    	TEST LE	X$VerAb,(P$NumPol#(1/KolAb)),Met2
    	TEST NE	P$NumOtpr,P$NumPol,Met6	; Отправитель не себе ли отправляет?
     Розыгрыш категории сообщения и счёта сообщений
    Met4	ASSIGN	1,FN$Kat	; В Р1 код категории и счет сообщений всех категорий
    	ASSIGN	TimeVxod,AC1 ; Запись времени входа сообщения в сеть
    	ASSIGN	10,(200+P1) ; В Р10 номера Х для счета отправленных сообщений по категориям
    	ASSIGN	11,(P10+MaxKat) ; В Р11 номера Х для счета полученных сообщений по категориям
    	ASSIGN	12,(P11+MaxKat) ; В Р12 номера Х для счета потерянных сообщений по категориям
    	ASSIGN	13,(P12+MaxKat) ; В Р13 номера Х для записи КПС полученных сообщений по категориям
    	ASSIGN	14,(P13+MaxKat) ; В Р14 номера Х для записи КПС потерянных сообщений по категориям
    	SAVEVALUE	*10+,1 ; Cчет отправленных сообщений по категориям
    	MSAVEVALUE Otpr+,P$NumOtpr,P$NumPol,1 ; Запись в матрицу количества отправляемых сообщений абонентам
     Розыгрыш характеристик сообщений
    Met02	ASSIGN	2,V$DL ; Занесение в Р2 длины (вычислительной сложности) сообщения
    	ASSIGN	3,V$VrPer ; Занесение в Р3 времени передачи сообщения
    	ASSIGN	8,V$VrObr ; Занесение в Р8 времени обработки сообщения
    ; Сегмент имитации работы основных каналов 1-6
    OsnK1	GATE FV	P$NumOtpr,ResK1 ; Исправен ли канал?
    	ASSIGN	Vsp1,P$NumOtpr  ; Запись в параметр Vsp1 номера абонента отправителя
    	GATE NU	P$Vsp1;Свободен канал с номером в P$Vsp1?
    	SEIZE	P$Vsp1; Занять канал с номером в P$Vsp1
    	ADVANCE	P3	    ; Имитация передачи сообщения
    	RELEASE	 P$Vsp1 ; Освободить канал с номером в P$Vsp1
    ; Сегмент имитации работы маршрутизатора 1
    Met11	ASSIGN	NumBK1,(2#NKan+1); Запись в параметр номера маршрутизатора как ОКУ
    	TEST E	BV$Prov2,1,Met5 ; Исправен ли ВК1 и есть ли место в его буфере?
    	QUEUE	P$NumBK1,P2   ; Если есть, поместить в буфер ВК1
    Met14	SEIZE	P$NumBK1     ; Занять ВК1
    	DEPART	P$NumBK1,P2    ; Освободить буфер ВК1
    	ADVANCE	P8			; Имитация обработки сообщения
    	ASSIGN	NumNapr,FN$NaprM1 ; Определение номера направления маршрутизатора 1	
    	RELEASE	P$NumBK1	; Освобождение ВК1
    	TEST LE P2,(FN$EmkNaprM1-Q*NumNapr),Met5; Есть ли место в буфере направления
    	QUEUE	P$NumNapr,P2 ; Поместить в буфер направления
    	TEST NE P$NumPol,5,Met21 ; Выделение сообщения для абонента 5
    	TEST NE P$NumPol,6,Met21 ; Выделение сообщения для абонента 6
    	TRANSFER	,Met15 ; Отправить на маршрутизатор 2 сообщения	для абонентов 1-4 
    Met21	DEPART	P$NumNapr,P2 ; Покинуть буфер направления маршрутизатора 1
    	TRANSFER	,Met16 ; Отправить на каналы сообщения для абонентов 5 и 6
    Met15	DEPART	P$NumNapr,P2 ; Покинуть буфер направления маршрутизатора 1
    ; Сегмент имитации работы маршрутизатора 2
    	ASSIGN	NumBK2,(2#NKan+2)
    	TEST E	BV$Prov3,1,Met5 ; Если маршрутизатор 2 исправен и есть место в его буфере, то
    	QUEUE	P$NumBK2,P2 ; поместить в буфер маршрутизатора 2
    	SEIZE	P$NumBK2	; Занять BK2
    	DEPART	P$NumBK2,P2 ; Покинуть буфер маршрутизатора 2
    	ADVANCE	P8	; Имитация обработки сообщения
    	RELEASE	P$NumBK2	; Освобождение BK2
    	TEST E	P$NumPol,1,Met24
    ; Определить номер направления маршрутизатора 2
    	ASSIGN	NumNapr,(KolNapr+1) 
    	TEST LE	P2,(FN$EmkNaprM2-Q*NumNapr),Met5
    	TRANSFER	,Met25
    Met24	TEST E	P$NumPol,2,Met26
    	ASSIGN	NumNapr,(KolNapr+2) ; Определить номер направления маршрутизатора 2
    	TEST LE	P2,(FN$EmkNaprM2-Q*NumNapr),Met5
    	TRANSFER	,Met25
    Met26	TEST E	P$NumPol,3,Met27
    	ASSIGN	NumNapr,(KolNapr+3) ; Определить номер направления маршрутизатора 2
    	TEST LE	P2,(FN$EmkNaprM2-Q*NumNapr),Met5
    	TRANSFER	,Met25
    Met27	TEST E	P$NumPol,4,Met24
    	ASSIGN	NumNapr,(KolNapr+4) ; Определить номер направления маршрутизатора 2
    	TEST LE	P2,(FN$EmkNaprM2-Q*NumNapr),Met5
    Met25	QUEUE	P$NumNapr,P2 ; Поместить в буфер направления маршрутизатора 2
    ; Сегмент имитации работы основных каналов 7-10	
    	ASSIGN	Vsp1,(KolAb+P$NumPol); Определение каналов 7-10
    	DEPART	P$NumNapr,P2 ; Покинуть буфер направления маршрутизатора 2
    	GATE FV	P$Vsp1,ResK2 ; Если исправен основной канал, 
    	GATE NU	P$Vsp1	; и свободен, то
    	SEIZE	P$Vsp1	; занять его
    	ADVANCE	P3	; Передача сообщения
    	RELEASE	P$Vsp1	; Освободить канал
    	TRANSFER	,Met17 ; Отправить для имитации получения сообщения
    ; Сегмент имитации работы основных каналов 11-12	
    Met16	ASSIGN	Vsp1,(KolAb+P$NumPol); Определение каналов 11-12
    	GATE FV	P$Vsp1,ResK2 ; Если исправен основной канал, 
    	GATE NU	P$Vsp1	     ; и свободен, то
    	SEIZE	P$Vsp1	     ; занять его
    Met20	ADVANCE	P3		     ; Передача сообщения
    	RELEASE P$Vsp1	     ; Освободить канал
    ; Сегмент имитации получения сообщений
    Met17	ASSIGN	Vsp3,(2#KolNapr+P$NumPol); Запись в Vsp3 номера буфера абонента-получателя
    	TEST LE P2,(FN$BufAb-Q*Vsp3),Met5 ; Есть ли место в буфере абонента получателя?
    	QUEUE	P$Vsp3,P2 ; Поместить сообщение в буфер
    	DEPART	P$Vsp3,P2 ; Освободить буфер
    	TRANSFER	,Met10  ; Отправить для счёта полученных сообщений
    ; Сегмент имитации работы резервных каналов 13-18
    ResK1	ASSIGN	Vsp1,(NKan+P$NumOtpr)
    	GATE NU	P$Vsp1	; Свободен ли резервный канал?
    	TEST E	X*Vsp1,1,Met7 ; Включить резервный канал
    	ADVANCE	T5	; Включение резервного канала
    	SAVEVALUE	P$Vsp1,0 ; Признак того, что резервный канал включён
    Met7	SEIZE	P$Vsp1	 ; Занять резервный канал
    	ADVANCE	P3	; Передача
    	RELEASE	P$Vsp1	 ; Освободить резервный канал
    	TRANSFER	,Met11 ; Отправить на маршрутизатор 1
    ; Сегмент имитации работы резервных каналов 19-24
    ResK2	ASSIGN	Vsp1,(NKan+KolAb+P$NumPol)
    	TEST NE	P$NumPol,5,Met22 ; Выделение сообщения для абонента 5
    	TEST NE	P$NumPol,6,Met22 ; Выделение сообщения для абонента 6
    Met22	GATE NU	P$Vsp1 ; Свободен ли резервный канал?
    	TEST E	X*Vsp1,1,Met8 ; Включить резервный канал
    	ADVANCE	T5	; Включение резервного канала
    	SAVEVALUE	P$Vsp1,0 ; Признак включения ResK
    Met8	SEIZE	P$Vsp1	; Занять резервный канал
    	ADVANCE	P3	   	; Передача
    	RELEASE	P$Vsp1	; Освободить резервный канал
    	TRANSFER	,Met17 ; Отправить для имитации получения сообщения
    ; Сегмент имитации отказов ВК1
    	GENERATE	,,,1
    	ASSIGN	4,(2#NKan+1) ; Номер BK в P4
    Met50	ADVANCE	(Exponential(897,0,FN$TOtkBK)) ; Розыгрыш времени до очередного отказа
    	GATE FV	P4,Met50
    	FUNAVAIL	P4,RE,Met117 ; Перевод ВК в неисправное состояние
    	ADVANCE	(Exponential(897,0,FN$TVosstBK))	; Имитация восстановления
    	FAVAIL	P4	; Перевод ВК в исправное состояние
    	TRANSFER	,Met50   ; Отправить для розыгрыша очередного отказа
    Met117	RELEASE	P$NumBK1 ; Освобождение ВК прерванным сообщением
    	TRANSFER	,Met5	; Отправить для счета потерь
    ; Сегмент имитации отказов ВК2
    	GENERATE	,,,1
    	ASSIGN	4,(2#NKan+2) ; Номер BK в P4
    Met49	ADVANCE	(Exponential(897,0,FN$TOtkBK)) ; Розыгрыш времени до очередного отказа
    	GATE FV	P4,Met49
    	FUNAVAIL	P4,RE,Met115 ; Перевод ВК в неисправное состояние
    	ADVANCE	(Exponential(897,0,FN$TVosstBK))	; Имитация восстановления
    	FAVAIL	P4	; Перевод ВК в исправное состояние
    	TRANSFER	,Met49   ; Отправить для розыгрыша очередного отказа
    Met115	RELEASE	P$NumBK2 ; Освобождение ВК прерванным сообщением
    	TRANSFER	,Met5	; Отправить для счета потерь
    ; Сегмент имитации отказов каналов связи 1-6
    	GENERATE	,,,KolAb ; Число транзактов - по числу каналов связи
    	SAVEVALUE	NumKan+,1 ; Записать в X$NumCan последовательно 1, 2, ..., KolAb
    	ASSIGN	4,X$NumKan  ; Записать в Р4 последовательно 1, 2, ..., KolAb
    Met19	ADVANCE	(Exponential(897,0,FN$TOtkKan)) ; Розыгрыш времени до очередного отказа
    	GATE FV	P4,Met19
    	FUNAVAIL	P4,RE,Met112 ; Перевод канала в неисправное состояние
    	ASSIGN	NumKan,(NKan+P4)
    	SAVEVALUE	P$NumKan,1 ; Признак включения резервного канала
    	ADVANCE	(Exponential(47,0,FN$TVosstKan)) ; Имитация восстановления канала
    	FAVAIL	P4	; Перевод в исправное состояние
    	TRANSFER	,Met19   ; Отправить для розыгрыша очередного отказа
    Met112	RELEASE	P$Vsp1   ; Освобождение канала с номером в Р$Vsp1
    	TRANSFER	,Met5	; Отправить для счета потерь
    ; Сегмент имитации отказов каналов связи 7-12
    	GENERATE	,,,KolAb  ; Число транзактов - по числу каналов связи
    	SAVEVALUE	NumKan+,1 ; Записать в X$NumCan последовательно 1, 2, ..., KolAb
    	ASSIGN	4,(X$NumKan+KolAb) ; Записать в Р4 последовательно KolAb+1, ...,KolAb+KolAb 
    Met23	ADVANCE	(Exponential(897,0,FN$TOtkKan)) ; Розыгрыш времени до очередного отказа
    	GATE FV	 P4,Met23
    	FUNAVAIL	P4,RE,Met113 ; Перевод канала в неисправное состояние
    	ASSIGN	NumKan,(NKan+P4)
    	SAVEVALUE	P$NumKan,1 ; Признак включения резервного канала
    	ADVANCE	(Exponential(47,0,FN$TVosstKan)) ; Имитация восстановления канала
    	FAVAIL	P4	; Перевод в исправное состояние
    	TRANSFER	,Met23   ; Отправить для розыгрыша очередного отказа
    Met113	RELEASE	P$Vsp1   ; Освобождение канала с номером в Р$Vsp1
    	TRANSFER	,Met5	; Отправить для счета потерь
    Met6	TERMINATE	; Уничтожение сообщений, отправленных самим себе
    ; Сегмент счета переданных и потерянных сообщений и расчет вероятностей передачи сообщений
    Met10	SAVEVALUE	*11+,1 ; Cчет в ячейке с номером в Р11 полученных сообщений всего и по категориям
    	SAVEVALUE	*13,(X*11/X*10) ; Расчет и сохранение в ячейке с номером в Р13 КПС сети по категориям
    	MSAVEVALUE Pol+,P$NumPol,P$NumOtpr,1 ; Счёт и запись в матрицу полученных сообщений
    	MSAVEVALUE KPS,P$NumOtpr,P$NumPol, (MX$Pol(P$NumPol,P$NumOtpr)/MX$Otpr(P$NumOtpr,P$NumPol))
    	TERMINATE	
    Met5	SAVEVALUE	*12+,1 ; Cчет в ячейке с номером в Р12 потерянных сообщений всего и по категориям
    	TERMINATE
    ; Задание времени моделирования и расчёт результатов
    	GENERATE	VrMod	; Задание времени моделирования
    	TEST L	X$Prog,TG1,Met30 ; Если X$Prog<TG1,
    	SAVEVALUE	Prog,TG1      ; то X$Prog=TG1
    Met30	TEST E	TG1,1,Met32 ; Если TG1=1, расчёт и сохранение результатов
    	SAVEVALUE	TimeS,(X$TimeSum/N$Met10) ; Расчёт и сохранение в TimeS среднего времени передачи одного сообщения
    	SAVEVALUE	VPerS,(N$Met10/N$Met4)	; Расчет и сохранение в ячейке VPerS КПС сети
    	SAVEVALUE	VPotS,(N$Met5/N$Met4)	; Расчет и сохранение в ячейке VPotS КПС сети
    Met32 TERMINATE	1
    	START	1000

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

    Всего выполнено 6 экспериментов. Изменение параметров сети связи проводилось также, как и в предыдущих моделях. То есть в каждом следующем эксперименте параметры, изменённые в предыдущем эксперименте, остаются такими же, если не указано их изменение. В шестом эксперименте кроме указанных параметров были также изменены средние интервалы поступления сообщений от всех абонентов (timeAbonent) с 30 до 20.

    В Anylogic в поле Конечное время: было введено 3600000.0. Время моделирования увеличено в 1000 раз по числу прогонов модели. В GPSS указывается модельное время 3600 и 1000 прогонов модели.

    Результаты экспериментов сведены в Табл. 4.11. Видно, что результаты моделирования отличаются незначительно. Коэффициенты пропускной способности $$(\Delta_{11} … (\Delta_{61})$$ отличаются на 0…0,001, а среднее время передачи одного сообщения $$(\Delta_{12} … \Delta_{62})$$ - на 0,071…1,064 с. Коэффициенты загрузки вычислительных комплексов также отличаются на 0…0,022, а коэффициенты загрузки основных каналов - на 0,000…0,001.

    В четвёртом и пятом экспериментах в связи с уменьшением ёмкостей входных буферов ВК1 и ВК2 сообщения второй категории не передаются, так как их средняя длина из всех категорий максимальная.

    Сравнительная оценка позволяет сделать вывод об адекватности результатов моделирования, полученных при использовании для построения моделей одной и той же системы инструментальных средств GPSS World и AnyLogic. Машинное время выполнения модели в GPSS World составляет 22 … 24 с, а в AnyLogic примерно 15 мин.

    Показатели функционирования сети связи
    ПоказателиGPSS WorldAnyLogic6AnyLogic7
    1) Согласно постановке задачи
    Коэффициент пропускной способности сети связи0,8160,8150,817
    $$\Delta_{11} = \left | 0,816-0,816 \right | = 0,001$$
    Время передачи одного сообщения6,1276,0526,056
    $$\Delta_{12} = \left | 6,127-6,056\right | = 0,071$$
    Коэффициент загрузки ВК10,2550,2550,255
    Коэффициент загрузки ВК20,170,170,17
    Коэффициент загрузки основных каналов0,0420,0420,042
    Количество полученных / отправленных сообщений489,930/600,263490,195/601,092489,917/599,907
    2) emkBuferVx =…= emkBuferVx = 70000
    Коэффициент пропускной способности сети связи0,7410,7410,741
    $$\Delta_{21} = \left | 0,741-0,741\right | = 0,000$$
    Время передачи одного сообщения6,1275,8675,88
    $$\Delta_{12} = \left | 6,127-5,880\right | = 0,247$$
    Коэффициент загрузки ВК10,2550,2550,255
    Коэффициент загрузки ВК20,170,170,17
    Коэффициент загрузки основных каналов0,0430,0430,042
    Количество полученных / отправленных сообщений444,728/600,263444,863/600,347444,999/599,929
    3) emkBuferVx =…= emkBuferVx = 60000
    Коэффициент пропускной способности сети связи0,5990,5990,601
    $$\Delta_{31} = \left | 0,599-0,601\right | = 0,002$$
    Время передачи одного сообщения6,1325,665,658
    $$\Delta_{32} = \left | 6,132-5,658\right | = 0,474$$
    Коэффициент загрузки ВК10,2550,2560,277
    Коэффициент загрузки ВК20,170,170,17
    Коэффициент загрузки основных каналов0,0430,0430,042
    Количество полученных / отправленных сообщений359,640/600,584360,251/601,104360,799/599,829
    4) emkBufer1 = 4000000 (маршрутизаторов)
    Коэффициент пропускной способности сети связи0,5990,60,601
    $$\Delta_{41} = \left | 0,599-0,601\right | = 0,002$$
    Время передачи одного сообщения6,1325,655,658
    $$\Delta_{42} = \left | 6,132-5,658\right | = 0,478$$
    Коэффициент загрузки ВК10,2550,2510,255
    Коэффициент загрузки ВК20,170,1690,17
    Коэффициент загрузки основных каналов0,0430,0420,043
    Количество полученных /отправленных сообщений359,640/600,584359,651/599,302360,799/599,829
    5) emkBufer1 = 3000000 (маршрутизаторов)
    Коэффициент пропускной способности сети связи0,5990,5980,602
    $$\Delta_{51} = \left | 0,599-0,602\right | = 0,003$$
    Время передачи одного сообщения6,1325,6485,658
    $$\Delta_{52} = \left | 6,132-5,658\right | = 0,474$$
    Коэффициент загрузки ВК10,2550,2560,255
    Коэффициент загрузки ВК20,170,170,17
    Коэффициент загрузки основных каналов0,0430,0440,043
    Количество полученных / отправленных сообщений359,640/600,584360,114/601,495360,799/599,829
    6) emkBuferVx =…= emkBuferVx = 100000, emkBufer1 = 6000000
    Коэффициент пропускной способности сети связи0,9960,9960,997
    $$\Delta_{61} = \left | 0,996-0,997\right | = 0,001$$
    Время передачи одного сообщения6,1557,2377,219
    $$\Delta_{62} = \left | 6,155-7,219\right | = 1,064$$
    Коэффициент загрузки ВК10,3620,3820,381
    Коэффициент загрузки ВК20,2380,2540,254
    Коэффициент загрузки основных каналов0,0640,0640,064
    Количество полученных / отправленных сообщений848,296/851,388896,072/899,333896,792/898,748
    Страницы:

    Модель в AnyLogic

    Постановка задачи

    В сети связи имеются $$n_1$$ абонентов, обменивающихся между собой сообщениями. Адресация сообщений организована посредством маршрутизаторов. На маршрутизатор поступают сообщения через случайные промежутки времени от $$n_1$$ абонентов со средними интервалами времени $$T_1, T_2, T_{n_1}$$.

    Сообщения могут быть $$n_2$$ категорий с вероятностями их появления $$p_{k1}, p_{k2}, p_{kn{_2}}$$ $$(p_{k1}+p_{k2}+...+p_{kn{_2}}=1)$$ и вычислительными сложностями обработки $$S_1, S_2,...,S_{n_{2}}$$ операций соответственно.

    Маршрутизатор имеет k входов и k выходов, входной буфер 1 ёмкостью $$L_1$$ байт для хранения сообщений, ожидающих обработки. В маршрутизаторе сообщения обрабатываются вычислительным комплексом (ВК) с производительностью Q операций/с. В случае полного заполнения буфера 1 поступающие на маршрутизатор сообщения теряются. Принято допущение, что одна операция вычислительной сложности соответствует одному байту при размещении сообщения в буфере.

    После обработки сообщения в зависимости от направления передачи поступают в соответствующие буферы, стоящие на входах каждого i-го направления связи, $$i=\overline{1,k}$$. Каждый буфер имеет ёмкость $$L_{2i}$$ байт, $$i=\overline{1,k}$$. В случае полного заполнения буфера направления поступающее сообщение теряется.

    Из буферов сообщения передаются по своим направлениям. Каждое направление имеет основной и резервный каналы связи. Скорость передачи сообщений по основному и резервному каналам связи каждого из направлений $$V_{пi}$$ бит/с, $$i=\overline{1,k}$$.

    ВК и основные каналы связи имеют конечную надёжность. Интервалы времени $$T_{отВК}$$ и $$T_{отК_{1}}, T_{отК_{2}}, …,T_{отК_{n}}$$ между отказами ВК и каналов связи случайные. Длительности восстановления ВК и каналов связи $$T_{вВК}}$$ и $$T_{вК_{1}}, T_{вК_{2}}, …,T_{вК_{n}}$$также случайные.

    При отказе обрабатываемые ВК и передаваемые по каналам связи сообщения теряются.

    Исходные данные

    $$n_1=6; k=4;$$ $$Exponential(T_{1})=Exponential(T_{2})=…= Exponential(T_{6})=Exponential(30);$$ $$n_2=4; p_{k1}=0,3; p_{k2}=0,2; p_{k3}=0,2; p_{k4}=0,3; $$ $$Q=40000 оп/с; L_1=5000000;$$ $$normal(S_1, S_{o1}=normal(53000, 6100);$$ $$normal(S_3, S_{o3}=normal(66000, 7000);$$ $$normal(S_4, S_{o4}=normal(50000, 500);$$ $$exponential(T_{отК_{1}})=…= exponential(T_{отК_{8}})=exponential(360);$$ $$exponential(T_{вК_{1}})=…= exponential(T_{вК_{8}})=exponential(3.2);$$ $$exponential(T_{отВК})=exponential(360), exponential(T_{вВК})=exponential(3.7);$$ $$V_{пi}=5000 бит/с, n_{3i}=1, L_{2i}=250000, i=\overline{1,4}.$$

    Задание на исследование

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

    Формализованное описание модели

    Сообщения поступают от $$n_1=6$$ источников. Интервалы поступления сообщений, интервалы между отказами и время восстановления работоспособности распределяются по экспоненциальному закону (exponential), а вычислительные сложности сообщений в зависимости от категорий - по нормальному закону (normal). Для некоторых одинаковых параметров с целью упрощения принято, что они имеют равные значения, например, средние значения интервалов поступления сообщений. Модель же будет построена в некотором приближении универсальной так, что все эти значения могут быть любыми.

    Вариант сети связи при принятых исходных данных (в том числе количестве входов и выходов маршрутизатора) может быть представлен в следующем виде (Рис. 4.1).

    (рис 4.1) Вариант схемы сети связи

    Сообщения абонентов А1 и А2 поступают на вход 1 маршрутизатора М1, абонентов А3 и А4 - на вход 2 маршрутизатора М1, абонента А5 - на вход 3 маршрутизатора М1, абонента А6 - на вход 4 маршрутизатора М1.

    Маршрутизатор М1 настроен таким образом, что сообщения, адресованные абонентам А1 и А2 поступают на вход 1 маршрутизатора М2, а абонентам А3 и А4 - на вход 2 маршрутизатора М2.

    Маршрутизатор М2 настроен так, что его выходы 1…4 подключены к каналам связи, по которым передаются сообщения, адресованные абонентам А1…А4 соответственно.

    Видно, что система связи представляет собой многофазную многоканальную систему массового обслуживания замкнутого типа с ограниченными ёмкостями буферов (накопителей), то есть с отказами.

    Теперь представим маршрутизатор также как систему массового обслуживания и в общем виде (Рис. 4.2).

    (рис 4.2) Маршрутизатор как система массового обслуживания

    В маршрутизаторе выделены блок контроля 1, накопитель (буфер) ВК, непосредственно ВК, блок контроля 2, накопители направлений связи.

    Назначение и функции выделенных в структуре сети связи и маршрутизаторе блоков будет рассмотрено позже в ходе изложения технологии построения модели в AnyLogic.

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

    Сообщения, поступающие на маршрутизатор, должны иметь следующие параметры:

  • numAbOtpr - номер абонента-отправителя сообщения;
  • numAbPol - номер абонента-получателя сообщения;
  • numKat - номер категории сообщения;
  • timeOtpr - время отправления сообщения абонентом;
  • dlina - длина сообщения, байт;
  • timeObr - время обработки сообщения ВК, с;
  • timePered - время передачи сообщения по каналу связи, с.
  • Эти параметры получаются путем розыгрыша по следующим исходным данным:

  • kolAbonent - количество абонентов;
  • timeAbonent - среднее время отправления сообщений абонентом, с;
  • verKat={verKat1, verKat2, verKat3, verKat4} - вероятности распределения видов сообщений первой, второй, третьей и четвёртой категорий соответственно,
  • verKat1+verKat2+verKat3+verKat4=1; dlKat={dlKat1, dlKat2, dlKat3, dlKat4} - средние длины сообщений, байт, первой, второй, третьей и четвёртой категорий соответственно;
  • dlKat0={dlKat01, dlKat02, dlKat03, dlKat04} - стандартные отклонения длин сообщений, байт, первой, второй, третьей и четвёртой категорий соответственно;
  • proizvod - производительность ВК при обработке сообщения, оп/c;
  • skorPeredKan - среднее время передачи сообщений по каналу связи, бит/с;
  • skorPeredKanR - среднее время передачи сообщений по резервному каналу связи, бит/с;
  • timeBklKanR - время включения резервного канала связи.
  • В ходе моделирования собирается следующая статистика:

  • kolOtprKat1, kolOtprKat2, kolOtprKat3,kolOtprKat4, kolOtpr - количество отправленных абонентом сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • kolPolKat1, kolPolKat2,kolPolKat3,kolPolKat4, kolPol - количество полученных абонентом сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • всегоОтпрКат1, всегоОтпрКат2, всегоОтпрКат3, всегоОтпрКат4, всегоОтпр - количество отправленных в сети сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • всегоПолКат1, всегоПолКат2, всегоПолКат3, всегоПолКат4, всегоПол - количество полученных в сети сообщений первой, второй, третьей, четвёртой и всех категорий соответственно;
  • количество отправленных сообщений каждым абонентом каждому абоненту сети;
  • количество полученных сообщений каждым абонентом от каждого абонента сети.
  • По этим статистическим данным рассчитываются:

  • коэффициенты пропускной способности между всеми абонентами сети;
  • коэфПропСпособ - коэффициент пропускной способности сети связи;
  • врПередачи - среднее время передачи абоненту одного сообщения;
  • врПередСооб - среднее время передачи в сети связи одного сообщения.
  • Коэффициенты пропускной способности определяются как отношение количества полученных сообщений к отправленным сообщениям.

    В модели также для выполнения условий ограничения ёмкостей буферов необходимо использовать:

  • emkBuferVx - ёмкость входного буфера абонента, байт;
  • tekEmkBuferVx - текущую ёмкость входного буфера абонента, байт;
  • emkBufer1 - ёмкость входного буфера маршрутизатора, байт;
  • tekEmkBufer1 - текущая ёмкость входного буфера, байт;
  • emkBuferNapr1,emkBuferNapr2,emkostBuferNapr3, emkBuferNapr4 - ёмкости на входах каналов связи первого, второго, третьего и четвёртого направлений соответственно, байт;
  • tekEmkNapr1, tekEmkNapr2, tekEmkNapr3, tekEmkNapr4 - текущие ёмкости на входах каналов связи первого, второго, третьего и четвёртого направлений соответственно, байт.
  • Отказы и восстановление ВК и каналов связи разыгрываются по следующим данным:

  • timeOtkВК - среднее время между отказами ВК;
  • timeVosstВК - среднее время восстановления ВК;
  • timeOtkKan - среднее время между отказами канала связи;
  • timeVosstKan - среднее время восстановления канала связи.
  • Создание новых типов агентов

    Построение модели начнём с создания активных объектов - экземпляров типов агентов. Напомним, что согласно Рис. 4.1 в сети связи выделены следующие сегменты (компоненты):

  • абонент;
  • маршрутизатор;
  • канал.
  • Реализуем эти сегменты средствами AnyLogic, а потом из них, как из созданных нами объектов, будем строить сеть на корневом объекте Main.

    Создайте три новых типа агентов: Абонент, Канал, Маршрутизатор.

  • Выполните команду Файл/Создать/Модель на панели инструментов. Появится диалоговое окно Новая модель.
  • Задайте имя новой модели. В поле Имя модели введите Сеть_связи. Выберите каталог, в котором будут сохранены файлы модели. Щёлкните Готово.
  • На панели Проекты щёлкните правой кнопкой Main и выберите из контекстного меню Создать/Тип агента.
  • Откроется диалоговое окно Новый тип агента.
  • Введите в поле Имя: имя нового типа агента Абонент.
  • Щёлкните Готово.
  • Также создайте типы агентов Канал и Маршрутизатор.
  • Создание областей просмотра

    Последовательно переходите на типы агентов Main, Абонент, Канал, Маршрутизатор и создайте на каждом области просмотра. На них мы будем размещать элементы событийной части модели, а также исходные данные, переменные для промежуточных вычислений и результаты моделирования.

    Значения свойств элементов Область просмотра установите согласно Табл. 4.1.

    Для всех областей просмотра оставьте Выравнивать по: Верхнему левому углу, установите из списка Масштабирование: Подогнать под окно.

    СвойстваОбъекты
    MainАбонентМаршрутизаторКанал
    Имя:облСетьоблАбонентоблМарш1облКанал
    Х:0000
    Y:0000
    Ширина:770810740400
    Высота:470360470340
    Имя:viewDataviewDataviewDataviewData
    Х:870000
    Y:600700550700
    Ширина:470450330400
    Высота:620420250180
    Имя:viewResultviewResult
    Х:00
    Y:6001200
    Ширина:442470
    Высота:820432

    Приступим к созданию сегментов сети связи.

    Сегмент Абонент

    Исходные данные

  • Откройте тип агента Абонент.
  • Перейдите на область просмотра viewData.
  • Перетащите из палитры Презентация элемент Скругленный прямоугольник. На странице Основные оставьте Имя:, предложенное системой.
  • На странице Местоположение и размер панели Свойства введите в поля X: 5, Y: 745, Ширина: 435, Высота: 365.
  • Перетащите два элемента text и на странице Текст панели Свойства вместо text введите Исходные данные и Результаты соответственно (Рис. 4.3).
  • Переход между областями просмотра в ходе моделирования организуйте позднее. Поэтому на относящиеся к этому элементы Сеть и Абонент1 пока не обращайте внимания. (рис 4.3) Размещение элементов Параметр и Переменная
  • Перетащите из палитры Основная элементы Переменная, разместите и дайте им имена согласно Рис. 4.3. Тип всех простых переменных, кроме tekEmkBuferVx, установите double. Тип tekEmkBuferVx - int. Переменные предназначены для промежуточных вычислений и сбора статистических данных за одного абонента сети.
  • Перетащите элементы Параметр, разместите и дайте имена как на Рис. 4.3. Тип всех элементов Параметр, кроме emkBuferVx и numAbonent, double. Тип emkBuferVx и numAbonent - int. Значения свойств установите согласно Табл. 4.2.
  • ИмяМассивРазмерностьЗначение по умолчанию
    kolAbonent 6
    timeAbonent 30
    kolProg 100
    numAbonent 1
    emkBuferVx 80000
    verKatУстановить флажкиKolKat{0.3, 0.5, 0.7, 1.0}
    dlKatKolKat{53000,86000,66000,50000}
    dlKatOKolKat{6100,5000,7000,500}

    На Рис. 4.2 видно, что элементы verKat, dlKat, dlKatO используются как массивы, размерность которых равна числу категорий сообщений. Создайте размерность KolKat.

  • Щёлкните правой кнопкой мышки в панели Проекты и в контекстном меню выберите Размерность.
  • В открывшемся окне Размерность в поле Имя: введите KolKat. Если введёте kolKat, в окне Ошибки появится сообщение: По соглашению, имена типов Java обычно начинаются с заглавной буквы.
  • Установите Тип размерности: Диапазон.
  • В открывшееся поле Диапазон: введите 1-4.
  • Щёлкните Готово.
  • Теперь создайте массив verKat.

  • Выделите элемент Параметр (см. Рис. 4.3).
  • На странице Основные панели Свойства установите флажок Массив. Откроется окно Размерности. Щёлкните по расположенной справа от окна и подсвеченной зелёным кнопке.
  • Откроется окно Edit dimensions. В окошке Возможные размерности: выделите KolКат.
  • Щёлкните по кнопке . Размерность KolКат появится в окошке Выбранные размерности.
  • Закройте окно. Вы вернётесь на панель Свойства. В окошке Размерности вы увидите размерность KolКат.
  • Щёлкните Редактировать значения массива. Откроется одноимённое диалоговое окно.
  • В левой части окна стрелками показано размещение элементов массива. Оставим горизонтальное. Элементы массива имеют разные значения. Поэтому не используем [ВСЕ].
  • В правой части окна введите значения элементов массива:
    0.3, 0.5, 0.7, 1.0
  • Создайте также массивы dlKat, dlKatO одинаковой размерности KolKat. Данные в поле По умолчанию введите из Табл. 4.2.
  • Для получения стандартной статистической информации о времени передачи сообщений по каждому абоненту добавьте элемент сбора статистики.

  • Перетащите элемент Данные гистограммы с палитры Статистика.
  • Задайте свойства элемента:
  • измените Имя: на врПередачи;
  • сделайте Количество интервалов: равным 10;
  • задайте Нач. размер интервалов: 0.01.
  • Теперь можно было бы приступить к построению событийной части сегмента. Однако вы решили вывести результаты моделирования в более презентабельном виде. Поэтому целесообразнее организовать этот вывод, поскольку полученные при этом данные (имена, опции и др.) необходимы будут в дальнейшем при написании кода в событийной части сегмента.

    Результаты моделирования по каждому абоненту

    Вариант размещения элементов для вывода результатов моделирования показан на Рис. 4.4.

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

    (рис 4.4) Размещение элементов для вывода результатов моделирования
  • В Палитре выделите Презентация. Перетащите элемент Скругленный прямоугольник в область просмотра облАбонент.
  • На странице Основные в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
  • На странице Местоположение и размер панели Свойства. Введите в поля X: 13, Y: 1250, Ширина: 447, Высота: 371.
  • Перетащите элемент text. В поле Текст: введите Результаты моделирования.
  • В Палитре выделите Элементы управления. Перетащите элементы Текстовое поле на элемент Результаты моделирования. Разместите их так, как показано на Рис. 4.4. Значения свойств установите согласно Табл. 4.3. У элементов editbox и editbox5 Ширина: 100, Высота: 31. У остальных - Ширина: 50.
  • Осталось поместить элемент для обработки и вывода статистической информации о времени передачи одного сообщения.

  • В Палитре выделите Статистика.
  • Перетащите элемент Гистограмма. Характеристики его размещения даны в Табл. 4.3.
    Всего сообщений полученоПолучено сообщений по категориям
    editboxeditbox1editbox2editbox3editbox4
    X: 21X: 177X: 247X: 317X: 389
    Y: 1310Y: 1310Y: 1310Y: 1310Y: 1310
    Всего сообщений отправленоОтправлено сообщений по категориям
    editbox5editbox6editbox7editbox8editbox9
    X: 19X: 179X: 249X: 319X: 389
    Y: 1390Y: 1390Y: 1390Y: 1390Y: 1390
    Время передачи сообщения
    МинимальноеМаксимальноеСреднее
    editbox13editbox12editbox15
    X: 319X: 319X: 319
    Y: 1470Y: 1520Y: 1570
    сhart-Гистограмма
    X: 19Y: 1450Ширина: 240Высота: 160
  • На странице Основные панели Свойства в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
  • Щёлкните кнопку Добавить данные и введите в поле Данные: имя врПередачи.
  • В поле Заголовок: введите Время передачи.
  • Значения остальных свойств (цвет и др.) установите по собственному усмотрению.
  • Добавьте остальные элементы презентации (номера категорий сообщений, другую текстовую информацию, например, Всего сообщений получено и др.) согласно Рис. 4.4.
  • И снова, прежде чем перейти к построению событийной части сегмента Абонент, разместим на корневом агенте Main необходимые элементы для сбора статистических данных, обработки, расчёта показателей качества обслуживания сети и их вывода. Это необходимо сделать по той причине, что также имена этих элементов нужны будут при написании кода в сегменте Абонент.

    Показатели качества обслуживания сети связи

  • Откройте корневой объект Main.
  • Перейдите на область просмотра ViewData. (рис 4.5) Элементы для сбора и вывода данных за сеть в целом
  • Перетащите или скопируйте элементы Переменная, разместите и дайте имена согласно Рис. 4.5.
  • Тип всех переменных double. Переменные отпр11…отпр66 предназначены для накопления статистических данных о количестве отправленных сообщений абонент - абонент. Например, отпр23 - количество сообщений, отправленных абонентом 2 абоненту 3, а отпр32 - количество сообщений, отправленных абонентом 3 абоненту 2. По этим данным рассчитываются коэффициенты пропускной способности кПрСп12…кПрСп66 абонент - абонент.
  • Выровняйте элементы. Выделите нужные элементы, Щёлкните правой кнопкой мышки, выберите Выравнивание.
  • Перетащите элемент Данные гистограммы с палитры Статистика.
  • Задайте свойства элемента:
  • измените Имя: на врПередСооб;
  • сделайте Количество интервалов: равным 10;
  • задайте Нач. размер интервалов: 0.01.
  • Теперь организуем вывод в более презентабельном виде. На Рис. 4.6 показаны элементы для вывода количественных показателей качества обслуживания сети связи. Часть результатов моделирования будем выводить в таком же виде и такие же, как и для каждого абонента.

  • Перейдите на область просмотра ViewResult.
  • Откройте объект Абонент.
  • Скопируйте элементы в скруглённом прямоугольнике с именем Результаты моделирования.
  • Перейдите на корневой объект Main и вставьте скопированные элементы в верхнюю часть области просмотра ViewResult (см. Рис. 4.6).
  • Добавьте элемент Текстовое поле (editbox10) для вывода коэффициента пропускной способности сети.
  • Внесите правки в текстовые сообщения согласно Рис. 4.6.
  • В Палитре выделите Статистика. Перетащите элемент Гистограмма.
  • На странице Основные панели Свойства в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя. (рис 4.6) Вывод показателей качества обслуживания сети
  • Щёлкните кнопку Добавить данные и введите в поле Данные: имя врПередачи.
  • В поле Заголовок: введите Время передачи.
  • Значения остальных свойств (цвет и др.) установите по собственному усмотрению.
  • В Палитре выделите Презентация. Перетащите элемент Скругленный прямоугольник в область просмотра результатов ViewResult.
  • На странице Основные в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
  • На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 1000, Ширина: 420, Высота: 410.
  • Перетащите элемент text. В поле Текст: введите Коэффициенты пропускной способности абонент-абонент.
  • В Палитре выделите Элементы управления. Перетащите элемент Текстовое поле. Разместите X: 20, Y: 1078, Ширина: 48, Высота: 25. В поле Имя: введите КПрСп11. Сбросьте флажок Отображать имя.
  • Перетащите элемент text. В поле Текст: введите КПрСп11.
  • Скопируйте элементы text и Текстовое поле. Вставьте их пять раз согласно Рис. 4.6. При этом в полях Имя: последовательно меняются имена КПрСп12… КПрСп16. Но поле Текст: останется неизменным, т.е. КПрСп11. Внесите правки в соответствии с Рис. 4.6. Элемент text добавлен потому, что в ходе моделирования имя элемента Текстовое поле не отображается.
  • Аналогичным образом добавьте остальные элементы text и Текстовое поле согласно Рис. 4.6.
  • Теперь можно перейти к построению событийной части сегмента.

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

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

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

  • Из палитры Презентация перетащите элемент Прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 50, Ширина: 450, Высота: 380.
  • Перетащите элемент text и в поле Текст: введите Абонент1. (рис 4.7) Алгоритм блока Абонент1
  • Перетащите из Библиотеки моделирования процессов объект source. Поместите его так же, как на Рис. 4.8. Остальные объекты блока Абонент1 вы будете перетаскивать и размещать по мере необходимости.
  • (рис 4.8) Реализация блока Абонент1 средствами AnyLogic

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

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

  • Выделите объект source.
  • В панели Проект щёлкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
  • Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса: Message.
  • В поле Базовый класс: выберите из выпадающего списка Entity . Щёлкните кнопку Далее. (рис 4.9) Дополнительные поля класса заявок Message
  • Появится вторая страница Мастера создания Java класса. Добавьте поля Java класса, показанные на Рис. 4.9.
  • Оставьте флажки Создать конструктор и Создать метод toString (). Щёлкните Готово. Закройте редактор кода.
  • Щёлкните правой кнопкой мыши в панели Проект только что созданный Java класс и в контекстном меню выберите Преобразовать Java класс в тип агента. Закройте окно с параметрами.
  • Продолжим построение блока Абонент1.

  • Выделите объект source. На странице Основные панели Свойства установите следующие свойства:
  • Тип заявки: Message
  • Прибывают согласно Времени между прибытиями
  • Время между прибытиями exponential(1/timeAbonent)
  • Новая заявка 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 заносится время отправления сообщения.

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

  • Из палитры Презентация перетащите элемент Скруглённый прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 210, Y: 100, Ширина: 65, Высота: 60.
  • Из палитры Основная перетащите два элемента порт. Разместите их как на Рис. 4.8. В поле Имя: замените предложенное системой на вх и вых.
  • Обратите внимание на то, чтобы у элементов Скруглённый прямоугольник и порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Абонент1 этот флажок должен быть сброшенным. В противном случае вы обнаружите их также на верхнем уровне - на диаграмме Main.
  • Итак, отправляемое сообщение поступило в канал связи, подключённый к порту вых.

    Через порт вх сообщения поступают из канала связи. Продолжим построение блока Абонент1.

  • Перетащите объект selectOutput (имя selectOutput3). Он предназначен для контроля текущей ёмкости входного буфера. В случае заполнения буфера, сообщения теряются.
  • Соедините порт вх с входом объекта selectOutput3.
  • Перетащите объект sink (имя sink1). Его вход соедините с выходом F объекта selectOutput3.
  • Выделите объект selectOutput3 и установите его свойства:
  • Тип заявки: Message
  • Выход true выбирается При выполнении условия
  • Условие emkBuferVx-tekEmkBuferVx>=entity.dlina
  • Перетащите объект queue. Укажите его свойства:
  • Имя: БуферВх
  • Тип заявки: Message
  • Вместимость emkBuferVx
  • Действие при входе tekEmkBuferVx+=entity.dlina;
  • Действия При выходе tekEmkBuferVx-=entity.dlina;
  • Соедините его вход с выходом Т объекта selectOutput3.

  • Перетащите selectOutput5 (имя selectOutput4). Он необходим для разделения потока полученных сообщений по категориям.
  • На страницах панели Свойства установите свойства согласно Табл. 4.5. Эти свойства также являются кодом. Код предназначен для:
  • счёта полученных сообщений за сеть связи в целом и по категориям сообщений,
  • определения числа полученных сообщений за один прогон,
  • вывода расчётов за каждого абонента, а также за сеть связи в целом.
  • Соедините выход элемента БуферВх с выходом объекта selectOutput4.
  • Перетащите два объекта selectOutput5 (имена selectOutput5 и selectOutput6). Объекты предназначены для разделения и счёта получаемых сообщений по абонентам. Значения свойств установите также согласно Табл. 4.5. Выход по умолчанию объекта selectOutput5 соедините с входом объекта selectOutput6.
    СвойствоselectOutput4
    Тип заявки:Message
    Условия
    Использовать:g++;
    Действия При входе:kolPol=g/kolProg;
    editbox.setText(kolPol, true);
    main.g++;
    main.всегоПол=main.g/kolProg;
    main.editbox.setText(main.всегоПол, true);
    Условие 1entity.numKat==1
    Действия При выходе 1k1++;
    kolPolKat1=k1/kolProg;
    editbox1.setText(kolPolKat1, true);
    main.k1++;
    main.всегоПолКат1=main.k1/kolProg;
    main.editbox1.setText(main.всегоПолКат1, true);
    Условие 2entity.numKat==2
    Действия При выходе 2k2++;
    kolPolKat2=k2/kolProg;
    editbox2.setText(kolPolKat2, true);
    main.k2++;
    main.всегоПолКат2=main.k2/kolProg;
    main.editbox2.setText(main.всегоПолКат2, true);
    Условие 3entity.numKat==3
    Действия При выходе 3k3++;
    kolPolKat3=k3/kolProg;
    editbox3.setText(kolPolKat3, true);
    main.k3++;
    main.всегоПолКат3=main.k3/kolProg;
    main.editbox3.setText(main.всегоПолКат3, true);
    Условие 4entity.numKat==4
    Действия При выходе 4k4++;
    kolPolKat4=k4/kolProg;
    editbox4.setText(kolPolKat4, true);
    main.k4++;
    main.всегоПолКат4=main.k4/kolProg;
    main.editbox4.setText(main.всегоПолКат4, true);
    СвойствоselectOutput5
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==1
    Условие 2entity.numAbOtpr==2
    Действия При выходе 2отАб2++;
    main.кПрСп21=отАб2/main.отпр21;
    main.КПрСп21.setText(main.кПрСп21, true);
    Условие 3entity.numAbOtpr==3
    Действия При выходе 3отАб3++;
    main.кПрСп31=отАб3/main.отпр31;
    main.КПрСп31.setText(main.кПрСп31, true);
    Условие 4entity.numAbOtpr==4
    Действия При выходе 4отАб4++;
    main.кПрСп41=отАб4/main.отпр41;
    main.КПрСп41.setText(main.кПрСп41, true);
    СвойствоselectOutput6
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==5
    Действия При выходе 1отАб5++;
    main.кПрСп51=отАб5/main. отпр51;
    main.КПрСп51.setText(main.кПрСп51, true);
    Условие 2entity.numAbOtpr==6
    Действия При выходе 2отАб6++;
    main.кПрСп61=отАб6/main.отпр61;
    main.КПрСп61.setText(main.кПрСп61, true);
  • Перетащите объект sink2. Его вход соедините с выходами 1…4 объекта selectOutput5 и выходами объекта selectOutput6.
  • Установите свойства объекта sink2 согласно Табл. 4.6. Код предназначен для расчёта коэффициента пропускной способности сети связи и времени передачи одного сообщения.
  • Свойствоsink2
    Тип заявки:Message
    Действия При входе:врПередачи.add(time()-entity.timeOtpr);
    editbox11.setText(врПередачи.mean(), true);
    editbox12.setText(врПередачи.max(), true);
    editbox13.setText(врПередачи.min(), true);
    main.коэфПропСпособ=main.всегоПол/main.всегоОтпр;
    main.editbox10.setText(main.коэфПропСпособ, true);
    main.врПередСооб.add(time()-entity.timeOtpr);
    main.editbox11.setText(main.врПередСооб.mean(), true);
    main.editbox12.setText(main.врПередСооб.max(), true);
    main.editbox13.setText(main.врПередСооб.min(), true);

    Приступим к построению сегмента Маршрутизатор.

    Сегмент Маршрутизатор

    Исходные данные

  • Откройте тип агента Маршрутизатор.
  • Перейдите на область просмотра viewData.
  • Перетащите из палитры Презентация элемент Скругленный прямоугольник. На странице Основные в поле Имя: оставьте имя, предложенное системой.
  • На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 600, Ширина: 314, Высота: 190.
  • Перетащите элемент text и в поле Текст: введите Исходные данные (Рис. 4.9.).
  • Перетащите элементы Параметр и Переменная. Разместите их и дайте имена согласно Рис. 4.10.
  • Значения по умолчанию элементов Параметр установите согласно Табл. 4.7.
  • Тип timeOtkBK, timeVosstBK, proizvod установите double, остальных параметров и простых переменных - int.
  • (рис 4.10) Исходные данные сегмента Маршрутизатор
    ИмяЗначение по умолчаниюИмяЗначение по умолчанию
    emkBufer15000000emkBuferNapr1250000
    timeOtkBK3600emkBuferNapr2250000
    timeVosstBK3,7emkBuferNapr3250000
    proizvod40000emkBuferNapr4250000

    Событийная часть сегмента Маршрутизатор

    Элементы событийной части сегмента Маршрутизатор показаны на Рис. 4.11. Сегмент включает Вычислительный комплекс, Буфер 2, порты входа-выхода, Имитатор отказов вычислительного комплекса.

    В свою очередь вычислительный комплекс содержит Блок контроля 1, Буфер 1, Блок обработки сообщений.

    Построим событийную часть сегмента Маршрутизатор.

    Блок контроля 1

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

    Алгоритм работы Блока контроля 1 представлен на Рис. 4.12.

    В AnyLogic этот алгоритм реализуется блоками selectOutput, hold и sink.

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля: X: 26, Y: 50, Ширина: 154, Высота: 150.
  • Перетащите объекты selectOutput, hold и sink на диаграмму типа агента Маршрутизатор, разместите и соедините так, как показано на Рис. 4.11.
  • Перетащите элемент text и на странице Текст панели Свойства вместо text введите Блок контроля 1.
  • Выделите объект selectOutput.
  • В поле Имя: вместо selectOutput введите blokKontrol_1.
  • В поле Тип заявки: Agent замените Message. (рис 4.11) Событийная часть сегмента Маршрутизатор (рис 4.12) Алгоритм работы Блока контроля 1
  • Установите Выход true выбирается При выполнении условия.
  • В поле Условие введите условие:
    (emkostBufer1-tekEmkostBufer1>=entity.dlina)
    (hold.isBlocked()==false)

    При выполнении условия заявка направляется на выход T (выходной порт для заявок, для которых выбирается выход true) и на выход F (выходной порт для заявок, для которых выбирается выход false), если условие не выполняется, соответственно.

  • Выделите объект sink. В поле Тип заявки: Agent замените Message.
  • В поле Действие при входе введите kolPotBK++; для счёта количества сообщений, потерянных при отказе вычислительного комплекса.
  • Выделите элемент hold. В поле Тип заявки: Agent замените Message.
  • Блок Буфер 1

    Блок Буфер 1 предназначен для приема, размещения и хранения поступающих на обработку сообщений.

    Алгоритм работы блока Буфер 1 приведен на Рис. 4.13.

    В AnyLogic алгоритм блока Буфер 1 реализуется объектом queue, который выполняет функции очереди (FIFO).

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 190, Y: 50, Ширина: 126, Высота: 100.
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не ставьте флажок Отображать имя.
  • Перетащите элемент text и на странице Текст панели

    Свойства вместо text введите Буфер 1.

    (рис 4.13) Алгоритм работы блока Буфер 1
  • Выделите объект queue.
  • В поле Имя: вместо queue введите bufer1.
  • В поле Тип заявки: Agent замените Message.
  • В поле Вместимость введите emkBufer1.
  • При помещении сообщения в буфер его текущая емкость увеличивается, поэтому в поле Действия При входе введите:
    tekEmkBufer1 += entity.dlina;
  • При выходе сообщения из буфера его текущая емкость уменьшается, поэтому в поле Действия При выходе введите:
    tekEmkBufer1 -= entity.dlina;
    entity.timeObr=entity.dlina/proizvod;
  • Поставьте флажок Включить сбор статистики.
  • Блок обработки сообщений

    Блок предназначен для имитации обработки сообщений.

    Алгоритм работы блока приведен на Рис. 4.14.

    (рис 4.14) Алгоритм работы Блока обработки сообщений

    Для реализации алгоритма Блока обработки сообщений в AnyLogic используется объект delay.

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Также не устанавливайте флажок Отображать имя.
  • На странице Местоположение и размер панели Свойства введите в поля X: 336, Y: 50, Ширина: 194, Высота: 100.
  • Перетащите элемент text и на странице Текст панели Свойства вместо text введите название Блок обработки сообщений.
  • Перетащите объект delay, разместите и соедините с bufer_1 так, как на Рис. 4.11.
  • Выделите объект delay. На странице Основные панели Свойства в поле Имя: вместо delay введите сomputer.
  • В поле Тип заявки: Agent замените Message.
  • Задержка задаётся установите Определённое время.
  • В поле Время задержки введите:
    exponential(1/entity.timeObr)
  • Оставьте Вместимость 1.
  • Действие при выходе
    коэфЗагрВК1=computer.statsUtilization.mean();
  • Установите флажок Включить сбор статистики.
  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не ставьте флажок Отображать имя.
  • На странице Местоположение и размер панели Свойства введите в поля X: 20, Y: 40, Ширина: 520, Высота: 170.
  • Перетащите элемент text и на странице Текст панели Свойства вместо слова text введите название Вычислительный комплекс.
  • Блок контроля 2

    Блок контроля 2 предназначен для распределения сообщений по направлениям и контроля текущих ёмкостей буферов (накопителей) направлений передачи сообщений.

    Алгоритм работы Блока контроля 2 приведен на Рис. 4.15.

    (рис 4.15) Алгоритм работы блока Блок контроля 2

    Вначале определяется номер направления, по которому должно быть передано поступившее сообщение. Затем определяется наличие достаточной свободной памяти в буфере этого направления. При отсутствии нужного объёма памяти сообщение теряется.

    Для распределения сообщений по направлениям можно было бы использовать объекты selectOutput5 и sink. Однако мы используем другие объекты AnyLogic: exit и enter. Они позволяют организовать сложную маршрутизацию, вследствие чего на Рис. 4.11 Блок контроля 2 не выделен, хотя функционально он существует.

  • Перетащите объект exit, вход которого соедините с выходом computer (Рис. 4.10).
  • В поле Тип заявки: Agent замените Message.
  • В поле Действия При выходе введите код:
    int i;
    	i=entity.numIstPol;
    	 {
    			switch (i) 
    {
    				case 1:if (emkBuferNapr1-tekEmkNapr1>=entity.dlina) {
    							enter1.take(entity);
    							break;}
    						else {enter.take(entity);
    							break;}  
    				case 2:if (emkBuferNapr1-tekEmkNapr1>=entity.dlina) {
    							enter1.take(entity);
    							break;}
    						else {enter.take(entity);
    		    				break;}  
    				case 3:if (emkBuferNapr2-tekEmkNapr2>=entity.dlina) {
    							enter2.take(entity);
    							break;}
    						else {enter.take(entity);
    						    break;}  
    				case 4:if (emkBuferNapr2-tekEmkNapr2>=entity.dlina) {
    							enter2.take(entity);
    							break;}
    						else {enter.take(entity);
    	    					break;}
    	    		case 5:if (emkBuferNapr3-tekEmkNapr3>=entity.dlina) {
    							enter3.take(entity);
    							break;}
    						else {enter.take(entity);
    	    					break;}
    				case 6:if (emkBuferNapr4-tekEmkNapr4>=entity.dlina) {
    							enter4.take(entity);
    							break;}
    						else {enter.take(entity);
    	    					break;}     
    			}
    		}
  • Маршрутизатор настраивается определённым образом, например, таблицей маршрутизации. В данном случае он настраивается программным путём так, что сообщения первого и второго отправителей передаются по первому направлению, третьего и четвёртого отправителей - по второму направлению, пятого отправителя - по третьему и шестого отправителя - по четвёртому направлению. Такой вариант принят с учётом построения в дальнейшем сети связи (см. Рис. 4.1).

    Блок Буфер 2

    Блок Буфер 2 предназначен для приема и хранения сообщений, передаваемых по каналам направлений. Он состоит из четырёх буферов - для каждого направления свой буфер.

    Алгоритм работы буфера каждого из направлений такой же, как и алгоритм работы буфера 1 (см. Рис. 4.13).

    Реализуется каждый из буферов также объектом queue.

  • В Палитре выделите Презентация. Перетащите элемент Прямоугольник (см. Рис. 4.11).
  • На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
  • На странице Местоположение и размер панели Свойства введите в поля X: 550, Y: 20, Ширина: 140, Высота: 290.
  • Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Буфер 2.
  • Перетащите пять объектов enter, четыре объекта queue и один объект sink, разместите, дайте имена и соедините так, как на Рис. 4.11.
  • Выделите элемент buferNapr1, вход которого соединён с выходом enter1 и установите значения свойств.
  • В поле Тип заявки: Agent замените Message.
  • Вместимость emkBuferNapr1
  • В поле Действия При входе введите:
    tekEmkNapr1 += entity.dlina;
  • В поле Действия При выходе введите:
    tekEmkNapr1 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Выделите элемент buferNapr2, вход которого соединен с выходом enter2 и установите значения свойств.
  • В поле Тип заявки: Agent замените Message.
  • Вместимость emkBuferNapr2
  • В поле Действия При входе введите:
    tekEmkNapr2 += entity.dlina;
  • В поле Действия При выходе введите:
    tekEmkNapr2 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Выделите элемент buferNapr3, вход которого соединен с выходом enter3 и установите значения свойств.
  • В поле Тип заявки: Agent замените Message.
  • Вместимость emkBuferNapr3
  • В поле Действия При входе введите:
    tekEmkNapr3 += entity.dlina;
  • В поле Действия При выходе введите:
    tekEmkNapr3 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Выделите элемент buferNapr4, вход которого соединен с выходом enter4 и установите значения свойств.
  • В поле Тип заявки: Agent замените Message.
  • Вместимость emkBuferNapr4
  • В поле Действия При входе введите:
    tekEmkNapr4 += entity.dlina;
  • В поле Действия При выходе введите:
    tekEmkNapr4 -= entity.dlina;
  • Установите флажок Включить сбор статистики.
  • Организация входных и выходных портов

    Также как и для источника сообщений, для маршрутизатора нужно создать выходы, через которые отправлять сообщения, и входы, по которым получать сообщения. Создайте эти входы и выходы.

  • Перетащите элемент Скруглённый прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 536, Y: 340, Ширина: 83, Высота: 110.
  • Из палитры Основная перетащите восемь элементов Порт. Разместите их как на Рис. 4.11. В полях Имя: предложенные системой имена замените согласно Рис. 4.11. Установите флажки Отображать имя.
  • Обратите также внимание на то, чтобы у элементов Скруглённый прямоугольник и Порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Маршрутизатор этот флажок должен быть сброшенным.
  • Соедините выходы элементов buferNapr1… buferNapr4 с соответствующими портами вых1… вых4, а порты вх1… вх4 - с входом элемента blokKontrol_1 (Блок контроля 1).
  • Имитатор отказов вычислительного комплекса

    Принято, что вычислительный комплекс может выходить из строя и отказывать в обработке сообщений. Можно было бы построить имитатор отказов так, что генератор вырабатывает заявки-отказы в количестве, определяемом длительностью времени моделирования. Однако мы сделаем так, что генератор вырабатывает одну заявку, а затем этот процесс повторяется через интервалы времени, равные наработке до очередного отказа.

  • Перетащите элемент Прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 160, Y: 224, Ширина: 340, Высота: 140.
  • Перетащите объект source и два объекта delay. Разместите и соедините их как на Рис. 4.11.
  • Выделите source и установите значения его свойств:
  • Прибывают согласно Интенсивности
  • Интенсивность прибытия 1
  • Количество заявок, прибывающих за один раз 1
  • Ограниченное количество прибытий 1
  • Максимальное количество прибытий 1
  • Выделите первый объект delay и установите значения его свойств:
  • Имя: розыгрыш_инт_до_отказа
  • Задержка задаётся Определённое время
  • Время задержки exponential(1/timeOtkBK)
  • Вместимость 1
  • Действия При выходе
    hold.setBlocked(true);
    if (computer.size()!=0) {
    computer.remove((Message)computer.get(0));
    kolPoterBK ++;}
  • Выделите второй объект delay и установите значения его свойств:
  • Имя: имитация_восст_ВК
  • Задержка задаётся Определённое время
  • Время задержки exponential(1/timeVosstBK)
  • Вместимость 1
  • Действия При выходе
    hold.setBlocked(false)
  • Сегмент Канал

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

    Для его реализации в AnyLogic используется имитационная модель направления связи (глава 2), которое состоит из основного и резервного каналов.

    Исходные данные

  • Откройте объект Канал. Перейдите на область просмотра viewData.
  • Перетащите элемент Скруглённый прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 752, Ширина: 377, Высота: 118.
  • Перетащите элементы Параметр и Переменная, разместите и дайте им имена согласно Рис. 4.16.
  • Типы и значения по умолчанию установите согласно Табл. 4.8.
  • ИмяТипЗначение по умолчанию
    skorPeredKandouble5000
    skorPeredKanRdouble5000
    timeOtkKan double360
    timeVosstKandouble3,2
    timeBklResKdouble0,1
    всего_потеряно_сообщint0

    Событийная часть сегмента Каналы

  • Перейдите на область просмотра облКаналы.
  • Перетащите элемент Прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 186, Y: 50, Ширина: 200, Высота: 135.
  • Перетащите объект selectOutput, разместите как на Рис. 4.17.
  • Оставьте предложенные системой имена и флажок Отображать имя.
  • В поле Тип заявки: Agent замените Message. (рис 4.16) Исходные данные сегмента Канал (рис 4.17) Объекты событийной части сегмента Канал
  • Выход true выбирается: При выполнении условия.
  • Условие: основной_канал_работает.
  • При выходе (true):
    entity.timePered=entity.dlina/skorPeredKan;
  • В поле Вместимость введите 1.
  • При выходе (false):
    if (а==0)
    entity.timePered=entity.dlina/skorPeredKanR;
    if (а==1)
    {entity.timePered=entity.dlina/skorPeredKanR +
    timeBklResK;
    а=0;}
    а=1;
  • Установите флажок Включить сбор статистики.
  • Скопируйте объект delay. Вставьте его один раз. При этом изменится имя на основной_канал, а остальные свойства останутся неизменными.
  • Замените имя основной_канал на резерв_канал.
  • Действия При выходе
    коэфЗагрРезК=резерв_канал.statsUtilization.mean();
    коэфЗагрКан=коэфЗагрОснК+коэфЗагрРезК;
  • Соедините согласно Рис. 4.17 объекты selectOutput и delay.
  • Организация входного и выходного портов

  • Перетащите элемент Скруглённый прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 50, Y: 80, Ширина: 60, Высота: 52.
  • Из палитры Основная перетащите два элемента Порт. Разместите их как на Рис. 4.17. В полях Имя: предложенные системой имена замените согласно Рис. 4.17. Установите флажки Отображать имя.
  • Обратите также внимание на то, чтобы у элементов Скруглённый прямоугольник и Порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Канал этот флажок должен быть сброшенным.
  • Соедините выходы элементов основной_канал и резерв_канал с портом вых, а порт вх - с входом элемента selectOutput.
  • Имитатор отказов каналов связи

    Имитатор отказов основного канала связи построен аналогично имитатору отказов вычислительного комплекса.

  • Перетащите элемент Прямоугольник.
  • На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 212, Ширина: 380, Высота: 120.
  • Перетащите объект source и два объекта delay. Разместите и соедините их как на Рис. 4.17.
  • Выделите source и установите значения его свойств:
  • Отображать имя установите флажок
  • Прибывают согласно Интенсивности
  • Интенсивность прибытия 1
  • Количество заявок, прибывающих за один раз 1
  • Ограниченное количество прибытий установите флажок
  • Максимальное количество прибытий 1
  • Действия При выходе
  • Выделите первый объект delay и установите значения его свойств:
  • Имя: розыг_инт_до_отказа
  • Отображать имя установите флажок
  • Задержка задаётся Определённое время
  • Время задержки exponential(1/timeOtkKan)
  • Вместимость 1
  • Действия При выходе:
    основной_канал_работает = false;
    if (основной_канал.size()!=0){
    	Message m = основной_канал.get(0);
    	основной_канал.stopDelayForAll();
    	всего_потеряно_сообщ ++;}
  • Выделите второй объект delay и установите значения его свойств:
  • Имя имитация_восст_осн_кан
  • Отображать имя установите флажок
  • Задержка задаётся Определённое время
  • Время задержки exponential(1/timeVosstkKan)
  • Вместимость 1
  • Действия При выходе:
    основной_канал_работает = true;
  • Построение модели сети связи

    Все необходимое для построения модели сети из активных объектов Абонент, Канал и Маршрутизатор нами создано. Приступим к построению модели сети.

  • Перейдите на Main к области просмотра облСеть.
  • Из окна Проекты перетащите объект абонент1 и поместите как на Рис. 4.18.
  • Объект абонент1 имитирует абонента 1. В свойствах абонент1 записан код для расчёта коэффициентов пропускной способности абонентов 2…6 с абонентом 1. Следовательно, абонент2 должен иметь код для расчёта коэффициентов пропускной способности абонентов 1, 3…6 с абонентом 2 и т.д.
  • Создайте типы агентов Абонент2…Абонент6.
  • Откройте Абонент1. Скопируйте все объекты.
  • Вставьте скопированные объекты на объекты Абонент2 … Абонент6.
  • Внесите правки в коды согласно Табл. 4.9.
  • Из окна Проекты перетащите объекты абонент2 … абонент6.
  • Из окна Проекты перетащите объект канал и поместите вверху (см. Рис. 4.18). В поле Имя: добавьте к предложенному имени 1.
  • Скопируйте объект канал1. Вставьте пять объектов. Разместите их как на Рис. 4.18. Нам потребуются ещё несколько каналов связи, но мы их образуем позже после создания второго маршрутизатора.
  • Выходы объектов абонент1…абонент6 соедините с соответствующими входами объектов канал1…канал6.
  • Из окна Проекты перетащите объект маршрутизатор. В поле Имя: установите маршрут1.
  • Соедините выходы первого и второго абонентов с вх1, выходы третьего и четвёртого - с вх2, пятого - с вх3, шестого - с вх4 объекта маршрут1.
  • (рис 4.18) Элементы модели функционирования сети связи
    Абонент2
    СвойствоselectOutput
    Тип заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbPol == numAbonent
    numAbonent2
    СвойствоselectOutput1
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==1
    Действия При выходе 1отпрАб1++;
    main.отпр21=отпрАб1;
    Условие 2entity.numAbPol==2
    Условие 3entity.numAbPol==3
    Действия При выходе 3отпрАб3++;
    main.отпр23=отпрАб3;
    Условие 4entity.numAbPol==4
    Действия При выходе 4отпрАб4++;
    main.отпр24=отпрАб4;
    СвойствоselectOutput2
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==5
    Действия При выходе 1отпрАб5++;
    main.отпр25=отпрАб5;
    Условие 2entity.numAbPol==6
    Действия При выходе 2отпрАб6++;
    main.отпр26=отпрАб6;
    СвойствоselectOutput5
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==1
    Действия При выходе 1отАб1++;
    main.кПрСп12=отАб1/main.отпр12;
    main.КПрСп12.setText(main.кПрСп12, true);
    Условие 2entity.numAbOtpr==2
    Условие 3entity.numAbOtpr==3
    Действия При выходе 3отАб3++;
    main.кПрСп32=отАб3/main.отпр32;
    main.КПрСп32.setText(main.кПрСп32, true);
    Условие 4entity.numAbOtpr==4
    Действия При выходе 4отАб4++;
    main.кПрСп42=отАб4/main.отпр42;
    main.КПрСп42.setText(main.кПрСп42, true);
    СвойствоselectOutput6
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==5
    Действия При выходе 1отАб5++;
    main.кПрСп52=отАб5/main.отпр52;
    main.КПрСп52.setText(main.кПрСп52, true);
    Условие 2entity.numAbOtpr==6
    Действия При выходе 2отАб6++;
    main.кПрСп62=отАб6/main.отпр62;
    main.КПрСп62.setText(main.кПрСп62, true);
    Абонент3
    СвойствоselectOutput
    Тип заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbPol == numAbonent
    numAbonent3
    СвойствоselectOutput1
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==1
    Действия При выходе 1отпрАб1++;
    main.отпр31=отпрАб1;
    Условие 2entity.numAbPol==2
    Действия При выходе 3отпрАб2++;
    main.отпр32=отпрАб2;
    Условие 3entity.numAbPol==3
    Условие 4entity.numAbOtpr==4
    Действия При выходе 4отпрАб4++;
    main.отпр34=отпрАб4;
    СвойствоselectOutput2
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==5
    Действия При выходе 1отпрАб5++;
    main.отпр35=отпрАб5;
    Условие 2entity.numAbPol==6
    Действия При выходе 2отпрАб6++;
    main.отпр36=отпрАб6;
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==1
    СвойствоselectOutput5
    Действия При выходе 1отАб1++;
    main.кПрСп13=отАб1/main.отпр13;
    main.КПрСп13.setText(main.кПрСп13, true);
    Условие 2entity.numAbOtpr==2
    Действия При выходе 2отАб2++;
    main.кПрСп23=отАб2/main.отпр23;
    main.КПрСп23.setText(main.кПрСп23, true);
    Условие 3entity.numAbOtpr==3
    Условие 4entity.numAbOtpr==4
    Действия При выходе 4отАб4++;
    main.кПрСп43=отАб4/main.отпр43;
    main.КПрСп43.setText(main.кПрСп43, true);
    СвойствоselectOutput6
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==5
    Действия При выходе 1отАб5++;
    main.кПрСп53=отАб5/main.отпр53;
    main.КПрСп53.setText(main.кПрСп53, true);
    Условие 2entity.numAbOtpr==6
    Действия При выходе 2отАб6++;
    main.кПрСп63=отАб6/main.отпр63;
    main.КПрСп63.setText(main.кПрСп63, true);
    Абонент4
    СвойствоselectOutput
    Тип заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbPol == numAbonent
    numAbonent4
    СвойствоselectOutput1
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==1
    Действия При выходе 1отпрАб1++;
    main.отпр41=отпрАб1;
    Условие 2entity.numAbPol==2
    Действия При выходе 3отпрАб2++;
    main.отпр42=отпрАб2;
    Условие 3entity.numAbPol==3
    Действия При выходе 3отпрАб3++;
    main.отпр43=отпрАб3;
    Условие 4entity.numAbOtpr==4
    СвойствоselectOutput2
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==5
    Действия При выходе 1отпрАб5++;
    main.отпр45=отпрАб5;
    Условие 2entity.numAbPol==6
    Действия При выходе 2отпрАб6++;
    main.отпр46=отпрАб6;
    СвойствоselectOutput5
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==1
    Действия При выходе 1отАб1++;
    main.кПрСп14=отАб1/main.отпр14;
    main.КПрСп14.setText(main.кПрСп14, true);
    Условие 2entity.numAbOtpr==2
    Действия При выходе 2отАб2++;
    main.кПрСп24=отАб2/main.отпр24;
    main.КПрСп24.setText(main.кПрСп24, true);
    Условие 3entity.numAbOtpr==3
    Действия При выходе 3отАб3++;
    main.кПрСп34=отАб3/main.отпр34;
    main.КПрСп34.setText(main.кПрСп34, true);
    Условие 4entity.numAbOtpr==4
    СвойствоselectOutput6
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==5
    Действия При выходе 1отАб5++;
    main.кПрСп54=отАб5/main.отпр54;
    main.КПрСп54.setText(main.кПрСп54, true);
    Условие 2entity.numAbOtpr==6
    Действия При выходе 2отАб6++;
    main.кПрСп64=отАб6/main.отпр64;
    main.КПрСп64.setText(main.кПрСп64, true);
    Абонент5
    СвойствоselectOutput
    Тип заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbPol == numAbonent
    numAbonent5
    СвойствоselectOutput1
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==1
    Действия При выходе 1отпрАб1++;
    main.отпр51=отпрАб1;
    Условие 2entity.numAbPol==2
    Действия При выходе2отпрАб2++;
    main.отпр52=отпрАб2;
    Условие 3entity.numAbPol==3
    Действия При выходе 3отпрАб3++;
    main.отпр53=отпрАб3;
    Условие 4entity.numAbOtpr==4
    Действия При выходе 4отпрАб4++;
    main.отпр54=отпрАб4;
    СвойствоselectOutput2
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==5
    Условие 2entity.numAbPol==6
    Действия При выходе 2отпрАб6++;
    main.отпр56=отпрАб6;
    Тип заявки:Message
    Использовать:Условия
    СвойствоselectOutput5
    Условие 1entity.numAbOtpr==1
    Действия При выходе 1отАб1++;
    main.кПрСп15=отАб1/main.отпр15;
    main.КПрСп15.setText(main.кПрСп15, true);
    Условие 2entity.numAbOtpr==2
    Действия При выходе 2отАб2++;
    main.кПрСп25=отАб2/main.отпр25;
    main.КПрСп25.setText(main.кПрСп25, true);
    Условие 3entity.numAbOtpr==3
    Действия При выходе 3отАб3++;
    main.кПрСп35=отАб3/main.отпр35;
    main.КПрСп35.setText(main.кПрСп35, true);
    Условие 4entity.numAbOtpr==4
    Действия При выходе 4отАб4++;
    main.кПрСп45=отАб4/main.отпр45;
    main.КПрСп45.setText(main.кПрСп45, true);
    СвойствоselectOutput6
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==5
    Условие 2entity.numAbOtpr==6
    Действия При выходе 2отАб6++;
    main.кПрСп65=отАб6/main.отпр65;
    main.КПрСп65.setText(main.кПрСп65, true);
    Абонент6
    СвойствоselectOutput
    Тип заявки:Message
    Выход true выбираетсяПри выполнении условия
    Условиеentity.numAbPol == numAbonent
    numAbonent6
    СвойствоselectOutput1
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbPol==1
    Действия При выходе 1отпрАб1++;
    main.отпр61=отпрАб1;
    Условие 2entity.numAbPol==2
    Действия При выходе 2отпрАб2++;
    main.отпр62=отпрАб2;
    Условие 3entity.numAbPol==3
    Действия При выходе 3отпрАб3++;
    main.отпр63=отпрАб3;
    Условие 4entity.numAbPol==4
    Действия При выходе 4отпрАб4++;
    main.отпр64=отпрАб4;
    СвойствоselectOutput2
    Условие 1entity.numAbPol==5
    Действия отпрАб5++;
    При выходе 1main.отпр65=отпрАб5;
    Условие 1entity.numAbPol==6
    СвойствоselectOutput5
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==1
    Действия При выходе 1отАб1++;
    main.кПрСп16=отАб1/main.отпр16;
    main.КПрСп16.setText(main.кПрСп16, true);
    Условие 2entity.numAbOtpr==2
    Действия При выходе 2отАб2++;
    main.кПрСп26=отАб2/main.отпр26;
    main.КПрСп26.setText(main.кПрСп26, true);
    Условие 3entity.numAbOtpr==3
    Действия При выходе 3отАб3++;
    main.кПрСп35=отАб3/main.отпр35;
    main.КПрСп35.setText(main.кПрСп35, true);
    Условие 4entity.numAbOtpr==4
    Действия При выходе 4отАб3++;
    main.кПрСп36=отАб3/main.отпр36;
    main.КПрСп36.setText(main.кПрСп36, true);
    СвойствоselectOutput6
    Тип заявки:Message
    Использовать:Условия
    Условие 1entity.numAbOtpr==5
    Действия При выходе 1отАб5++;
    main.кПрСп56=отАб5/main.отпр56;
    main.КПрСп56.setText(main.кПрСп56, true);
    Условие 2entity.numAbOtpr==6

    Для того чтобы связь была между всеми абонентами и они могли бы обмениваться сообщениями, нам потребуется ещё один маршрутизатор. Но мы не можем использовать второй экземпляр этого же типа абонента, так как программно он настроен именно на наш вариант организации связи.

  • Создайте ещё тип агента Маршрутизатор1.
  • Откройте объект Маршрутизатор.
  • Выделите все объекты и скопируйте их.
  • Вставьте на Маршрутизатор1 скопированные объекты.
  • Выделите элемент exit и в поле Действия При выходе замените имеющийся там код следующим кодом:
    int i;
    	i=entity.numAbPol;
    	 {
    			switch (i) {
    				case 1:if (emkBuferNapr1-tekEmkNapr1>=entity.dlina) 
    {enter1.take(entity);
    							break;}
    						else {enter.take(entity);
    							break;}  
    				case 2:if (emkBuferNapr2-tekEmkNapr2>=entity.dlina) {
    							enter2.take(entity);
    							break;}
    						else {enter.take(entity);
    		    				break;}  
    				case 3:if (emkBuferNapr3-tekEmkNapr3>=entity.dlina) {
    							enter3.take(entity);
    							break;}
    						else {enter.take(entity);
    						    break;}  
    				case 4:if (emkBuferNapr4-tekEmkNapr4>=entity.dlina) {
    							enter4.take(entity);
    							break;}
    						else {enter.take(entity);
    	    					break;}
    	    	}
    		}
  • Теперь Маршрутизатор1 настроен так, что сообщения от абонентов 1…4 будут направляться на его выходы 1…4.
  • Из окна Проекты перетащите элемент маршрутизатор1. В поле Имя: установите маршрут2.
  • Соедините вых1 маршрут1 с вх1 маршрут2, а вых2 с вх2.
  • Скопируйте элемент канал1. Вставьте шесть элементов. Разместите их как на Рис. 4.18.
  • Соедините вых3 маршрут1 с вх канал11, вых4 - с вх канал12.
  • Соедините вых1…вых4 маршрут2 с вх канал7…канал10 соответственно.
  • Соедините вых канал7…канал12 с входами абонент1…абонент6 соответственно.
  • Построение модели сети связи завершено. Но надо ещё организовать переключение между областями просмотра.

    Переключение между областями просмотра

    Переключение между областями просмотра организуем так, чтобы можно было из сети переходить к любому абоненту, каналу, маршрутизатору и обратно. В каждом активном объекте - к данным и обратно к событийной части объекта или в сеть.

    Для переключения используем элемент button из палитры Элементы управления.

  • Перетащите элемент button (см. Рис. 4.18).
  • На странице Основные панели Свойства укажите:
  • Метка: Абонент1
  • Действие: абонент1.облАбонент1.navigateTo()
  • Скопируйте кнопку Абонент1. Вставьте пять раз. Последовательно откройте и внесите соответствующие правки в полях Метка: и Действие:, например:
  • Метка: Абонент2
  • Действие: абонент2.облАбонент2.navigateTo()
  • Перетащите элемент button. Укажите свойства:
  • Метка: Результаты
  • Действие: viewData.navigateTo()
  • Перетащите элемент button. Укажите свойства:
  • Метка: маршрутизатор1
  • Действие: маршрут1.облМарш1.navigateTo()
  • Скопируйте кнопку маршрутизатор1. Её свойства:
  • Метка: маршрутизатор2
  • Действие: маршрут2.облМарш2.navigateTo()
  • (рис 4.19) Область просмотра облКан

    Так как каналов 12, то давайте создадим ещё одну область просмотра облКан, и на ней разместим 12 кнопок (Рис. 4.19).

  • Перетащите из палитры Презентация элемент Область просмотра. На странице Основные в поле Имя: введите облКан.
  • Перейдите на страницу Местоположение и размер панели Свойства. Введите в поля X: 0, Y: 1780, Ширина: 450, Высота: 200.
  • Перетащите элемент button.
  • На странице Основные панели Свойства укажите:
  • Метка: Канал1
  • Действие: канал1.облКан.navigateTo()
  • Скопируйте кнопку Канал1. Вставьте одиннадцать раз. Последовательно откройте и внесите соответствующие правки в полях Метка: и Действие:. Например:
  • Метка: Канал2
  • Действие: канал2.облКан.navigateTo()
  • Перетащите элемент button.
  • На странице Основные панели Свойства укажите:
  • Метка: Сеть
  • Действие: облСеть.navigateTo()
  • Перейдите на область просмотра облСеть. Перетащите элемент button.
  • На странице Основные панели Свойства укажите:
  • Метка: Каналы
  • Действие: облКан.navigateTo()
  • Нам осталось добавить элементы для переключения между областями просмотра на активных объектах и возвращения на корневой объект Main на область просмотра облСеть.

    Последовательно переходите от объекта к объекту, добавляя на них нужное число элементов button и устанавливая значения свойств согласно Табл. 4.10. Размещение этих элементов было уже показано на Рис. 4.34.6, 4.8, 4.10, 4.11, 4.164.18.

    ОбъектОбласть просмотраСвойстваЗначение
    АбонентоблАбонентМетка:Сеть
    Действие:main.облСеть.navigateTo()
    облАбонентМетка:Исходные данные
    Действие:viewData.navigateTo()
    viewDataМетка:Сеть
    Действие:main.облСеть.navigateTo()
    viewDataМетка:Абонент
    Действие:облАбонент.navigateTo()
    КаналоблКанМетка:Сеть
    Действие:main.облСеть.navigateTo()
    облКанМетка:Данные
    Действие:viewData.navigateTo()
    viewDataМетка:Канал
    Действие:облКан.navigateTo()
    МаршрутизатороблМаршМетка:Сеть
    Действие:main.облСеть.navigateTo()
    облМаршМетка:Данные
    Действие:viewData.navigateTo()
    viewDataМетка:Сеть
    Действие:main.облСеть.navigateTo()
    viewDataМетка:Маршрутизатор
    Действие:облМарш.navigateTo()
    Маршрутизатор1облМаршМетка:Сеть
    Действие:main.облСеть.navigateTo()
    облМаршМетка:Данные
    Действие:viewData.navigateTo()
    viewDataМетка:Сеть
    Действие:main.облСеть.navigateTo()
    viewDataМетка:Маршрутизатор
    Действие:облМарш.navigateTo()

    Запуск и отладка модели

    Прежде чем запустить модель:

  • В окне Проекты выделите Сеть_связи.
  • На странице Основные в поле Единицы модельного времени: установите секунды.
  • В окне Проекты выделите Simulation: Main.
  • На странице Модельное время установите:
  • Режим выполнения: Виртуальное время (максимальная скорость)
  • Остановить: В заданное время.
  • В поле Конечное время: введите 3600000. Время моделирования увеличено в 1000 раз по числу прогонов модели.
  • На странице Случайность установите Фиксированное начальное число (воспроизводимые "прогоны").
  • В поле Начальное число: введите 897.
  • Запустите модель. Если появятся ошибки, исправьте их.
  • При правильном построении модели вы получите результаты, показанные на Рис. 4.20.

    Среди них показатели качества обслуживания сети связи: коэффициент пропускной способности 0,815 и среднее время передачи одного сообщения 6,050. Коэффициент пропускной способности, например, абонент 2 - абонент 3 равен 0,816. Обратите внимание на существенную разницу между минимальным и максимальным временами передачи сообщения. Она объясняется принятым экспоненциальным законом распределения времени передачи сообщений: максимальное значение может отличаться от среднего значения в восемь раз.

    Количество отправленных и полученных сообщений всего и по категориям рассчитано за один прогон модели, то есть за 3600 сек. Для расчёта, как вы помните, был введён параметр kolProg=1000 и в 1000 раз было увеличено модельное время. Всего отправлено сообщений 600,559, получено всего абонентами - 490,035. Если разделить число полученных сообщений на число отправленных, то и будет получен коэффициент пропускной способности сети.

    Точно такие же результаты моделирования, коэффициенты пропускной способности, выводятся и по каждому абоненту сети.

    Перейдите в область просмотра Сеть, щёлкнув кнопку Сеть. Затем, щёлкните, например, кнопку Абонент2. Вы увидите результаты моделирования, показанные на Рис. 4.21.

    (рис 4.20) Результаты моделирования сети связи (рис 4.21) Результаты моделирования по абоненту 2 сети связи

    Модель в GPSS World

    Состав GPSS-модели

    Модель в GPSS World разработана согласно постановке и включает следующие элементы:

  • задание исходных данных:
  • определение матриц;
  • описание функций, задающих исходные данные;
  • арифметические выражения;
  • сегмент имитации поступления сообщений от источников:
  • розыгрыш абонентов-получателей сообщений;
  • розыгрыш категории сообщения и счёта сообщений;
  • розыгрыш характеристик сообщений;
  • сегмент имитации работы основных каналов 1-6;
  • сегмент имитации работы маршрутизатора 1;
  • сегмент имитации работы маршрутизатора 2;
  • сегмент имитации работы основных каналов 7-10;
  • сегмент имитации работы основных каналов 11-12;
  • сегмент имитации получения сообщений;
  • сегмент имитации работы резервных каналов 13-18;
  • сегмент имитации работы резервных каналов 19-24;
  • сегмент имитации работы резервных каналов 19-24;
  • сегмент имитации отказов ВК1;
  • сегмент имитации отказов ВК2;
  • сегмент имитации отказов каналов связи 1-6;
  • сегмент имитации отказов каналов связи 7-12;
  • сегмент счёта переданных и потерянных сообщений и расчёт вероятностей передачи сообщений;
  • задание времени моделирования и расчёт результатов.
  • GPSS-программа

    Ввод данных в виде массивов организован таким образом, во-первых, чтобы в программе было меньшее количество строк, во-вторых, чтобы удобнее было использовать эти данные при написании программы модели и, в-третьих, чтобы при изменении числа элементов массива требовалась бы незначительная коррекция. Для организации такого ввода использованы функции. Например, функцией S_ задаются средние вычислительные сложности (длины) сообщений. Выборка соответствующей средней длины в зависимости от категории осуществляется по аргументу, представляющему собой параметр транзакта Р1. В этот параметр заранее посредством розыгрыша заносится код категории.

    Сообщения имитируются транзактами с параметрами, необходимыми согласно логике работы модели. Каналы связи и ВК имитируются одноканальными устройствами (ОКУ): основные каналы связи - ОКУ1…ОКУ12, резервные каналы - ОКУ13…ОКУ24, ВК1 - ОКУ25, ВК2 - ОКУ26.

    Для одновременной проверки выполнения каких-либо условий используются булевы переменные. Например, булева переменная Prov2 проверяет исправность ВК1 и наличие свободной ёмкости входного буфера, достаточной для размещения поступившего сообщения. Эти проверки можно выполнить и по отдельности, но использование булевой переменной более эффективно. Булева переменная Prov1 используется для выделения сообщений, адресованных абонентам 5 и 6.

    Количество отправленных сообщений каждым абонентом каждому абоненту сети накапливается в матрице Otpr, а количество полученных сообщений каждым абонентом от каждого абонента сети - в матрице Pol. По эти статистическим данным рассчитываются коэффициенты пропускной способности абонент-абонент и записываются в матрицу KPS.

    Коэффициент пропускной способности сети (КПС) связи в целом сохраняется в ячейке VPerS. А среднее время передачи одного сообщения - в ячейке TimeS.

    GPSS-программа приведена ниже.

    ; Модель функционирования сети связи
     Определение матриц
    Otpr	MATRIX	,6,6	; Матрица для записи отправленных сообщений
    Pol	MATRIX	,6,6 ; Матрица для записи полученных сообщений
    KPS	MATRIX	,6,6 ; Матрица для записи коэффициентов пропускной способности
    ; Задание исходных данных
    VrMod EQU	  3600	; Время моделирования,1 ед. мод. вр.=1с
    KolAb EQU		6		; Количество абонентов сообщений
    Q_  	 EQU		40000  ; Производительность ВК, оп/c
    V_     EQU	40000	; Скорость передачи, бит/с
    MaxKat	EQU	4	; Количество категорий сообщений
    NKan		EQU	12	; Количество каналов передачи данных
    KolNapr	EQU	4	; Количество направлений в маршрутизаторе
    KolBK	EQU	2	; Количество ВК
    T5		EQU	0.1	; Время включения резервного канала
    EmkBK1	EQU	5000000	; Ёмкость входного буфера ВК1
    EmkBK2	EQU	5000000	; Ёмкость входного буфера ВК2
    ; Описание функций, задающих исходные данные
    NaprM1	FUNCTION	P$NumPol,D6 ; Таблица адресов в маршрутизаторе 1
    1,1/2,1/3,2/4,2/5,3/6,4
    NaprM2	FUNCTION	P$NumPol,D4 ; Таблица адресов в маршрутизаторе 2
    1,1/2,2/3,3/4,4
    TOtkBK	FUNCTION	P4,D2  ; Среднее время между отказами ВК
    1,3600/2,3600
    TVosstBK	FUNCTION P4,D2; Среднее время восстановления ВК
    1,3.7/2,3.7
    TOtkKan 	FUNCTION	P4,D12 ; Среднее время между отказами каналов
    1,3600/2,3600/3,3600/4,3600/5,3600/6,3600/7,3600/
    8,3600/9,3600/10,3600/11,3600/12,3600
    TVosstKan	FUNCTION	P4,D12 ; Среднее время восстановления каналов
    1,3.2/2,3.2/3,3.2/4,3.2/5,3.2/6,3.2/7,3.2/8,3.2/
    9,3.2/10,3.2/11,3.2/12,3.2
    TimeAb	FUNCTION	P$NumOtpr,D6 ; Среднее время передачи сообщений от абонентов
    1,30/2,30/3,30/4,30/5,30/6,30
    Kat	FUNCTION	RN897,D4 ; Вероятности видов категорий
    .3,1/.5,2/.7,3/1,4
    S_	FUNCTION	P1,D4	; Средние вычислительные сложности сообщений (длины), оп (байт) по категориям
    1,53000/2,86000/3,66000/4,50000
    So_	FUNCTION	P1,D4	; Среднеквадратические отклонения вычислительных сложностей (длин) сообщений, оп (байт) по категориям
    1,6100/2,5000/3,7000/4,500
    EmkNaprM1	FUNCTION	P$NumNapr,D4 ; Ёмкости накопителей направлений, байт
    1,250000/2,250000/3,250000/4,250000
    EmkNaprM2	FUNCTION	P$NumNapr,D4 ; Ёмкости накопителей направлений, байт
    5,250000/6,250000/7,250000/8,250000
    BufAb	FUNCTION	P$NumPol,D6  ; Ёмкости входных буферов абонентов
    1,80000/2,80000/3,80000/4,80000/5,80000/6,80000
    Prov1	BVARIABLE	(P$NumPol'E'5)'OR'(P$NumPol'E'6)
    Prov2 BVARIABLE	(FV*NumBK1)'AND'(P2'LE'(EmkBK1-Q*NumBK1))
    Prov3	 BVARIABLE	(FV*NumBK2)'AND'(P2'LE'(EmkBK2-Q*NumBK2))
     Арифметические выражения вычисления
    DL	VARIABLE	INT(NORMAL(897,FN$S_,FN$So_))	; Длин (вычислительных сложностей) сообщений
    VrPer	VARIABLE	(P2/V_) ; Времени передачи сообщения
    VrObr	VARIABLE	P2/Q_  ; Времени обработки сообщения
    ; Сегмент имитации поступления сообщений от источников
    	GENERATE	,,,KolAb    ; Число транзактов по числу абонентов
    	SAVEVALUE	Num+,1;Нумерация абонента-отправителя
    	ASSIGN	NumOtpr,X$Num ; Номер абонента-отправителя в NumOtpr
    Soob	ADVANCE	(Exponential(897,0,FN$TimeAb))	; Время отправления сообщений
    	SPLIT	1,Soob	; Создание двойника сообщения
     Розыгрыш абонентов-получателей сообщений
    Met1	SAVEVALUE	VerAb,(RN897/1000); Получение РРСЧ
    Met2	ASSIGN	NumPol+,1 ; В Р$NumPol номер абонента-получателя сообщения
    	TEST LE	X$VerAb,(P$NumPol#(1/KolAb)),Met2
    	TEST NE	P$NumOtpr,P$NumPol,Met6	; Отправитель не себе ли отправляет?
     Розыгрыш категории сообщения и счёта сообщений
    Met4	ASSIGN	1,FN$Kat	; В Р1 код категории и счет сообщений всех категорий
    	ASSIGN	TimeVxod,AC1 ; Запись времени входа сообщения в сеть
    	ASSIGN	10,(200+P1) ; В Р10 номера Х для счета отправленных сообщений по категориям
    	ASSIGN	11,(P10+MaxKat) ; В Р11 номера Х для счета полученных сообщений по категориям
    	ASSIGN	12,(P11+MaxKat) ; В Р12 номера Х для счета потерянных сообщений по категориям
    	ASSIGN	13,(P12+MaxKat) ; В Р13 номера Х для записи КПС полученных сообщений по категориям
    	ASSIGN	14,(P13+MaxKat) ; В Р14 номера Х для записи КПС потерянных сообщений по категориям
    	SAVEVALUE	*10+,1 ; Cчет отправленных сообщений по категориям
    	MSAVEVALUE Otpr+,P$NumOtpr,P$NumPol,1 ; Запись в матрицу количества отправляемых сообщений абонентам
     Розыгрыш характеристик сообщений
    Met02	ASSIGN	2,V$DL ; Занесение в Р2 длины (вычислительной сложности) сообщения
    	ASSIGN	3,V$VrPer ; Занесение в Р3 времени передачи сообщения
    	ASSIGN	8,V$VrObr ; Занесение в Р8 времени обработки сообщения
    ; Сегмент имитации работы основных каналов 1-6
    OsnK1	GATE FV	P$NumOtpr,ResK1 ; Исправен ли канал?
    	ASSIGN	Vsp1,P$NumOtpr  ; Запись в параметр Vsp1 номера абонента отправителя
    	GATE NU	P$Vsp1;Свободен канал с номером в P$Vsp1?
    	SEIZE	P$Vsp1; Занять канал с номером в P$Vsp1
    	ADVANCE	P3	    ; Имитация передачи сообщения
    	RELEASE	 P$Vsp1 ; Освободить канал с номером в P$Vsp1
    ; Сегмент имитации работы маршрутизатора 1
    Met11	ASSIGN	NumBK1,(2#NKan+1); Запись в параметр номера маршрутизатора как ОКУ
    	TEST E	BV$Prov2,1,Met5 ; Исправен ли ВК1 и есть ли место в его буфере?
    	QUEUE	P$NumBK1,P2   ; Если есть, поместить в буфер ВК1
    Met14	SEIZE	P$NumBK1     ; Занять ВК1
    	DEPART	P$NumBK1,P2    ; Освободить буфер ВК1
    	ADVANCE	P8			; Имитация обработки сообщения
    	ASSIGN	NumNapr,FN$NaprM1 ; Определение номера направления маршрутизатора 1	
    	RELEASE	P$NumBK1	; Освобождение ВК1
    	TEST LE P2,(FN$EmkNaprM1-Q*NumNapr),Met5; Есть ли место в буфере направления
    	QUEUE	P$NumNapr,P2 ; Поместить в буфер направления
    	TEST NE P$NumPol,5,Met21 ; Выделение сообщения для абонента 5
    	TEST NE P$NumPol,6,Met21 ; Выделение сообщения для абонента 6
    	TRANSFER	,Met15 ; Отправить на маршрутизатор 2 сообщения	для абонентов 1-4 
    Met21	DEPART	P$NumNapr,P2 ; Покинуть буфер направления маршрутизатора 1
    	TRANSFER	,Met16 ; Отправить на каналы сообщения для абонентов 5 и 6
    Met15	DEPART	P$NumNapr,P2 ; Покинуть буфер направления маршрутизатора 1
    ; Сегмент имитации работы маршрутизатора 2
    	ASSIGN	NumBK2,(2#NKan+2)
    	TEST E	BV$Prov3,1,Met5 ; Если маршрутизатор 2 исправен и есть место в его буфере, то
    	QUEUE	P$NumBK2,P2 ; поместить в буфер маршрутизатора 2
    	SEIZE	P$NumBK2	; Занять BK2
    	DEPART	P$NumBK2,P2 ; Покинуть буфер маршрутизатора 2
    	ADVANCE	P8	; Имитация обработки сообщения
    	RELEASE	P$NumBK2	; Освобождение BK2
    	TEST E	P$NumPol,1,Met24
    ; Определить номер направления маршрутизатора 2
    	ASSIGN	NumNapr,(KolNapr+1) 
    	TEST LE	P2,(FN$EmkNaprM2-Q*NumNapr),Met5
    	TRANSFER	,Met25
    Met24	TEST E	P$NumPol,2,Met26
    	ASSIGN	NumNapr,(KolNapr+2) ; Определить номер направления маршрутизатора 2
    	TEST LE	P2,(FN$EmkNaprM2-Q*NumNapr),Met5
    	TRANSFER	,Met25
    Met26	TEST E	P$NumPol,3,Met27
    	ASSIGN	NumNapr,(KolNapr+3) ; Определить номер направления маршрутизатора 2
    	TEST LE	P2,(FN$EmkNaprM2-Q*NumNapr),Met5
    	TRANSFER	,Met25
    Met27	TEST E	P$NumPol,4,Met24
    	ASSIGN	NumNapr,(KolNapr+4) ; Определить номер направления маршрутизатора 2
    	TEST LE	P2,(FN$EmkNaprM2-Q*NumNapr),Met5
    Met25	QUEUE	P$NumNapr,P2 ; Поместить в буфер направления маршрутизатора 2
    ; Сегмент имитации работы основных каналов 7-10	
    	ASSIGN	Vsp1,(KolAb+P$NumPol); Определение каналов 7-10
    	DEPART	P$NumNapr,P2 ; Покинуть буфер направления маршрутизатора 2
    	GATE FV	P$Vsp1,ResK2 ; Если исправен основной канал, 
    	GATE NU	P$Vsp1	; и свободен, то
    	SEIZE	P$Vsp1	; занять его
    	ADVANCE	P3	; Передача сообщения
    	RELEASE	P$Vsp1	; Освободить канал
    	TRANSFER	,Met17 ; Отправить для имитации получения сообщения
    ; Сегмент имитации работы основных каналов 11-12	
    Met16	ASSIGN	Vsp1,(KolAb+P$NumPol); Определение каналов 11-12
    	GATE FV	P$Vsp1,ResK2 ; Если исправен основной канал, 
    	GATE NU	P$Vsp1	     ; и свободен, то
    	SEIZE	P$Vsp1	     ; занять его
    Met20	ADVANCE	P3		     ; Передача сообщения
    	RELEASE P$Vsp1	     ; Освободить канал
    ; Сегмент имитации получения сообщений
    Met17	ASSIGN	Vsp3,(2#KolNapr+P$NumPol); Запись в Vsp3 номера буфера абонента-получателя
    	TEST LE P2,(FN$BufAb-Q*Vsp3),Met5 ; Есть ли место в буфере абонента получателя?
    	QUEUE	P$Vsp3,P2 ; Поместить сообщение в буфер
    	DEPART	P$Vsp3,P2 ; Освободить буфер
    	TRANSFER	,Met10  ; Отправить для счёта полученных сообщений
    ; Сегмент имитации работы резервных каналов 13-18
    ResK1	ASSIGN	Vsp1,(NKan+P$NumOtpr)
    	GATE NU	P$Vsp1	; Свободен ли резервный канал?
    	TEST E	X*Vsp1,1,Met7 ; Включить резервный канал
    	ADVANCE	T5	; Включение резервного канала
    	SAVEVALUE	P$Vsp1,0 ; Признак того, что резервный канал включён
    Met7	SEIZE	P$Vsp1	 ; Занять резервный канал
    	ADVANCE	P3	; Передача
    	RELEASE	P$Vsp1	 ; Освободить резервный канал
    	TRANSFER	,Met11 ; Отправить на маршрутизатор 1
    ; Сегмент имитации работы резервных каналов 19-24
    ResK2	ASSIGN	Vsp1,(NKan+KolAb+P$NumPol)
    	TEST NE	P$NumPol,5,Met22 ; Выделение сообщения для абонента 5
    	TEST NE	P$NumPol,6,Met22 ; Выделение сообщения для абонента 6
    Met22	GATE NU	P$Vsp1 ; Свободен ли резервный канал?
    	TEST E	X*Vsp1,1,Met8 ; Включить резервный канал
    	ADVANCE	T5	; Включение резервного канала
    	SAVEVALUE	P$Vsp1,0 ; Признак включения ResK
    Met8	SEIZE	P$Vsp1	; Занять резервный канал
    	ADVANCE	P3	   	; Передача
    	RELEASE	P$Vsp1	; Освободить резервный канал
    	TRANSFER	,Met17 ; Отправить для имитации получения сообщения
    ; Сегмент имитации отказов ВК1
    	GENERATE	,,,1
    	ASSIGN	4,(2#NKan+1) ; Номер BK в P4
    Met50	ADVANCE	(Exponential(897,0,FN$TOtkBK)) ; Розыгрыш времени до очередного отказа
    	GATE FV	P4,Met50
    	FUNAVAIL	P4,RE,Met117 ; Перевод ВК в неисправное состояние
    	ADVANCE	(Exponential(897,0,FN$TVosstBK))	; Имитация восстановления
    	FAVAIL	P4	; Перевод ВК в исправное состояние
    	TRANSFER	,Met50   ; Отправить для розыгрыша очередного отказа
    Met117	RELEASE	P$NumBK1 ; Освобождение ВК прерванным сообщением
    	TRANSFER	,Met5	; Отправить для счета потерь
    ; Сегмент имитации отказов ВК2
    	GENERATE	,,,1
    	ASSIGN	4,(2#NKan+2) ; Номер BK в P4
    Met49	ADVANCE	(Exponential(897,0,FN$TOtkBK)) ; Розыгрыш времени до очередного отказа
    	GATE FV	P4,Met49
    	FUNAVAIL	P4,RE,Met115 ; Перевод ВК в неисправное состояние
    	ADVANCE	(Exponential(897,0,FN$TVosstBK))	; Имитация восстановления
    	FAVAIL	P4	; Перевод ВК в исправное состояние
    	TRANSFER	,Met49   ; Отправить для розыгрыша очередного отказа
    Met115	RELEASE	P$NumBK2 ; Освобождение ВК прерванным сообщением
    	TRANSFER	,Met5	; Отправить для счета потерь
    ; Сегмент имитации отказов каналов связи 1-6
    	GENERATE	,,,KolAb ; Число транзактов - по числу каналов связи
    	SAVEVALUE	NumKan+,1 ; Записать в X$NumCan последовательно 1, 2, ..., KolAb
    	ASSIGN	4,X$NumKan  ; Записать в Р4 последовательно 1, 2, ..., KolAb
    Met19	ADVANCE	(Exponential(897,0,FN$TOtkKan)) ; Розыгрыш времени до очередного отказа
    	GATE FV	P4,Met19
    	FUNAVAIL	P4,RE,Met112 ; Перевод канала в неисправное состояние
    	ASSIGN	NumKan,(NKan+P4)
    	SAVEVALUE	P$NumKan,1 ; Признак включения резервного канала
    	ADVANCE	(Exponential(47,0,FN$TVosstKan)) ; Имитация восстановления канала
    	FAVAIL	P4	; Перевод в исправное состояние
    	TRANSFER	,Met19   ; Отправить для розыгрыша очередного отказа
    Met112	RELEASE	P$Vsp1   ; Освобождение канала с номером в Р$Vsp1
    	TRANSFER	,Met5	; Отправить для счета потерь
    ; Сегмент имитации отказов каналов связи 7-12
    	GENERATE	,,,KolAb  ; Число транзактов - по числу каналов связи
    	SAVEVALUE	NumKan+,1 ; Записать в X$NumCan последовательно 1, 2, ..., KolAb
    	ASSIGN	4,(X$NumKan+KolAb) ; Записать в Р4 последовательно KolAb+1, ...,KolAb+KolAb 
    Met23	ADVANCE	(Exponential(897,0,FN$TOtkKan)) ; Розыгрыш времени до очередного отказа
    	GATE FV	 P4,Met23
    	FUNAVAIL	P4,RE,Met113 ; Перевод канала в неисправное состояние
    	ASSIGN	NumKan,(NKan+P4)
    	SAVEVALUE	P$NumKan,1 ; Признак включения резервного канала
    	ADVANCE	(Exponential(47,0,FN$TVosstKan)) ; Имитация восстановления канала
    	FAVAIL	P4	; Перевод в исправное состояние
    	TRANSFER	,Met23   ; Отправить для розыгрыша очередного отказа
    Met113	RELEASE	P$Vsp1   ; Освобождение канала с номером в Р$Vsp1
    	TRANSFER	,Met5	; Отправить для счета потерь
    Met6	TERMINATE	; Уничтожение сообщений, отправленных самим себе
    ; Сегмент счета переданных и потерянных сообщений и расчет вероятностей передачи сообщений
    Met10	SAVEVALUE	*11+,1 ; Cчет в ячейке с номером в Р11 полученных сообщений всего и по категориям
    	SAVEVALUE	*13,(X*11/X*10) ; Расчет и сохранение в ячейке с номером в Р13 КПС сети по категориям
    	MSAVEVALUE Pol+,P$NumPol,P$NumOtpr,1 ; Счёт и запись в матрицу полученных сообщений
    	MSAVEVALUE KPS,P$NumOtpr,P$NumPol, (MX$Pol(P$NumPol,P$NumOtpr)/MX$Otpr(P$NumOtpr,P$NumPol))
    	TERMINATE	
    Met5	SAVEVALUE	*12+,1 ; Cчет в ячейке с номером в Р12 потерянных сообщений всего и по категориям
    	TERMINATE
    ; Задание времени моделирования и расчёт результатов
    	GENERATE	VrMod	; Задание времени моделирования
    	TEST L	X$Prog,TG1,Met30 ; Если X$Prog<TG1,
    	SAVEVALUE	Prog,TG1      ; то X$Prog=TG1
    Met30	TEST E	TG1,1,Met32 ; Если TG1=1, расчёт и сохранение результатов
    	SAVEVALUE	TimeS,(X$TimeSum/N$Met10) ; Расчёт и сохранение в TimeS среднего времени передачи одного сообщения
    	SAVEVALUE	VPerS,(N$Met10/N$Met4)	; Расчет и сохранение в ячейке VPerS КПС сети
    	SAVEVALUE	VPotS,(N$Met5/N$Met4)	; Расчет и сохранение в ячейке VPotS КПС сети
    Met32 TERMINATE	1
    	START	1000

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

    Всего выполнено 6 экспериментов. Изменение параметров сети связи проводилось также, как и в предыдущих моделях. То есть в каждом следующем эксперименте параметры, изменённые в предыдущем эксперименте, остаются такими же, если не указано их изменение. В шестом эксперименте кроме указанных параметров были также изменены средние интервалы поступления сообщений от всех абонентов (timeAbonent) с 30 до 20.

    В Anylogic в поле Конечное время: было введено 3600000.0. Время моделирования увеличено в 1000 раз по числу прогонов модели. В GPSS указывается модельное время 3600 и 1000 прогонов модели.

    Результаты экспериментов сведены в Табл. 4.11. Видно, что результаты моделирования отличаются незначительно. Коэффициенты пропускной способности $$(\Delta_{11} … (\Delta_{61})$$ отличаются на 0…0,001, а среднее время передачи одного сообщения $$(\Delta_{12} … \Delta_{62})$$ - на 0,071…1,064 с. Коэффициенты загрузки вычислительных комплексов также отличаются на 0…0,022, а коэффициенты загрузки основных каналов - на 0,000…0,001.

    В четвёртом и пятом экспериментах в связи с уменьшением ёмкостей входных буферов ВК1 и ВК2 сообщения второй категории не передаются, так как их средняя длина из всех категорий максимальная.

    Сравнительная оценка позволяет сделать вывод об адекватности результатов моделирования, полученных при использовании для построения моделей одной и той же системы инструментальных средств GPSS World и AnyLogic. Машинное время выполнения модели в GPSS World составляет 22 … 24 с, а в AnyLogic примерно 15 мин.

    Показатели функционирования сети связи
    ПоказателиGPSS WorldAnyLogic6AnyLogic7
    1) Согласно постановке задачи
    Коэффициент пропускной способности сети связи0,8160,8150,817
    $$\Delta_{11} = \left | 0,816-0,816 \right | = 0,001$$
    Время передачи одного сообщения6,1276,0526,056
    $$\Delta_{12} = \left | 6,127-6,056\right | = 0,071$$
    Коэффициент загрузки ВК10,2550,2550,255
    Коэффициент загрузки ВК20,170,170,17
    Коэффициент загрузки основных каналов0,0420,0420,042
    Количество полученных / отправленных сообщений489,930/600,263490,195/601,092489,917/599,907
    2) emkBuferVx =…= emkBuferVx = 70000
    Коэффициент пропускной способности сети связи0,7410,7410,741
    $$\Delta_{21} = \left | 0,741-0,741\right | = 0,000$$
    Время передачи одного сообщения6,1275,8675,88
    $$\Delta_{12} = \left | 6,127-5,880\right | = 0,247$$
    Коэффициент загрузки ВК10,2550,2550,255
    Коэффициент загрузки ВК20,170,170,17
    Коэффициент загрузки основных каналов0,0430,0430,042
    Количество полученных / отправленных сообщений444,728/600,263444,863/600,347444,999/599,929
    3) emkBuferVx =…= emkBuferVx = 60000
    Коэффициент пропускной способности сети связи0,5990,5990,601
    $$\Delta_{31} = \left | 0,599-0,601\right | = 0,002$$
    Время передачи одного сообщения6,1325,665,658
    $$\Delta_{32} = \left | 6,132-5,658\right | = 0,474$$
    Коэффициент загрузки ВК10,2550,2560,277
    Коэффициент загрузки ВК20,170,170,17
    Коэффициент загрузки основных каналов0,0430,0430,042
    Количество полученных / отправленных сообщений359,640/600,584360,251/601,104360,799/599,829
    4) emkBufer1 = 4000000 (маршрутизаторов)
    Коэффициент пропускной способности сети связи0,5990,60,601
    $$\Delta_{41} = \left | 0,599-0,601\right | = 0,002$$
    Время передачи одного сообщения6,1325,655,658
    $$\Delta_{42} = \left | 6,132-5,658\right | = 0,478$$
    Коэффициент загрузки ВК10,2550,2510,255
    Коэффициент загрузки ВК20,170,1690,17
    Коэффициент загрузки основных каналов0,0430,0420,043
    Количество полученных /отправленных сообщений359,640/600,584359,651/599,302360,799/599,829
    5) emkBufer1 = 3000000 (маршрутизаторов)
    Коэффициент пропускной способности сети связи0,5990,5980,602
    $$\Delta_{51} = \left | 0,599-0,602\right | = 0,003$$
    Время передачи одного сообщения6,1325,6485,658
    $$\Delta_{52} = \left | 6,132-5,658\right | = 0,474$$
    Коэффициент загрузки ВК10,2550,2560,255
    Коэффициент загрузки ВК20,170,170,17
    Коэффициент загрузки основных каналов0,0430,0440,043
    Количество полученных / отправленных сообщений359,640/600,584360,114/601,495360,799/599,829
    6) emkBuferVx =…= emkBuferVx = 100000, emkBufer1 = 6000000
    Коэффициент пропускной способности сети связи0,9960,9960,997
    $$\Delta_{61} = \left | 0,996-0,997\right | = 0,001$$
    Время передачи одного сообщения6,1557,2377,219
    $$\Delta_{62} = \left | 6,155-7,219\right | = 1,064$$
    Коэффициент загрузки ВК10,3620,3820,381
    Коэффициент загрузки ВК20,2380,2540,254
    Коэффициент загрузки основных каналов0,0640,0640,064
    Количество полученных / отправленных сообщений848,296/851,388896,072/899,333896,792/898,748
    Вернуться к учебному плану