В сети связи имеются $$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$$ источников. Интервалы поступления сообщений, интервалы между отказами и время восстановления работоспособности распределяются по экспоненциальному закону (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 | облКанал |
| Х: | 0 | 0 | 0 | 0 |
| Y: | 0 | 0 | 0 | 0 |
| Ширина: | 770 | 810 | 740 | 400 |
| Высота: | 470 | 360 | 470 | 340 |
| Имя: | viewData | viewData | viewData | viewData |
| Х: | 870 | 0 | 0 | 0 |
| Y: | 600 | 700 | 550 | 700 |
| Ширина: | 470 | 450 | 330 | 400 |
| Высота: | 620 | 420 | 250 | 180 |
| Имя: | viewResult | viewResult | ||
| Х: | 0 | 0 | ||
| Y: | 600 | 1200 | ||
| Ширина: | 442 | 470 | ||
| Высота: | 820 | 432 | ||
Приступим к созданию сегментов сети связи.
Абонент.
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} |
| dlKat | KolKat | {53000,86000,66000,50000} | |
| dlKatO | KolKat | {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
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.
| Всего сообщений получено | Получено сообщений по категориям | |||
|---|---|---|---|---|
| editbox | editbox1 | editbox2 | editbox3 | editbox4 |
| X: 21 | X: 177 | X: 247 | X: 317 | X: 389 |
| Y: 1310 | Y: 1310 | Y: 1310 | Y: 1310 | Y: 1310 |
| Всего сообщений отправлено | Отправлено сообщений по категориям | |||
| editbox5 | editbox6 | editbox7 | editbox8 | editbox9 |
| X: 19 | X: 179 | X: 249 | X: 319 | X: 389 |
| Y: 1390 | Y: 1390 | Y: 1390 | Y: 1390 | Y: 1390 |
| Время передачи сообщения | ||||
| Минимальное | Максимальное | Среднее | ||
| editbox13 | editbox12 | editbox15 | ||
| X: 319 | X: 319 | X: 319 | ||
| Y: 1470 | Y: 1520 | Y: 1570 | ||
| сhart-Гистограмма | ||||
| X: 19 | Y: 1450 | Ширина: 240 | Высота: 160 | |
Основные панели Свойства в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
Добавить данные и введите в поле Данные: имя врПередачи.
Заголовок: введите Время передачи.
И снова, прежде чем перейти к построению событийной части сегмента Абонент, разместим на корневом агенте Main необходимые элементы для сбора статистических данных, обработки, расчёта показателей качества обслуживания сети и их вывода. Это необходимо сделать по той причине, что также имена этих элементов нужны будут при написании кода в сегменте Абонент.
ViewData.
(рис 4.5) Элементы для сбора и вывода данных за сеть в целом
Переменная, разместите и дайте имена согласно Рис. 4.5.
double. Переменные отпр11…отпр66 предназначены для накопления статистических данных о количестве отправленных сообщений абонент - абонент. Например, отпр23 - количество сообщений, отправленных абонентом 2 абоненту 3, а отпр32 - количество сообщений, отправленных абонентом 3 абоненту 2. По этим данным рассчитываются коэффициенты пропускной способности кПрСп12…кПрСп66 абонент - абонент.
Статистика.
Имя: на врПередСооб;
Теперь организуем вывод в более презентабельном виде. На Рис. 4.6 показаны элементы для вывода количественных показателей качества обслуживания сети связи. Часть результатов моделирования будем выводить в таком же виде и такие же, как и для каждого абонента.
ViewResult.
Абонент.
Результаты моделирования.
ViewResult (см. Рис. 4.6).
Текстовое поле (editbox10) для вывода коэффициента пропускной способности сети.
Палитре выделите Статистика. Перетащите элемент Гистограмма.
Основные панели Свойства в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
(рис 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); | |
| Условие 1 | a<=verKat.get(1) |
| Действия При выходе 1 | entity.numKat=1; |
| b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
| entity.dlina=(int)(b); | |
| d1++; | |
| kolOtprKat1=d1/kolProg; | |
| editbox6.setText(kolOtprKat1, true); | |
| main.d1++; | |
| main.всегоОтпрКат1=main.d1/kolProg; | |
| main.editbox6.setText(main.всегоОтпрКат1, true); | |
| Условие 2 | a<=ver verKat.get(2) |
| Действия При выходе 2 | entity.numKat=2; |
| b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
| entity.dlina = (int)(b); | |
| d2++; | |
| kolOtprKat2=d2/kolProg; | |
| editbox7.setText(kolOtprKat2, true); | |
| main.d2++; | |
| main.всегоОтпрКат2=main.d2/kolProg; | |
| main.editbox7.setText(main.всегоОтпрКат2, true); | |
| Условие 3 | a<=verKat.get(3) |
| Действия При выходе 3 | entity.numKat=3; |
| b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
| entity.dlina=(int)(b); | |
| d3++; | |
| kolOtprKat3=d3/kolProg; | |
| editbox8.setText(kolOtprKat3, true); | |
| main.d3++; | |
| main.всегоОтпрКат3=main.d3/ kolProg; | |
| main.editbox8.setText(main.всегоОтпрКат3, true); | |
| Условие 4 | a<=verKat.get(4) |
| Действия При выходе 4 | entity.numKat=4; |
| b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
| entity.dlina=(int)(b); | |
| d4++; | |
| kolOtprKat4=d4/kolProg; | |
| editbox9.setText(kolOtprKat4, true); | |
| main.d4++; | |
| main.всегоОтпрКат4=main.d4/kolProg; | |
| main.editbox9.setText(main.всегоОтпрКат4, true); | |
| Свойство | selectOutput1 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==1 |
| Условие 2 | entity.numAbPol==2 |
| Действия При выходе 2 | отпрАб2++; |
| main.отпр12=отпрАб2; | |
| Условие 3 | entity.numAbPol==3 |
| Действия При выходе 3 | отпрАб3++; |
| main.отпр13=отпрАб3; | |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отпрАб4++; |
| main.отпр14=отпрАб4; | |
| Свойство | selectOutput2 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==5 |
| Действия При выходе 1 | отпрАб5++; |
| main.отпр15=отпрАб5; | |
| Условие 2 | entity.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.dlinaqueue. Укажите его свойства:Имя: БуферВх
Тип заявки: 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); | |
| Условие 1 | entity.numKat==1 |
| Действия При выходе 1 | k1++; |
| kolPolKat1=k1/kolProg; | |
| editbox1.setText(kolPolKat1, true); | |
| main.k1++; | |
| main.всегоПолКат1=main.k1/kolProg; | |
| main.editbox1.setText(main.всегоПолКат1, true); | |
| Условие 2 | entity.numKat==2 |
| Действия При выходе 2 | k2++; |
| kolPolKat2=k2/kolProg; | |
| editbox2.setText(kolPolKat2, true); | |
| main.k2++; | |
| main.всегоПолКат2=main.k2/kolProg; | |
| main.editbox2.setText(main.всегоПолКат2, true); | |
| Условие 3 | entity.numKat==3 |
| Действия При выходе 3 | k3++; |
| kolPolKat3=k3/kolProg; | |
| editbox3.setText(kolPolKat3, true); | |
| main.k3++; | |
| main.всегоПолКат3=main.k3/kolProg; | |
| main.editbox3.setText(main.всегоПолКат3, true); | |
| Условие 4 | entity.numKat==4 |
| Действия При выходе 4 | k4++; |
| kolPolKat4=k4/kolProg; | |
| editbox4.setText(kolPolKat4, true); | |
| main.k4++; | |
| main.всегоПолКат4=main.k4/kolProg; | |
| main.editbox4.setText(main.всегоПолКат4, true); | |
| Свойство | selectOutput5 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==1 |
| Условие 2 | entity.numAbOtpr==2 |
| Действия При выходе 2 | отАб2++; |
| main.кПрСп21=отАб2/main.отпр21; | |
| main.КПрСп21.setText(main.кПрСп21, true); | |
| Условие 3 | entity.numAbOtpr==3 |
| Действия При выходе 3 | отАб3++; |
| main.кПрСп31=отАб3/main.отпр31; | |
| main.КПрСп31.setText(main.кПрСп31, true); | |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отАб4++; |
| main.кПрСп41=отАб4/main.отпр41; | |
| main.КПрСп41.setText(main.кПрСп41, true); | |
| Свойство | selectOutput6 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==5 |
| Действия При выходе 1 | отАб5++; |
| main.кПрСп51=отАб5/main. отпр51; | |
| main.КПрСп51.setText(main.кПрСп51, true); | |
| Условие 2 | entity.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); |
Приступим к построению сегмента Маршрутизатор.
Маршрутизатор.
Презентация элемент Скругленный прямоугольник. На странице Основные в поле Имя: оставьте имя, предложенное системой.
Местоположение и размер панели Свойства введите в поля X: 10, Y: 600, Ширина: 314, Высота: 190.
text и в поле Текст: введите Исходные данные (Рис. 4.9.).
Параметр и Переменная. Разместите их и дайте имена согласно Рис. 4.10.
Параметр установите согласно Табл. 4.7.
timeOtkBK, timeVosstBK, proizvod установите double, остальных параметров и простых переменных - int.
(рис 4.10) Исходные данные сегмента Маршрутизатор
| Имя | Значение по умолчанию | Имя | Значение по умолчанию |
|---|---|---|---|
| emkBufer1 | 5000000 | emkBuferNapr1 | 250000 |
| timeOtkBK | 3600 | emkBuferNapr2 | 250000 |
| timeVosstBK | 3,7 | emkBuferNapr3 | 250000 |
| proizvod | 40000 | emkBuferNapr4 | 250000 |
Элементы событийной части сегмента Маршрутизатор показаны на Рис. 4.11. Сегмент включает Вычислительный комплекс, Буфер 2, порты входа-выхода, Имитатор отказов вычислительного комплекса.
В свою очередь вычислительный комплекс содержит Блок контроля 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
При выполнении условия.
(emkostBufer1-tekEmkostBufer1>=entity.dlina) (hold.isBlocked()==false)
При выполнении условия заявка направляется на выход T (выходной порт для заявок, для которых выбирается выход true) и на выход F (выходной порт для заявок, для которых выбирается выход false), если условие не выполняется, соответственно.
sink. В поле Тип заявки: Agent замените Message.
hold. В поле Тип заявки: Agent замените Message.Блок Буфер 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 приведен на Рис. 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 предназначен для приема и хранения сообщений, передаваемых по каналам направлений. Он состоит из четырёх буферов - для каждого направления свой буфер.
Алгоритм работы буфера каждого из направлений такой же, как и алгоритм работы буфера 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
Максимальное количество прибытий 1delay и установите значения его свойств:Имя: розыгрыш_инт_до_отказа
Задержка задаётся Определённое время
Время задержки 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.
| Имя | Тип | Значение по умолчанию |
|---|---|---|
| skorPeredKan | double | 5000 |
| skorPeredKanR | double | 5000 |
| timeOtkKan | double | 360 |
| timeVosstKan | double | 3,2 |
| timeBklResK | double | 0,1 |
| всего_потеряно_сообщ | int | 0 |
облКаналы.
Прямоугольник.
Местоположение и размер панели Свойства введите в поля 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(); коэфЗагрКан=коэфЗагрОснК+коэфЗагрРезК;
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;
Все необходимое для построения модели сети из активных объектов Абонент, Канал и Маршрутизатор нами создано. Приступим к построению модели сети.
облСеть.
Проекты перетащите объект абонент1 и поместите как на Рис. 4.18.
абонент1 имитирует абонента 1. В свойствах абонент1 записан код для расчёта коэффициентов пропускной способности абонентов 2…6 с абонентом 1. Следовательно, абонент2 должен иметь код для расчёта коэффициентов пропускной способности абонентов 1, 3…6 с абонентом 2 и т.д.
Абонент2…Абонент6.
Абонент1. Скопируйте все объекты.
Абонент2 … Абонент6.
Проекты перетащите объекты абонент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 |
| numAbonent | 2 |
| Свойство | selectOutput1 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==1 |
| Действия При выходе 1 | отпрАб1++; |
| main.отпр21=отпрАб1; | |
| Условие 2 | entity.numAbPol==2 |
| Условие 3 | entity.numAbPol==3 |
| Действия При выходе 3 | отпрАб3++; |
| main.отпр23=отпрАб3; | |
| Условие 4 | entity.numAbPol==4 |
| Действия При выходе 4 | отпрАб4++; |
| main.отпр24=отпрАб4; | |
| Свойство | selectOutput2 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==5 |
| Действия При выходе 1 | отпрАб5++; |
| main.отпр25=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Действия При выходе 2 | отпрАб6++; |
| main.отпр26=отпрАб6; | |
| Свойство | selectOutput5 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==1 |
| Действия При выходе 1 | отАб1++; |
| main.кПрСп12=отАб1/main.отпр12; | |
| main.КПрСп12.setText(main.кПрСп12, true); | |
| Условие 2 | entity.numAbOtpr==2 |
| Условие 3 | entity.numAbOtpr==3 |
| Действия При выходе 3 | отАб3++; |
| main.кПрСп32=отАб3/main.отпр32; | |
| main.КПрСп32.setText(main.кПрСп32, true); | |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отАб4++; |
| main.кПрСп42=отАб4/main.отпр42; | |
| main.КПрСп42.setText(main.кПрСп42, true); | |
| Свойство | selectOutput6 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==5 |
| Действия При выходе 1 | отАб5++; |
| main.кПрСп52=отАб5/main.отпр52; | |
| main.КПрСп52.setText(main.кПрСп52, true); | |
| Условие 2 | entity.numAbOtpr==6 |
| Действия При выходе 2 | отАб6++; |
| main.кПрСп62=отАб6/main.отпр62; | |
| main.КПрСп62.setText(main.кПрСп62, true); | |
| Абонент3 | |
| Свойство | selectOutput |
| Тип заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbPol == numAbonent |
| numAbonent | 3 |
| Свойство | selectOutput1 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==1 |
| Действия При выходе 1 | отпрАб1++; |
| main.отпр31=отпрАб1; | |
| Условие 2 | entity.numAbPol==2 |
| Действия При выходе 3 | отпрАб2++; |
| main.отпр32=отпрАб2; | |
| Условие 3 | entity.numAbPol==3 |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отпрАб4++; |
| main.отпр34=отпрАб4; | |
| Свойство | selectOutput2 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==5 |
| Действия При выходе 1 | отпрАб5++; |
| main.отпр35=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Действия При выходе 2 | отпрАб6++; |
| main.отпр36=отпрАб6; | |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==1 |
| Свойство | selectOutput5 |
| Действия При выходе 1 | отАб1++; |
| main.кПрСп13=отАб1/main.отпр13; | |
| main.КПрСп13.setText(main.кПрСп13, true); | |
| Условие 2 | entity.numAbOtpr==2 |
| Действия При выходе 2 | отАб2++; |
| main.кПрСп23=отАб2/main.отпр23; | |
| main.КПрСп23.setText(main.кПрСп23, true); | |
| Условие 3 | entity.numAbOtpr==3 |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отАб4++; |
| main.кПрСп43=отАб4/main.отпр43; | |
| main.КПрСп43.setText(main.кПрСп43, true); | |
| Свойство | selectOutput6 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==5 |
| Действия При выходе 1 | отАб5++; |
| main.кПрСп53=отАб5/main.отпр53; | |
| main.КПрСп53.setText(main.кПрСп53, true); | |
| Условие 2 | entity.numAbOtpr==6 |
| Действия При выходе 2 | отАб6++; |
| main.кПрСп63=отАб6/main.отпр63; | |
| main.КПрСп63.setText(main.кПрСп63, true); | |
| Абонент4 | |
| Свойство | selectOutput |
| Тип заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbPol == numAbonent |
| numAbonent | 4 |
| Свойство | selectOutput1 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==1 |
| Действия При выходе 1 | отпрАб1++; |
| main.отпр41=отпрАб1; | |
| Условие 2 | entity.numAbPol==2 |
| Действия При выходе 3 | отпрАб2++; |
| main.отпр42=отпрАб2; | |
| Условие 3 | entity.numAbPol==3 |
| Действия При выходе 3 | отпрАб3++; |
| main.отпр43=отпрАб3; | |
| Условие 4 | entity.numAbOtpr==4 |
| Свойство | selectOutput2 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==5 |
| Действия При выходе 1 | отпрАб5++; |
| main.отпр45=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Действия При выходе 2 | отпрАб6++; |
| main.отпр46=отпрАб6; | |
| Свойство | selectOutput5 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==1 |
| Действия При выходе 1 | отАб1++; |
| main.кПрСп14=отАб1/main.отпр14; | |
| main.КПрСп14.setText(main.кПрСп14, true); | |
| Условие 2 | entity.numAbOtpr==2 |
| Действия При выходе 2 | отАб2++; |
| main.кПрСп24=отАб2/main.отпр24; | |
| main.КПрСп24.setText(main.кПрСп24, true); | |
| Условие 3 | entity.numAbOtpr==3 |
| Действия При выходе 3 | отАб3++; |
| main.кПрСп34=отАб3/main.отпр34; | |
| main.КПрСп34.setText(main.кПрСп34, true); | |
| Условие 4 | entity.numAbOtpr==4 |
| Свойство | selectOutput6 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==5 |
| Действия При выходе 1 | отАб5++; |
| main.кПрСп54=отАб5/main.отпр54; | |
| main.КПрСп54.setText(main.кПрСп54, true); | |
| Условие 2 | entity.numAbOtpr==6 |
| Действия При выходе 2 | отАб6++; |
| main.кПрСп64=отАб6/main.отпр64; | |
| main.КПрСп64.setText(main.кПрСп64, true); | |
| Абонент5 | |
| Свойство | selectOutput |
| Тип заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbPol == numAbonent |
| numAbonent | 5 |
| Свойство | selectOutput1 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==1 |
| Действия При выходе 1 | отпрАб1++; |
| main.отпр51=отпрАб1; | |
| Условие 2 | entity.numAbPol==2 |
| Действия При выходе2 | отпрАб2++; |
| main.отпр52=отпрАб2; | |
| Условие 3 | entity.numAbPol==3 |
| Действия При выходе 3 | отпрАб3++; |
| main.отпр53=отпрАб3; | |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отпрАб4++; |
| main.отпр54=отпрАб4; | |
| Свойство | selectOutput2 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==5 |
| Условие 2 | entity.numAbPol==6 |
| Действия При выходе 2 | отпрАб6++; |
| main.отпр56=отпрАб6; | |
| Тип заявки: | Message |
| Использовать: | Условия |
| Свойство | selectOutput5 |
| Условие 1 | entity.numAbOtpr==1 |
| Действия При выходе 1 | отАб1++; |
| main.кПрСп15=отАб1/main.отпр15; | |
| main.КПрСп15.setText(main.кПрСп15, true); | |
| Условие 2 | entity.numAbOtpr==2 |
| Действия При выходе 2 | отАб2++; |
| main.кПрСп25=отАб2/main.отпр25; | |
| main.КПрСп25.setText(main.кПрСп25, true); | |
| Условие 3 | entity.numAbOtpr==3 |
| Действия При выходе 3 | отАб3++; |
| main.кПрСп35=отАб3/main.отпр35; | |
| main.КПрСп35.setText(main.кПрСп35, true); | |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отАб4++; |
| main.кПрСп45=отАб4/main.отпр45; | |
| main.КПрСп45.setText(main.кПрСп45, true); | |
| Свойство | selectOutput6 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==5 |
| Условие 2 | entity.numAbOtpr==6 |
| Действия При выходе 2 | отАб6++; |
| main.кПрСп65=отАб6/main.отпр65; | |
| main.КПрСп65.setText(main.кПрСп65, true); | |
| Абонент6 | |
| Свойство | selectOutput |
| Тип заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbPol == numAbonent |
| numAbonent | 6 |
| Свойство | selectOutput1 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==1 |
| Действия При выходе 1 | отпрАб1++; |
| main.отпр61=отпрАб1; | |
| Условие 2 | entity.numAbPol==2 |
| Действия При выходе 2 | отпрАб2++; |
| main.отпр62=отпрАб2; | |
| Условие 3 | entity.numAbPol==3 |
| Действия При выходе 3 | отпрАб3++; |
| main.отпр63=отпрАб3; | |
| Условие 4 | entity.numAbPol==4 |
| Действия При выходе 4 | отпрАб4++; |
| main.отпр64=отпрАб4; | |
| Свойство | selectOutput2 |
| Условие 1 | entity.numAbPol==5 |
| Действия | отпрАб5++; |
| При выходе 1 | main.отпр65=отпрАб5; |
| Условие 1 | entity.numAbPol==6 |
| Свойство | selectOutput5 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==1 |
| Действия При выходе 1 | отАб1++; |
| main.кПрСп16=отАб1/main.отпр16; | |
| main.КПрСп16.setText(main.кПрСп16, true); | |
| Условие 2 | entity.numAbOtpr==2 |
| Действия При выходе 2 | отАб2++; |
| main.кПрСп26=отАб2/main.отпр26; | |
| main.КПрСп26.setText(main.кПрСп26, true); | |
| Условие 3 | entity.numAbOtpr==3 |
| Действия При выходе 3 | отАб3++; |
| main.кПрСп35=отАб3/main.отпр35; | |
| main.КПрСп35.setText(main.кПрСп35, true); | |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отАб3++; |
| main.кПрСп36=отАб3/main.отпр36; | |
| main.КПрСп36.setText(main.кПрСп36, true); | |
| Свойство | selectOutput6 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==5 |
| Действия При выходе 1 | отАб5++; |
| main.кПрСп56=отАб5/main.отпр56; | |
| main.КПрСп56.setText(main.кПрСп56, true); | |
| Условие 2 | entity.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.3… 4.6, 4.8, 4.10, 4.11, 4.16… 4.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 разработана согласно постановке и включает следующие элементы:
Ввод данных в виде массивов организован таким образом, во-первых, чтобы в программе было меньшее количество строк, во-вторых, чтобы удобнее было использовать эти данные при написании программы модели и, в-третьих, чтобы при изменении числа элементов массива требовалась бы незначительная коррекция. Для организации такого ввода использованы функции. Например, функцией 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 World | AnyLogic6 | AnyLogic7 |
|---|---|---|---|
| 1) Согласно постановке задачи | |||
| Коэффициент пропускной способности сети связи | 0,816 | 0,815 | 0,817 |
| $$\Delta_{11} = \left | 0,816-0,816 \right | = 0,001$$ | |||
| Время передачи одного сообщения | 6,127 | 6,052 | 6,056 |
| $$\Delta_{12} = \left | 6,127-6,056\right | = 0,071$$ | |||
| Коэффициент загрузки ВК1 | 0,255 | 0,255 | 0,255 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 | 0,17 |
| Коэффициент загрузки основных каналов | 0,042 | 0,042 | 0,042 |
| Количество полученных / отправленных сообщений | 489,930/600,263 | 490,195/601,092 | 489,917/599,907 |
| 2) emkBuferVx =…= emkBuferVx = 70000 | |||
| Коэффициент пропускной способности сети связи | 0,741 | 0,741 | 0,741 |
| $$\Delta_{21} = \left | 0,741-0,741\right | = 0,000$$ | |||
| Время передачи одного сообщения | 6,127 | 5,867 | 5,88 |
| $$\Delta_{12} = \left | 6,127-5,880\right | = 0,247$$ | |||
| Коэффициент загрузки ВК1 | 0,255 | 0,255 | 0,255 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 | 0,17 |
| Коэффициент загрузки основных каналов | 0,043 | 0,043 | 0,042 |
| Количество полученных / отправленных сообщений | 444,728/600,263 | 444,863/600,347 | 444,999/599,929 |
| 3) emkBuferVx =…= emkBuferVx = 60000 | |||
| Коэффициент пропускной способности сети связи | 0,599 | 0,599 | 0,601 |
| $$\Delta_{31} = \left | 0,599-0,601\right | = 0,002$$ | |||
| Время передачи одного сообщения | 6,132 | 5,66 | 5,658 |
| $$\Delta_{32} = \left | 6,132-5,658\right | = 0,474$$ | |||
| Коэффициент загрузки ВК1 | 0,255 | 0,256 | 0,277 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 | 0,17 |
| Коэффициент загрузки основных каналов | 0,043 | 0,043 | 0,042 |
| Количество полученных / отправленных сообщений | 359,640/600,584 | 360,251/601,104 | 360,799/599,829 |
| 4) emkBufer1 = 4000000 (маршрутизаторов) | |||
| Коэффициент пропускной способности сети связи | 0,599 | 0,6 | 0,601 |
| $$\Delta_{41} = \left | 0,599-0,601\right | = 0,002$$ | |||
| Время передачи одного сообщения | 6,132 | 5,65 | 5,658 |
| $$\Delta_{42} = \left | 6,132-5,658\right | = 0,478$$ | |||
| Коэффициент загрузки ВК1 | 0,255 | 0,251 | 0,255 |
| Коэффициент загрузки ВК2 | 0,17 | 0,169 | 0,17 |
| Коэффициент загрузки основных каналов | 0,043 | 0,042 | 0,043 |
| Количество полученных /отправленных сообщений | 359,640/600,584 | 359,651/599,302 | 360,799/599,829 |
| 5) emkBufer1 = 3000000 (маршрутизаторов) | |||
| Коэффициент пропускной способности сети связи | 0,599 | 0,598 | 0,602 |
| $$\Delta_{51} = \left | 0,599-0,602\right | = 0,003$$ | |||
| Время передачи одного сообщения | 6,132 | 5,648 | 5,658 |
| $$\Delta_{52} = \left | 6,132-5,658\right | = 0,474$$ | |||
| Коэффициент загрузки ВК1 | 0,255 | 0,256 | 0,255 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 | 0,17 |
| Коэффициент загрузки основных каналов | 0,043 | 0,044 | 0,043 |
| Количество полученных / отправленных сообщений | 359,640/600,584 | 360,114/601,495 | 360,799/599,829 |
| 6) emkBuferVx =…= emkBuferVx = 100000, emkBufer1 = 6000000 | |||
| Коэффициент пропускной способности сети связи | 0,996 | 0,996 | 0,997 |
| $$\Delta_{61} = \left | 0,996-0,997\right | = 0,001$$ | |||
| Время передачи одного сообщения | 6,155 | 7,237 | 7,219 |
| $$\Delta_{62} = \left | 6,155-7,219\right | = 1,064$$ | |||
| Коэффициент загрузки ВК1 | 0,362 | 0,382 | 0,381 |
| Коэффициент загрузки ВК2 | 0,238 | 0,254 | 0,254 |
| Коэффициент загрузки основных каналов | 0,064 | 0,064 | 0,064 |
| Количество полученных / отправленных сообщений | 848,296/851,388 | 896,072/899,333 | 896,792/898,748 |
В сети связи имеются $$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$$ источников. Интервалы поступления сообщений, интервалы между отказами и время восстановления работоспособности распределяются по экспоненциальному закону (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 | облКанал |
| Х: | 0 | 0 | 0 | 0 |
| Y: | 0 | 0 | 0 | 0 |
| Ширина: | 770 | 810 | 740 | 400 |
| Высота: | 470 | 360 | 470 | 340 |
| Имя: | viewData | viewData | viewData | viewData |
| Х: | 870 | 0 | 0 | 0 |
| Y: | 600 | 700 | 550 | 700 |
| Ширина: | 470 | 450 | 330 | 400 |
| Высота: | 620 | 420 | 250 | 180 |
| Имя: | viewResult | viewResult | ||
| Х: | 0 | 0 | ||
| Y: | 600 | 1200 | ||
| Ширина: | 442 | 470 | ||
| Высота: | 820 | 432 | ||
Приступим к созданию сегментов сети связи.
Абонент.
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} |
| dlKat | KolKat | {53000,86000,66000,50000} | |
| dlKatO | KolKat | {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
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.
| Всего сообщений получено | Получено сообщений по категориям | |||
|---|---|---|---|---|
| editbox | editbox1 | editbox2 | editbox3 | editbox4 |
| X: 21 | X: 177 | X: 247 | X: 317 | X: 389 |
| Y: 1310 | Y: 1310 | Y: 1310 | Y: 1310 | Y: 1310 |
| Всего сообщений отправлено | Отправлено сообщений по категориям | |||
| editbox5 | editbox6 | editbox7 | editbox8 | editbox9 |
| X: 19 | X: 179 | X: 249 | X: 319 | X: 389 |
| Y: 1390 | Y: 1390 | Y: 1390 | Y: 1390 | Y: 1390 |
| Время передачи сообщения | ||||
| Минимальное | Максимальное | Среднее | ||
| editbox13 | editbox12 | editbox15 | ||
| X: 319 | X: 319 | X: 319 | ||
| Y: 1470 | Y: 1520 | Y: 1570 | ||
| сhart-Гистограмма | ||||
| X: 19 | Y: 1450 | Ширина: 240 | Высота: 160 | |
Основные панели Свойства в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
Добавить данные и введите в поле Данные: имя врПередачи.
Заголовок: введите Время передачи.
И снова, прежде чем перейти к построению событийной части сегмента Абонент, разместим на корневом агенте Main необходимые элементы для сбора статистических данных, обработки, расчёта показателей качества обслуживания сети и их вывода. Это необходимо сделать по той причине, что также имена этих элементов нужны будут при написании кода в сегменте Абонент.
ViewData.
(рис 4.5) Элементы для сбора и вывода данных за сеть в целом
Переменная, разместите и дайте имена согласно Рис. 4.5.
double. Переменные отпр11…отпр66 предназначены для накопления статистических данных о количестве отправленных сообщений абонент - абонент. Например, отпр23 - количество сообщений, отправленных абонентом 2 абоненту 3, а отпр32 - количество сообщений, отправленных абонентом 3 абоненту 2. По этим данным рассчитываются коэффициенты пропускной способности кПрСп12…кПрСп66 абонент - абонент.
Статистика.
Имя: на врПередСооб;
Теперь организуем вывод в более презентабельном виде. На Рис. 4.6 показаны элементы для вывода количественных показателей качества обслуживания сети связи. Часть результатов моделирования будем выводить в таком же виде и такие же, как и для каждого абонента.
ViewResult.
Абонент.
Результаты моделирования.
ViewResult (см. Рис. 4.6).
Текстовое поле (editbox10) для вывода коэффициента пропускной способности сети.
Палитре выделите Статистика. Перетащите элемент Гистограмма.
Основные панели Свойства в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
(рис 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); | |
| Условие 1 | a<=verKat.get(1) |
| Действия При выходе 1 | entity.numKat=1; |
| b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
| entity.dlina=(int)(b); | |
| d1++; | |
| kolOtprKat1=d1/kolProg; | |
| editbox6.setText(kolOtprKat1, true); | |
| main.d1++; | |
| main.всегоОтпрКат1=main.d1/kolProg; | |
| main.editbox6.setText(main.всегоОтпрКат1, true); | |
| Условие 2 | a<=ver verKat.get(2) |
| Действия При выходе 2 | entity.numKat=2; |
| b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
| entity.dlina = (int)(b); | |
| d2++; | |
| kolOtprKat2=d2/kolProg; | |
| editbox7.setText(kolOtprKat2, true); | |
| main.d2++; | |
| main.всегоОтпрКат2=main.d2/kolProg; | |
| main.editbox7.setText(main.всегоОтпрКат2, true); | |
| Условие 3 | a<=verKat.get(3) |
| Действия При выходе 3 | entity.numKat=3; |
| b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
| entity.dlina=(int)(b); | |
| d3++; | |
| kolOtprKat3=d3/kolProg; | |
| editbox8.setText(kolOtprKat3, true); | |
| main.d3++; | |
| main.всегоОтпрКат3=main.d3/ kolProg; | |
| main.editbox8.setText(main.всегоОтпрКат3, true); | |
| Условие 4 | a<=verKat.get(4) |
| Действия При выходе 4 | entity.numKat=4; |
| b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
| entity.dlina=(int)(b); | |
| d4++; | |
| kolOtprKat4=d4/kolProg; | |
| editbox9.setText(kolOtprKat4, true); | |
| main.d4++; | |
| main.всегоОтпрКат4=main.d4/kolProg; | |
| main.editbox9.setText(main.всегоОтпрКат4, true); | |
| Свойство | selectOutput1 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==1 |
| Условие 2 | entity.numAbPol==2 |
| Действия При выходе 2 | отпрАб2++; |
| main.отпр12=отпрАб2; | |
| Условие 3 | entity.numAbPol==3 |
| Действия При выходе 3 | отпрАб3++; |
| main.отпр13=отпрАб3; | |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отпрАб4++; |
| main.отпр14=отпрАб4; | |
| Свойство | selectOutput2 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==5 |
| Действия При выходе 1 | отпрАб5++; |
| main.отпр15=отпрАб5; | |
| Условие 2 | entity.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.dlinaqueue. Укажите его свойства:Имя: БуферВх
Тип заявки: 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); | |
| Условие 1 | entity.numKat==1 |
| Действия При выходе 1 | k1++; |
| kolPolKat1=k1/kolProg; | |
| editbox1.setText(kolPolKat1, true); | |
| main.k1++; | |
| main.всегоПолКат1=main.k1/kolProg; | |
| main.editbox1.setText(main.всегоПолКат1, true); | |
| Условие 2 | entity.numKat==2 |
| Действия При выходе 2 | k2++; |
| kolPolKat2=k2/kolProg; | |
| editbox2.setText(kolPolKat2, true); | |
| main.k2++; | |
| main.всегоПолКат2=main.k2/kolProg; | |
| main.editbox2.setText(main.всегоПолКат2, true); | |
| Условие 3 | entity.numKat==3 |
| Действия При выходе 3 | k3++; |
| kolPolKat3=k3/kolProg; | |
| editbox3.setText(kolPolKat3, true); | |
| main.k3++; | |
| main.всегоПолКат3=main.k3/kolProg; | |
| main.editbox3.setText(main.всегоПолКат3, true); | |
| Условие 4 | entity.numKat==4 |
| Действия При выходе 4 | k4++; |
| kolPolKat4=k4/kolProg; | |
| editbox4.setText(kolPolKat4, true); | |
| main.k4++; | |
| main.всегоПолКат4=main.k4/kolProg; | |
| main.editbox4.setText(main.всегоПолКат4, true); | |
| Свойство | selectOutput5 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==1 |
| Условие 2 | entity.numAbOtpr==2 |
| Действия При выходе 2 | отАб2++; |
| main.кПрСп21=отАб2/main.отпр21; | |
| main.КПрСп21.setText(main.кПрСп21, true); | |
| Условие 3 | entity.numAbOtpr==3 |
| Действия При выходе 3 | отАб3++; |
| main.кПрСп31=отАб3/main.отпр31; | |
| main.КПрСп31.setText(main.кПрСп31, true); | |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отАб4++; |
| main.кПрСп41=отАб4/main.отпр41; | |
| main.КПрСп41.setText(main.кПрСп41, true); | |
| Свойство | selectOutput6 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==5 |
| Действия При выходе 1 | отАб5++; |
| main.кПрСп51=отАб5/main. отпр51; | |
| main.КПрСп51.setText(main.кПрСп51, true); | |
| Условие 2 | entity.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); |
Приступим к построению сегмента Маршрутизатор.
Маршрутизатор.
Презентация элемент Скругленный прямоугольник. На странице Основные в поле Имя: оставьте имя, предложенное системой.
Местоположение и размер панели Свойства введите в поля X: 10, Y: 600, Ширина: 314, Высота: 190.
text и в поле Текст: введите Исходные данные (Рис. 4.9.).
Параметр и Переменная. Разместите их и дайте имена согласно Рис. 4.10.
Параметр установите согласно Табл. 4.7.
timeOtkBK, timeVosstBK, proizvod установите double, остальных параметров и простых переменных - int.
(рис 4.10) Исходные данные сегмента Маршрутизатор
| Имя | Значение по умолчанию | Имя | Значение по умолчанию |
|---|---|---|---|
| emkBufer1 | 5000000 | emkBuferNapr1 | 250000 |
| timeOtkBK | 3600 | emkBuferNapr2 | 250000 |
| timeVosstBK | 3,7 | emkBuferNapr3 | 250000 |
| proizvod | 40000 | emkBuferNapr4 | 250000 |
Элементы событийной части сегмента Маршрутизатор показаны на Рис. 4.11. Сегмент включает Вычислительный комплекс, Буфер 2, порты входа-выхода, Имитатор отказов вычислительного комплекса.
В свою очередь вычислительный комплекс содержит Блок контроля 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
При выполнении условия.
(emkostBufer1-tekEmkostBufer1>=entity.dlina) (hold.isBlocked()==false)
При выполнении условия заявка направляется на выход T (выходной порт для заявок, для которых выбирается выход true) и на выход F (выходной порт для заявок, для которых выбирается выход false), если условие не выполняется, соответственно.
sink. В поле Тип заявки: Agent замените Message.
hold. В поле Тип заявки: Agent замените Message.Блок Буфер 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 приведен на Рис. 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 предназначен для приема и хранения сообщений, передаваемых по каналам направлений. Он состоит из четырёх буферов - для каждого направления свой буфер.
Алгоритм работы буфера каждого из направлений такой же, как и алгоритм работы буфера 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
Максимальное количество прибытий 1delay и установите значения его свойств:Имя: розыгрыш_инт_до_отказа
Задержка задаётся Определённое время
Время задержки 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.
| Имя | Тип | Значение по умолчанию |
|---|---|---|
| skorPeredKan | double | 5000 |
| skorPeredKanR | double | 5000 |
| timeOtkKan | double | 360 |
| timeVosstKan | double | 3,2 |
| timeBklResK | double | 0,1 |
| всего_потеряно_сообщ | int | 0 |
облКаналы.
Прямоугольник.
Местоположение и размер панели Свойства введите в поля 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(); коэфЗагрКан=коэфЗагрОснК+коэфЗагрРезК;
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;
Все необходимое для построения модели сети из активных объектов Абонент, Канал и Маршрутизатор нами создано. Приступим к построению модели сети.
облСеть.
Проекты перетащите объект абонент1 и поместите как на Рис. 4.18.
абонент1 имитирует абонента 1. В свойствах абонент1 записан код для расчёта коэффициентов пропускной способности абонентов 2…6 с абонентом 1. Следовательно, абонент2 должен иметь код для расчёта коэффициентов пропускной способности абонентов 1, 3…6 с абонентом 2 и т.д.
Абонент2…Абонент6.
Абонент1. Скопируйте все объекты.
Абонент2 … Абонент6.
Проекты перетащите объекты абонент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 |
| numAbonent | 2 |
| Свойство | selectOutput1 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==1 |
| Действия При выходе 1 | отпрАб1++; |
| main.отпр21=отпрАб1; | |
| Условие 2 | entity.numAbPol==2 |
| Условие 3 | entity.numAbPol==3 |
| Действия При выходе 3 | отпрАб3++; |
| main.отпр23=отпрАб3; | |
| Условие 4 | entity.numAbPol==4 |
| Действия При выходе 4 | отпрАб4++; |
| main.отпр24=отпрАб4; | |
| Свойство | selectOutput2 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==5 |
| Действия При выходе 1 | отпрАб5++; |
| main.отпр25=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Действия При выходе 2 | отпрАб6++; |
| main.отпр26=отпрАб6; | |
| Свойство | selectOutput5 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==1 |
| Действия При выходе 1 | отАб1++; |
| main.кПрСп12=отАб1/main.отпр12; | |
| main.КПрСп12.setText(main.кПрСп12, true); | |
| Условие 2 | entity.numAbOtpr==2 |
| Условие 3 | entity.numAbOtpr==3 |
| Действия При выходе 3 | отАб3++; |
| main.кПрСп32=отАб3/main.отпр32; | |
| main.КПрСп32.setText(main.кПрСп32, true); | |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отАб4++; |
| main.кПрСп42=отАб4/main.отпр42; | |
| main.КПрСп42.setText(main.кПрСп42, true); | |
| Свойство | selectOutput6 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==5 |
| Действия При выходе 1 | отАб5++; |
| main.кПрСп52=отАб5/main.отпр52; | |
| main.КПрСп52.setText(main.кПрСп52, true); | |
| Условие 2 | entity.numAbOtpr==6 |
| Действия При выходе 2 | отАб6++; |
| main.кПрСп62=отАб6/main.отпр62; | |
| main.КПрСп62.setText(main.кПрСп62, true); | |
| Абонент3 | |
| Свойство | selectOutput |
| Тип заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbPol == numAbonent |
| numAbonent | 3 |
| Свойство | selectOutput1 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==1 |
| Действия При выходе 1 | отпрАб1++; |
| main.отпр31=отпрАб1; | |
| Условие 2 | entity.numAbPol==2 |
| Действия При выходе 3 | отпрАб2++; |
| main.отпр32=отпрАб2; | |
| Условие 3 | entity.numAbPol==3 |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отпрАб4++; |
| main.отпр34=отпрАб4; | |
| Свойство | selectOutput2 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==5 |
| Действия При выходе 1 | отпрАб5++; |
| main.отпр35=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Действия При выходе 2 | отпрАб6++; |
| main.отпр36=отпрАб6; | |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==1 |
| Свойство | selectOutput5 |
| Действия При выходе 1 | отАб1++; |
| main.кПрСп13=отАб1/main.отпр13; | |
| main.КПрСп13.setText(main.кПрСп13, true); | |
| Условие 2 | entity.numAbOtpr==2 |
| Действия При выходе 2 | отАб2++; |
| main.кПрСп23=отАб2/main.отпр23; | |
| main.КПрСп23.setText(main.кПрСп23, true); | |
| Условие 3 | entity.numAbOtpr==3 |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отАб4++; |
| main.кПрСп43=отАб4/main.отпр43; | |
| main.КПрСп43.setText(main.кПрСп43, true); | |
| Свойство | selectOutput6 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==5 |
| Действия При выходе 1 | отАб5++; |
| main.кПрСп53=отАб5/main.отпр53; | |
| main.КПрСп53.setText(main.кПрСп53, true); | |
| Условие 2 | entity.numAbOtpr==6 |
| Действия При выходе 2 | отАб6++; |
| main.кПрСп63=отАб6/main.отпр63; | |
| main.КПрСп63.setText(main.кПрСп63, true); | |
| Абонент4 | |
| Свойство | selectOutput |
| Тип заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbPol == numAbonent |
| numAbonent | 4 |
| Свойство | selectOutput1 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==1 |
| Действия При выходе 1 | отпрАб1++; |
| main.отпр41=отпрАб1; | |
| Условие 2 | entity.numAbPol==2 |
| Действия При выходе 3 | отпрАб2++; |
| main.отпр42=отпрАб2; | |
| Условие 3 | entity.numAbPol==3 |
| Действия При выходе 3 | отпрАб3++; |
| main.отпр43=отпрАб3; | |
| Условие 4 | entity.numAbOtpr==4 |
| Свойство | selectOutput2 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==5 |
| Действия При выходе 1 | отпрАб5++; |
| main.отпр45=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Действия При выходе 2 | отпрАб6++; |
| main.отпр46=отпрАб6; | |
| Свойство | selectOutput5 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==1 |
| Действия При выходе 1 | отАб1++; |
| main.кПрСп14=отАб1/main.отпр14; | |
| main.КПрСп14.setText(main.кПрСп14, true); | |
| Условие 2 | entity.numAbOtpr==2 |
| Действия При выходе 2 | отАб2++; |
| main.кПрСп24=отАб2/main.отпр24; | |
| main.КПрСп24.setText(main.кПрСп24, true); | |
| Условие 3 | entity.numAbOtpr==3 |
| Действия При выходе 3 | отАб3++; |
| main.кПрСп34=отАб3/main.отпр34; | |
| main.КПрСп34.setText(main.кПрСп34, true); | |
| Условие 4 | entity.numAbOtpr==4 |
| Свойство | selectOutput6 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==5 |
| Действия При выходе 1 | отАб5++; |
| main.кПрСп54=отАб5/main.отпр54; | |
| main.КПрСп54.setText(main.кПрСп54, true); | |
| Условие 2 | entity.numAbOtpr==6 |
| Действия При выходе 2 | отАб6++; |
| main.кПрСп64=отАб6/main.отпр64; | |
| main.КПрСп64.setText(main.кПрСп64, true); | |
| Абонент5 | |
| Свойство | selectOutput |
| Тип заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbPol == numAbonent |
| numAbonent | 5 |
| Свойство | selectOutput1 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==1 |
| Действия При выходе 1 | отпрАб1++; |
| main.отпр51=отпрАб1; | |
| Условие 2 | entity.numAbPol==2 |
| Действия При выходе2 | отпрАб2++; |
| main.отпр52=отпрАб2; | |
| Условие 3 | entity.numAbPol==3 |
| Действия При выходе 3 | отпрАб3++; |
| main.отпр53=отпрАб3; | |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отпрАб4++; |
| main.отпр54=отпрАб4; | |
| Свойство | selectOutput2 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==5 |
| Условие 2 | entity.numAbPol==6 |
| Действия При выходе 2 | отпрАб6++; |
| main.отпр56=отпрАб6; | |
| Тип заявки: | Message |
| Использовать: | Условия |
| Свойство | selectOutput5 |
| Условие 1 | entity.numAbOtpr==1 |
| Действия При выходе 1 | отАб1++; |
| main.кПрСп15=отАб1/main.отпр15; | |
| main.КПрСп15.setText(main.кПрСп15, true); | |
| Условие 2 | entity.numAbOtpr==2 |
| Действия При выходе 2 | отАб2++; |
| main.кПрСп25=отАб2/main.отпр25; | |
| main.КПрСп25.setText(main.кПрСп25, true); | |
| Условие 3 | entity.numAbOtpr==3 |
| Действия При выходе 3 | отАб3++; |
| main.кПрСп35=отАб3/main.отпр35; | |
| main.КПрСп35.setText(main.кПрСп35, true); | |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отАб4++; |
| main.кПрСп45=отАб4/main.отпр45; | |
| main.КПрСп45.setText(main.кПрСп45, true); | |
| Свойство | selectOutput6 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==5 |
| Условие 2 | entity.numAbOtpr==6 |
| Действия При выходе 2 | отАб6++; |
| main.кПрСп65=отАб6/main.отпр65; | |
| main.КПрСп65.setText(main.кПрСп65, true); | |
| Абонент6 | |
| Свойство | selectOutput |
| Тип заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbPol == numAbonent |
| numAbonent | 6 |
| Свойство | selectOutput1 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbPol==1 |
| Действия При выходе 1 | отпрАб1++; |
| main.отпр61=отпрАб1; | |
| Условие 2 | entity.numAbPol==2 |
| Действия При выходе 2 | отпрАб2++; |
| main.отпр62=отпрАб2; | |
| Условие 3 | entity.numAbPol==3 |
| Действия При выходе 3 | отпрАб3++; |
| main.отпр63=отпрАб3; | |
| Условие 4 | entity.numAbPol==4 |
| Действия При выходе 4 | отпрАб4++; |
| main.отпр64=отпрАб4; | |
| Свойство | selectOutput2 |
| Условие 1 | entity.numAbPol==5 |
| Действия | отпрАб5++; |
| При выходе 1 | main.отпр65=отпрАб5; |
| Условие 1 | entity.numAbPol==6 |
| Свойство | selectOutput5 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==1 |
| Действия При выходе 1 | отАб1++; |
| main.кПрСп16=отАб1/main.отпр16; | |
| main.КПрСп16.setText(main.кПрСп16, true); | |
| Условие 2 | entity.numAbOtpr==2 |
| Действия При выходе 2 | отАб2++; |
| main.кПрСп26=отАб2/main.отпр26; | |
| main.КПрСп26.setText(main.кПрСп26, true); | |
| Условие 3 | entity.numAbOtpr==3 |
| Действия При выходе 3 | отАб3++; |
| main.кПрСп35=отАб3/main.отпр35; | |
| main.КПрСп35.setText(main.кПрСп35, true); | |
| Условие 4 | entity.numAbOtpr==4 |
| Действия При выходе 4 | отАб3++; |
| main.кПрСп36=отАб3/main.отпр36; | |
| main.КПрСп36.setText(main.кПрСп36, true); | |
| Свойство | selectOutput6 |
| Тип заявки: | Message |
| Использовать: | Условия |
| Условие 1 | entity.numAbOtpr==5 |
| Действия При выходе 1 | отАб5++; |
| main.кПрСп56=отАб5/main.отпр56; | |
| main.КПрСп56.setText(main.кПрСп56, true); | |
| Условие 2 | entity.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.3… 4.6, 4.8, 4.10, 4.11, 4.16… 4.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 разработана согласно постановке и включает следующие элементы:
Ввод данных в виде массивов организован таким образом, во-первых, чтобы в программе было меньшее количество строк, во-вторых, чтобы удобнее было использовать эти данные при написании программы модели и, в-третьих, чтобы при изменении числа элементов массива требовалась бы незначительная коррекция. Для организации такого ввода использованы функции. Например, функцией 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 World | AnyLogic6 | AnyLogic7 |
|---|---|---|---|
| 1) Согласно постановке задачи | |||
| Коэффициент пропускной способности сети связи | 0,816 | 0,815 | 0,817 |
| $$\Delta_{11} = \left | 0,816-0,816 \right | = 0,001$$ | |||
| Время передачи одного сообщения | 6,127 | 6,052 | 6,056 |
| $$\Delta_{12} = \left | 6,127-6,056\right | = 0,071$$ | |||
| Коэффициент загрузки ВК1 | 0,255 | 0,255 | 0,255 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 | 0,17 |
| Коэффициент загрузки основных каналов | 0,042 | 0,042 | 0,042 |
| Количество полученных / отправленных сообщений | 489,930/600,263 | 490,195/601,092 | 489,917/599,907 |
| 2) emkBuferVx =…= emkBuferVx = 70000 | |||
| Коэффициент пропускной способности сети связи | 0,741 | 0,741 | 0,741 |
| $$\Delta_{21} = \left | 0,741-0,741\right | = 0,000$$ | |||
| Время передачи одного сообщения | 6,127 | 5,867 | 5,88 |
| $$\Delta_{12} = \left | 6,127-5,880\right | = 0,247$$ | |||
| Коэффициент загрузки ВК1 | 0,255 | 0,255 | 0,255 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 | 0,17 |
| Коэффициент загрузки основных каналов | 0,043 | 0,043 | 0,042 |
| Количество полученных / отправленных сообщений | 444,728/600,263 | 444,863/600,347 | 444,999/599,929 |
| 3) emkBuferVx =…= emkBuferVx = 60000 | |||
| Коэффициент пропускной способности сети связи | 0,599 | 0,599 | 0,601 |
| $$\Delta_{31} = \left | 0,599-0,601\right | = 0,002$$ | |||
| Время передачи одного сообщения | 6,132 | 5,66 | 5,658 |
| $$\Delta_{32} = \left | 6,132-5,658\right | = 0,474$$ | |||
| Коэффициент загрузки ВК1 | 0,255 | 0,256 | 0,277 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 | 0,17 |
| Коэффициент загрузки основных каналов | 0,043 | 0,043 | 0,042 |
| Количество полученных / отправленных сообщений | 359,640/600,584 | 360,251/601,104 | 360,799/599,829 |
| 4) emkBufer1 = 4000000 (маршрутизаторов) | |||
| Коэффициент пропускной способности сети связи | 0,599 | 0,6 | 0,601 |
| $$\Delta_{41} = \left | 0,599-0,601\right | = 0,002$$ | |||
| Время передачи одного сообщения | 6,132 | 5,65 | 5,658 |
| $$\Delta_{42} = \left | 6,132-5,658\right | = 0,478$$ | |||
| Коэффициент загрузки ВК1 | 0,255 | 0,251 | 0,255 |
| Коэффициент загрузки ВК2 | 0,17 | 0,169 | 0,17 |
| Коэффициент загрузки основных каналов | 0,043 | 0,042 | 0,043 |
| Количество полученных /отправленных сообщений | 359,640/600,584 | 359,651/599,302 | 360,799/599,829 |
| 5) emkBufer1 = 3000000 (маршрутизаторов) | |||
| Коэффициент пропускной способности сети связи | 0,599 | 0,598 | 0,602 |
| $$\Delta_{51} = \left | 0,599-0,602\right | = 0,003$$ | |||
| Время передачи одного сообщения | 6,132 | 5,648 | 5,658 |
| $$\Delta_{52} = \left | 6,132-5,658\right | = 0,474$$ | |||
| Коэффициент загрузки ВК1 | 0,255 | 0,256 | 0,255 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 | 0,17 |
| Коэффициент загрузки основных каналов | 0,043 | 0,044 | 0,043 |
| Количество полученных / отправленных сообщений | 359,640/600,584 | 360,114/601,495 | 360,799/599,829 |
| 6) emkBuferVx =…= emkBuferVx = 100000, emkBufer1 = 6000000 | |||
| Коэффициент пропускной способности сети связи | 0,996 | 0,996 | 0,997 |
| $$\Delta_{61} = \left | 0,996-0,997\right | = 0,001$$ | |||
| Время передачи одного сообщения | 6,155 | 7,237 | 7,219 |
| $$\Delta_{62} = \left | 6,155-7,219\right | = 1,064$$ | |||
| Коэффициент загрузки ВК1 | 0,362 | 0,382 | 0,381 |
| Коэффициент загрузки ВК2 | 0,238 | 0,254 | 0,254 |
| Коэффициент загрузки основных каналов | 0,064 | 0,064 | 0,064 |
| Количество полученных / отправленных сообщений | 848,296/851,388 | 896,072/899,333 | 896,792/898,748 |
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.