Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Литература / Compyuternoe_modelirovanie_v_AnyLogic_7_Boev_VD.pdf
Скачиваний:
225
Добавлен:
12.02.2018
Размер:
8.72 Mб
Скачать

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

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

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

UNLINK Nak,Prov3,1

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

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

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

два входных порта корневых объектов hold1.in и hold.in. Разрешается соединять несколько выходных портов с одним

входным и наоборот. Что мы и сделали (см. рис. 3.4).

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

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

107

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

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

SelectOutput.

1.Удалите соединения выходного порта объекта буфер с входными портами объектов hold1 и hold.

2.Перетащите объект selectOutput и соедините его входной порт с выходным портом объекта буфер, а выходные порты — с

входными портами объектов hold1 и hold (рис. 3.7).

3.Полагаем, что выходной порт true объекта selectOutput выбирается по условию, когда объект hold не заблокирован, то есть hold.isBlocked().

4.Замените Тип заявки: Agent на тип заявки Message.

5.Установите Выход true выбирается: При выполнении

условия.

6.В поле Условие: введите hold.isBlocked().

7.Запустите модель.

Рис. 3.7. Для соединения портов использован объект selectOutput

108

8.В результате моделирования получили вероятность_передачи_сообщ = 0,568, коэф_использ_кан = 0,690, в том числе коэф_использ_осн_кан = 0,614.

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

10.Удалите объекты selectOutput, hold1, резерв_канал и со-

единения между ними.

11.Соедините выходной порт объекта буфер с входным портом объекта hold.

12.Запустите модель. Появится сообщение об ошибке. Щёлк-

ните Отменить. Увидите две ошибки:

Невоможно разрешить hold1

Невоможно разрешить hold1

13.Дважды щёлкните по первой ошибке. В открывшемся окне удалите код с hold1.

14.Дважды щёлкните по второй ошибке. В открывшемся окне также удалите код с hold1.

15.Запустите модель. Получите результат моделирования: вероятность_передачи_сообщ = 0,691, то есть больше, чем с резервированием. При этом коэф_использ_осн_кан = 0,805, то есть также больше. Делаем вывод, что модель работает неверно.

16.Продолжим корректировку модели. Возвратимся к исходному варианту построения модели (см. рис. 3.7). Для этого используем команду Правка. Последовательно щёлкая мышью, возвращаемся к построению модели с резервным каналом.

17.Попробуем обойтись без объектов hold. Удалите объекты hold и hold1 и их соединения с выходами объекта selectOutput.

18.Соедините выходы объекта selectOutput со входами объек-

тов основ_канал и резерв_канал (рис. 3.8).

19.Из палитры Основная перетащите элемент Переменная.

Дайте имя основной_канал_работает. Тип: boolean.

Начальное значение: true.

20. Выделите selectOutput. Замените Тип заявки: Agent на тип заявки Message. Установите Выход true выбирается: При вы-

полнении условия.

109

Рис. 3.8. Вариант модели без объектов hold

21.В поле Условие: введите основной_канал_работает.

22.Выделите объект розыгрыш_инт_до_отказа. В поле Дей-

ствия При выходе: замените имеющийся там код следующим:

основной_канал_работает = false; if (основной_канал.size()!=0){

Message m = основной_канал.get(0); основной_канал.stopDelayForAll();

всего_потеряно_сообщ ++;

всего_передано_сообщ--;

if (m.numPotok == 1){

передано_сообщ_потока1--;

}

if (m.numPotok == 2){

передано_сообщ_потока2--;

}

}

а=1;

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

110

23. Выделите объект имитация_восст_осн_кан. В поле Дей-

ствия При выходе: замените код следующим кодом:

основной_канал_работает = true; коэф_безотк_раб_осн_кан=

1-имитация_восст_осн_кан.statsUtilization.mean();

24. Выделите объект резерв_канал. В поле Действия При выходе: оставьте следующий код:

коэф_использ_резерв_кан=

резерв_канал.statsUtilization.mean()

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

Рис. 3.9. Результаты моделирования

111