В сети связи имеются $$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}$$.
ВК и основные каналы связи имеют конечную надёжность. Интервалы времени $$Т_{отВК}$$ и $$Т_{отК_{1}}, Т_{отК_{2}}, …, Т_{отК_{n}}$$ между отказами ВК и каналов связи случайные. Длительности восстановления ВК и каналов связи $$Т_{вВК}$$ и $$Т_{вК_{1}}, Т_{вК_{2}}, …, Т_{вК_{n}}$$ также случайные.
При отказе обрабатываемые ВК и передаваемые по каналам связи сообщения теряются.
Разработать имитационную модель функционирования сети связи. Исследовать влияние ёмкостей буферов, интервалов времени поступления сообщений, их вычислительных сложностей и других параметров на показатели функционирования сети с целью их оценки и принятия решений при необходимости по улучшению качества обслуживания сети.
Сообщения поступают от $$n_1=6$$ источников. Интервалы поступления сообщений, интервалы между отказами и время восстановления работоспособности распределяются по экспоненциальному закону (exponential), а вычислительные сложности сообщений в зависимости от категорий - по нормальному закону (normal). Для некоторых одинаковых параметров с целью упрощения принято, что они имеют равные значения, например, средние значения интервалов поступления сообщений. Модель же будет построена в некотором приближении универсальной так, что все эти значения могут быть любыми.
Вариант сети связи при принятых исходных данных (в том числе количестве входов и выходов маршрутизатора) может быть представлен в следующем виде (рис. 4.1).
(рис 4.1) Вариант схемы сети связи
Сообщения абонентов А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 | Абонент | Маршрутизатор | Канал | |
| Имя: | облСеть | облАбонент | облМарш | облКанал |
| Х: | 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 |
| Имя: | ||||
| Х: | 0 | 0 | ||
| Y: | 600 | 1200 | ||
| Ширина: | 442 | 470 | ||
| Высота: | 820 | 432 | ||
Приступим к созданию сегментов сети связи.
Абонент.
viewData.
Презентация элемент Скругленный прямоугольник. На странице Основные оставьте Имя:, предложенное системой.
Дополнительные панели Свойства. Введите в поля X: 5, Y: 745, Ширина: 435, Высота: 365.
text и на странице Основные панели Свойства в поле Текст: введите Исходные данные и Результаты соответственно (рис. 4.3).
(рис 4.3) Размещение элементов Параметр и Простая переменная
Основная элементы Простая переменная, разместите и дайте им имена согласно рис. 4.3. Тип всех простых переменных, кроме tekEmkBuferVx, установите double. Тип tekEmkBuferVx - int. Простые переменные предназначены для промежуточных вычислений и сбора статистических данных за одного абонента.
Параметр, разместите и дайте имена как на рис. 4.3. Тип всех элементов Параметр, кроме emkBuferVx и numAbonent, double. Тип emkBuferVx и numAbonent - int. Значения свойств установите согласно табл. 4.2.| Имя | Массив | Размерность | Значение по умолчанию |
|---|---|---|---|
| 6 | |||
| 30 | |||
| 100 | |||
| 1 | |||
| 80000 | |||
verKat | Установить флажки | KolKat | {0.3, 0.5, 0.7, 1.0} |
| KolKat | {53000,86000,66000,50000} | ||
| KolKat | {6100,5000,7000,500} |
На рис. 4.2 видно, что элементы verKat, dlKat, dlKatO используются как массивы, размерность которых равна числу категорий сообщений. Создайте размерность KolKat.
Проекты и в контекстном меню выберите Размерность.
Размерность в поле Имя: введите KolKat. Если введёте kolKat, в окне Ошибки появится сообщение: По соглашению, имена типов Java обычно начинаются с заглавной буквы.
Тип размерности: Диапазон.
Диапазон: введите 1-4.
Готово.Теперь создайте массив verKat.
Параметр (см. рис. 4.3).
Основные панели Свойства установите флажок Массив. Рядом появится значок {…}. Щёлкните по нему.
Массив. В окошке Возможные размерности: выделите KolКат.
. Размерность KolКат появится в окошке Выбранные размерности.
Основные панели Свойства.
Значение по умолчанию: введите:
{0.3, 0.5, 0.7, 1.0}
dlKat, dlKatO одинаковой размерности KolKat. Данные в поле По умолчанию введите из табл. 4.2.Для получения стандартной статистической информации о времени передачи сообщений по каждому источнику добавьте элемент сбора статистики.
Данные гистограммы с палитры Статистика.
Имя: на врПередачи;
Количество интервалов: равным 10;
Нач. размер интервалов: 0.01.Теперь можно было бы приступить к построению событийной части сегмента. Однако вы решили вывести результаты моделирования в более презентабельном виде. Поэтому целесообразнее организовать этот вывод, поскольку полученные при этом данные (имена, опции и др.) необходимы будут в дальнейшем при написании кода в событийной части сегмента.
Вариант размещения элементов для вывода результатов моделирования показан на рис. 4.4.
Для вывода количественных показателей использован элемент Текстовое поле из палитры Элементы управления и элемент Гистограмма из палитры Статистика.
Палитре выделите Презентация. Перетащите элемент Скругленный прямоугольник в область просмотра облАбонент.
Основные в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
Дополнительные панели Свойства. Введите в поля X: 13, Y: 1250, Ширина: 447, Высота: 371.
(рис 4.4) Размещение элементов для вывода результатов моделирования
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 необходимые элементы для сбора статистических данных, обработки, расчёта показателей качества обслуживания сети и их вывода. Это необходимо сделать по той причине, что также имена этих элементов нужны будут при написании кода в сегменте Абонент.
Main.
ViewData.
Простая переменная, разместите и дайте имена согласно рис. 4.5.
(рис 4.5) Элементы для сбора и обработки данных за сеть в целом
double. Переменные отпр11…отпр66 предназначены для накопления статистических данных о количестве отправленных сообщений абонент - абонент. Например, отпр23 - количество сообщений, отправленных абонентом 2 абоненту 3, а отпр32 - количество сообщений, отправленных абонентом 3 абоненту 2. По этим данным рассчитываются коэффициенты пропускной способности кПрСп12…кПрСп66 абонент - абонент.
Выравнивание.
Данные гистограммы с палитры Статистика.
Имя: на врПередСооб;
Количество интервалов: равным 10;
Нач. размер интервалов: 0.01.Теперь организуем вывод в более презентабельном виде. На рис. 4.6 показаны элементы для вывода показателей качества обслуживания сети связи. Часть результатов моделирования будем выводить в таком же виде и такие же, как и для каждого абонента.
ViewResult.
Абонент.
Результаты моделирования.
Main и вставьте скопированные элементы в верхнюю часть области просмотра ViewResult (см. рис. 4.6).
Текстовое поле (editbox10) для вывода коэффициента пропускной способности сети.
Палитре выделите Статистика. Перетащите элемент Гистограмма.
Основные панели Свойства в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
Добавить данные и введите в поле Данные: имя врПередачи.
Время передачи.
Палитре выделите Презентация. Перетащите элемент Скругленный прямоугольник в область просмотра результатов ViewResult.
(рис 4.6) Вывод показателей качества обслуживания сети
Основные в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
Дополнительные панели Свойства. Введите в поля 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
Основной библиотеки (Enterprise Library) объект source. Поместите его так же, как на рис. 4.8. Остальные объекты блока Абонент1 вы будете размещать по мере необходимости.При построении модели нам придётся воспользоваться Java-кодом, в котором потребуются дополнительные поля сообщений. Для этого мы должны создать нестандартный класс заявки с дополнительными полями для записи и хранения параметров, о которых мы упоминали ранее (см. п. 4.1.4).
(рис 4.8) Реализация блока Абонент1 средствами AnyLogic
Создайте класс заявки Message.
source.
Проект щелкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
Новый Java класс. В поле Имя: введите имя нового класса: Message.
Базовый класс: выберите из выпадающего списка Entity в качестве базового класса (в ранних версиях - anylogic.libraries.enterprise.Entity). Щелкните кнопку Далее.
Мастера создания Java класса. Добавьте поля Java класса, показанные на рис. 4.9.
(рис 4.9) Дополнительные поля класса заявок Message
Создать конструктор и Создать метод toString ().
Готово. Закройте редактор кода.Продолжим построение блока Абонент1.
source. На странице Основные панели Свойства установите следующие свойства:Message
Времени между прибытиями
exponential(1/timeAbonent)
1
new Message()
double a=0;
double b=kolAbonent;
// Розыгрыш номера получателя сообщения
a=uniform();
for (int i=1; i<(kolAbonent+1); i++)
{if (a<=((1/kolAbonent)*b))
entity.numAbPol=i;
b=b-1;}
entity.timeOtpr=time();
entity.numAbOtpr=numAbonent;Объект source будет генерировать сообщения с интервалами времени, распределёнными по экспоненциальному закону. Принято, что сообщения от данного абонента-отправителя с равной вероятностью могут быть отправлены любому абоненту сети. Поэтому разыгрывается номер абонента-получателя сообщения, и заносится в numAbPol. В поле timeOtpr заносится время отправления сообщения.
TimeMeasureStart и TimeMeasureEnd, позволяющие измерять время прохождения заявки между двумя заданными точками диаграммы процесса. TimeMeasureStart запоминает момент времени, в который заявка проходит через этот объект. TimeMeasureEnd вычисляет для поступившей в него заявки разность между текущим временем и запомненным объектом TimeMeasureStart, на который ссылается этот объект. Эта разность добавляется в элементы сбора статистики, встроенные в объект TimeMeasureEnd.selectOutput. Соедините его вход с выходом объекта source. Объект selectOutput выделяет и направляет объекту sink на уничтожение сообщения, адресованные абоненту-отправителю, то есть самому себе. Перетащите объект sink. Его вход соедините с выходом T объекта selectOutput.
selectOutput5. Данный объект предназначен для розыгрыша категорий отправляемых сообщений. Его вход соедините с выходом F объекта selectOutput. На странице Основные панели Свойства установите свойства согласно табл. 4.4. Эти свойства являются кодом. Код предназначен для счёта отправленных сообщений за сеть связи в целом и по категориям сообщений, определения количества отправленных сообщений за один прогон, розыгрыша длин сообщений по категориям, вывода расчётов по каждому абоненту, а также за сеть связи в целом.
selectOutput5 (имена selectOutput1 и selectOutput2). Объекты предназначены для разделения и счёта отправляемых сообщений по абонентам.
| Свойство | selectOutput |
|---|---|
| Класс заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbOtpr==entity.numAbPol |
| Класс заявки: | Message |
| Использовать: | Условия |
| Действие при входе: | a=uniform(); |
f++; | |
kolOtpr=f/kolProg; | |
editbox5.setText(kolOtpr, true); | |
get_Main().f++; | |
get_Main().всегоОтпр=get_Main().f/ | |
kolProg; | |
get_Main().editbox5.setText(get_Main(). | |
всегоОтпр, true); | |
| Условие 0 | a<=verKat.get(1) |
| Действие при выходе 0 | entity.numKat=1; |
b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
entity.dlina=(int)(b); | |
d1++; | |
kolOtprKat1=d1/kolProg; | |
editbox6.setText(kolOtprKat1, true); | |
get_Main().d1++; | |
get_Main().всегоОтпрКат1=get_Main().d1/kolProg; | |
get_Main().editbox6.setText(get_Main().всегоОтпрКат1, true); | |
| Условие 1 | a<=ver verKat.get(2) |
| Действие при выходе 1 | entity.numKat=2; |
b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
entity.dlina = (int)(b); | |
d2++; | |
kolOtprKat2=d2/kolProg; | |
editbox7.setText(kolOtprKat2, true); | |
get_Main().d2++; | |
get_Main().всегоОтпрКат2=get_Main().d2/kolProg; | |
get_Main().editbox7.setText(get_Main().всегоОтпрКат2, true); | |
| Условие 2 | a<=verKat.get(3) |
| Действие при выходе 2 | entity.numKat=3; |
b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
entity.dlina=(int)(b); | |
d3++; | |
kolOtprKat3=d3/kolProg; | |
editbox8.setText(kolOtprKat3, true); | |
get_Main().d3++; | |
get_Main().всегоОтпрКат3=get_Main().d3/ kolProg; | |
get_Main().editbox8.setText(get_Main().всегоОтпрКат3, true); | |
| Условие 3 | a<=verKat.get(4) |
| Действие при выходе 3 | entity.numKat=4; |
b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
entity.dlina=(int)(b); | |
d4++; | |
kolOtprKat4=d4/kolProg; | |
editbox9.setText(kolOtprKat4, true); | |
get_Main().d4++; | |
get_Main().всегоОтпрКат4=get_Main().d4/kolProg; | |
get_Main().editbox9.setText(get_Main().всегоОтпрКат4, true); | |
| Свойство | selectOutput1 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==1 |
| Условие 1 | entity.numAbPol==2 |
| Действие при выходе 1 | отпрАб2++; |
get_Main().отпр12=отпрАб2; | |
| Условие 2 | entity.numAbPol==3 |
| Действие при выходе 2 | отпрАб3++; |
get_Main().отпр13=отпрАб3; | |
| Условие 3 | entity.numAbOtpr==entity.numAbPol |
| Свойство | selectOutput2 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==4 |
| Действие при выходе 0 | отпрАб4++; |
get_Main().отпр14=отпрАб4; | |
| Условие 1 | entity.numAbPol==5 |
| Действие при выходе 1 | отпрАб5++; |
get_Main().отпр15=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Действие при выходе 2 | отпрАб6++; |
get_Main().отпр16=отпрАб6; |
queue. Укажите его свойства: Имя:Буфер. Класс заявки: Message. Вместимость 100. Соедините выходы 0…3 selectOutput1 с входом элемента Буфер (см. рис. 4.8).
selectOutput1 с входом selectOutput2. Через этот выход будут проходить на selectOutput2 сообщения, адресованные абонентам 4, 5 и 6.
selectOutput2 и установите значения свойств, указанных также в табл. 4.4. Соедините все выходы selectOutput2 с входом элемента Буфер.Отправляемое сообщение поступило в буфер. Дальше оно должно попасть в канал связи. Создайте порты для отправления и приёма сообщений.
Презентация перетащите элемент Скруглённый прямоугольник.
Дополнительные панели Свойства. Введите в поля X: 210, Y: 100, Ширина: 65, Высота: 60.
Основная перетащите два элемента порт. Разместите их как на рис. 4.8. В поле Имя: замените предложенное системой на вх и вых.
Скруглённый прямоугольник и порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Абонент1 этот флажок должен быть сброшенным.Итак, отправляемое сообщение поступило в канал связи, подключённый к порту вых.
Через порт вх сообщения поступают из канала связи. Продолжим построение блока Абонент1.
selectOutput (имя selectOutput3). Он предназначен для контроля текущей ёмкости входного буфера. В случае заполнения буфера, сообщения теряются.
вх с входом объекта selectOutput3.
sink (имя sink1). Его вход соедините с выходом F объекта selectOutput3.
selectOutput3 и установите его свойства:Message
true выбирается При выполнении условия
emkBuferVx-tekEmkBuferVx>=entity.dlina queue. Укажите его свойства:БуферВх
Message
emkBuferVx
tekEmkBuferVx+=entity.dlina;
tekEmkBuferVx-=entity.dlina; Соедините его вход с выходом Т объекта selectOutput3.
selectOutput5 (имя selectOutput4). Он предназначен для разделения потока полученных сообщений по категориям. На странице Основные панели Свойства установите свойства согласно табл. 4.5. Эти свойства также являются кодом. Код предназначен для счёта полученных сообщений за сеть связи в целом и по категориям сообщений, определения количества полученных сообщений за один прогон, вывода расчётов за каждого абонента, а также за сеть связи в целом.
БуферВх с выходом объекта selectOutput4.
| Свойство | selectOutput4 |
|---|---|
| Класс заявки: | Message |
| Использовать: | Условия |
| Действие при входе: | g++; |
kolPol=g/kolProg; | |
editbox.setText(kolPol, true); | |
get_Main().g++; | |
get_Main().всегоПол=get_Main().g/ | |
kolProg; | |
get_Main().editbox.setText(get_Main().всегоПол, true); | |
| Условие 0 | entity.numKat==1 |
| Действие при выходе 0 | k1++; |
kolPolKat1=k1/kolProg; | |
editbox1.setText(kolPolKat1, true); | |
get_Main().k1++; | |
get_Main().всегоПолКат1=get_Main().k1/kolProg; | |
get_Main().editbox1.setText(get_Main().всегоПолКат1, true); | |
| Условие 1 | entity.numKat==2 |
| Действие при выходе 1 | k2++; |
kolPolKat2=k2/kolProg; | |
editbox2.setText(kolPolKat2, true); | |
get_Main().k2++; | |
get_Main().всегоПолКат2=get_Main().k2/kolProg; | |
get_Main().editbox2.setText(get_Main().всегоПолКат2, true); | |
| Условие 2 | entity.numKat==3 |
| Действие при выходе 2 | k3++; |
kolPolKat3=k3/kolProg; | |
editbox3.setText(kolPolKat3, true); | |
get_Main().k3++; | |
get_Main().всегоПолКат3=get_Main().k3/kolProg; | |
get_Main().editbox3.setText(get_Main().всегоПолКат3, true); | |
| Условие 3 | entity.numKat==4 |
| Действие при выходе 3 | k4++; |
kolPolKat4=k4/kolProg; | |
editbox4.setText(kolPolKat4, true); | |
get_Main().k4++; | |
get_Main().всегоПолКат4=get_Main().k4/kolProg; | |
get_Main().editbox4.setText(get_Main().всегоПолКат4, true); | |
| Свойство | selectOutput5 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==1 |
| Условие 1 | entity.numAbOtpr==2 |
| Действие при выходе 1 | отАб2++; |
get_Main().кПрСп21=отАб2/get_Main(). | |
отпр21; | |
get_Main().КПрСп21.setText(get_Main().кПрСп21, true); | |
| Условие 2 | entity.numAbOtpr==3 |
| Действие при выходе 2 | отАб3++; |
get_Main().кПрСп31=отАб3/get_Main(). | |
отпр31; | |
get_Main().КПрСп31.setText(get_Main().кПрСп31, true); | |
| Условие 3 | entity.numAbOtpr==4 |
| Действие при выходе 3 | отАб4++; |
get_Main().кПрСп41=отАб4/get_Main(). | |
отпр41; | |
get_Main().КПрСп41.setText(get_Main().кПрСп41, true); | |
| Свойство | selectOutput6 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==5 |
| Действие при выходе 0 | отАб5++; |
get_Main().кПрСп51=отАб5/get_Main(). | |
отпр51; | |
get_Main().КПрСп51.setText(get_Main().кПрСп51, true); | |
| Условие 1 | entity.numAbOtpr==6 |
| Действие при выходе 1 | отАб6++; |
get_Main().кПрСп61=отАб6/get_Main(). | |
отпр61; | |
get_Main().КПрСп61.setText(get_Main().кПрСп61, true); |
selectOutput5 (имена selectOutput5 и selectOutput6). Объекты предназначены для разделения и счёта получаемых сообщений по абонентам. Значения свойств установите также согласно табл. 4.5. Выход по умолчанию объекта selectOutput5 соедините с входом объекта selectOutput6.
sink2. Его вход соедините с выходами 0…3 объекта selectOutput5 и выходами объекта selectOutput6.
sink2 согласно табл. 4.6. Код рассчитывает коэффициент пропускной способности сети связи и время передачи одного сообщения.| Свойство | sink2 |
|---|---|
| Класс заявки: | Message |
| Действие при входе: | врПередачи.add(time()-entity.timeOtpr); |
editbox11.setText(врПередачи.mean(), true); | |
editbox12.setText(врПередачи.max(), true); | |
editbox13.setText(врПередачи.min(), true); | |
get_Main().коэфПропСпособ=get_Main(). | |
всегоПол/get_Main().всегоОтпр; | |
get_Main().editbox10.setText(get_Main().коэфПропСпособ, true); | |
get_Main().врПередСооб.add(time()-entity.timeOtpr); | |
get_Main().editbox11.setText(get_Main().врПередСооб.mean(), true); | |
get_Main().editbox12.setText(get_Main().врПередСооб.max(), true); | |
get_Main().editbox13.setText(get_Main().врПередСооб.min(), true); |
Маршрутизатор.
viewData.
Презентация элемент Скругленный прямоугольник. На странице Основные в поле Имя: оставьте имя, предложенное системой.
Дополнительные панели Свойства. Введите в поля 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 и на странице Основные панели Свойства в поле Текст: введите Блок контроля 1.
Имя: вместо selectOutput введите blokKontrol_1.
Класс заявки: Entity замените Message.
(рис 4.11) Событийная часть сегмента Маршрутизатор
(рис 4.12) Алгоритм работы Блока контроля 1
Выход true выбирается При выполнении условия.
Условие введите условие:
(emkostBufer1-tekEmkostBufer1>=entity.dlina) (hold.isBlocked()==false)
При выполнении условия заявка направляется на выход T (выходной порт для заявок, для которых выбирается выход true) и на выход F (выходной порт для заявок, для которых выбирается выход false), если условие не выполняется, соответственно.
sink. В поле Класс заявки: Entity замените Message.
kolPotBK++; для счёта количества сообщений, потерянных при отказе вычислительного комплекса.
hold. В поле Класс заявки: Entity замените Message.Блок Буфер 1 предназначен для приема, размещения и хранения поступающих на обработку сообщений.
Алгоритм работы блока Буфер 1 приведен на рис. 4.13.
В AnyLogic алгоритм блока Буфер 1 реализуется объектом queue, который выполняет функции очереди (FIFO).
Палитре выделите Презентация. Перетащите элемент Прямоугольник.
Дополнительные панели Свойства. Введите в поля X: 190, Y: 50, Ширина: 126, Высота: 100.
Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
text и на странице Основные панели Свойства в поле Текст: введите Буфер 1.
(рис 4.13) Алгоритм работы блока Буфер 1
queue.
Имя: вместо queue введите bufer1.
Класс заявки: Entity замените Message.
Вместимость введите emkBufer1.
Действие при входе введите:
tekEmkBufer1 += entity.dlina;
Действие при выходе введите:
tekEmkBufer1 = -entity.dlina;
Включить сбор статистики.Блок предназначен для имитации обработки сообщений.
Алгоритм работы блока приведен на рис. 4.14.
(рис 4.14) Алгоритм работы Блока обработки сообщений
Для реализации алгоритма Блока обработки сообщений в AnyLogic используется объект delay.
Палитре выделите Презентация. Перетащите элемент Прямоугольник.
Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
Дополнительные панели Свойства. Введите в поля X: 336, Y: 50, Ширина: 194, Высота: 100.
text и на странице Основные панели Свойства в поле Текст: введите Блок обработки сообщений.
delay, разместите и соедините с bufer_1 так, как на рис. 4.11.
delay. На странице Основные панели Свойства в поле Имя: вместо delay введите сomputer.
Класс заявки: Entity замените Message.
Задержка задаётся установите Явно.
Время задержки введите:
exponential(1/entity.timeObr)
Вместимость 1.
Действие при входе entity.timeObr=
entity.dlina/proizvod;
Включить сбор статистики.
Палитре выделите Презентация. Перетащите элемент Прямоугольник.
Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
Дополнительные панели Свойства. Введите в поля X: 20, Y: 40, Ширина: 520, Высота: 170.
text и на странице Основные панели Свойства в поле Текст: введите Вычислительный комплекс.Блок контроля 2 предназначен для распределения сообщений по направлениям и контроля текущих ёмкостей буферов (накопителей) направлений передачи сообщений.
Алгоритм работы Блока контроля 2 приведен на рис. 4.15.
Вначале определяется номер направления, по которому должно быть передано поступившее сообщение.
(рис 4.15) Алгоритм работы блока Блок контроля 2
Затем определяется наличие достаточной свободной памяти в буфере этого направления. При отсутствии нужного объёма памяти сообщение теряется.
Для распределения сообщений по направлениям можно было бы использовать объекты selectOutput5 и sink. Однако мы используем другие объекты AnyLogic: exit и enter. Они позволяют организовать сложную маршрутизацию, вследствие чего на рис. 4.11 Блок контроля 2 не выделен, хотя функционально он существует.
exit, вход которого соедините с выходом computer (рис. 4.10).
Класс заявки: Entity замените 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 и установите значения свойств.
Класс заявки: Entity замените Message.
Вместимость emkBuferNapr1
Действие при входе введите:
tekEmkNapr1 += entity.dlina;
Действие при выходе введите:
tekEmkNapr1 -= entity.dlina;
Включить сбор статистики.
buferNapr2, вход которого соединен с выходом enter2 и установите значения свойств.
Класс заявки: Entity замените Message.
Вместимость emkBuferNapr2
Действие при входе введите:
tekEmkNapr2 += entity.dlina;
Действие при выходе введите:
tekEmkNapr2 -= entity.dlina;
Включить сбор статистики.
buferNapr3, вход которого соединен с выходом enter3 и установите значения свойств.
Класс заявки: Entity замените Message.
Вместимость emkBuferNapr3
Действие при входе введите:
tekEmkNapr3 += entity.dlina;
Действие при выходе введите:
tekEmkNapr3 -= entity.dlina;
Включить сбор статистики.
buferNapr4, вход которого соединен с выходом enter4 и установите значения свойств.
Класс заявки: Entity замените 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.
hold, разместите как на рис. 4.17.
Отображать имя.
Класс заявки: Entity замените Message.
(рис 4.16) Исходные данные сегмента Канал
(рис 4.17) Объекты событийной части сегмента Канал
hold1 установите флажок Изначально заблокирован.
delay, поместите сверху (см. рис. 4.16). В поле Имя: введите основной_канал.
Отображать имя.
Класс заявки: Entity замените Message. Задержка задаётся установите Явно.
Время задержки введите
exponential(1/entity.timePered)
Вместимость введите 1.
Действие при входе entity.timePered=entity.dlina/
skorPeredKan;
Включить сбор статистики.
delay. Вставьте его один раз. При этом изменится имя на основной_канал, а остальные свойства останутся неизменными.
основной_канал на резерв_канал.
Действие при входе замените имеющийся там код следующим:
if (а==0)
entity.timePered=entity.dlina/skorPeredKanR;
if (а==1)
{entity.timePered=entity.dlina/skorPeredKanR +
timeBklResK;
а=0;}
Действие при выходе
if (hold.isBlocked()== true) hold1.setBlocked(false);
hold и delay согласно рис. 4.17.Скруглённый прямоугольник.
Дополнительные панели Свойства введите в поля X: 50, Y: 80, Ширина: 60, Высота: 52.
Основная перетащите два элемента Порт. Разместите их как на рис. 4.17. В полях Имя: предложенные системой имена замените согласно рис. 4.17. Установите флажки Отображать имя.
Скруглённый прямоугольник и Порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Канал этот флажок должен быть сброшенным.
основной_канал и резерв_канал с портом вых, а порт вх - с входами элементов hold и hold1.Имитатор отказов основного канала связи построен аналогично имитатору отказов вычислительного комплекса.
Прямоугольник.
Дополнительные панели Свойства введите в поля X: 10, Y: 212, Ширина: 380, Высота: 120.
source и два объекта delay. Разместите и соедините их как на рис. 4.17.
source и установите значения его свойств:установите флажок
Интенсивности
1
1
установите флажок
1
delay и установите значения его свойств:розыг_инт_до_отказа
установите флажок
Явно
exponential(1/timeOtkKan)
1
hold.setBlocked(true);
if (основной_канал.size()!=0) {
основной_канал.remove((Message)
основной_канал.get(0));
всего_потеряно_сообщ ++;}
hold1.setBlocked(false);
а=1;delay и установите значения его свойств:имитация_восст_осн_кан
установите флажок
Явно
exponential(1/timeVosstkKan)
1
hold.setBlocked(false); hold1.setBlocked(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.numAbOtpr==entity.numAbPol |
numAbonent | 2 |
| Свойство | selectOutput1 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==1 |
| Действие при выходе 0 | отпрАб1++; |
get_Main().отпр21=отпрАб1; | |
| Условие 1 | entity.numAbPol==2 |
| Условие 2 | entity.numAbPol==3 |
| Действие при выходе 2 | отпрАб3++; |
get_Main().отпр23=отпрАб3; | |
| Условие 3 | entity.numAbOtpr==entity.numAbPol |
| Свойство | selectOutput2 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==4 |
| Действие при выходе 0 | отпрАб4++; |
get_Main().отпр24=отпрАб4; | |
| Условие 1 | entity.numAbPol==5 |
| Действие при выходе 1 | отпрАб5++; |
get_Main().отпр25=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Действие при выходе 2 | отпрАб6++; |
get_Main().отпр26=отпрАб6; | |
| Свойство | selectOutput5 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==1 |
| Действие при выходе 0 | отАб1++; |
get_Main().кПрСп12=отАб1/get_Main(). | |
отпр12; | |
get_Main().КПрСп12.setText(get_Main().кПрСп12, true); | |
| Условие 1 | entity.numAbOtpr==2 |
| Условие 2 | entity.numAbOtpr==3 |
| Действие при выходе 2 | отАб3++; |
get_Main().кПрСп32=отАб3/get_Main(). | |
отпр32; | |
get_Main().КПрСп32.setText(get_Main().кПрСп32, true); | |
| Условие 3 | entity.numAbOtpr==4 |
| Действие при выходе 3 | отАб4++; |
get_Main().кПрСп42=отАб4/get_Main(). | |
отпр42; | |
get_Main().КПрСп42.setText(get_Main().кПрСп42, true); | |
| Свойство | selectOutput6 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==5 |
| Действие при выходе 0 | отАб5++; |
get_Main().кПрСп52=отАб5/get_Main(). | |
отпр52; | |
get_Main().КПрСп52.setText(get_Main().кПрСп52, true); | |
| Условие 1 | entity.numAbOtpr==6 |
| Действие при выходе 1 | отАб6++; |
get_Main().кПрСп62=отАб6/get_Main(). | |
отпр62; | |
get_Main().КПрСп62.setText(get_Main().кПрСп62, true); | |
| Абонент3 | |
| Свойство | selectOutput |
| Класс заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbOtpr==entity.numAbPol |
numAbonent | 3 |
| Свойство | selectOutput1 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==1 |
| Действие при выходе 0 | отпрАб1++; |
get_Main().отпр31=отпрАб1; | |
| Условие 1 | entity.numAbPol==2 |
| Действие при выходе 2 | отпрАб2++; |
get_Main().отпр32=отпрАб2; | |
| Условие 2 | entity.numAbPol==3 |
| Условие 3 | entity.numAbOtpr==entity.numAbPol |
| Свойство | selectOutput2 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==4 |
| Действие при выходе 0 | отпрАб4++; |
get_Main().отпр34=отпрАб4; | |
| Условие 1 | entity.numAbPol==5 |
| Действие при выходе 1 | отпрАб5++; |
get_Main().отпр35=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Действие при выходе 2 | отпрАб6++; |
get_Main().отпр36=отпрАб6; | |
| Свойство | selectOutput5 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==1 |
| Действие при выходе 0 | отАб1++; |
get_Main().кПрСп13=отАб1/get_Main(). | |
отпр13; | |
get_Main().КПрСп13.setText(get_Main().кПрСп13, true); | |
| Условие 1 | entity.numAbOtpr==2 |
| Действие при выходе 1 | отАб2++; |
get_Main().кПрСп23=отАб2/get_Main(). | |
отпр23; | |
get_Main().КПрСп23.setText(get_Main().кПрСп23, true); | |
| Условие 2 | entity.numAbOtpr==3 |
| Условие 3 | entity.numAbOtpr==4 |
| Действие при выходе 3 | отАб4++; |
get_Main().кПрСп43=отАб4/get_Main(). | |
отпр43; | |
get_Main().КПрСп43.setText(get_Main().кПрСп43, true); | |
| Свойство | selectOutput6 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==5 |
| Действие при выходе 0 | отАб5++; |
get_Main().кПрСп53=отАб5/get_Main(). | |
отпр53; | |
get_Main().КПрСп53.setText(get_Main().кПрСп53, true); | |
| Условие 1 | entity.numAbOtpr==6 |
| Действие при выходе 1 | отАб6++; |
get_Main().кПрСп63=отАб6/get_Main(). | |
отпр63; | |
get_Main().КПрСп63.setText(get_Main().кПрСп63, true); | |
| Абонент4 | |
| Свойство | selectOutput |
| Класс заявки: | Message |
Выход true выбирается | При выполнении условия |
| Условие | entity.numAbOtpr==entity.numAbPol |
numAbonent | 4 |
| Свойство | selectOutput1 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==1 |
| Действие при выходе 0 | отпрАб1++; |
get_Main().отпр41=отпрАб1; | |
| Условие 1 | entity.numAbPol==2 |
| Действие при выходе 2 | отпрАб2++; |
get_Main().отпр42=отпрАб2; | |
| Условие 2 | entity.numAbPol==3 |
| Действие при выходе 2 | отпрАб3++; |
get_Main().отпр43=отпрАб3; | |
| Условие 3 | entity.numAbOtpr==entity.numAbPol |
| Свойство | selectOutput2 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==4 |
| Условие 1 | entity.numAbPol==5 |
| Действие при выходе 1 | отпрАб5++; |
get_Main().отпр45=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Действие при выходе 2 | отпрАб6++; |
get_Main().отпр46=отпрАб6; | |
| Свойство | selectOutput5 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==1 |
| Действие при выходе 0 | отАб1++; |
get_Main().кПрСп14=отАб1/get_Main(). | |
отпр14; | |
get_Main().КПрСп14.setText(get_Main().кПрСп14, true); | |
| Условие 1 | entity.numAbOtpr==2 |
| Действие при выходе 1 | отАб2++; |
get_Main().кПрСп24=отАб2/get_Main(). | |
отпр24; | |
get_Main().КПрСп24.setText(get_Main().кПрСп24, true); | |
| Условие 2 | entity.numAbOtpr==3 |
| Действие при выходе 2 | отАб3++; |
get_Main().кПрСп34=отАб3/get_Main(). | |
отпр34; | |
get_Main().КПрСп34.setText(get_Main().кПрСп34, true); | |
| Условие 3 | entity.numAbOtpr==4 |
| Свойство | selectOutput6 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==5 |
| Действие при выходе 0 | отАб5++; |
get_Main().кПрСп54=отАб5/get_Main(). | |
отпр54; | |
get_Main().КПрСп54.setText(get_Main().кПрСп54, true); | |
| Условие 1 | entity.numAbOtpr==6 |
| Действие при выходе 1 | отАб6++; |
get_Main().кПрСп64=отАб6/get_Main().отпр64; | |
get_Main().КПрСп64.setText(get_Main().кПрСп64, true); | |
| Абонент5 | |
| Свойство | selectOutput |
| Класс заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbOtpr==entity.numAbPol |
numAbonent | 5 |
| Свойство | selectOutput1 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==1 |
| Действие при выходе 0 | отпрАб1++; |
get_Main().отпр51=отпрАб1; | |
| Условие 1 | entity.numAbPol==2 |
| Действие при выходе 2 | отпрАб2++; |
get_Main().отпр52=отпрАб2; | |
| Условие 2 | entity.numAbPol==3 |
| Действие при выходе 2 | отпрАб3++; |
get_Main().отпр53=отпрАб3; | |
| Условие 3 | entity.numAbOtpr==entity.numAbPol |
| Свойство | selectOutput2 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==4 |
| Действие при выходе 0 | отпрАб4++; |
get_Main().отпр54=отпрАб4; | |
| Условие 1 | entity.numAbPol==5 |
| Условие 2 | entity.numAbPol==6 |
| Действие при выходе 2 | отпрАб6++; |
get_Main().отпр56=отпрАб6; | |
| Свойство | selectOutput5 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==1 |
| Действие при выходе 0 | отАб1++; |
get_Main().кПрСп15=отАб1/get_Main(). | |
отпр15; | |
get_Main().КПрСп15.setText(get_Main().кПрСп15, true); | |
| Условие 1 | entity.numAbOtpr==2 |
| Действие при выходе 1 | отАб2++; |
get_Main().кПрСп25=отАб2/get_Main(). | |
отпр25; | |
get_Main().КПрСп25.setText(get_Main().кПрСп25, true); | |
| Условие 2 | entity.numAbOtpr==3 |
| Действие при выходе 2 | отАб3++; |
get_Main().кПрСп35=отАб3/get_Main(). | |
отпр35; | |
get_Main().КПрСп35.setText(get_Main().кПрСп35, true); | |
| Условие 3 | entity.numAbOtpr==4 |
| Действие при выходе 3 | отАб4++; |
get_Main().кПрСп45=отАб4/get_Main(). | |
отпр45; | |
get_Main().КПрСп45.setText(get_Main().кПрСп45, true); | |
| Свойство | selectOutput6 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==5 |
| Условие 1 | entity.numAbOtpr==6 |
| Действие при выходе 1 | отАб6++; |
get_Main().кПрСп65=отАб6/get_Main(). | |
отпр65; | |
get_Main().КПрСп65.setText(get_Main().кПрСп65, true); | |
| Абонент6 | |
| Свойство | selectOutput |
| Класс заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbOtpr==entity.numAbPol |
numAbonent | 6 |
| Свойство | selectOutput1 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==1 |
| Действие при выходе 0 | отпрАб1++; |
get_Main().отпр61=отпрАб1; | |
| Условие 1 | entity.numAbPol==2 |
| Действие при выходе 2 | отпрАб2++; |
get_Main().отпр62=отпрАб2; | |
| Условие 2 | entity.numAbPol==3 |
| Действие при выходе 2 | отпрАб3++; |
get_Main().отпр63=отпрАб3; | |
| Условие 3 | entity.numAbOtpr==entity.numAbPol |
| Свойство | selectOutput2 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==4 |
| Действие при выходе 0 | отпрАб4++; |
get_Main().отпр64=отпрАб4; | |
| Условие 1 | entity.numAbPol==5 |
| Действие при выходе 1 | отпрАб5++; |
get_Main().отпр65=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Свойство | selectOutput5 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==1 |
| Действие при выходе 0 | отАб1++; |
get_Main().кПрСп16=отАб1/get_Main().отпр16; | |
get_Main().КПрСп16.setText(get_Main().кПрСп16, true); | |
| Условие 1 | entity.numAbOtpr==2 |
| Действие при выходе 1 | отАб2++; |
get_Main().кПрСп26=отАб2/get_Main().отпр26; | |
get_Main().КПрСп26.setText(get_Main().кПрСп26, true); | |
| Условие 2 | entity.numAbOtpr==3 |
| Действие при выходе 2 | отАб3++; |
get_Main().кПрСп35=отАб3/get_Main(). | |
отпр35; | |
get_Main().КПрСп35.setText(get_Main().кПрСп35, true); | |
| Условие 3 | entity.numAbOtpr==4 |
| Действие при выходе 3 | отАб3++; |
get_Main().кПрСп36=отАб3/get_Main(). | |
отпр36; | |
get_Main().КПрСп36.setText(get_Main().кПрСп36, true); | |
| Свойство | selectOutput6 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==5 |
| Действие при выходе 0 | отАб5++; |
get_Main().кПрСп56=отАб5/get_Main(). | |
отпр56; | |
get_Main().КПрСп56.setText(get_Main().кПрСп56, true); | |
| Условие 1 | 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. Вставьте пять раз. Последовательно откройте и внесите соответствующие правки в полях Метка: и Действие:.
button. Укажите свойства:Результаты
viewData.navigateTo()button. Укажите свойства:маршрут1
маршрут1.облМарш.navigateTo()маршрут1. Скорректируйте свойства:маршрут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.
| Объект | Область просмотра | Свойства | Значение |
|---|---|---|---|
| Абонент | облАбонент | Метка: | Сеть |
| Действие: | get_Main().облСеть.navigateTo() | ||
| облАбонент | Метка: | Исходные данные | |
| Действие: | viewData.navigateTo() | ||
| viewData | Метка: | Сеть | |
| Действие: | get_Main().облСеть.navigateTo() | ||
| viewData | Метка: | Абонент | |
| Действие: | облАбонент.navigateTo() | ||
| Канал | облКан | Метка: | Сеть |
| Действие: | get_Main().облСеть.navigateTo() | ||
| облКан | Метка: | Данные | |
| Действие: | viewData.navigateTo() | ||
| viewData | Метка: | Канал | |
| Действие: | облКан.navigateTo() | ||
| Маршрутизатор | облМарш | Метка: | Сеть |
| Действие: | get_Main().облСеть.navigateTo() | ||
| облМарш | Метка: | Данные | |
| Действие: | viewData.navigateTo() | ||
| viewData | Метка: | Сеть | |
| Действие: | get_Main().облСеть.navigateTo() | ||
| viewData | Метка: | Маршрутизатор | |
| Действие: | облМарш.navigateTo() | ||
| Маршрутизатор1 | облМарш | Метка: | Сеть |
| Действие: | get_Main().облСеть.navigateTo() | ||
| облМарш | Метка: | Данные | |
| Действие: | viewData.navigateTo() | ||
| viewData | Метка: | Сеть | |
| Действие: | get_Main().облСеть.navigateTo() | ||
| viewData | Метка: | Маршрутизатор | |
| Действие: | облМарш.navigateTo() |
Прежде чем запустить модель:
Проекты выделите Сеть_связи.
Основные в поле Единицы модельного времени: установите секунды.
Проекты выделите Simulation: Main.
Основные установите Фиксированное начальное число (воспроизводимые "прогоны").
Начальное число: введите 897.
Модельное время. В поле Остановить: выберите В заданное время.
Конечное время: введите 3600000.0. Время моделирования увеличено в 1000 раз по числу прогонов модели.
При правильном построении модели вы получите результаты, показанные на рис. 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 экспериментов. Изменение параметров сети связи проводилось так же, как и в предыдущих моделях. То есть в каждом следующем эксперименте параметры, изменённые в предыдущем эксперименте, остаются такими же, если не указано их изменение. В шестом эксперименте кроме указанных параметров были также изменены средние интервалы поступления сообщений от всех абонентов с 30 до 20.
В Anylogic в поле Конечное время: было введено 3600000.0. Время моделирования увеличено в 1000 раз по числу прогонов модели. В GPSS указывается модельное время 3600 и 1000 прогонов модели.
Результаты экспериментов сведены в табл. 4.11. Видно, что результаты моделирования отличаются незначительно. Коэффициенты пропускной способности ($$\Delta_{11} … \Delta_{61}$$) отличаются на 0…0,001, а среднее время передачи одного сообщения ($$\Delta_{12} … \Delta_{62}$$) - на 0,075…1,085 с. Коэффициенты загрузки вычислительных комплексов также отличаются на 0…0,020, а коэффициенты загрузки основных каналов - на 0,000…0,001.
В четвёртом и пятом экспериментах в связи с уменьшением ёмкостей входных буферов ВК1 и ВК2 сообщения второй категории не передаются, так как их средняя длина из всех категорий максимальная.
Сравнительная оценка позволяет сделать вывод об адекватности результатов моделирования, полученных при использовании для построения моделей одной и той же системы инструментальных средств GPSS World и AnyLogic.
Машинное время выполнения модели в GPSS World составляет 22 … 24 с, а в AnyLogic примерно 5 мин.
| Показатели | GPSS World | AnyLogic |
|---|---|---|
| 1) Согласно постановке задачи | ||
| Коэффициент пропускной способности сети связи | 0,816 | 0,815 |
| $$\Delta_{11}=\mid 0,816-0,815\mid=0,001$$ | ||
| Среднее время передачи одного сообщения | 6,127 | 6,052 |
| $$\Delta_{12}=\mid6,127-6,052\mid=0,075$$ | ||
| Коэффициент загрузки ВК1 | 0,255 | 0,255 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 |
| Средний коэффициент загрузки основных каналов | 0,042 | 0,042 |
| Среднее количество полученных / отправленных сообщений | 489,930/600,263 | 490,195/601,092 |
| 2) emkBuferVx =…= emkBuferVx = 70000 | ||
| Коэффициент пропускной способности сети связи | 0,741 | 0,741 |
| $$\Delta_{21}=\mid0,741-0,741\mid=0,000$$ | ||
| Среднее время передачи одного сообщения | 6,127 | 5,867 |
| $$\Delta_{22}=\mid6,127-5,867\mid=0,260$$ | ||
| Коэффициент загрузки ВК1 | 0,255 | 0,255 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 |
| Средний коэффициент загрузки основных каналов | 0,043 | 0,043 |
| Среднее количество полученных / отправленных сообщений | 444,728/600,263 | 444,863/600,347 |
| 3) emkBuferVx =…= emkBuferVx = 60000 | ||
| Коэффициент пропускной способности сети связи | 0,599 | 0,599 |
| $$\Delta_{31}=\mid0,599-0,599\mid=0,000$$ | ||
| Среднее время передачи одного сообщения | 6,132 | 5,66 |
| $$\Delta_{32}=\mid6,132-5,660\mid=0,472$$ | ||
| Коэффициент загрузки ВК1 | 0,255 | 0,256 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 |
| Средний коэффициент загрузки основных каналов | 0,043 | 0,043 |
| Среднее количество полученных / отправленных сообщений | 359,640/600,584 | 360,251/601,104 |
| 4) emkBufer1 = 4 000 000 | ||
| Коэффициент пропускной способности сети связи | 0,599 | 0,6 |
| $$\Delta_{41}=\mid0,599-0,600\mid=0,001$$ | ||
| Среднее время передачи одного сообщения | 6,132 | 5,65 |
| $$\Delta_{42}=\mid6,132-5,650\mid=0,482$$ | ||
| Коэффициент загрузки ВК1 | 0,255 | 0,251 |
| Коэффициент загрузки ВК2 | 0,17 | 0,169 |
| Средний коэффициент загрузки основных каналов | 0,043 | 0,042 |
| Среднее количество полученных / отправленных сообщений | 359,640/600,584 | 359,651/599,302 |
| 5) emkBufer1 = 3 000 000 | ||
| Коэффициент пропускной способности сети связи | 0,599 | 0,598 |
| $$\Delta_{51}=\mid0,599-0,598\mid=0,001$$ | ||
| Среднее время передачи одного сообщения | 6,132 | 5,648 |
| $$\Delta_{52}=\mid6,132-5,648\mid\mid=0,484$$ | ||
| Коэффициент загрузки ВК1 | 0,255 | 0,256 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 |
| Средний коэффициент загрузки основных каналов | 0,043 | 0,044 |
| Среднее количество полученных / отправленных сообщений | 359,640/600,584 | 360,114/601,495 |
| 6) emkBuferVx =…= emkBuferVx = 100000, emkBufer1 = 6 000 000 | ||
| Коэффициент пропускной способности сети связи | 0,996 | 0,996 |
| $$\Delta_{61}=\mid0,996-0,996\mid=0,000$$ | ||
| Среднее время передачи одного сообщения | 6,155 | 7,237 |
| $$\Delta_{62}=\mid6,155-7,237\mid=1,082$$ | ||
| Коэффициент загрузки ВК1 | 0,362 | 0,382 |
| Коэффициент загрузки ВК2 | 0,238 | 0,254 |
| Средний коэффициент загрузки основных каналов | 0,064 | 0,064 |
| Среднее количество полученных / отправленных сообщений | 848,296/851,388 | 896,072/899,333 |
В сети связи имеются $$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}$$.
ВК и основные каналы связи имеют конечную надёжность. Интервалы времени $$Т_{отВК}$$ и $$Т_{отК_{1}}, Т_{отК_{2}}, …, Т_{отК_{n}}$$ между отказами ВК и каналов связи случайные. Длительности восстановления ВК и каналов связи $$Т_{вВК}$$ и $$Т_{вК_{1}}, Т_{вК_{2}}, …, Т_{вК_{n}}$$ также случайные.
При отказе обрабатываемые ВК и передаваемые по каналам связи сообщения теряются.
Разработать имитационную модель функционирования сети связи. Исследовать влияние ёмкостей буферов, интервалов времени поступления сообщений, их вычислительных сложностей и других параметров на показатели функционирования сети с целью их оценки и принятия решений при необходимости по улучшению качества обслуживания сети.
Сообщения поступают от $$n_1=6$$ источников. Интервалы поступления сообщений, интервалы между отказами и время восстановления работоспособности распределяются по экспоненциальному закону (exponential), а вычислительные сложности сообщений в зависимости от категорий - по нормальному закону (normal). Для некоторых одинаковых параметров с целью упрощения принято, что они имеют равные значения, например, средние значения интервалов поступления сообщений. Модель же будет построена в некотором приближении универсальной так, что все эти значения могут быть любыми.
Вариант сети связи при принятых исходных данных (в том числе количестве входов и выходов маршрутизатора) может быть представлен в следующем виде (рис. 4.1).
(рис 4.1) Вариант схемы сети связи
Сообщения абонентов А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 | Абонент | Маршрутизатор | Канал | |
| Имя: | облСеть | облАбонент | облМарш | облКанал |
| Х: | 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 |
| Имя: | ||||
| Х: | 0 | 0 | ||
| Y: | 600 | 1200 | ||
| Ширина: | 442 | 470 | ||
| Высота: | 820 | 432 | ||
Приступим к созданию сегментов сети связи.
Абонент.
viewData.
Презентация элемент Скругленный прямоугольник. На странице Основные оставьте Имя:, предложенное системой.
Дополнительные панели Свойства. Введите в поля X: 5, Y: 745, Ширина: 435, Высота: 365.
text и на странице Основные панели Свойства в поле Текст: введите Исходные данные и Результаты соответственно (рис. 4.3).
(рис 4.3) Размещение элементов Параметр и Простая переменная
Основная элементы Простая переменная, разместите и дайте им имена согласно рис. 4.3. Тип всех простых переменных, кроме tekEmkBuferVx, установите double. Тип tekEmkBuferVx - int. Простые переменные предназначены для промежуточных вычислений и сбора статистических данных за одного абонента.
Параметр, разместите и дайте имена как на рис. 4.3. Тип всех элементов Параметр, кроме emkBuferVx и numAbonent, double. Тип emkBuferVx и numAbonent - int. Значения свойств установите согласно табл. 4.2.| Имя | Массив | Размерность | Значение по умолчанию |
|---|---|---|---|
| 6 | |||
| 30 | |||
| 100 | |||
| 1 | |||
| 80000 | |||
verKat | Установить флажки | KolKat | {0.3, 0.5, 0.7, 1.0} |
| KolKat | {53000,86000,66000,50000} | ||
| KolKat | {6100,5000,7000,500} |
На рис. 4.2 видно, что элементы verKat, dlKat, dlKatO используются как массивы, размерность которых равна числу категорий сообщений. Создайте размерность KolKat.
Проекты и в контекстном меню выберите Размерность.
Размерность в поле Имя: введите KolKat. Если введёте kolKat, в окне Ошибки появится сообщение: По соглашению, имена типов Java обычно начинаются с заглавной буквы.
Тип размерности: Диапазон.
Диапазон: введите 1-4.
Готово.Теперь создайте массив verKat.
Параметр (см. рис. 4.3).
Основные панели Свойства установите флажок Массив. Рядом появится значок {…}. Щёлкните по нему.
Массив. В окошке Возможные размерности: выделите KolКат.
. Размерность KolКат появится в окошке Выбранные размерности.
Основные панели Свойства.
Значение по умолчанию: введите:
{0.3, 0.5, 0.7, 1.0}
dlKat, dlKatO одинаковой размерности KolKat. Данные в поле По умолчанию введите из табл. 4.2.Для получения стандартной статистической информации о времени передачи сообщений по каждому источнику добавьте элемент сбора статистики.
Данные гистограммы с палитры Статистика.
Имя: на врПередачи;
Количество интервалов: равным 10;
Нач. размер интервалов: 0.01.Теперь можно было бы приступить к построению событийной части сегмента. Однако вы решили вывести результаты моделирования в более презентабельном виде. Поэтому целесообразнее организовать этот вывод, поскольку полученные при этом данные (имена, опции и др.) необходимы будут в дальнейшем при написании кода в событийной части сегмента.
Вариант размещения элементов для вывода результатов моделирования показан на рис. 4.4.
Для вывода количественных показателей использован элемент Текстовое поле из палитры Элементы управления и элемент Гистограмма из палитры Статистика.
Палитре выделите Презентация. Перетащите элемент Скругленный прямоугольник в область просмотра облАбонент.
Основные в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
Дополнительные панели Свойства. Введите в поля X: 13, Y: 1250, Ширина: 447, Высота: 371.
(рис 4.4) Размещение элементов для вывода результатов моделирования
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 необходимые элементы для сбора статистических данных, обработки, расчёта показателей качества обслуживания сети и их вывода. Это необходимо сделать по той причине, что также имена этих элементов нужны будут при написании кода в сегменте Абонент.
Main.
ViewData.
Простая переменная, разместите и дайте имена согласно рис. 4.5.
(рис 4.5) Элементы для сбора и обработки данных за сеть в целом
double. Переменные отпр11…отпр66 предназначены для накопления статистических данных о количестве отправленных сообщений абонент - абонент. Например, отпр23 - количество сообщений, отправленных абонентом 2 абоненту 3, а отпр32 - количество сообщений, отправленных абонентом 3 абоненту 2. По этим данным рассчитываются коэффициенты пропускной способности кПрСп12…кПрСп66 абонент - абонент.
Выравнивание.
Данные гистограммы с палитры Статистика.
Имя: на врПередСооб;
Количество интервалов: равным 10;
Нач. размер интервалов: 0.01.Теперь организуем вывод в более презентабельном виде. На рис. 4.6 показаны элементы для вывода показателей качества обслуживания сети связи. Часть результатов моделирования будем выводить в таком же виде и такие же, как и для каждого абонента.
ViewResult.
Абонент.
Результаты моделирования.
Main и вставьте скопированные элементы в верхнюю часть области просмотра ViewResult (см. рис. 4.6).
Текстовое поле (editbox10) для вывода коэффициента пропускной способности сети.
Палитре выделите Статистика. Перетащите элемент Гистограмма.
Основные панели Свойства в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
Добавить данные и введите в поле Данные: имя врПередачи.
Время передачи.
Палитре выделите Презентация. Перетащите элемент Скругленный прямоугольник в область просмотра результатов ViewResult.
(рис 4.6) Вывод показателей качества обслуживания сети
Основные в поле Имя: оставьте имя, предложенное системой. Сбросьте флажок Отображать имя.
Дополнительные панели Свойства. Введите в поля 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
Основной библиотеки (Enterprise Library) объект source. Поместите его так же, как на рис. 4.8. Остальные объекты блока Абонент1 вы будете размещать по мере необходимости.При построении модели нам придётся воспользоваться Java-кодом, в котором потребуются дополнительные поля сообщений. Для этого мы должны создать нестандартный класс заявки с дополнительными полями для записи и хранения параметров, о которых мы упоминали ранее (см. п. 4.1.4).
(рис 4.8) Реализация блока Абонент1 средствами AnyLogic
Создайте класс заявки Message.
source.
Проект щелкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
Новый Java класс. В поле Имя: введите имя нового класса: Message.
Базовый класс: выберите из выпадающего списка Entity в качестве базового класса (в ранних версиях - anylogic.libraries.enterprise.Entity). Щелкните кнопку Далее.
Мастера создания Java класса. Добавьте поля Java класса, показанные на рис. 4.9.
(рис 4.9) Дополнительные поля класса заявок Message
Создать конструктор и Создать метод toString ().
Готово. Закройте редактор кода.Продолжим построение блока Абонент1.
source. На странице Основные панели Свойства установите следующие свойства:Message
Времени между прибытиями
exponential(1/timeAbonent)
1
new Message()
double a=0;
double b=kolAbonent;
// Розыгрыш номера получателя сообщения
a=uniform();
for (int i=1; i<(kolAbonent+1); i++)
{if (a<=((1/kolAbonent)*b))
entity.numAbPol=i;
b=b-1;}
entity.timeOtpr=time();
entity.numAbOtpr=numAbonent;Объект source будет генерировать сообщения с интервалами времени, распределёнными по экспоненциальному закону. Принято, что сообщения от данного абонента-отправителя с равной вероятностью могут быть отправлены любому абоненту сети. Поэтому разыгрывается номер абонента-получателя сообщения, и заносится в numAbPol. В поле timeOtpr заносится время отправления сообщения.
TimeMeasureStart и TimeMeasureEnd, позволяющие измерять время прохождения заявки между двумя заданными точками диаграммы процесса. TimeMeasureStart запоминает момент времени, в который заявка проходит через этот объект. TimeMeasureEnd вычисляет для поступившей в него заявки разность между текущим временем и запомненным объектом TimeMeasureStart, на который ссылается этот объект. Эта разность добавляется в элементы сбора статистики, встроенные в объект TimeMeasureEnd.selectOutput. Соедините его вход с выходом объекта source. Объект selectOutput выделяет и направляет объекту sink на уничтожение сообщения, адресованные абоненту-отправителю, то есть самому себе. Перетащите объект sink. Его вход соедините с выходом T объекта selectOutput.
selectOutput5. Данный объект предназначен для розыгрыша категорий отправляемых сообщений. Его вход соедините с выходом F объекта selectOutput. На странице Основные панели Свойства установите свойства согласно табл. 4.4. Эти свойства являются кодом. Код предназначен для счёта отправленных сообщений за сеть связи в целом и по категориям сообщений, определения количества отправленных сообщений за один прогон, розыгрыша длин сообщений по категориям, вывода расчётов по каждому абоненту, а также за сеть связи в целом.
selectOutput5 (имена selectOutput1 и selectOutput2). Объекты предназначены для разделения и счёта отправляемых сообщений по абонентам.
| Свойство | selectOutput |
|---|---|
| Класс заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbOtpr==entity.numAbPol |
| Класс заявки: | Message |
| Использовать: | Условия |
| Действие при входе: | a=uniform(); |
f++; | |
kolOtpr=f/kolProg; | |
editbox5.setText(kolOtpr, true); | |
get_Main().f++; | |
get_Main().всегоОтпр=get_Main().f/ | |
kolProg; | |
get_Main().editbox5.setText(get_Main(). | |
всегоОтпр, true); | |
| Условие 0 | a<=verKat.get(1) |
| Действие при выходе 0 | entity.numKat=1; |
b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
entity.dlina=(int)(b); | |
d1++; | |
kolOtprKat1=d1/kolProg; | |
editbox6.setText(kolOtprKat1, true); | |
get_Main().d1++; | |
get_Main().всегоОтпрКат1=get_Main().d1/kolProg; | |
get_Main().editbox6.setText(get_Main().всегоОтпрКат1, true); | |
| Условие 1 | a<=ver verKat.get(2) |
| Действие при выходе 1 | entity.numKat=2; |
b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
entity.dlina = (int)(b); | |
d2++; | |
kolOtprKat2=d2/kolProg; | |
editbox7.setText(kolOtprKat2, true); | |
get_Main().d2++; | |
get_Main().всегоОтпрКат2=get_Main().d2/kolProg; | |
get_Main().editbox7.setText(get_Main().всегоОтпрКат2, true); | |
| Условие 2 | a<=verKat.get(3) |
| Действие при выходе 2 | entity.numKat=3; |
b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
entity.dlina=(int)(b); | |
d3++; | |
kolOtprKat3=d3/kolProg; | |
editbox8.setText(kolOtprKat3, true); | |
get_Main().d3++; | |
get_Main().всегоОтпрКат3=get_Main().d3/ kolProg; | |
get_Main().editbox8.setText(get_Main().всегоОтпрКат3, true); | |
| Условие 3 | a<=verKat.get(4) |
| Действие при выходе 3 | entity.numKat=4; |
b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); | |
entity.dlina=(int)(b); | |
d4++; | |
kolOtprKat4=d4/kolProg; | |
editbox9.setText(kolOtprKat4, true); | |
get_Main().d4++; | |
get_Main().всегоОтпрКат4=get_Main().d4/kolProg; | |
get_Main().editbox9.setText(get_Main().всегоОтпрКат4, true); | |
| Свойство | selectOutput1 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==1 |
| Условие 1 | entity.numAbPol==2 |
| Действие при выходе 1 | отпрАб2++; |
get_Main().отпр12=отпрАб2; | |
| Условие 2 | entity.numAbPol==3 |
| Действие при выходе 2 | отпрАб3++; |
get_Main().отпр13=отпрАб3; | |
| Условие 3 | entity.numAbOtpr==entity.numAbPol |
| Свойство | selectOutput2 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==4 |
| Действие при выходе 0 | отпрАб4++; |
get_Main().отпр14=отпрАб4; | |
| Условие 1 | entity.numAbPol==5 |
| Действие при выходе 1 | отпрАб5++; |
get_Main().отпр15=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Действие при выходе 2 | отпрАб6++; |
get_Main().отпр16=отпрАб6; |
queue. Укажите его свойства: Имя:Буфер. Класс заявки: Message. Вместимость 100. Соедините выходы 0…3 selectOutput1 с входом элемента Буфер (см. рис. 4.8).
selectOutput1 с входом selectOutput2. Через этот выход будут проходить на selectOutput2 сообщения, адресованные абонентам 4, 5 и 6.
selectOutput2 и установите значения свойств, указанных также в табл. 4.4. Соедините все выходы selectOutput2 с входом элемента Буфер.Отправляемое сообщение поступило в буфер. Дальше оно должно попасть в канал связи. Создайте порты для отправления и приёма сообщений.
Презентация перетащите элемент Скруглённый прямоугольник.
Дополнительные панели Свойства. Введите в поля X: 210, Y: 100, Ширина: 65, Высота: 60.
Основная перетащите два элемента порт. Разместите их как на рис. 4.8. В поле Имя: замените предложенное системой на вх и вых.
Скруглённый прямоугольник и порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Абонент1 этот флажок должен быть сброшенным.Итак, отправляемое сообщение поступило в канал связи, подключённый к порту вых.
Через порт вх сообщения поступают из канала связи. Продолжим построение блока Абонент1.
selectOutput (имя selectOutput3). Он предназначен для контроля текущей ёмкости входного буфера. В случае заполнения буфера, сообщения теряются.
вх с входом объекта selectOutput3.
sink (имя sink1). Его вход соедините с выходом F объекта selectOutput3.
selectOutput3 и установите его свойства:Message
true выбирается При выполнении условия
emkBuferVx-tekEmkBuferVx>=entity.dlina queue. Укажите его свойства:БуферВх
Message
emkBuferVx
tekEmkBuferVx+=entity.dlina;
tekEmkBuferVx-=entity.dlina; Соедините его вход с выходом Т объекта selectOutput3.
selectOutput5 (имя selectOutput4). Он предназначен для разделения потока полученных сообщений по категориям. На странице Основные панели Свойства установите свойства согласно табл. 4.5. Эти свойства также являются кодом. Код предназначен для счёта полученных сообщений за сеть связи в целом и по категориям сообщений, определения количества полученных сообщений за один прогон, вывода расчётов за каждого абонента, а также за сеть связи в целом.
БуферВх с выходом объекта selectOutput4.
| Свойство | selectOutput4 |
|---|---|
| Класс заявки: | Message |
| Использовать: | Условия |
| Действие при входе: | g++; |
kolPol=g/kolProg; | |
editbox.setText(kolPol, true); | |
get_Main().g++; | |
get_Main().всегоПол=get_Main().g/ | |
kolProg; | |
get_Main().editbox.setText(get_Main().всегоПол, true); | |
| Условие 0 | entity.numKat==1 |
| Действие при выходе 0 | k1++; |
kolPolKat1=k1/kolProg; | |
editbox1.setText(kolPolKat1, true); | |
get_Main().k1++; | |
get_Main().всегоПолКат1=get_Main().k1/kolProg; | |
get_Main().editbox1.setText(get_Main().всегоПолКат1, true); | |
| Условие 1 | entity.numKat==2 |
| Действие при выходе 1 | k2++; |
kolPolKat2=k2/kolProg; | |
editbox2.setText(kolPolKat2, true); | |
get_Main().k2++; | |
get_Main().всегоПолКат2=get_Main().k2/kolProg; | |
get_Main().editbox2.setText(get_Main().всегоПолКат2, true); | |
| Условие 2 | entity.numKat==3 |
| Действие при выходе 2 | k3++; |
kolPolKat3=k3/kolProg; | |
editbox3.setText(kolPolKat3, true); | |
get_Main().k3++; | |
get_Main().всегоПолКат3=get_Main().k3/kolProg; | |
get_Main().editbox3.setText(get_Main().всегоПолКат3, true); | |
| Условие 3 | entity.numKat==4 |
| Действие при выходе 3 | k4++; |
kolPolKat4=k4/kolProg; | |
editbox4.setText(kolPolKat4, true); | |
get_Main().k4++; | |
get_Main().всегоПолКат4=get_Main().k4/kolProg; | |
get_Main().editbox4.setText(get_Main().всегоПолКат4, true); | |
| Свойство | selectOutput5 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==1 |
| Условие 1 | entity.numAbOtpr==2 |
| Действие при выходе 1 | отАб2++; |
get_Main().кПрСп21=отАб2/get_Main(). | |
отпр21; | |
get_Main().КПрСп21.setText(get_Main().кПрСп21, true); | |
| Условие 2 | entity.numAbOtpr==3 |
| Действие при выходе 2 | отАб3++; |
get_Main().кПрСп31=отАб3/get_Main(). | |
отпр31; | |
get_Main().КПрСп31.setText(get_Main().кПрСп31, true); | |
| Условие 3 | entity.numAbOtpr==4 |
| Действие при выходе 3 | отАб4++; |
get_Main().кПрСп41=отАб4/get_Main(). | |
отпр41; | |
get_Main().КПрСп41.setText(get_Main().кПрСп41, true); | |
| Свойство | selectOutput6 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==5 |
| Действие при выходе 0 | отАб5++; |
get_Main().кПрСп51=отАб5/get_Main(). | |
отпр51; | |
get_Main().КПрСп51.setText(get_Main().кПрСп51, true); | |
| Условие 1 | entity.numAbOtpr==6 |
| Действие при выходе 1 | отАб6++; |
get_Main().кПрСп61=отАб6/get_Main(). | |
отпр61; | |
get_Main().КПрСп61.setText(get_Main().кПрСп61, true); |
selectOutput5 (имена selectOutput5 и selectOutput6). Объекты предназначены для разделения и счёта получаемых сообщений по абонентам. Значения свойств установите также согласно табл. 4.5. Выход по умолчанию объекта selectOutput5 соедините с входом объекта selectOutput6.
sink2. Его вход соедините с выходами 0…3 объекта selectOutput5 и выходами объекта selectOutput6.
sink2 согласно табл. 4.6. Код рассчитывает коэффициент пропускной способности сети связи и время передачи одного сообщения.| Свойство | sink2 |
|---|---|
| Класс заявки: | Message |
| Действие при входе: | врПередачи.add(time()-entity.timeOtpr); |
editbox11.setText(врПередачи.mean(), true); | |
editbox12.setText(врПередачи.max(), true); | |
editbox13.setText(врПередачи.min(), true); | |
get_Main().коэфПропСпособ=get_Main(). | |
всегоПол/get_Main().всегоОтпр; | |
get_Main().editbox10.setText(get_Main().коэфПропСпособ, true); | |
get_Main().врПередСооб.add(time()-entity.timeOtpr); | |
get_Main().editbox11.setText(get_Main().врПередСооб.mean(), true); | |
get_Main().editbox12.setText(get_Main().врПередСооб.max(), true); | |
get_Main().editbox13.setText(get_Main().врПередСооб.min(), true); |
Маршрутизатор.
viewData.
Презентация элемент Скругленный прямоугольник. На странице Основные в поле Имя: оставьте имя, предложенное системой.
Дополнительные панели Свойства. Введите в поля 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 и на странице Основные панели Свойства в поле Текст: введите Блок контроля 1.
Имя: вместо selectOutput введите blokKontrol_1.
Класс заявки: Entity замените Message.
(рис 4.11) Событийная часть сегмента Маршрутизатор
(рис 4.12) Алгоритм работы Блока контроля 1
Выход true выбирается При выполнении условия.
Условие введите условие:
(emkostBufer1-tekEmkostBufer1>=entity.dlina) (hold.isBlocked()==false)
При выполнении условия заявка направляется на выход T (выходной порт для заявок, для которых выбирается выход true) и на выход F (выходной порт для заявок, для которых выбирается выход false), если условие не выполняется, соответственно.
sink. В поле Класс заявки: Entity замените Message.
kolPotBK++; для счёта количества сообщений, потерянных при отказе вычислительного комплекса.
hold. В поле Класс заявки: Entity замените Message.Блок Буфер 1 предназначен для приема, размещения и хранения поступающих на обработку сообщений.
Алгоритм работы блока Буфер 1 приведен на рис. 4.13.
В AnyLogic алгоритм блока Буфер 1 реализуется объектом queue, который выполняет функции очереди (FIFO).
Палитре выделите Презентация. Перетащите элемент Прямоугольник.
Дополнительные панели Свойства. Введите в поля X: 190, Y: 50, Ширина: 126, Высота: 100.
Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
text и на странице Основные панели Свойства в поле Текст: введите Буфер 1.
(рис 4.13) Алгоритм работы блока Буфер 1
queue.
Имя: вместо queue введите bufer1.
Класс заявки: Entity замените Message.
Вместимость введите emkBufer1.
Действие при входе введите:
tekEmkBufer1 += entity.dlina;
Действие при выходе введите:
tekEmkBufer1 = -entity.dlina;
Включить сбор статистики.Блок предназначен для имитации обработки сообщений.
Алгоритм работы блока приведен на рис. 4.14.
(рис 4.14) Алгоритм работы Блока обработки сообщений
Для реализации алгоритма Блока обработки сообщений в AnyLogic используется объект delay.
Палитре выделите Презентация. Перетащите элемент Прямоугольник.
Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
Дополнительные панели Свойства. Введите в поля X: 336, Y: 50, Ширина: 194, Высота: 100.
text и на странице Основные панели Свойства в поле Текст: введите Блок обработки сообщений.
delay, разместите и соедините с bufer_1 так, как на рис. 4.11.
delay. На странице Основные панели Свойства в поле Имя: вместо delay введите сomputer.
Класс заявки: Entity замените Message.
Задержка задаётся установите Явно.
Время задержки введите:
exponential(1/entity.timeObr)
Вместимость 1.
Действие при входе entity.timeObr=
entity.dlina/proizvod;
Включить сбор статистики.
Палитре выделите Презентация. Перетащите элемент Прямоугольник.
Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
Дополнительные панели Свойства. Введите в поля X: 20, Y: 40, Ширина: 520, Высота: 170.
text и на странице Основные панели Свойства в поле Текст: введите Вычислительный комплекс.Блок контроля 2 предназначен для распределения сообщений по направлениям и контроля текущих ёмкостей буферов (накопителей) направлений передачи сообщений.
Алгоритм работы Блока контроля 2 приведен на рис. 4.15.
Вначале определяется номер направления, по которому должно быть передано поступившее сообщение.
(рис 4.15) Алгоритм работы блока Блок контроля 2
Затем определяется наличие достаточной свободной памяти в буфере этого направления. При отсутствии нужного объёма памяти сообщение теряется.
Для распределения сообщений по направлениям можно было бы использовать объекты selectOutput5 и sink. Однако мы используем другие объекты AnyLogic: exit и enter. Они позволяют организовать сложную маршрутизацию, вследствие чего на рис. 4.11 Блок контроля 2 не выделен, хотя функционально он существует.
exit, вход которого соедините с выходом computer (рис. 4.10).
Класс заявки: Entity замените 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 и установите значения свойств.
Класс заявки: Entity замените Message.
Вместимость emkBuferNapr1
Действие при входе введите:
tekEmkNapr1 += entity.dlina;
Действие при выходе введите:
tekEmkNapr1 -= entity.dlina;
Включить сбор статистики.
buferNapr2, вход которого соединен с выходом enter2 и установите значения свойств.
Класс заявки: Entity замените Message.
Вместимость emkBuferNapr2
Действие при входе введите:
tekEmkNapr2 += entity.dlina;
Действие при выходе введите:
tekEmkNapr2 -= entity.dlina;
Включить сбор статистики.
buferNapr3, вход которого соединен с выходом enter3 и установите значения свойств.
Класс заявки: Entity замените Message.
Вместимость emkBuferNapr3
Действие при входе введите:
tekEmkNapr3 += entity.dlina;
Действие при выходе введите:
tekEmkNapr3 -= entity.dlina;
Включить сбор статистики.
buferNapr4, вход которого соединен с выходом enter4 и установите значения свойств.
Класс заявки: Entity замените 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.
hold, разместите как на рис. 4.17.
Отображать имя.
Класс заявки: Entity замените Message.
(рис 4.16) Исходные данные сегмента Канал
(рис 4.17) Объекты событийной части сегмента Канал
hold1 установите флажок Изначально заблокирован.
delay, поместите сверху (см. рис. 4.16). В поле Имя: введите основной_канал.
Отображать имя.
Класс заявки: Entity замените Message. Задержка задаётся установите Явно.
Время задержки введите
exponential(1/entity.timePered)
Вместимость введите 1.
Действие при входе entity.timePered=entity.dlina/
skorPeredKan;
Включить сбор статистики.
delay. Вставьте его один раз. При этом изменится имя на основной_канал, а остальные свойства останутся неизменными.
основной_канал на резерв_канал.
Действие при входе замените имеющийся там код следующим:
if (а==0)
entity.timePered=entity.dlina/skorPeredKanR;
if (а==1)
{entity.timePered=entity.dlina/skorPeredKanR +
timeBklResK;
а=0;}
Действие при выходе
if (hold.isBlocked()== true) hold1.setBlocked(false);
hold и delay согласно рис. 4.17.Скруглённый прямоугольник.
Дополнительные панели Свойства введите в поля X: 50, Y: 80, Ширина: 60, Высота: 52.
Основная перетащите два элемента Порт. Разместите их как на рис. 4.17. В полях Имя: предложенные системой имена замените согласно рис. 4.17. Установите флажки Отображать имя.
Скруглённый прямоугольник и Порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Канал этот флажок должен быть сброшенным.
основной_канал и резерв_канал с портом вых, а порт вх - с входами элементов hold и hold1.Имитатор отказов основного канала связи построен аналогично имитатору отказов вычислительного комплекса.
Прямоугольник.
Дополнительные панели Свойства введите в поля X: 10, Y: 212, Ширина: 380, Высота: 120.
source и два объекта delay. Разместите и соедините их как на рис. 4.17.
source и установите значения его свойств:установите флажок
Интенсивности
1
1
установите флажок
1
delay и установите значения его свойств:розыг_инт_до_отказа
установите флажок
Явно
exponential(1/timeOtkKan)
1
hold.setBlocked(true);
if (основной_канал.size()!=0) {
основной_канал.remove((Message)
основной_канал.get(0));
всего_потеряно_сообщ ++;}
hold1.setBlocked(false);
а=1;delay и установите значения его свойств:имитация_восст_осн_кан
установите флажок
Явно
exponential(1/timeVosstkKan)
1
hold.setBlocked(false); hold1.setBlocked(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.numAbOtpr==entity.numAbPol |
numAbonent | 2 |
| Свойство | selectOutput1 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==1 |
| Действие при выходе 0 | отпрАб1++; |
get_Main().отпр21=отпрАб1; | |
| Условие 1 | entity.numAbPol==2 |
| Условие 2 | entity.numAbPol==3 |
| Действие при выходе 2 | отпрАб3++; |
get_Main().отпр23=отпрАб3; | |
| Условие 3 | entity.numAbOtpr==entity.numAbPol |
| Свойство | selectOutput2 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==4 |
| Действие при выходе 0 | отпрАб4++; |
get_Main().отпр24=отпрАб4; | |
| Условие 1 | entity.numAbPol==5 |
| Действие при выходе 1 | отпрАб5++; |
get_Main().отпр25=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Действие при выходе 2 | отпрАб6++; |
get_Main().отпр26=отпрАб6; | |
| Свойство | selectOutput5 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==1 |
| Действие при выходе 0 | отАб1++; |
get_Main().кПрСп12=отАб1/get_Main(). | |
отпр12; | |
get_Main().КПрСп12.setText(get_Main().кПрСп12, true); | |
| Условие 1 | entity.numAbOtpr==2 |
| Условие 2 | entity.numAbOtpr==3 |
| Действие при выходе 2 | отАб3++; |
get_Main().кПрСп32=отАб3/get_Main(). | |
отпр32; | |
get_Main().КПрСп32.setText(get_Main().кПрСп32, true); | |
| Условие 3 | entity.numAbOtpr==4 |
| Действие при выходе 3 | отАб4++; |
get_Main().кПрСп42=отАб4/get_Main(). | |
отпр42; | |
get_Main().КПрСп42.setText(get_Main().кПрСп42, true); | |
| Свойство | selectOutput6 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==5 |
| Действие при выходе 0 | отАб5++; |
get_Main().кПрСп52=отАб5/get_Main(). | |
отпр52; | |
get_Main().КПрСп52.setText(get_Main().кПрСп52, true); | |
| Условие 1 | entity.numAbOtpr==6 |
| Действие при выходе 1 | отАб6++; |
get_Main().кПрСп62=отАб6/get_Main(). | |
отпр62; | |
get_Main().КПрСп62.setText(get_Main().кПрСп62, true); | |
| Абонент3 | |
| Свойство | selectOutput |
| Класс заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbOtpr==entity.numAbPol |
numAbonent | 3 |
| Свойство | selectOutput1 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==1 |
| Действие при выходе 0 | отпрАб1++; |
get_Main().отпр31=отпрАб1; | |
| Условие 1 | entity.numAbPol==2 |
| Действие при выходе 2 | отпрАб2++; |
get_Main().отпр32=отпрАб2; | |
| Условие 2 | entity.numAbPol==3 |
| Условие 3 | entity.numAbOtpr==entity.numAbPol |
| Свойство | selectOutput2 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==4 |
| Действие при выходе 0 | отпрАб4++; |
get_Main().отпр34=отпрАб4; | |
| Условие 1 | entity.numAbPol==5 |
| Действие при выходе 1 | отпрАб5++; |
get_Main().отпр35=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Действие при выходе 2 | отпрАб6++; |
get_Main().отпр36=отпрАб6; | |
| Свойство | selectOutput5 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==1 |
| Действие при выходе 0 | отАб1++; |
get_Main().кПрСп13=отАб1/get_Main(). | |
отпр13; | |
get_Main().КПрСп13.setText(get_Main().кПрСп13, true); | |
| Условие 1 | entity.numAbOtpr==2 |
| Действие при выходе 1 | отАб2++; |
get_Main().кПрСп23=отАб2/get_Main(). | |
отпр23; | |
get_Main().КПрСп23.setText(get_Main().кПрСп23, true); | |
| Условие 2 | entity.numAbOtpr==3 |
| Условие 3 | entity.numAbOtpr==4 |
| Действие при выходе 3 | отАб4++; |
get_Main().кПрСп43=отАб4/get_Main(). | |
отпр43; | |
get_Main().КПрСп43.setText(get_Main().кПрСп43, true); | |
| Свойство | selectOutput6 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==5 |
| Действие при выходе 0 | отАб5++; |
get_Main().кПрСп53=отАб5/get_Main(). | |
отпр53; | |
get_Main().КПрСп53.setText(get_Main().кПрСп53, true); | |
| Условие 1 | entity.numAbOtpr==6 |
| Действие при выходе 1 | отАб6++; |
get_Main().кПрСп63=отАб6/get_Main(). | |
отпр63; | |
get_Main().КПрСп63.setText(get_Main().кПрСп63, true); | |
| Абонент4 | |
| Свойство | selectOutput |
| Класс заявки: | Message |
Выход true выбирается | При выполнении условия |
| Условие | entity.numAbOtpr==entity.numAbPol |
numAbonent | 4 |
| Свойство | selectOutput1 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==1 |
| Действие при выходе 0 | отпрАб1++; |
get_Main().отпр41=отпрАб1; | |
| Условие 1 | entity.numAbPol==2 |
| Действие при выходе 2 | отпрАб2++; |
get_Main().отпр42=отпрАб2; | |
| Условие 2 | entity.numAbPol==3 |
| Действие при выходе 2 | отпрАб3++; |
get_Main().отпр43=отпрАб3; | |
| Условие 3 | entity.numAbOtpr==entity.numAbPol |
| Свойство | selectOutput2 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==4 |
| Условие 1 | entity.numAbPol==5 |
| Действие при выходе 1 | отпрАб5++; |
get_Main().отпр45=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Действие при выходе 2 | отпрАб6++; |
get_Main().отпр46=отпрАб6; | |
| Свойство | selectOutput5 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==1 |
| Действие при выходе 0 | отАб1++; |
get_Main().кПрСп14=отАб1/get_Main(). | |
отпр14; | |
get_Main().КПрСп14.setText(get_Main().кПрСп14, true); | |
| Условие 1 | entity.numAbOtpr==2 |
| Действие при выходе 1 | отАб2++; |
get_Main().кПрСп24=отАб2/get_Main(). | |
отпр24; | |
get_Main().КПрСп24.setText(get_Main().кПрСп24, true); | |
| Условие 2 | entity.numAbOtpr==3 |
| Действие при выходе 2 | отАб3++; |
get_Main().кПрСп34=отАб3/get_Main(). | |
отпр34; | |
get_Main().КПрСп34.setText(get_Main().кПрСп34, true); | |
| Условие 3 | entity.numAbOtpr==4 |
| Свойство | selectOutput6 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==5 |
| Действие при выходе 0 | отАб5++; |
get_Main().кПрСп54=отАб5/get_Main(). | |
отпр54; | |
get_Main().КПрСп54.setText(get_Main().кПрСп54, true); | |
| Условие 1 | entity.numAbOtpr==6 |
| Действие при выходе 1 | отАб6++; |
get_Main().кПрСп64=отАб6/get_Main().отпр64; | |
get_Main().КПрСп64.setText(get_Main().кПрСп64, true); | |
| Абонент5 | |
| Свойство | selectOutput |
| Класс заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbOtpr==entity.numAbPol |
numAbonent | 5 |
| Свойство | selectOutput1 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==1 |
| Действие при выходе 0 | отпрАб1++; |
get_Main().отпр51=отпрАб1; | |
| Условие 1 | entity.numAbPol==2 |
| Действие при выходе 2 | отпрАб2++; |
get_Main().отпр52=отпрАб2; | |
| Условие 2 | entity.numAbPol==3 |
| Действие при выходе 2 | отпрАб3++; |
get_Main().отпр53=отпрАб3; | |
| Условие 3 | entity.numAbOtpr==entity.numAbPol |
| Свойство | selectOutput2 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==4 |
| Действие при выходе 0 | отпрАб4++; |
get_Main().отпр54=отпрАб4; | |
| Условие 1 | entity.numAbPol==5 |
| Условие 2 | entity.numAbPol==6 |
| Действие при выходе 2 | отпрАб6++; |
get_Main().отпр56=отпрАб6; | |
| Свойство | selectOutput5 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==1 |
| Действие при выходе 0 | отАб1++; |
get_Main().кПрСп15=отАб1/get_Main(). | |
отпр15; | |
get_Main().КПрСп15.setText(get_Main().кПрСп15, true); | |
| Условие 1 | entity.numAbOtpr==2 |
| Действие при выходе 1 | отАб2++; |
get_Main().кПрСп25=отАб2/get_Main(). | |
отпр25; | |
get_Main().КПрСп25.setText(get_Main().кПрСп25, true); | |
| Условие 2 | entity.numAbOtpr==3 |
| Действие при выходе 2 | отАб3++; |
get_Main().кПрСп35=отАб3/get_Main(). | |
отпр35; | |
get_Main().КПрСп35.setText(get_Main().кПрСп35, true); | |
| Условие 3 | entity.numAbOtpr==4 |
| Действие при выходе 3 | отАб4++; |
get_Main().кПрСп45=отАб4/get_Main(). | |
отпр45; | |
get_Main().КПрСп45.setText(get_Main().кПрСп45, true); | |
| Свойство | selectOutput6 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==5 |
| Условие 1 | entity.numAbOtpr==6 |
| Действие при выходе 1 | отАб6++; |
get_Main().кПрСп65=отАб6/get_Main(). | |
отпр65; | |
get_Main().КПрСп65.setText(get_Main().кПрСп65, true); | |
| Абонент6 | |
| Свойство | selectOutput |
| Класс заявки: | Message |
| Выход true выбирается | При выполнении условия |
| Условие | entity.numAbOtpr==entity.numAbPol |
numAbonent | 6 |
| Свойство | selectOutput1 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==1 |
| Действие при выходе 0 | отпрАб1++; |
get_Main().отпр61=отпрАб1; | |
| Условие 1 | entity.numAbPol==2 |
| Действие при выходе 2 | отпрАб2++; |
get_Main().отпр62=отпрАб2; | |
| Условие 2 | entity.numAbPol==3 |
| Действие при выходе 2 | отпрАб3++; |
get_Main().отпр63=отпрАб3; | |
| Условие 3 | entity.numAbOtpr==entity.numAbPol |
| Свойство | selectOutput2 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbPol==4 |
| Действие при выходе 0 | отпрАб4++; |
get_Main().отпр64=отпрАб4; | |
| Условие 1 | entity.numAbPol==5 |
| Действие при выходе 1 | отпрАб5++; |
get_Main().отпр65=отпрАб5; | |
| Условие 2 | entity.numAbPol==6 |
| Свойство | selectOutput5 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==1 |
| Действие при выходе 0 | отАб1++; |
get_Main().кПрСп16=отАб1/get_Main().отпр16; | |
get_Main().КПрСп16.setText(get_Main().кПрСп16, true); | |
| Условие 1 | entity.numAbOtpr==2 |
| Действие при выходе 1 | отАб2++; |
get_Main().кПрСп26=отАб2/get_Main().отпр26; | |
get_Main().КПрСп26.setText(get_Main().кПрСп26, true); | |
| Условие 2 | entity.numAbOtpr==3 |
| Действие при выходе 2 | отАб3++; |
get_Main().кПрСп35=отАб3/get_Main(). | |
отпр35; | |
get_Main().КПрСп35.setText(get_Main().кПрСп35, true); | |
| Условие 3 | entity.numAbOtpr==4 |
| Действие при выходе 3 | отАб3++; |
get_Main().кПрСп36=отАб3/get_Main(). | |
отпр36; | |
get_Main().КПрСп36.setText(get_Main().кПрСп36, true); | |
| Свойство | selectOutput6 |
| Класс заявки: | Message |
| Использовать: | Условия |
| Условие 0 | entity.numAbOtpr==5 |
| Действие при выходе 0 | отАб5++; |
get_Main().кПрСп56=отАб5/get_Main(). | |
отпр56; | |
get_Main().КПрСп56.setText(get_Main().кПрСп56, true); | |
| Условие 1 | 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. Вставьте пять раз. Последовательно откройте и внесите соответствующие правки в полях Метка: и Действие:.
button. Укажите свойства:Результаты
viewData.navigateTo()button. Укажите свойства:маршрут1
маршрут1.облМарш.navigateTo()маршрут1. Скорректируйте свойства:маршрут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.
| Объект | Область просмотра | Свойства | Значение |
|---|---|---|---|
| Абонент | облАбонент | Метка: | Сеть |
| Действие: | get_Main().облСеть.navigateTo() | ||
| облАбонент | Метка: | Исходные данные | |
| Действие: | viewData.navigateTo() | ||
| viewData | Метка: | Сеть | |
| Действие: | get_Main().облСеть.navigateTo() | ||
| viewData | Метка: | Абонент | |
| Действие: | облАбонент.navigateTo() | ||
| Канал | облКан | Метка: | Сеть |
| Действие: | get_Main().облСеть.navigateTo() | ||
| облКан | Метка: | Данные | |
| Действие: | viewData.navigateTo() | ||
| viewData | Метка: | Канал | |
| Действие: | облКан.navigateTo() | ||
| Маршрутизатор | облМарш | Метка: | Сеть |
| Действие: | get_Main().облСеть.navigateTo() | ||
| облМарш | Метка: | Данные | |
| Действие: | viewData.navigateTo() | ||
| viewData | Метка: | Сеть | |
| Действие: | get_Main().облСеть.navigateTo() | ||
| viewData | Метка: | Маршрутизатор | |
| Действие: | облМарш.navigateTo() | ||
| Маршрутизатор1 | облМарш | Метка: | Сеть |
| Действие: | get_Main().облСеть.navigateTo() | ||
| облМарш | Метка: | Данные | |
| Действие: | viewData.navigateTo() | ||
| viewData | Метка: | Сеть | |
| Действие: | get_Main().облСеть.navigateTo() | ||
| viewData | Метка: | Маршрутизатор | |
| Действие: | облМарш.navigateTo() |
Прежде чем запустить модель:
Проекты выделите Сеть_связи.
Основные в поле Единицы модельного времени: установите секунды.
Проекты выделите Simulation: Main.
Основные установите Фиксированное начальное число (воспроизводимые "прогоны").
Начальное число: введите 897.
Модельное время. В поле Остановить: выберите В заданное время.
Конечное время: введите 3600000.0. Время моделирования увеличено в 1000 раз по числу прогонов модели.
При правильном построении модели вы получите результаты, показанные на рис. 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 экспериментов. Изменение параметров сети связи проводилось так же, как и в предыдущих моделях. То есть в каждом следующем эксперименте параметры, изменённые в предыдущем эксперименте, остаются такими же, если не указано их изменение. В шестом эксперименте кроме указанных параметров были также изменены средние интервалы поступления сообщений от всех абонентов с 30 до 20.
В Anylogic в поле Конечное время: было введено 3600000.0. Время моделирования увеличено в 1000 раз по числу прогонов модели. В GPSS указывается модельное время 3600 и 1000 прогонов модели.
Результаты экспериментов сведены в табл. 4.11. Видно, что результаты моделирования отличаются незначительно. Коэффициенты пропускной способности ($$\Delta_{11} … \Delta_{61}$$) отличаются на 0…0,001, а среднее время передачи одного сообщения ($$\Delta_{12} … \Delta_{62}$$) - на 0,075…1,085 с. Коэффициенты загрузки вычислительных комплексов также отличаются на 0…0,020, а коэффициенты загрузки основных каналов - на 0,000…0,001.
В четвёртом и пятом экспериментах в связи с уменьшением ёмкостей входных буферов ВК1 и ВК2 сообщения второй категории не передаются, так как их средняя длина из всех категорий максимальная.
Сравнительная оценка позволяет сделать вывод об адекватности результатов моделирования, полученных при использовании для построения моделей одной и той же системы инструментальных средств GPSS World и AnyLogic.
Машинное время выполнения модели в GPSS World составляет 22 … 24 с, а в AnyLogic примерно 5 мин.
| Показатели | GPSS World | AnyLogic |
|---|---|---|
| 1) Согласно постановке задачи | ||
| Коэффициент пропускной способности сети связи | 0,816 | 0,815 |
| $$\Delta_{11}=\mid 0,816-0,815\mid=0,001$$ | ||
| Среднее время передачи одного сообщения | 6,127 | 6,052 |
| $$\Delta_{12}=\mid6,127-6,052\mid=0,075$$ | ||
| Коэффициент загрузки ВК1 | 0,255 | 0,255 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 |
| Средний коэффициент загрузки основных каналов | 0,042 | 0,042 |
| Среднее количество полученных / отправленных сообщений | 489,930/600,263 | 490,195/601,092 |
| 2) emkBuferVx =…= emkBuferVx = 70000 | ||
| Коэффициент пропускной способности сети связи | 0,741 | 0,741 |
| $$\Delta_{21}=\mid0,741-0,741\mid=0,000$$ | ||
| Среднее время передачи одного сообщения | 6,127 | 5,867 |
| $$\Delta_{22}=\mid6,127-5,867\mid=0,260$$ | ||
| Коэффициент загрузки ВК1 | 0,255 | 0,255 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 |
| Средний коэффициент загрузки основных каналов | 0,043 | 0,043 |
| Среднее количество полученных / отправленных сообщений | 444,728/600,263 | 444,863/600,347 |
| 3) emkBuferVx =…= emkBuferVx = 60000 | ||
| Коэффициент пропускной способности сети связи | 0,599 | 0,599 |
| $$\Delta_{31}=\mid0,599-0,599\mid=0,000$$ | ||
| Среднее время передачи одного сообщения | 6,132 | 5,66 |
| $$\Delta_{32}=\mid6,132-5,660\mid=0,472$$ | ||
| Коэффициент загрузки ВК1 | 0,255 | 0,256 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 |
| Средний коэффициент загрузки основных каналов | 0,043 | 0,043 |
| Среднее количество полученных / отправленных сообщений | 359,640/600,584 | 360,251/601,104 |
| 4) emkBufer1 = 4 000 000 | ||
| Коэффициент пропускной способности сети связи | 0,599 | 0,6 |
| $$\Delta_{41}=\mid0,599-0,600\mid=0,001$$ | ||
| Среднее время передачи одного сообщения | 6,132 | 5,65 |
| $$\Delta_{42}=\mid6,132-5,650\mid=0,482$$ | ||
| Коэффициент загрузки ВК1 | 0,255 | 0,251 |
| Коэффициент загрузки ВК2 | 0,17 | 0,169 |
| Средний коэффициент загрузки основных каналов | 0,043 | 0,042 |
| Среднее количество полученных / отправленных сообщений | 359,640/600,584 | 359,651/599,302 |
| 5) emkBufer1 = 3 000 000 | ||
| Коэффициент пропускной способности сети связи | 0,599 | 0,598 |
| $$\Delta_{51}=\mid0,599-0,598\mid=0,001$$ | ||
| Среднее время передачи одного сообщения | 6,132 | 5,648 |
| $$\Delta_{52}=\mid6,132-5,648\mid\mid=0,484$$ | ||
| Коэффициент загрузки ВК1 | 0,255 | 0,256 |
| Коэффициент загрузки ВК2 | 0,17 | 0,17 |
| Средний коэффициент загрузки основных каналов | 0,043 | 0,044 |
| Среднее количество полученных / отправленных сообщений | 359,640/600,584 | 360,114/601,495 |
| 6) emkBuferVx =…= emkBuferVx = 100000, emkBufer1 = 6 000 000 | ||
| Коэффициент пропускной способности сети связи | 0,996 | 0,996 |
| $$\Delta_{61}=\mid0,996-0,996\mid=0,000$$ | ||
| Среднее время передачи одного сообщения | 6,155 | 7,237 |
| $$\Delta_{62}=\mid6,155-7,237\mid=1,082$$ | ||
| Коэффициент загрузки ВК1 | 0,362 | 0,382 |
| Коэффициент загрузки ВК2 | 0,238 | 0,254 |
| Средний коэффициент загрузки основных каналов | 0,064 | 0,064 |
| Среднее количество полученных / отправленных сообщений | 848,296/851,388 | 896,072/899,333 |
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.