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

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

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

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

Направление связи состоит из двух каналов (основного и резервного) и общего входного буфера емкостью на Еmk сообщений.

На направление поступают два потока сообщений с экспоненциально распределенными интервалами времени, средние значения которых Т1 = 3 мин и Т2 = 4 мин. При нормальной работе сообщения передаются по основному каналу. Время передачи одного сообщения распределено по экспоненциальному закону со средним значением Т3 = 2 мин.

В основном канале происходят сбои через интервалы времени, распределенные по экспоненциальному закону со средним значением Т4 = 15 мин. Если сбой происходит во время передачи, то сообщение теряется. За время Т5 = 5 с запускается резервный канал, который передает сообщения, начиная с очередного. Время передачи одного сообщения распределено по экспоненциальному закону со средним значением Т6 = 3 мин.

Основной канал восстанавливается. Время восстановления канала подчинено экспоненциальному закону со средним значением Т7 = 2 мин. После восстановления резервный канал выключается и основной канал продолжает работу с очередного сообщения.

Необходимо разработать имитационную модель и провести исследование функционирования направления связи в течение 2 ч.

Определить:

  • рациональную емкость накопителя;
  • загрузку основного и резервного каналов связи;
  • вероятности передачи сообщений потока 1 и потока 2;
  • вероятность передачи сообщений направлением связи в целом.
  • Модель направления связи в GPSS World

    В модели сообщения следует представлять транзактами, основной и резервный канал - одноканальными устройствами (ОКУ), входной буфер (накопитель) - списком пользователя. В списке пользователя следует использовать дисциплину обслуживания FIFO.

    Для ввода исходных данных целесообразно использовать переменные пользователя. В этом случае можно проводить при необходимости встроенными средствами GPSS World дисперсионный и оптимизирующий эксперименты.

    Так как сообщения имеют одинаковые приоритеты, то для моделирования ОКУ нужно использовать блоки SEIZE и RELEASE. Моделирование отказов основного канала нужно произвести блоками FUNAVAIL и FAVAIL, а не блоками PREEMPT и RETURN в режиме абсолютного захвата. Тогда статистика ОКУ не будет искажена.

    Введем масштабирование: 1 единица модельного времени соответствует 1 с, то есть, например, время моделирования равно 2 часам, тогда 2*60*60 = 7200 единиц модельного времени. Аналогично Т1 = 120, Т2 =240 и т.д.

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

  • ввода исходных данных и описания арифметических выражений;
  • имитации сообщений потока 1;
  • имитации сообщений потока 2;
  • имитации работы буфера и основного канала;
  • имитации работы резервного канала;
  • имитации выхода из строя основного канала;
  • задания времени моделирования и вычисления результатов моделирования.
  • Ниже приводится программа модели.

    ; Модель функционирования направления связи
    ;Задание исходных данных
    Emk		EQU	5		; Емкость накопителя
    VrMod	EQU	7200	; Время моделирования
    T1			EQU	180	; Среднее время поступления сообщений потока 1
    T2			EQU	240	; Среднее время поступления сообщений потока 2
    T3			EQU	120	; Среднее время передачи по OsnK
    T4			EQU	900	; Средний интервал времени выхода из строя OsnK
    T5			EQU	10		; Время включения Resk
    T6			EQU	180	; Среднее время передачи по ResK
    T7			EQU	120	; Среднее время восстановления OsnK
    ; Описание арифметических выражений
    ;	Вероятность передачи сообщений потока 1
    Ver1		VARIABLE	(N$Term1+N$Term3)/N$Soob1
    ;	Вероятность передачи сообщений потока 2
    Ver2		VARIABLE	(N$Term2+N$Term4)/N$Soob2
    ;	Вероятность передачи сообщений потоков 1 и 2
    Ver		VARIABLE	(V$Ver1+V$Ver2)/2
    ; Сегмент имитации сообщений потока 1
    GENERATE	(Exponential(12,0,T1))		; Генератор сообщений потока 1
    Soob1	ASSIGN	1,1	; Код 1 в P1 - сообщения потока 1
    TRANSFER	,Nakop		; Направить на OsnK
    ; Сегмент имитации сообщений потока 2
    GENERATE	(Exponential(15,0,T2))	; Генератор
    сообщений потока 2
    Soob2	ASSIGN	1,2	; Код 2 в P1 - сообщения потока 2
    ; Сегмент имитации работы накопителя и OsnK
    Nakop	GATE FV 	OsnK,KRes		;Доступен ли OsnK? Если нет, на Resk
    GATE NU 	OsnK,Spis		;Свободен ли OsnK? Если
    нет, в накопитель
    Prov3	SEIZE		OsnK			; Занять OsnK
    ADVANCE	(Exponential(11,0,T3))	; Обслуживание
    RELEASE		OsnK			; Освободить OsnK
    UNLINK	Nak,Prov3,1	; Вывод из накопителя 
    одного транзакта на OsnK
    TEST E	P1,1,Term2	; Сообщение потока 1 или 
    потока 2 передано по OsnK?
    Term1	TERMINATE			; Счет переданных сообщений потока 1 по OsnK
    Term2	TERMINATE			; Счет переданных сообщений потока 2 по OsnK
    ;	Список пользователя Nak
    Spis		TEST L	CH$Nak,Emk,Term7	; Есть ли место в накопителе?
    LINK		Nak,FIFO		;Если да, поместить
    сообщение в накопитель
    Term7	TEST E 	P1,1,Term6	; Сообщение потока 1 или потока 2 было потеряно?
    Term5	TERMINATE	; Счет потерянных сообщений потока 1
    Term6	TERMINATE	; Счет потерянных сообщений потока 2
    ; Сегмент имитации работы Resk
    KRes		GATE NU	ResK,Spis	; Свободен ли Resk? Нет, сообщение в накопитель
    			TEST E		Kont,1,Prov1	; Включить ResK
    ADVANCE		T5			; Включение Resk
    SAVEVALUE	Kont,0	
    Prov1	SEIZE		ResK		; Занять Resk
    ADVANCE	(Exponential(12,0,T6)); Передача
    RELEASE		ResK		; Освободить Resk
    GATE FNV	OsnK,Prov2	; Доступен ли OsnK?
    UNLINK	Nak,Prov1,1		; Если нет, из буфера
    сообщение на Resk
    Prov2	TEST E	P1,1,Term4	; Сообщение потока 1 или 2 передано по ResK?
    Term3	TERMINATE	; Счет переданных сообщений потока 1
    Term4	TERMINATE	; Счет переданных сообщений потока 2
    ; Сегмент имитации выхода из строя OsnK
    			GENERATE	,,,1
    Term8	ADVANCE		(Exponential(12,0,T4)); Расчет времени до следующего отказа
    			FUNAVAIL	OsnK			; Выход из строя OsnK
    			SAVEVALUE	Kont,1
    ASSIGN		1,(Exponential(12,0,T7)); Расчет
    времени восстановления OsnK
    ADVANCE		P1		; Имитация восстановления OsnK
    SAVEVALUE	VrOtk+,P1		; Учет времени восстановления OsnK
    FAVAIL	OsnK		; OsnK в доступное состояние
    UNLINK	Nak,Prov3,1	; Сообщение на OsnK
    			TRANSFER	,Term8
    ; Сегмент задания времени моделирования
    ; и вычисления результатов моделирования
    			GENERATE	VrMod
    			TEST L	X$Prog,TG1,Met3
    			SAVEVALUE	Prog,TG1
    Met3		TEST E	TG1,1,Met4	
    SAVEVALUE	Ver1,V$Ver1		; Вероятность передачи
    сообщений потока 1
    			SAVEVALUE	Ver2,V$Ver2		; Вероятность передачи сообщений потока 2
    			SAVEVALUE	Ver,V$Ver			; Вероятность передачи сообщений направлением связи
    			SAVEVALUE	VOtk,(1-V$Ver)		; Вероятность отказа в передаче сообщений
    			SAVEVALUE	VerOtk,((AC1-X$VrOtk)/AC1)	; Вероятность безотказной работы OsnK
    Met4		TERMINATE	1
    			START	10000

    Для определения вероятности безотказной работы суммируется в ячейке X$VrOtk время отказов направления связи, которое затем вычитается из абсолютного модельного времени AC1, а полученная разность делится на AC1.

    Модель направления связи в AnyLogic

    Направление связи представляет собой систему массового обслуживания разомкнутого типа с ожиданием и с отказами из-за ограниченной ёмкости входного буфера. А также с выходами из строя (временного не функционирования и восстановления) основного канала.

    Поскольку методика построения модели в AnyLogic существенным образом отличается от методики построения в GPSS World, выделим в модели функционирования направления связи следующие сегменты:

  • исходные данные;
  • источники сообщений;
  • буфер, основной и резервный каналы связи;
  • имитатор отказов основного канала;
  • результаты моделирования.
  • Исходные данные

    Для ввода исходных данных используем элементы Параметр.

  • Выполните команду Файл/Создать/Модель на панели инструментов.
  • В поле Имя модели диалогового окна Новая модель введите Направление связи. Выберите каталог, в котором будут сохранены файлы модели. Щёлкните кнопку Готово.
  • Полагаем вначале, что все сегменты модели мы сможем разместить так, что они будут видны в ходе работы модели. В Палитре выделите Презентация.
  • Перетащите элемент Скругленный прямоугольник для размещения элементов исходных данных.
  • На странице Местоположение и размер панели Свойства: введите: X: 630, Y: 20, Ширина: 320, Высота: 280.
  • Перетащите элемент text и на странице Текст панели Свойства вместо text введите Исходные данные.
  • В Палитре выделите Основная. Перетащите элементы Параметр на элемент с именем Исходные данные. Разместите их и дайте имена так, как показано на Рис. 3.1. Значения свойств установите согласно Табл. 3.1.
  • Замечание. В данной модели (а это возможно и в любых других моделях) все идентификаторы на русском языке. (рис 3.1) Размещение элементов для ввода исходных данных
    Параметр
    ИмяТипЗначение по умолчанию
    интер_сообщ_потока1double180
    интер_сообщ_потока2double240
    ёмкость_буфераint5
    время_передачи_осн_канdouble120
    время_передачи_рез_канdouble180
    время_вкл_рез_канdouble10
    время_нараб_отказ_осн_канdouble900
    время_восстан_осн_канdouble120

    Вывод результатов моделирования

    Для вывода результатов моделирования используем элемент Переменная.

  • В Палитре выделите Презентация. Перетащите элемент Скругленный прямоугольник для размещения элементов Переменная.
  • На странице Местоположение и размер панели Свойства: введите: X: 470, Y: 330, Ширина: 490, Высота: 320.
  • Перетащите элемент text и на странице Текст панели Свойства вместо text введите Результаты моделирования.
  • В Палитре выделите Основная. Перетащите элементы Переменная. Разместите их и дайте им имена так, как показано на Рис. 3.2. Тип всех переменных double, кроме переменной - текущая ёмкость буфера. Её тип - int.
  • Построение событийной части модели

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

  • В Палитре выделите Презентация. Перетащите три элемента Прямоугольник и разместите так, как на Рис. 3.3.
  • На странице Местоположение и размер панели Свойства: для размещения объектов имитации источников сообщений введите: X: 20, Y: 20, Ширина: 150, Высота: 190. (рис 3.2) Размещение элементов для вывода результатов моделирования (рис 3.3) Элементы для размещения сегментов событийной части
  • Для размещения объектов имитации буфера, основного и резервного каналов введите: X: 190, Y: 20, Ширина: 370, Высота: 200.
  • Для размещения объектов имитации отказов основного канала введите: X: 20, Y: 350, Ширина: 380, Высота: 130.
  • Перетащите также три элемента text и на странице Текст панели Свойства вместо text каждого элемента введите названия, показанные на Рис. 3.3.
  • Источники сообщений

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

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

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

  • В Палитре выделите Библиотеку моделирования процессов.
  • Перетащите на диаграмму Main и разместите в прямоугольнике с именем Буфер, основной и резервный каналы объекты, показанные на Рис. 3.4. Соедините их между собой, а также с объектами сегмента Источники сообщений.
    Свойства объектов source
    ИмяСвойстваЗначения
    Поток_1Отображать имяУстановите флажок
    Тип заявкиMessage
    Прибывают согласноВремени между прибытиями
    Время между прибытиямиexponential(1/интер_сообщ_потока1)
    Новая заявкаMessage
    Действия при выходе: entity.numPotok = 1;
    поступило_сообщ_потока1 ++;
    всего_сообщ_поступило ++;
    Поток_2Отображать имяУстановите флажок
    Тип заявкиMessage
    Прибывают согласноВремени между прибытиями
    Время между прибытиямиexponential(1/интер_сообщ_потока2)
    Новая заявкаMessage
    Действия при выходе: entity.numPotok = 2;
    поступило_сообщ_потока2 ++;
    всего_сообщ_поступило ++;
  • Объект source вам известен. Объект hold из Библиотеки моделирования процессов нет. Он блокирует/разблокировывает поток заявок на определенном участке блок-схемы. Если объект находится в заблокированном состоянии, то заявки не будут поступать на его входной порт, и будут ждать, пока объект не будет разблокирован.
  • Состоянием объекта можно управлять программно с помощью метода setBlocked(). Метод блокирует входной порт, если в качестве значения аргумента передано true, и разблокировывает его при передаче аргумента false.
  • Метод isBlocked() возвращает true, если входной порт заблокирован. Если порт не заблокирован - возвращает false. Мы в дальнейшем воспользуемся этими методами. (рис 3.4) Объекты двух сегментов модели
  • Последовательно выделите объекты и установите им свойства согласно Табл. 3.4.
  • СвойстваЗначение
    ИмяБуфер
    Отображать имяУстановить флажок
    Тип заявкиMessage
    Вместимостьёмкость_буфера
    Действия При входе:текущая_ёмкость_буфера=буфер.size();
    Действия При выходе:текущая_ёмкость_буфера=буфер.size();
    Разрешить вытеснениеУстановить флажок
    Имяhold1
    Отображать имяУстановить флажок
    Тип заявкиMessage
    Изначально заблокированУстановить флажок
    Имяhold
    Тип заявкиMessage
    Имяпотер_сообщ_буфер
    Отображать имяУстановить флажок
    Тип заявкиMessage
    Действия При входе:if (entity.numPotok == 1)
    потеряно_сообщ_потока1 ++;
    if (entity.numPotok == 2)
    потеряно_сообщ_потока2 ++;
    всего_потеряно_сообщ ++;
    Имяосновной_канал
    Отображать имяУстановить флажок
    Тип заявкиMessage
    ТипОпределённое время
    Время задержкиexponential(1/время_передачи_осн_кан)
    Вместимость1
    Включить сбор статистикиУстановить флажок
    Имярезерв_канал
    Отображать имяУстановить флажок
    Тип заявкиMessage
    Вместимость1
    ТипОпределённое время
    Время задержкиexponential(1/время_передачи_рез_кан)
    Действия При входе:if (а==0)
    в = время_передачи_рез_кан;
    if (а==1)
    {в = время_передачи_рез_кан +
    время_вкл_рез_кан;
    а=0;}
    Действия При выходе:if (hold.isBlocked()== true)
    Включить сбор hold1.setBlocked(false);
    статистикиУстановить флажок
    Имяsink
    Отображать имяУстановить флажок
    Тип заявкиMessage
    Действие при входеif (entity.numPotok == 1)
    {передано_сообщ_потока1 ++;
    вероятность_передачи_сообщ_потока1 = передано_сообщ_потока1 /поступило_сообщ_потока1;}
    if (entity.numPotok == 2)
    {передано_сообщ_потока2 ++;
    вероятность_передачи_сообщ_потока2 = передано_сообщ_потока2 /поступило_сообщ_потока2;}
    всего_передано_сообщ ++;
    вероятность_передачи_сообщ =
    всего_передано_сообщ
    /всего_сообщ_поступило;
    вероятность_потери_сообщ = 1-
    вероятность_передачи_сообщ;

    Имитатор отказов основного канала связи

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

    Сегмент построен из объектов и элементов, показанных на Рис. 3.5. Идея его работы заключается в следующем. Генератор вырабатывает одну заявку, и становится неактивным. Заявка поступает на объект задержки, разыгрывающий время до очередного отказа. После этого заявка поступает на второй объект задержки, имитирующий время восстановления основного канала.

    C выхода второго объекта задержки заявка поступает опять на вход первого объекта задержки. Процесс имитации отказов повторяется в цикле.

    Аналогичным образом построен сегмент имитации отказов основного канала и в GPSS-модели (см. п. 3.2).

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

    Постройте сегмент имитации отказов основного канала связи.

  • Перетащите из Библиотеки моделирования процессов source и два объекта delay, соедините их как на Рис. 3.5.
  • Последовательно выделите и установите свойства объектов согласно Табл. 3.5.
  • (рис 3.5) Сегмент имитации отказов основного канала связи
    СвойстваЗначение
    Имяsource
    Отображать имяУстановить флажок
    Тип заявкиAgent
    Прибывают согласноИнтенсивности
    Интенсивность прибытия1
    Ограниченное количество прибытийУстановить флажок
    Количество заявок, прибывающих за один раз1
    Имярозыгрыш_инт_до_отказа
    Отображать имяУстановить флажок
    Тип заявкиAgent
    ТипОпределённое время
    Время задержкиexponential (1/время_нараб_отказ_осн_кан)
    Вместимость1
    Действия При выходе:hold.setBlocked(true);
    if (основной_канал.size()!=0)
    {основной_канал.remove((Message)
    основной_канал.get(0));
    всего_потеряно_сообщ ++;}
    hold1.setBlocked(false);
    а=1;
    Включить сбор статистикиУстановить флажок
    Имяимитация_восст_осн_кан
    Тип заявкиAgent
    ТипОпределённое время
    Время задержкиexponential (1/время_нараб_отказ_осн_кан)
    Вместимость1
    Действия При выходе:hold.setBlocked(false);
    hold1.setBlocked(true);
    Включить сбор статистикиУстановить флажок

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

    Также организовано и в GPSS-модели, но для этого использована сохраняемая ячейка Kont (см. п. 3.2).

    В модели AnyLogic после занятия сообщением резервного канала элемент hold1 блокируется. Может быть так, что в процессе передачи сообщения резервным каналом возобновит работу основной канал, то есть элемент hold будет разблокирован, и сообщения пойдут на основной канал. Чтобы такая ситуация учитывалась и в GPSS-модели, в нее добавлена команда

    UNLINK	Nak,Prov3,1

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

    Отладка модели

    Запустите только что созданную модель Направление_связи.

    После запуска, если вы все рекомендации выполнили корректно, сразу появится сообщение об ошибке (Рис. 3.6). Согласно ему к выходному порту корневого объекта буфер.out подключены два входных порта корневых объектов hold1.in и hold.in.

    Разрешается соединять несколько выходных портов с одним входным и наоборот. Что мы и сделали (см. Рис. 3.4).

    Если несколько выходных портов соединены с одним входным портом, и сразу несколько объектов хотят передать заявку, выбор будет произведен "справедливым" образом, согласно циклическому (round-robin) алгоритму, реализованному во входном порте.

    (рис 3.6) Сообщение об ошибке подключения портов

    Если один выходной порт соединен с несколькими входными портами, и сразу несколько портов готовы принять заявку, то тот порт, куда она будет переслана, будет выбираться согласно определенному порядку. Этот выбор будет зависеть от того, как исполняющий модуль AnyLogic обрабатывает одновременные события. Таким образом, полной гарантии того, что этот выбор будет справедливым, нет. Рекомендуется не использовать такие соединения, а лучше пользоваться объектом SelectOutput или механизмом сложной маршрутизации, чтобы иметь полный контроль над распределением заявок.

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

  • Удалите соединения выходного порта объекта буфер с входными портами объектов hold1 и hold.
  • Перетащите объект selectOutput и соедините его входной порт с выходным портом объекта буфер, а выходные порты - с входными портами объектов hold1 и hold (Рис. 3.7).
  • Полагаем, что выходной порт true объекта selectOutput выбирается по условию, когда объект hold не заблокирован, то есть hold.isBlocked().
  • Замените Тип заявки: Agent на тип заявки Message.
  • Установите Выход true выбирается: При выполнении условия.
  • В поле Условие: введите hold.isBlocked().
  • Запустите модель. (рис 3.7) Для соединения портов использован объект selectOutput
  • В результате моделирования получили вероятность_передачи_сообщ = 0,568, коэф_использ_кан = 0,690, в том числе коэф_использ_осн_кан = 0,614.
  • Корректен ли полученный результат? Нужно проверить. Как это сделать? Применим способ, суть которого заключается в следующем: два канала, один из которых резервный, должны иметь большую вероятность пропускной способности, чем один основной канал, также выходящий из строя, как и при резервировании. Если это не так, то модель построена некорректно.
  • Удалите объекты selectOutput, hold1, резерв_канал и соединения между ними.
  • Соедините выходной порт объекта буфер с входным портом объекта hold.
  • Запустите модель. Появится сообщение об ошибке. Щёлкните Отменить. Увидите две ошибки:
    Невоможно разрешить hold1 
    Невоможно разрешить hold1
  • Дважды щёлкните по первой ошибке. В открывшемся окне удалите код с hold1.
  • Дважды щёлкните по второй ошибке. В открывшемся окне также удалите код с hold1.
  • Запустите модель. Получите результат моделирования: вероятность_передачи_сообщ = 0,691, то есть больше, чем с резервированием. При этом коэф_использ_осн_кан = 0,805, то есть также больше. Делаем вывод, что модель работает неверно.
  • Продолжим корректировку модели. Возвратимся к исходному варианту построения модели (см. Рис. 3.7). Для этого используем команду Правка. Последовательно щёлкая мышью, возвращаемся к построению модели с резервным каналом.
  • Попробуем обойтись без объектов hold. Удалите объекты hold и hold1 и их соединения с выходами объекта selectOutput.
  • Соедините выходы объекта selectOutput со входами объектов основ_канал и резерв_канал (Рис. 3.8).
  • Из палитры Основная перетащите элемент Переменная. Дайте имя основной_канал_работает. Тип: boolean. Начальное значение: true.
  • Выделите selectOutput. Замените Тип заявки: Agent на тип заявки Message. Установите Выход true выбирается: При выполнении условия. (рис 3.8) Вариант модели без объектов hold
  • В поле Условие: введите основной_канал_работает.
  • Выделите объект розыгрыш_инт_до_отказа. В поле Действия При выходе: замените имеющийся там код следующим:
    основной_канал_работает = false;
    if (основной_канал.size()!=0){
    Message m = основной_канал.get(0);
    основной_канал.stopDelayForAll();
    всего_потеряно_сообщ ++;
    
    всего_передано_сообщ--;
    
    if (m.numPotok == 1){
    передано_сообщ_потока1--;
    }
    if (m.numPotok == 2){
    передано_сообщ_потока2--;
    }
    }
    а=1;

    Код после первого if выполняется тогда, когда в объекте основной_канал находится сообщение. В коде функция stopDelayForAll() останавливает задержку для всех заявок, которые в этот момент задерживаются объектом основной_канал. В нашей модели это может быть только одно сообщение. Поэтому увеличивается количество потерянных сообщений на одно сообщение. Также уменьшается на одно количество переданных сообщений в целом направлением связи и по потокам.

  • Выделите объект имитация_восст_осн_кан. В поле Действия При выходе: замените код следующим кодом:
    основной_канал_работает = true;
    коэф_безотк_раб_осн_кан=
    1-имитация_восст_осн_кан.statsUtilization.mean();
  • Выделите объект резерв_канал. В поле Действия При выходе: оставьте следующий код:
    коэф_использ_резерв_кан=
    резерв_канал.statsUtilization.mean()
  • Запустите модель. Результаты моделирования приведены на Рис. 3.9. Видим, что вероятность передачи сообщений 0,773 > 0,568. При этом суммарный коэффициент использования обеих каналов равен 1,003, что свидетельствует о параллельной работе каналов в некоторые моменты времени. Забегая вперёд заметим, что близкие к этим результаты получены и в GPSS World. И точно такие же в AnyLogic 6 при построении модели с использованием объектов hold (см. Рис. 3.4). Теперь можно перейти к проведению экспериментов и интерпретации полученных результатов.
  • (рис 3.9) Результаты моделирования

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

    Проведите моделирование и сравните полученные результаты. Результаты наших экспериментов приведены в Табл. 3.6.

    Всего выполнено 8 экспериментов. Здесь, напомним, как и в главе 2, первый эксперимент соответствует постановке задачи. В каждом следующем эксперименте параметры, установленные в предыдущем эксперименте, либо остаются неизменными, либо изменяются. Указываются только новые значения параметров в строке, предшествующей результатам следующего эксперимента. Например, во втором эксперименте увеличена ёмкость входного буфера с 5 до 10 сообщений, а остальные параметры остались неизменными (Табл. 3.6).

    Для получения результатов моделирования с точностью $$\varepsilon = 0,01$$ и доверительной вероятностью $$\alpha = 0,95$$ в GPSS World необходимо выполнить 9604 прогонов модели. В каждом эксперименте выполнялось 10000 прогонов.

    Время моделирования в AnyLogic было увеличено в 10 000 раз и составляло 72 000 000 единиц модельного времени. Следует заметить, что если в GPSS World выполнить с этим же модельным временем один прогон, то результаты получаются такими же, что и при 10 000 прогонов модели.

    Согласно данным Табл. 3.6 во втором, третьем и шестом экспериментах экспериментах вероятность передачи сообщений отличается на 0,002 … 0,004. В остальных экспериментах вероятности передачи сообщений, полученные в GPSS World и AnyLogic7, отличаются на 0,017 … 0,029, то есть на порядок больше.

    По результатам экспериментов можно сделать вывод о чувствительности модели к изменению параметров направления связи. Например, при увеличении ёмкости входного буфера с 5 до 10 сообщений вероятность передачи возрастает с 0,773 (0,752) до 0,831 (0,829).Уменьшение интервалов (увеличение интенсивности) поступления сообщений потоков 1 и 2 в два раза (90 и 120) снижает вероятности передачи сообщений с 0,831 (0,829) до 0,456 (0,438). В тоже время повышение скорости передачи основного канала в два раза (60) и увеличение не менее чем в 5 раз времени наработки на отказ основного канала приводит к возрастанию вероятностей передачи сообщений с 0,456 (0,438) до 0,815 (0,844).

    Машинное время выполнения модели в обеих системах составляет 5…7 сек (в AnyLogic7 в виртуальном режиме).

    Показатели функционирования направления связи
    ПоказателиGPSS WorldAnyLogic6AnyLogic7
    1) объем_буфера = 5
    вероятность_передачи_сообщ0,7520,7730,773
    вероятность_передачи_сообщ_потока10,7520,7720,771
    вероятность_передачи_сообщ_потока20,7530,7730,774
    $$\Delta_{1}$$ вероятности_передачи_сообщ$$\Delta_{1}$$ = 0,021
    вероятность_потери_сообщ0,2480,2270,227
    коэф_использ_осн_кан0,7770,7570,718
    коэф_использ_рез_кан0,1520,2220,286
    сум_коэф_использ_кан0,9290,9791,003
    2) объем_буфера = 10
    вероятность_передачи_сообщ0,8290,8610,831
    вероятность_передачи_сообщ_потока10,8290,8610,832
    вероятность_передачи_сообщ_потока20,8290,8620,831
    $$\Delta_{2}$$ вероятности_передачи_сообщ$$\Delta_{2}$$ =0,002
    вероятность_потери_сообщ0,1710,1390,169
    коэф_использ_осн_кан0,8610,8410,756
    коэф_использ_рез_кан0,1570,250,327
    сум_коэф_использ_кан1,0181,0911,084
    3) интер_сообщ_потока1 = 90, интер_сообщ_потока2 = 120
    вероятность_передачи_сообщ0,4380,4540,456
    вероятность_передачи_сообщ_потока10,4380,4540,456
    вероятность_передачи_сообщ_потока20,4380,4530,456
    $$\Delta_{3}$$ вероятности_передачи_сообщ$$\Delta_{3}$$ = 0,002
    вероятность_потери_сообщ0,5620,5460,544
    коэф_использ_осн_кан0,8820,8820,808
    коэф_использ_рез_кан0,2090,2660,393
    сум_коэф_использ_кан1,0911,1481,201
    4) время_передачи_осн_кан = 60, время_нараб_отказ_осн_кан = 5000
    вероятность_передачи_сообщ0,8440,8480,815
    вероятность_передачи_сообщ_потока10,8440,8480,815
    вероятность_передачи_сообщ_потока20,8450,8480,815
    $$\Delta_{4}$$ вероятности_передачи_сообщ$$\Delta_{4}$$ = 0,029
    вероятность_потери_сообщ0,1560,1520,185
    коэф_использ_осн_кан0,9710,970,922
    коэф_использ_рез_кан0,0430,0580,088
    сум_коэф_использ_кан1,0141,0281,01
    5) время_передачи_рез_кан = 90, время_восстан_осн_кан = 60
    вероятность_передачи_сообщ0,8510,8570,834
    вероятность_передачи_сообщ_потока10,8510,8570,833
    вероятность_передачи_сообщ_потока20,8510,8570,835
    $$\Delta_{5}$$ вероятности_передачи_сообщ$$\Delta_{5}$$ = 0,017
    вероятность_потери_сообщ0,1490,1430,166
    коэф_использ_осн_кан0,9820,980,945
    коэф_использ_рез_кан0,0170,0290,043
    сум_коэф_использ_кан0,9991,0090,988
    6) интер_сообщ_потока1 = 45, интер_сообщ_потока2 = 60
    вероятность_передачи_сообщ0,430,4320,434
    вероятность_передачи_сообщ_потока10,4310,4320,434
    вероятность_передачи_сообщ_потока20,4290,4310,434
    $$\Delta_{6}$$ вероятности_передачи_сообщ$$\Delta_{6}$$ = 0,004
    вероятность_потери_сообщ0,570,5680,566
    коэф_использ_осн_кан0,9880,9880,98
    коэф_использ_рез_кан0,0240,0290,048
    сум_коэф_использ_кан1,0121,0171,028
    7) время_передачи_осн_кан = 30, время_передачи_рез_кан = 45
    вероятность_передачи_сообщ0,850,8530,832
    вероятность_передачи_сообщ_потока10,8510,8530,831
    вероятность_передачи_сообщ_потока20,850,8530,832
    $$\Delta_{7}$$ вероятности_передачи_сообщ$$\Delta_{7}$$ = 0,018
    вероятность_потери_сообщ0,150,1470,168
    коэф_использ_осн_кан0,9820,9820,952
    коэф_использ_рез_кан0,0150,0210,028
    сум_коэф_использ_кан0,9971,0030,98
    8) время_вкл_рез_кан = 1, время_восстан_осн_кан = 30
    вероятность_передачи_сообщ0,8510,8550,833
    вероятность_передачи_сообщ_потока10,8510,8550,833
    вероятность_передачи_сообщ_потока20,8510,8550,832
    $$\Delta_{8}$$ вероятности_передачи_сообщ$$\Delta_{8}$$ = 0,018
    вероятность_потери_сообщ0,1490,1450,167
    коэф_использ_осн_кан0,9880,9870,957
    коэф_использ_рез_кан0,0080,0150,021
    сум_коэф_использ_кан0,9961,0020,978
    Страницы:

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

    Направление связи состоит из двух каналов (основного и резервного) и общего входного буфера емкостью на Еmk сообщений.

    На направление поступают два потока сообщений с экспоненциально распределенными интервалами времени, средние значения которых Т1 = 3 мин и Т2 = 4 мин. При нормальной работе сообщения передаются по основному каналу. Время передачи одного сообщения распределено по экспоненциальному закону со средним значением Т3 = 2 мин.

    В основном канале происходят сбои через интервалы времени, распределенные по экспоненциальному закону со средним значением Т4 = 15 мин. Если сбой происходит во время передачи, то сообщение теряется. За время Т5 = 5 с запускается резервный канал, который передает сообщения, начиная с очередного. Время передачи одного сообщения распределено по экспоненциальному закону со средним значением Т6 = 3 мин.

    Основной канал восстанавливается. Время восстановления канала подчинено экспоненциальному закону со средним значением Т7 = 2 мин. После восстановления резервный канал выключается и основной канал продолжает работу с очередного сообщения.

    Необходимо разработать имитационную модель и провести исследование функционирования направления связи в течение 2 ч.

    Определить:

  • рациональную емкость накопителя;
  • загрузку основного и резервного каналов связи;
  • вероятности передачи сообщений потока 1 и потока 2;
  • вероятность передачи сообщений направлением связи в целом.
  • Модель направления связи в GPSS World

    В модели сообщения следует представлять транзактами, основной и резервный канал - одноканальными устройствами (ОКУ), входной буфер (накопитель) - списком пользователя. В списке пользователя следует использовать дисциплину обслуживания FIFO.

    Для ввода исходных данных целесообразно использовать переменные пользователя. В этом случае можно проводить при необходимости встроенными средствами GPSS World дисперсионный и оптимизирующий эксперименты.

    Так как сообщения имеют одинаковые приоритеты, то для моделирования ОКУ нужно использовать блоки SEIZE и RELEASE. Моделирование отказов основного канала нужно произвести блоками FUNAVAIL и FAVAIL, а не блоками PREEMPT и RETURN в режиме абсолютного захвата. Тогда статистика ОКУ не будет искажена.

    Введем масштабирование: 1 единица модельного времени соответствует 1 с, то есть, например, время моделирования равно 2 часам, тогда 2*60*60 = 7200 единиц модельного времени. Аналогично Т1 = 120, Т2 =240 и т.д.

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

  • ввода исходных данных и описания арифметических выражений;
  • имитации сообщений потока 1;
  • имитации сообщений потока 2;
  • имитации работы буфера и основного канала;
  • имитации работы резервного канала;
  • имитации выхода из строя основного канала;
  • задания времени моделирования и вычисления результатов моделирования.
  • Ниже приводится программа модели.

    ; Модель функционирования направления связи
    ;Задание исходных данных
    Emk		EQU	5		; Емкость накопителя
    VrMod	EQU	7200	; Время моделирования
    T1			EQU	180	; Среднее время поступления сообщений потока 1
    T2			EQU	240	; Среднее время поступления сообщений потока 2
    T3			EQU	120	; Среднее время передачи по OsnK
    T4			EQU	900	; Средний интервал времени выхода из строя OsnK
    T5			EQU	10		; Время включения Resk
    T6			EQU	180	; Среднее время передачи по ResK
    T7			EQU	120	; Среднее время восстановления OsnK
    ; Описание арифметических выражений
    ;	Вероятность передачи сообщений потока 1
    Ver1		VARIABLE	(N$Term1+N$Term3)/N$Soob1
    ;	Вероятность передачи сообщений потока 2
    Ver2		VARIABLE	(N$Term2+N$Term4)/N$Soob2
    ;	Вероятность передачи сообщений потоков 1 и 2
    Ver		VARIABLE	(V$Ver1+V$Ver2)/2
    ; Сегмент имитации сообщений потока 1
    GENERATE	(Exponential(12,0,T1))		; Генератор сообщений потока 1
    Soob1	ASSIGN	1,1	; Код 1 в P1 - сообщения потока 1
    TRANSFER	,Nakop		; Направить на OsnK
    ; Сегмент имитации сообщений потока 2
    GENERATE	(Exponential(15,0,T2))	; Генератор
    сообщений потока 2
    Soob2	ASSIGN	1,2	; Код 2 в P1 - сообщения потока 2
    ; Сегмент имитации работы накопителя и OsnK
    Nakop	GATE FV 	OsnK,KRes		;Доступен ли OsnK? Если нет, на Resk
    GATE NU 	OsnK,Spis		;Свободен ли OsnK? Если
    нет, в накопитель
    Prov3	SEIZE		OsnK			; Занять OsnK
    ADVANCE	(Exponential(11,0,T3))	; Обслуживание
    RELEASE		OsnK			; Освободить OsnK
    UNLINK	Nak,Prov3,1	; Вывод из накопителя 
    одного транзакта на OsnK
    TEST E	P1,1,Term2	; Сообщение потока 1 или 
    потока 2 передано по OsnK?
    Term1	TERMINATE			; Счет переданных сообщений потока 1 по OsnK
    Term2	TERMINATE			; Счет переданных сообщений потока 2 по OsnK
    ;	Список пользователя Nak
    Spis		TEST L	CH$Nak,Emk,Term7	; Есть ли место в накопителе?
    LINK		Nak,FIFO		;Если да, поместить
    сообщение в накопитель
    Term7	TEST E 	P1,1,Term6	; Сообщение потока 1 или потока 2 было потеряно?
    Term5	TERMINATE	; Счет потерянных сообщений потока 1
    Term6	TERMINATE	; Счет потерянных сообщений потока 2
    ; Сегмент имитации работы Resk
    KRes		GATE NU	ResK,Spis	; Свободен ли Resk? Нет, сообщение в накопитель
    			TEST E		Kont,1,Prov1	; Включить ResK
    ADVANCE		T5			; Включение Resk
    SAVEVALUE	Kont,0	
    Prov1	SEIZE		ResK		; Занять Resk
    ADVANCE	(Exponential(12,0,T6)); Передача
    RELEASE		ResK		; Освободить Resk
    GATE FNV	OsnK,Prov2	; Доступен ли OsnK?
    UNLINK	Nak,Prov1,1		; Если нет, из буфера
    сообщение на Resk
    Prov2	TEST E	P1,1,Term4	; Сообщение потока 1 или 2 передано по ResK?
    Term3	TERMINATE	; Счет переданных сообщений потока 1
    Term4	TERMINATE	; Счет переданных сообщений потока 2
    ; Сегмент имитации выхода из строя OsnK
    			GENERATE	,,,1
    Term8	ADVANCE		(Exponential(12,0,T4)); Расчет времени до следующего отказа
    			FUNAVAIL	OsnK			; Выход из строя OsnK
    			SAVEVALUE	Kont,1
    ASSIGN		1,(Exponential(12,0,T7)); Расчет
    времени восстановления OsnK
    ADVANCE		P1		; Имитация восстановления OsnK
    SAVEVALUE	VrOtk+,P1		; Учет времени восстановления OsnK
    FAVAIL	OsnK		; OsnK в доступное состояние
    UNLINK	Nak,Prov3,1	; Сообщение на OsnK
    			TRANSFER	,Term8
    ; Сегмент задания времени моделирования
    ; и вычисления результатов моделирования
    			GENERATE	VrMod
    			TEST L	X$Prog,TG1,Met3
    			SAVEVALUE	Prog,TG1
    Met3		TEST E	TG1,1,Met4	
    SAVEVALUE	Ver1,V$Ver1		; Вероятность передачи
    сообщений потока 1
    			SAVEVALUE	Ver2,V$Ver2		; Вероятность передачи сообщений потока 2
    			SAVEVALUE	Ver,V$Ver			; Вероятность передачи сообщений направлением связи
    			SAVEVALUE	VOtk,(1-V$Ver)		; Вероятность отказа в передаче сообщений
    			SAVEVALUE	VerOtk,((AC1-X$VrOtk)/AC1)	; Вероятность безотказной работы OsnK
    Met4		TERMINATE	1
    			START	10000

    Для определения вероятности безотказной работы суммируется в ячейке X$VrOtk время отказов направления связи, которое затем вычитается из абсолютного модельного времени AC1, а полученная разность делится на AC1.

    Модель направления связи в AnyLogic

    Направление связи представляет собой систему массового обслуживания разомкнутого типа с ожиданием и с отказами из-за ограниченной ёмкости входного буфера. А также с выходами из строя (временного не функционирования и восстановления) основного канала.

    Поскольку методика построения модели в AnyLogic существенным образом отличается от методики построения в GPSS World, выделим в модели функционирования направления связи следующие сегменты:

  • исходные данные;
  • источники сообщений;
  • буфер, основной и резервный каналы связи;
  • имитатор отказов основного канала;
  • результаты моделирования.
  • Исходные данные

    Для ввода исходных данных используем элементы Параметр.

  • Выполните команду Файл/Создать/Модель на панели инструментов.
  • В поле Имя модели диалогового окна Новая модель введите Направление связи. Выберите каталог, в котором будут сохранены файлы модели. Щёлкните кнопку Готово.
  • Полагаем вначале, что все сегменты модели мы сможем разместить так, что они будут видны в ходе работы модели. В Палитре выделите Презентация.
  • Перетащите элемент Скругленный прямоугольник для размещения элементов исходных данных.
  • На странице Местоположение и размер панели Свойства: введите: X: 630, Y: 20, Ширина: 320, Высота: 280.
  • Перетащите элемент text и на странице Текст панели Свойства вместо text введите Исходные данные.
  • В Палитре выделите Основная. Перетащите элементы Параметр на элемент с именем Исходные данные. Разместите их и дайте имена так, как показано на Рис. 3.1. Значения свойств установите согласно Табл. 3.1.
  • Замечание. В данной модели (а это возможно и в любых других моделях) все идентификаторы на русском языке. (рис 3.1) Размещение элементов для ввода исходных данных
    Параметр
    ИмяТипЗначение по умолчанию
    интер_сообщ_потока1double180
    интер_сообщ_потока2double240
    ёмкость_буфераint5
    время_передачи_осн_канdouble120
    время_передачи_рез_канdouble180
    время_вкл_рез_канdouble10
    время_нараб_отказ_осн_канdouble900
    время_восстан_осн_канdouble120

    Вывод результатов моделирования

    Для вывода результатов моделирования используем элемент Переменная.

  • В Палитре выделите Презентация. Перетащите элемент Скругленный прямоугольник для размещения элементов Переменная.
  • На странице Местоположение и размер панели Свойства: введите: X: 470, Y: 330, Ширина: 490, Высота: 320.
  • Перетащите элемент text и на странице Текст панели Свойства вместо text введите Результаты моделирования.
  • В Палитре выделите Основная. Перетащите элементы Переменная. Разместите их и дайте им имена так, как показано на Рис. 3.2. Тип всех переменных double, кроме переменной - текущая ёмкость буфера. Её тип - int.
  • Построение событийной части модели

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

  • В Палитре выделите Презентация. Перетащите три элемента Прямоугольник и разместите так, как на Рис. 3.3.
  • На странице Местоположение и размер панели Свойства: для размещения объектов имитации источников сообщений введите: X: 20, Y: 20, Ширина: 150, Высота: 190. (рис 3.2) Размещение элементов для вывода результатов моделирования (рис 3.3) Элементы для размещения сегментов событийной части
  • Для размещения объектов имитации буфера, основного и резервного каналов введите: X: 190, Y: 20, Ширина: 370, Высота: 200.
  • Для размещения объектов имитации отказов основного канала введите: X: 20, Y: 350, Ширина: 380, Высота: 130.
  • Перетащите также три элемента text и на странице Текст панели Свойства вместо text каждого элемента введите названия, показанные на Рис. 3.3.
  • Источники сообщений

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

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

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

  • В Палитре выделите Библиотеку моделирования процессов.
  • Перетащите на диаграмму Main и разместите в прямоугольнике с именем Буфер, основной и резервный каналы объекты, показанные на Рис. 3.4. Соедините их между собой, а также с объектами сегмента Источники сообщений.
    Свойства объектов source
    ИмяСвойстваЗначения
    Поток_1Отображать имяУстановите флажок
    Тип заявкиMessage
    Прибывают согласноВремени между прибытиями
    Время между прибытиямиexponential(1/интер_сообщ_потока1)
    Новая заявкаMessage
    Действия при выходе: entity.numPotok = 1;
    поступило_сообщ_потока1 ++;
    всего_сообщ_поступило ++;
    Поток_2Отображать имяУстановите флажок
    Тип заявкиMessage
    Прибывают согласноВремени между прибытиями
    Время между прибытиямиexponential(1/интер_сообщ_потока2)
    Новая заявкаMessage
    Действия при выходе: entity.numPotok = 2;
    поступило_сообщ_потока2 ++;
    всего_сообщ_поступило ++;
  • Объект source вам известен. Объект hold из Библиотеки моделирования процессов нет. Он блокирует/разблокировывает поток заявок на определенном участке блок-схемы. Если объект находится в заблокированном состоянии, то заявки не будут поступать на его входной порт, и будут ждать, пока объект не будет разблокирован.
  • Состоянием объекта можно управлять программно с помощью метода setBlocked(). Метод блокирует входной порт, если в качестве значения аргумента передано true, и разблокировывает его при передаче аргумента false.
  • Метод isBlocked() возвращает true, если входной порт заблокирован. Если порт не заблокирован - возвращает false. Мы в дальнейшем воспользуемся этими методами. (рис 3.4) Объекты двух сегментов модели
  • Последовательно выделите объекты и установите им свойства согласно Табл. 3.4.
  • СвойстваЗначение
    ИмяБуфер
    Отображать имяУстановить флажок
    Тип заявкиMessage
    Вместимостьёмкость_буфера
    Действия При входе:текущая_ёмкость_буфера=буфер.size();
    Действия При выходе:текущая_ёмкость_буфера=буфер.size();
    Разрешить вытеснениеУстановить флажок
    Имяhold1
    Отображать имяУстановить флажок
    Тип заявкиMessage
    Изначально заблокированУстановить флажок
    Имяhold
    Тип заявкиMessage
    Имяпотер_сообщ_буфер
    Отображать имяУстановить флажок
    Тип заявкиMessage
    Действия При входе:if (entity.numPotok == 1)
    потеряно_сообщ_потока1 ++;
    if (entity.numPotok == 2)
    потеряно_сообщ_потока2 ++;
    всего_потеряно_сообщ ++;
    Имяосновной_канал
    Отображать имяУстановить флажок
    Тип заявкиMessage
    ТипОпределённое время
    Время задержкиexponential(1/время_передачи_осн_кан)
    Вместимость1
    Включить сбор статистикиУстановить флажок
    Имярезерв_канал
    Отображать имяУстановить флажок
    Тип заявкиMessage
    Вместимость1
    ТипОпределённое время
    Время задержкиexponential(1/время_передачи_рез_кан)
    Действия При входе:if (а==0)
    в = время_передачи_рез_кан;
    if (а==1)
    {в = время_передачи_рез_кан +
    время_вкл_рез_кан;
    а=0;}
    Действия При выходе:if (hold.isBlocked()== true)
    Включить сбор hold1.setBlocked(false);
    статистикиУстановить флажок
    Имяsink
    Отображать имяУстановить флажок
    Тип заявкиMessage
    Действие при входеif (entity.numPotok == 1)
    {передано_сообщ_потока1 ++;
    вероятность_передачи_сообщ_потока1 = передано_сообщ_потока1 /поступило_сообщ_потока1;}
    if (entity.numPotok == 2)
    {передано_сообщ_потока2 ++;
    вероятность_передачи_сообщ_потока2 = передано_сообщ_потока2 /поступило_сообщ_потока2;}
    всего_передано_сообщ ++;
    вероятность_передачи_сообщ =
    всего_передано_сообщ
    /всего_сообщ_поступило;
    вероятность_потери_сообщ = 1-
    вероятность_передачи_сообщ;

    Имитатор отказов основного канала связи

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

    Сегмент построен из объектов и элементов, показанных на Рис. 3.5. Идея его работы заключается в следующем. Генератор вырабатывает одну заявку, и становится неактивным. Заявка поступает на объект задержки, разыгрывающий время до очередного отказа. После этого заявка поступает на второй объект задержки, имитирующий время восстановления основного канала.

    C выхода второго объекта задержки заявка поступает опять на вход первого объекта задержки. Процесс имитации отказов повторяется в цикле.

    Аналогичным образом построен сегмент имитации отказов основного канала и в GPSS-модели (см. п. 3.2).

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

    Постройте сегмент имитации отказов основного канала связи.

  • Перетащите из Библиотеки моделирования процессов source и два объекта delay, соедините их как на Рис. 3.5.
  • Последовательно выделите и установите свойства объектов согласно Табл. 3.5.
  • (рис 3.5) Сегмент имитации отказов основного канала связи
    СвойстваЗначение
    Имяsource
    Отображать имяУстановить флажок
    Тип заявкиAgent
    Прибывают согласноИнтенсивности
    Интенсивность прибытия1
    Ограниченное количество прибытийУстановить флажок
    Количество заявок, прибывающих за один раз1
    Имярозыгрыш_инт_до_отказа
    Отображать имяУстановить флажок
    Тип заявкиAgent
    ТипОпределённое время
    Время задержкиexponential (1/время_нараб_отказ_осн_кан)
    Вместимость1
    Действия При выходе:hold.setBlocked(true);
    if (основной_канал.size()!=0)
    {основной_канал.remove((Message)
    основной_канал.get(0));
    всего_потеряно_сообщ ++;}
    hold1.setBlocked(false);
    а=1;
    Включить сбор статистикиУстановить флажок
    Имяимитация_восст_осн_кан
    Тип заявкиAgent
    ТипОпределённое время
    Время задержкиexponential (1/время_нараб_отказ_осн_кан)
    Вместимость1
    Действия При выходе:hold.setBlocked(false);
    hold1.setBlocked(true);
    Включить сбор статистикиУстановить флажок

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

    Также организовано и в GPSS-модели, но для этого использована сохраняемая ячейка Kont (см. п. 3.2).

    В модели AnyLogic после занятия сообщением резервного канала элемент hold1 блокируется. Может быть так, что в процессе передачи сообщения резервным каналом возобновит работу основной канал, то есть элемент hold будет разблокирован, и сообщения пойдут на основной канал. Чтобы такая ситуация учитывалась и в GPSS-модели, в нее добавлена команда

    UNLINK	Nak,Prov3,1

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

    Отладка модели

    Запустите только что созданную модель Направление_связи.

    После запуска, если вы все рекомендации выполнили корректно, сразу появится сообщение об ошибке (Рис. 3.6). Согласно ему к выходному порту корневого объекта буфер.out подключены два входных порта корневых объектов hold1.in и hold.in.

    Разрешается соединять несколько выходных портов с одним входным и наоборот. Что мы и сделали (см. Рис. 3.4).

    Если несколько выходных портов соединены с одним входным портом, и сразу несколько объектов хотят передать заявку, выбор будет произведен "справедливым" образом, согласно циклическому (round-robin) алгоритму, реализованному во входном порте.

    (рис 3.6) Сообщение об ошибке подключения портов

    Если один выходной порт соединен с несколькими входными портами, и сразу несколько портов готовы принять заявку, то тот порт, куда она будет переслана, будет выбираться согласно определенному порядку. Этот выбор будет зависеть от того, как исполняющий модуль AnyLogic обрабатывает одновременные события. Таким образом, полной гарантии того, что этот выбор будет справедливым, нет. Рекомендуется не использовать такие соединения, а лучше пользоваться объектом SelectOutput или механизмом сложной маршрутизации, чтобы иметь полный контроль над распределением заявок.

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

  • Удалите соединения выходного порта объекта буфер с входными портами объектов hold1 и hold.
  • Перетащите объект selectOutput и соедините его входной порт с выходным портом объекта буфер, а выходные порты - с входными портами объектов hold1 и hold (Рис. 3.7).
  • Полагаем, что выходной порт true объекта selectOutput выбирается по условию, когда объект hold не заблокирован, то есть hold.isBlocked().
  • Замените Тип заявки: Agent на тип заявки Message.
  • Установите Выход true выбирается: При выполнении условия.
  • В поле Условие: введите hold.isBlocked().
  • Запустите модель. (рис 3.7) Для соединения портов использован объект selectOutput
  • В результате моделирования получили вероятность_передачи_сообщ = 0,568, коэф_использ_кан = 0,690, в том числе коэф_использ_осн_кан = 0,614.
  • Корректен ли полученный результат? Нужно проверить. Как это сделать? Применим способ, суть которого заключается в следующем: два канала, один из которых резервный, должны иметь большую вероятность пропускной способности, чем один основной канал, также выходящий из строя, как и при резервировании. Если это не так, то модель построена некорректно.
  • Удалите объекты selectOutput, hold1, резерв_канал и соединения между ними.
  • Соедините выходной порт объекта буфер с входным портом объекта hold.
  • Запустите модель. Появится сообщение об ошибке. Щёлкните Отменить. Увидите две ошибки:
    Невоможно разрешить hold1 
    Невоможно разрешить hold1
  • Дважды щёлкните по первой ошибке. В открывшемся окне удалите код с hold1.
  • Дважды щёлкните по второй ошибке. В открывшемся окне также удалите код с hold1.
  • Запустите модель. Получите результат моделирования: вероятность_передачи_сообщ = 0,691, то есть больше, чем с резервированием. При этом коэф_использ_осн_кан = 0,805, то есть также больше. Делаем вывод, что модель работает неверно.
  • Продолжим корректировку модели. Возвратимся к исходному варианту построения модели (см. Рис. 3.7). Для этого используем команду Правка. Последовательно щёлкая мышью, возвращаемся к построению модели с резервным каналом.
  • Попробуем обойтись без объектов hold. Удалите объекты hold и hold1 и их соединения с выходами объекта selectOutput.
  • Соедините выходы объекта selectOutput со входами объектов основ_канал и резерв_канал (Рис. 3.8).
  • Из палитры Основная перетащите элемент Переменная. Дайте имя основной_канал_работает. Тип: boolean. Начальное значение: true.
  • Выделите selectOutput. Замените Тип заявки: Agent на тип заявки Message. Установите Выход true выбирается: При выполнении условия. (рис 3.8) Вариант модели без объектов hold
  • В поле Условие: введите основной_канал_работает.
  • Выделите объект розыгрыш_инт_до_отказа. В поле Действия При выходе: замените имеющийся там код следующим:
    основной_канал_работает = false;
    if (основной_канал.size()!=0){
    Message m = основной_канал.get(0);
    основной_канал.stopDelayForAll();
    всего_потеряно_сообщ ++;
    
    всего_передано_сообщ--;
    
    if (m.numPotok == 1){
    передано_сообщ_потока1--;
    }
    if (m.numPotok == 2){
    передано_сообщ_потока2--;
    }
    }
    а=1;

    Код после первого if выполняется тогда, когда в объекте основной_канал находится сообщение. В коде функция stopDelayForAll() останавливает задержку для всех заявок, которые в этот момент задерживаются объектом основной_канал. В нашей модели это может быть только одно сообщение. Поэтому увеличивается количество потерянных сообщений на одно сообщение. Также уменьшается на одно количество переданных сообщений в целом направлением связи и по потокам.

  • Выделите объект имитация_восст_осн_кан. В поле Действия При выходе: замените код следующим кодом:
    основной_канал_работает = true;
    коэф_безотк_раб_осн_кан=
    1-имитация_восст_осн_кан.statsUtilization.mean();
  • Выделите объект резерв_канал. В поле Действия При выходе: оставьте следующий код:
    коэф_использ_резерв_кан=
    резерв_канал.statsUtilization.mean()
  • Запустите модель. Результаты моделирования приведены на Рис. 3.9. Видим, что вероятность передачи сообщений 0,773 > 0,568. При этом суммарный коэффициент использования обеих каналов равен 1,003, что свидетельствует о параллельной работе каналов в некоторые моменты времени. Забегая вперёд заметим, что близкие к этим результаты получены и в GPSS World. И точно такие же в AnyLogic 6 при построении модели с использованием объектов hold (см. Рис. 3.4). Теперь можно перейти к проведению экспериментов и интерпретации полученных результатов.
  • (рис 3.9) Результаты моделирования

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

    Проведите моделирование и сравните полученные результаты. Результаты наших экспериментов приведены в Табл. 3.6.

    Всего выполнено 8 экспериментов. Здесь, напомним, как и в главе 2, первый эксперимент соответствует постановке задачи. В каждом следующем эксперименте параметры, установленные в предыдущем эксперименте, либо остаются неизменными, либо изменяются. Указываются только новые значения параметров в строке, предшествующей результатам следующего эксперимента. Например, во втором эксперименте увеличена ёмкость входного буфера с 5 до 10 сообщений, а остальные параметры остались неизменными (Табл. 3.6).

    Для получения результатов моделирования с точностью $$\varepsilon = 0,01$$ и доверительной вероятностью $$\alpha = 0,95$$ в GPSS World необходимо выполнить 9604 прогонов модели. В каждом эксперименте выполнялось 10000 прогонов.

    Время моделирования в AnyLogic было увеличено в 10 000 раз и составляло 72 000 000 единиц модельного времени. Следует заметить, что если в GPSS World выполнить с этим же модельным временем один прогон, то результаты получаются такими же, что и при 10 000 прогонов модели.

    Согласно данным Табл. 3.6 во втором, третьем и шестом экспериментах экспериментах вероятность передачи сообщений отличается на 0,002 … 0,004. В остальных экспериментах вероятности передачи сообщений, полученные в GPSS World и AnyLogic7, отличаются на 0,017 … 0,029, то есть на порядок больше.

    По результатам экспериментов можно сделать вывод о чувствительности модели к изменению параметров направления связи. Например, при увеличении ёмкости входного буфера с 5 до 10 сообщений вероятность передачи возрастает с 0,773 (0,752) до 0,831 (0,829).Уменьшение интервалов (увеличение интенсивности) поступления сообщений потоков 1 и 2 в два раза (90 и 120) снижает вероятности передачи сообщений с 0,831 (0,829) до 0,456 (0,438). В тоже время повышение скорости передачи основного канала в два раза (60) и увеличение не менее чем в 5 раз времени наработки на отказ основного канала приводит к возрастанию вероятностей передачи сообщений с 0,456 (0,438) до 0,815 (0,844).

    Машинное время выполнения модели в обеих системах составляет 5…7 сек (в AnyLogic7 в виртуальном режиме).

    Показатели функционирования направления связи
    ПоказателиGPSS WorldAnyLogic6AnyLogic7
    1) объем_буфера = 5
    вероятность_передачи_сообщ0,7520,7730,773
    вероятность_передачи_сообщ_потока10,7520,7720,771
    вероятность_передачи_сообщ_потока20,7530,7730,774
    $$\Delta_{1}$$ вероятности_передачи_сообщ$$\Delta_{1}$$ = 0,021
    вероятность_потери_сообщ0,2480,2270,227
    коэф_использ_осн_кан0,7770,7570,718
    коэф_использ_рез_кан0,1520,2220,286
    сум_коэф_использ_кан0,9290,9791,003
    2) объем_буфера = 10
    вероятность_передачи_сообщ0,8290,8610,831
    вероятность_передачи_сообщ_потока10,8290,8610,832
    вероятность_передачи_сообщ_потока20,8290,8620,831
    $$\Delta_{2}$$ вероятности_передачи_сообщ$$\Delta_{2}$$ =0,002
    вероятность_потери_сообщ0,1710,1390,169
    коэф_использ_осн_кан0,8610,8410,756
    коэф_использ_рез_кан0,1570,250,327
    сум_коэф_использ_кан1,0181,0911,084
    3) интер_сообщ_потока1 = 90, интер_сообщ_потока2 = 120
    вероятность_передачи_сообщ0,4380,4540,456
    вероятность_передачи_сообщ_потока10,4380,4540,456
    вероятность_передачи_сообщ_потока20,4380,4530,456
    $$\Delta_{3}$$ вероятности_передачи_сообщ$$\Delta_{3}$$ = 0,002
    вероятность_потери_сообщ0,5620,5460,544
    коэф_использ_осн_кан0,8820,8820,808
    коэф_использ_рез_кан0,2090,2660,393
    сум_коэф_использ_кан1,0911,1481,201
    4) время_передачи_осн_кан = 60, время_нараб_отказ_осн_кан = 5000
    вероятность_передачи_сообщ0,8440,8480,815
    вероятность_передачи_сообщ_потока10,8440,8480,815
    вероятность_передачи_сообщ_потока20,8450,8480,815
    $$\Delta_{4}$$ вероятности_передачи_сообщ$$\Delta_{4}$$ = 0,029
    вероятность_потери_сообщ0,1560,1520,185
    коэф_использ_осн_кан0,9710,970,922
    коэф_использ_рез_кан0,0430,0580,088
    сум_коэф_использ_кан1,0141,0281,01
    5) время_передачи_рез_кан = 90, время_восстан_осн_кан = 60
    вероятность_передачи_сообщ0,8510,8570,834
    вероятность_передачи_сообщ_потока10,8510,8570,833
    вероятность_передачи_сообщ_потока20,8510,8570,835
    $$\Delta_{5}$$ вероятности_передачи_сообщ$$\Delta_{5}$$ = 0,017
    вероятность_потери_сообщ0,1490,1430,166
    коэф_использ_осн_кан0,9820,980,945
    коэф_использ_рез_кан0,0170,0290,043
    сум_коэф_использ_кан0,9991,0090,988
    6) интер_сообщ_потока1 = 45, интер_сообщ_потока2 = 60
    вероятность_передачи_сообщ0,430,4320,434
    вероятность_передачи_сообщ_потока10,4310,4320,434
    вероятность_передачи_сообщ_потока20,4290,4310,434
    $$\Delta_{6}$$ вероятности_передачи_сообщ$$\Delta_{6}$$ = 0,004
    вероятность_потери_сообщ0,570,5680,566
    коэф_использ_осн_кан0,9880,9880,98
    коэф_использ_рез_кан0,0240,0290,048
    сум_коэф_использ_кан1,0121,0171,028
    7) время_передачи_осн_кан = 30, время_передачи_рез_кан = 45
    вероятность_передачи_сообщ0,850,8530,832
    вероятность_передачи_сообщ_потока10,8510,8530,831
    вероятность_передачи_сообщ_потока20,850,8530,832
    $$\Delta_{7}$$ вероятности_передачи_сообщ$$\Delta_{7}$$ = 0,018
    вероятность_потери_сообщ0,150,1470,168
    коэф_использ_осн_кан0,9820,9820,952
    коэф_использ_рез_кан0,0150,0210,028
    сум_коэф_использ_кан0,9971,0030,98
    8) время_вкл_рез_кан = 1, время_восстан_осн_кан = 30
    вероятность_передачи_сообщ0,8510,8550,833
    вероятность_передачи_сообщ_потока10,8510,8550,833
    вероятность_передачи_сообщ_потока20,8510,8550,832
    $$\Delta_{8}$$ вероятности_передачи_сообщ$$\Delta_{8}$$ = 0,018
    вероятность_потери_сообщ0,1490,1450,167
    коэф_использ_осн_кан0,9880,9870,957
    коэф_использ_рез_кан0,0080,0150,021
    сум_коэф_использ_кан0,9961,0020,978
    Вернуться к учебному плану