Коллеги, спасибо за очень информативный и полезный курс. Прошёл три лекции. Столкнулся с проблемой, что обе модели не могут закончить расчёт по причине ограничения бесплатной версии "создано максимально допустимое число динамически создаваемых агентов (50000)". По скриншотам Лекции 2 видно, что да, модель создает гораздо больше 50000 агентов. В принципе, мне то и диплом не особо нужен. Но хотелось бы выполнить практические работы. Нет ли возможности откорректировать эту проблему? Или может я чего не так делаю? Еще раз спасибо за прекрасный курс! |
Модель функционирования сети связи
Событийная часть сегмента Маршрутизатор
Элементы событийной части сегмента Маршрутизатор показаны на Рис. 4.11. Сегмент включает Вычислительный комплекс, Буфер 2, порты входа-выхода, Имитатор отказов вычислительного комплекса.
В свою очередь вычислительный комплекс содержит Блок контроля 1, Буфер 1, Блок обработки сообщений.
Построим событийную часть сегмента Маршрутизатор.
Блок контроля 1
Блок предназначен для контроля текущей емкости буфера 1 маршрутизатора. Он анализирует наличие в буфере 1 свободной памяти, достаточной для хранения поступившего сообщения, и в зависимости от результата анализа сообщение либо помещается в буфер 1, либо уничтожается.
Алгоритм работы Блока контроля 1 представлен на Рис. 4.12.
В AnyLogic этот алгоритм реализуется блоками selectOutput, hold и sink.
- В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
- На странице Местоположение и размер панели Свойства введите в поля: X: 26, Y: 50, Ширина: 154, Высота: 150.
- Перетащите объекты selectOutput, hold и sink на диаграмму типа агента Маршрутизатор, разместите и соедините так, как показано на Рис. 4.11.
- Перетащите элемент text и на странице Текст панели Свойства вместо text введите Блок контроля 1.
- Выделите объект selectOutput.
- В поле Имя: вместо selectOutput введите blokKontrol_1.
- В поле Тип заявки: Agent замените Message.
- Установите Выход true выбирается При выполнении условия.
- В поле Условие введите условие:
(emkostBufer1-tekEmkostBufer1>=entity.dlina)&& (hold.isBlocked()==false)
При выполнении условия заявка направляется на выход T (выходной порт для заявок, для которых выбирается выход true) и на выход F (выходной порт для заявок, для которых выбирается выход false), если условие не выполняется, соответственно.
- Выделите объект sink. В поле Тип заявки: Agent замените Message.
- В поле Действие при входе введите kolPotBK++; для счёта количества сообщений, потерянных при отказе вычислительного комплекса.
- Выделите элемент hold. В поле Тип заявки: Agent замените Message.
Блок Буфер 1
Блок Буфер 1 предназначен для приема, размещения и хранения поступающих на обработку сообщений.
Алгоритм работы блока Буфер 1 приведен на Рис. 4.13.
В AnyLogic алгоритм блока Буфер 1 реализуется объектом queue, который выполняет функции очереди (FIFO).
- В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
- На странице Местоположение и размер панели Свойства введите в поля X: 190, Y: 50, Ширина: 126, Высота: 100.
- На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не ставьте флажок Отображать имя.
- Перетащите элемент text и на странице Текст панели
Свойства вместо text введите Буфер 1.
- Выделите объект queue.
- В поле Имя: вместо queue введите bufer1.
- В поле Тип заявки: Agent замените Message.
- В поле Вместимость введите emkBufer1.
- При помещении сообщения в буфер его текущая емкость увеличивается, поэтому в поле Действия При входе введите:
tekEmkBufer1 += entity.dlina;
- При выходе сообщения из буфера его текущая емкость уменьшается, поэтому в поле Действия При выходе введите:
tekEmkBufer1 -= entity.dlina; entity.timeObr=entity.dlina/proizvod;
- Поставьте флажок Включить сбор статистики.
Блок обработки сообщений
Блок предназначен для имитации обработки сообщений.
Алгоритм работы блока приведен на Рис. 4.14.
Для реализации алгоритма Блока обработки сообщений в AnyLogic используется объект delay.
- В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
- На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Также не устанавливайте флажок Отображать имя.
- На странице Местоположение и размер панели Свойства введите в поля X: 336, Y: 50, Ширина: 194, Высота: 100.
- Перетащите элемент text и на странице Текст панели Свойства вместо text введите название Блок обработки сообщений.
- Перетащите объект delay, разместите и соедините с bufer_1 так, как на Рис. 4.11.
- Выделите объект delay. На странице Основные панели Свойства в поле Имя: вместо delay введите сomputer.
- В поле Тип заявки: Agent замените Message.
- Задержка задаётся установите Определённое время.
- В поле Время задержки введите:
exponential(1/entity.timeObr)
- Оставьте Вместимость 1.
-
Действие при выходе
коэфЗагрВК1=computer.statsUtilization.mean();
- Установите флажок Включить сбор статистики.
- В Палитре выделите Презентация. Перетащите элемент Прямоугольник.
- На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не ставьте флажок Отображать имя.
- На странице Местоположение и размер панели Свойства введите в поля X: 20, Y: 40, Ширина: 520, Высота: 170.
- Перетащите элемент text и на странице Текст панели Свойства вместо слова text введите название Вычислительный комплекс.
Блок контроля 2
Блок контроля 2 предназначен для распределения сообщений по направлениям и контроля текущих ёмкостей буферов (накопителей) направлений передачи сообщений.
Алгоритм работы Блока контроля 2 приведен на Рис. 4.15.
Вначале определяется номер направления, по которому должно быть передано поступившее сообщение. Затем определяется наличие достаточной свободной памяти в буфере этого направления. При отсутствии нужного объёма памяти сообщение теряется.
Для распределения сообщений по направлениям можно было бы использовать объекты selectOutput5 и sink. Однако мы используем другие объекты AnyLogic: exit и enter. Они позволяют организовать сложную маршрутизацию, вследствие чего на Рис. 4.11 Блок контроля 2 не выделен, хотя функционально он существует.
- Перетащите объект exit, вход которого соедините с выходом computer (Рис. 4.10).
- В поле Тип заявки: Agent замените Message.
- В поле Действия При выходе введите код:
int i; i=entity.numIstPol; { switch (i) { case 1:if (emkBuferNapr1-tekEmkNapr1>=entity.dlina) { enter1.take(entity); break;} else {enter.take(entity); break;} case 2:if (emkBuferNapr1-tekEmkNapr1>=entity.dlina) { enter1.take(entity); break;} else {enter.take(entity); break;} case 3:if (emkBuferNapr2-tekEmkNapr2>=entity.dlina) { enter2.take(entity); break;} else {enter.take(entity); break;} case 4:if (emkBuferNapr2-tekEmkNapr2>=entity.dlina) { enter2.take(entity); break;} else {enter.take(entity); break;} case 5:if (emkBuferNapr3-tekEmkNapr3>=entity.dlina) { enter3.take(entity); break;} else {enter.take(entity); break;} case 6:if (emkBuferNapr4-tekEmkNapr4>=entity.dlina) { enter4.take(entity); break;} else {enter.take(entity); break;} } }
Маршрутизатор настраивается определённым образом, например, таблицей маршрутизации. В данном случае он настраивается программным путём так, что сообщения первого и второго отправителей передаются по первому направлению, третьего и четвёртого отправителей - по второму направлению, пятого отправителя - по третьему и шестого отправителя - по четвёртому направлению. Такой вариант принят с учётом построения в дальнейшем сети связи (см. Рис. 4.1).
Блок Буфер 2
Блок Буфер 2 предназначен для приема и хранения сообщений, передаваемых по каналам направлений. Он состоит из четырёх буферов - для каждого направления свой буфер.
Алгоритм работы буфера каждого из направлений такой же, как и алгоритм работы буфера 1 (см. Рис. 4.13).
Реализуется каждый из буферов также объектом queue.
- В Палитре выделите Презентация. Перетащите элемент Прямоугольник (см. Рис. 4.11).
- На странице Основные панели Свойства в поле Имя: оставьте Rectangle. Не устанавливайте флажок Отображать имя.
- На странице Местоположение и размер панели Свойства введите в поля X: 550, Y: 20, Ширина: 140, Высота: 290.
- Перетащите элемент text и на странице Основные панели Свойства в поле Текст: введите Буфер 2.
- Перетащите пять объектов enter, четыре объекта queue и один объект sink, разместите, дайте имена и соедините так, как на Рис. 4.11.
- Выделите элемент buferNapr1, вход которого соединён с выходом enter1 и установите значения свойств.
- В поле Тип заявки: Agent замените Message.
- Вместимость emkBuferNapr1
- В поле Действия При входе введите:
tekEmkNapr1 += entity.dlina;
- В поле Действия При выходе введите:
tekEmkNapr1 -= entity.dlina;
- Установите флажок Включить сбор статистики.
- Выделите элемент buferNapr2, вход которого соединен с выходом enter2 и установите значения свойств.
- В поле Тип заявки: Agent замените Message.
- Вместимость emkBuferNapr2
- В поле Действия При входе введите:
tekEmkNapr2 += entity.dlina;
- В поле Действия При выходе введите:
tekEmkNapr2 -= entity.dlina;
- Установите флажок Включить сбор статистики.
- Выделите элемент buferNapr3, вход которого соединен с выходом enter3 и установите значения свойств.
- В поле Тип заявки: Agent замените Message.
- Вместимость emkBuferNapr3
- В поле Действия При входе введите:
tekEmkNapr3 += entity.dlina;
- В поле Действия При выходе введите:
tekEmkNapr3 -= entity.dlina;
- Установите флажок Включить сбор статистики.
- Выделите элемент buferNapr4, вход которого соединен с выходом enter4 и установите значения свойств.
- В поле Тип заявки: Agent замените Message.
- Вместимость emkBuferNapr4
- В поле Действия При входе введите:
tekEmkNapr4 += entity.dlina;
- В поле Действия При выходе введите:
tekEmkNapr4 -= entity.dlina;
- Установите флажок Включить сбор статистики.
Организация входных и выходных портов
Также как и для источника сообщений, для маршрутизатора нужно создать выходы, через которые отправлять сообщения, и входы, по которым получать сообщения. Создайте эти входы и выходы.
- Перетащите элемент Скруглённый прямоугольник.
- На странице Местоположение и размер панели Свойства введите в поля X: 536, Y: 340, Ширина: 83, Высота: 110.
- Из палитры Основная перетащите восемь элементов Порт. Разместите их как на Рис. 4.11. В полях Имя: предложенные системой имена замените согласно Рис. 4.11. Установите флажки Отображать имя.
- Обратите также внимание на то, чтобы у элементов Скруглённый прямоугольник и Порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Маршрутизатор этот флажок должен быть сброшенным.
- Соедините выходы элементов buferNapr1… buferNapr4 с соответствующими портами вых1… вых4, а порты вх1… вх4 - с входом элемента blokKontrol_1 (Блок контроля 1).
Имитатор отказов вычислительного комплекса
Принято, что вычислительный комплекс может выходить из строя и отказывать в обработке сообщений. Можно было бы построить имитатор отказов так, что генератор вырабатывает заявки-отказы в количестве, определяемом длительностью времени моделирования. Однако мы сделаем так, что генератор вырабатывает одну заявку, а затем этот процесс повторяется через интервалы времени, равные наработке до очередного отказа.
- Перетащите элемент Прямоугольник.
- На странице Местоположение и размер панели Свойства введите в поля X: 160, Y: 224, Ширина: 340, Высота: 140.
- Перетащите объект source и два объекта delay. Разместите и соедините их как на Рис. 4.11.
- Выделите source и установите значения его свойств:
- Прибывают согласно Интенсивности
- Интенсивность прибытия 1
- Количество заявок, прибывающих за один раз 1
- Ограниченное количество прибытий 1
- Максимальное количество прибытий 1
- Выделите первый объект delay и установите значения его свойств:
- Имя: розыгрыш_инт_до_отказа
- Задержка задаётся Определённое время
- Время задержки exponential(1/timeOtkBK)
- Вместимость 1
-
Действия При выходе
hold.setBlocked(true); if (computer.size()!=0) { computer.remove((Message)computer.get(0)); kolPoterBK ++;}
- Выделите второй объект delay и установите значения его свойств:
- Имя: имитация_восст_ВК
- Задержка задаётся Определённое время
- Время задержки exponential(1/timeVosstBK)
- Вместимость 1
-
Действия При выходе
hold.setBlocked(false)
Сегмент Канал
Данный сегмент предназначен для имитации передачи сообщений по каналам связи.
Для его реализации в AnyLogic используется имитационная модель направления связи (глава 2), которое состоит из основного и резервного каналов.
Исходные данные
- Откройте объект Канал. Перейдите на область просмотра viewData.
- Перетащите элемент Скруглённый прямоугольник.
- На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 752, Ширина: 377, Высота: 118.
- Перетащите элементы Параметр и Переменная, разместите и дайте им имена согласно Рис. 4.16.
- Типы и значения по умолчанию установите согласно Табл. 4.8.
Имя | Тип | Значение по умолчанию |
---|---|---|
skorPeredKan | double | 5000 |
skorPeredKanR | double | 5000 |
timeOtkKan | double | 360 |
timeVosstKan | double | 3,2 |
timeBklResK | double | 0,1 |
всего_потеряно_сообщ | int | 0 |
Событийная часть сегмента Каналы
- Перейдите на область просмотра облКаналы.
- Перетащите элемент Прямоугольник.
- На странице Местоположение и размер панели Свойства введите в поля X: 186, Y: 50, Ширина: 200, Высота: 135.
- Перетащите объект selectOutput, разместите как на Рис. 4.17.
- Оставьте предложенные системой имена и флажок Отображать имя.
- В поле Тип заявки: Agent замените Message.
- Выход true выбирается: При выполнении условия.
- Условие: основной_канал_работает.
-
При выходе (true):
entity.timePered=entity.dlina/skorPeredKan;
- В поле Вместимость введите 1.
-
При выходе (false):
if (а==0) entity.timePered=entity.dlina/skorPeredKanR; if (а==1) {entity.timePered=entity.dlina/skorPeredKanR + timeBklResK; а=0;} а=1;
- Установите флажок Включить сбор статистики.
- Скопируйте объект delay. Вставьте его один раз. При этом изменится имя на основной_канал, а остальные свойства останутся неизменными.
- Замените имя основной_канал на резерв_канал.
-
Действия При выходе
коэфЗагрРезК=резерв_канал.statsUtilization.mean(); коэфЗагрКан=коэфЗагрОснК+коэфЗагрРезК;
- Соедините согласно Рис. 4.17 объекты selectOutput и delay.
Организация входного и выходного портов
- Перетащите элемент Скруглённый прямоугольник.
- На странице Местоположение и размер панели Свойства введите в поля X: 50, Y: 80, Ширина: 60, Высота: 52.
- Из палитры Основная перетащите два элемента Порт. Разместите их как на Рис. 4.17. В полях Имя: предложенные системой имена замените согласно Рис. 4.17. Установите флажки Отображать имя.
- Обратите также внимание на то, чтобы у элементов Скруглённый прямоугольник и Порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Канал этот флажок должен быть сброшенным.
- Соедините выходы элементов основной_канал и резерв_канал с портом вых, а порт вх - с входом элемента selectOutput.
Имитатор отказов каналов связи
Имитатор отказов основного канала связи построен аналогично имитатору отказов вычислительного комплекса.
- Перетащите элемент Прямоугольник.
- На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 212, Ширина: 380, Высота: 120.
- Перетащите объект source и два объекта delay. Разместите и соедините их как на Рис. 4.17.
- Выделите source и установите значения его свойств:
- Отображать имя установите флажок
- Прибывают согласно Интенсивности
- Интенсивность прибытия 1
- Количество заявок, прибывающих за один раз 1
- Ограниченное количество прибытий установите флажок
- Максимальное количество прибытий 1
- Действия При выходе
- Выделите первый объект delay и установите значения его свойств:
- Имя: розыг_инт_до_отказа
- Отображать имя установите флажок
- Задержка задаётся Определённое время
- Время задержки exponential(1/timeOtkKan)
- Вместимость 1
-
Действия При выходе:
основной_канал_работает = false; if (основной_канал.size()!=0){ Message m = основной_канал.get(0); основной_канал.stopDelayForAll(); всего_потеряно_сообщ ++;}
- Выделите второй объект delay и установите значения его свойств:
- Имя имитация_восст_осн_кан
- Отображать имя установите флажок
- Задержка задаётся Определённое время
- Время задержки exponential(1/timeVosstkKan)
- Вместимость 1
-
Действия При выходе:
основной_канал_работает = true;