Построение событийной части сегмента
При построении модели придется воспользоваться Java-кодом, в котором потребуются дополнительные ноля сообщений. Для этого нужно создать нестандартный тип заявки с дополнительными полями для записи и хранения параметров, о которых упоминалось ранее (см. подпараграф 4.1.4). Перетащите объект selectOutput. Соедините его вход с выходом объекта source. Объект selectOutput выделяет и направляет объекту… Читать ещё >
Построение событийной части сегмента (реферат, курсовая, диплом, контрольная)
Событийная часть сегмента, назовем ее блок АбонешТ, предназначена для имитации отправителя-получателя сообщений, поступления сообщений через случайные интервалы времени, розыгрыша параметров сообщений и подсчета количества отправлепных-полученных сообщений по категориям и абонентам, а также для запоминания времени поступления каждого сообщения, используемого в последующем для расчета минимального, максимального и среднего времени передачи одного сообщения.
Алгоритм работы блока Абонент1 приведен на рис. 4.7, а его реализация средствами AnyLogic — на рис. 4.8.
- 1. Из палитры Презентация перетащите элемент Прямоугольник.
- 2. На странице Местоположение и размер панели Свойства введите в поля X: 10, Y: 50, Ширина: 450, Высота: 380.
- 3. Перетащите элемент text и в поле Текст введите Абонент 1.
- 4. Перетащите из Библиотеки моделирования процессов объект source. Поместите его так же, как на рис. 4.8. Остальные объекты блока Абонент1 вы будете перетаскивать и размещать по мере необходимости.
При построении модели придется воспользоваться Java-кодом, в котором потребуются дополнительные ноля сообщений. Для этого нужно создать нестандартный тип заявки с дополнительными полями для записи и хранения параметров, о которых упоминалось ранее (см. подпараграф 4.1.4).
Рис. 4.7. Алгоритм работы блока Абонент!
Рис. 4.9. Дополнительные поля класса заявок Message
Рис. 4.8. Реализация блока Абонент! средствами AnyLogic
Создайте класс заявки Message.
- 1. Выделите объект source.
- 2. В панели Проект щелкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать —* Java класс.
- 3. Появится диалоговое окно Новый Java класс. В поле Имя введите имя нового класса: Message.
- 4. В поле Базовый класс: введите имя базового класса com.xj. апуlogic. libraries. enterprise. Entity. Щелкните кнопку Далее.
- 5. На появившейся второй странице Мастера создания Java класса добавьте поля Java-класса, показанные на рис. 4.9.
- 6. Оставьте флажки Создать конструктор и Создать метод toString ().
Щелкните Готово. Закройте редактор кода.
7. В панели Проект в контекстном меню только что созданного Javaкласса меню выберите Преобразовать Java класс в тип агента. Закройте окно с параметрами.
Продолжим построение блока Абонент1.
- 1. Выделите объект source. На странице Основные панели Свойства установите следующие свойства:
- • Тип заявки: Message;
- • Прибывают согласно: Времени между прибытиями;
- • Время между прибытиями: exponential (1/timeAbonent);
- • Новая заявка: Message;
- • Действия при подходе к выходу:
double, а = 0;
double b = kolAbonent;
// Розыгрыш номера получателя сообщения
а = uniform!);
for (int i = 1; i < (kolAbonent + 1); i++) {.
if (a <= ((1/kolAbonent) * b)) agent. numAbPol = i; b = b — 1;
).
agent.timeOtpr = time!);
agent.numAbOtpr = numAbonent;
Объект source будет генерировать сообщения с интервалами времени, распределенными, но экспоненциальному закону. Принято, что сообщения от данного абонента-отиравителя с равной вероятностью могут быть отправлены любому абоненту сети. Поэтому разыгрывается номер абонентаполучателя сообщения, и заносится в numAbPol. В поле timeOtpr заносится время отправления сообщения.
- 2. Перетащите объект selectOutput. Соедините его вход с выходом объекта source. Объект selectOutput выделяет и направляет объекту sink на уничтожение сообщения, адресованные абоненту-отнравителю, т. е. самому себе. Перетащите объект sink. Его вход соедините с выходом Т объекта selectOutput.
- 3. Перетащите объект selectOutput5. Данный объект предназначен для розыгрыша категорий отправляемых сообщений. Его вход соедините с выходом F объекта selectOutput. На панели Свойства установите свойства согласно табл. 4.4 (имена объектов см. на рис. 4.8). Значения свойств являются Java-кодом. Код предназначен для подсчета отправленных сообщений в сети связи в целом и по категориям сообщений, определения количества сообщений, отправленных за один прогон, розыгрыша длин сообщений по категориям, вывода расчетов по каждому абоненту, а также по сети связи в целом.
- 4. Перетащите два объекта selectOutput5 (имена selectOutputl и selectOutput2). Объекты предназначены для сортировки отправляемых сообщений по абонентам и подсчета их количества.
- 5. Перетащите объект queue.
- 6. Укажите его свойства:
- • Имя: Буфер;
- • Тип заявки: Message;
- • Вместимость: 100.
Соедините выходы 1—4 объекта selectOutputl с входом элемента Буфер (см. рис. 4.8).
- 7. Соедините выход по умолчанию объекта selectOutputl с входом объекта selectOutput2. Через этот выход будут проходить на selectOutput2 сообщения, адресованные абонентам 5 и 6.
- 8. Выделите selectOutput2 и установите значения свойств, указанных в табл. 4.4. Соедините все выходы selectOutput2 с входом элемента Буфер.
Свойства объектов selectOutput, selectOutputl, selectOutput2
Таблица 4.4
Свойство. | Значение. |
Имя. | selectOutput. |
Тип заявки. | Message. |
Выход true выбирается. | При выполнении условия. |
Условие. | agent.numAbPol == numAbonent. |
Тип заявки. | Message. |
Использовать. | Условия. |
Действия при входе. | a = uniformO; f++; kolOtpr = f/kolProg; editboxb.setText (kolOtpr, true); main.f++; main.всегоОтпр = main. f/kolProg; main. editbox5.setText (main.всегоОтпр, true); |
Условие 1. | a<=verKat.get (1). |
Действия при выходе. | agent.numKat=1; b=normal (dlKatO.get (agent.numKat), dlKat. get (aqent.numKat)); agent. dlina = (int)(b); dl + +; kolOtprKatl = dl/kolProg; editbox6.setText (kolOtprKatl, true); main.dl++; main.всегоОтпрКат1 = main. dl/kolProg; main. editbox6.setText (. main.всегоОтпрКат1, true); |
Условие 2. | a<=ver verKat. get (2). |
Действия при выходе 2. | agent.numKat = 2; b=normal (dlKatO.get (agent.numKat), dlKat. get (aqent.numKat)); agent. dlina = (int)(b); d2 + +; kolOtprKat2 = d2/kolProg; editbox7.setText (kolOtprKat2, true); main.d2++; main.всегоОтпрКат2 = main. d2/kolProg; |
Свойство. | Значение. |
main.editbox7.setText (. main.всегоОтпрКат2, true); | |
Условие 3. | A <= verKat. get (3). |
Действия при выходе 3. | agent.numKat = 3 ; b = normal (dlKatO.get (agent.numKat), dlKat. get (aqent.numKat)); agent. dlina = (int)(b); d3 + +; kolOtprKat3 = d3/kolProg; editbox8.setText (kolOtprKat3, true); main.d3++; main.всегоОтпрКатЗ = main. d3/kolProg; main. editbox8.setText (. main.всегоОтпрКатЗ, true); |
Условие 4. | a <= verKat. get (4). |
Действия при выходе. | 4agent.numKat = 4; b = normal (dlKatO.get (agent.numKat), dlKat. get (agent.numKat)); agent. dlina = (int)(b); d4 + +; kolOtprKat4 = d4/kolProg; editbox9.setText (kolOtprKat4, true); main.d4++; main.всегоОтпрКат4 = main. d4/kolProg; main. editbox9.setText (. main.всегоОтпрКат4, true); |
Имя. | selectOutputl. |
Тип заявки. | Message. |
Использовать. | Условия. |
Условие 1. | agent.numAbPol == 1. |
Условие 2. | agent.numAbPol == 2. |
Действия при выходе 2. | отпрАб2++; main.OTnpl2 = отпрАб2; |
Условие 3. | agent.numAbPol == 3. |
Действия при выходе 3. | отпрАбЗ++; main.oTnpl3 = отпрАбЗ; |
Условие 4. | agent.numAbOtpr == 4. |
Действия при выходе 4. | отпрАб4++; main.отпр14 = отпрАб 4; |
Имя. | selectOutput2. |
Тип заявки. | Message. |
Использовать. | Условия. |
Условие 1. | agent.numAbPol == 5. |
Действия при выходе 1. | отпрАб 5 + +; main.OTnpl5 = отпрАбб; |
Условие 2. | agent.numAbPol == 6. |
Действия при выходе 2. | отпрАб6++; main.oTnpl6 = отпрАбб; |
Отправляемое сообщение поступило в буфер. Из буфера оно должно попасть в канал связи. Создайте порты для отправления и приема сообщений.
- 1. Из палитры Презентация перетащите элемент Скругленный прямоугольник.
- 2. На странице Местоположение и размер панели Свойства введите в поля X: 210, Y: 100, Ширина: 65, Высота: 60.
- 3. Из палитры Агент перетащите два элемента порт (см. рис. 4.8). Сбросьте флажки Отображать имя. Из Презентации перетащите два элемента Текст и в поля text введите вх и вых.
Замечание. Обратите внимание на то, чтобы у элементов Скругленный прямоугольник и порт был установлен флажок На верхнем уровне. У остальных элементов сегмента Абонент1 этот флажок должен быть сброшен. В противном случае вы обнаружите их также на верхнем уровне — на агенте Main.
Итак, отправляемое сообщение поступило в канал связи, подключенный к порту вых.
Через порт вх сообщения поступают из канала связи. Продолжим построение блока Абоненте
- 1. Перетащите объект selectOutput (имя selectOutput3). Он предназначен для контроля текущей емкости входного буфера. В случае заполнения буфера сообщения теряются.
- 2. Соедините порт вх с входом объекта selectOutput3.
- 3. Перетащите объект sink (имя sinkl). Его вход соедините с выходом F объекта selectOutput3.
- 4. Выделите объект selectOutput3 и установите его свойства:
- • Тип заявки: Message;
- • Выход true выбирается При выполнении условия;
- • Условие emkBuferVx-tekEmkBuferVx>=aqent.dlina.
- 5. Перетащите объект queue. Укажите его свойства:
- • Имя: БуферВх;
- • Тин заявки: Message;
- • Вместимость emkBuf erVx;
- • Действие при входе: tekEmkBuferVx+= agent. dlina;
- • Действия при выходе: tekEmkBuf erVx -= agent.dlina.
Соедините его вход с выходом Т объекта selectOutput3.
- 1. Перетащите selectOutputS (имя selectOutput4). Он необходим для разделения потока полученных сообщений по категориям.
- 2. На страницах панели Свойства установите свойства согласно табл. 4.5. Эти свойства также являются кодом. Код предназначен:
- • для счета полученных сообщений для сети связи в целом и по категориям сообщений;
- • определения числа сообщений, полученных за один прогон;
- • вывода расчетов по каждому абоненту, а также для сети связи в целом.
- 3. Соедините выход элемента БуферВх с выходом объекта selectOutput4.
- 4. Перетащите два объекта selectOutput5 (имена selectOutput5 и selectOutput6). Объекты предназначены для разделения и счета получаемых сообщений по абонентам. Значения свойств установите согласно табл. 4.5. Выход по умолчанию объекта selectOutput5 соедините с входом объекта selectOutput6.
Свойства объектов selectOutput4 — selectOutputG.
Свойство | Значение |
Имя | sclcctOutput4 |
Тип заявки | Message |
Использовать | Условия |
Действия при входе | д++; kolPol = д/ко1Ргод; editbox.setText (kolPol, true); main.g++; main.всегоПол = main. g/kolProg; main.editbox.setText( main. всегоПол, true); |
Условие 1 | agent.numKat == 1. |
Действия при выходе 1 | kl + +; kolPolKatl=kl/kolProg; editboxl.setText (kolPolKatl, true); main.kl + +; main.всегоПолКат1=та1п.kl/kolProg; main.editboxl.setText{ main.всегоПолКат1, true); |
Условие 2 | agent.numKat == 2. |
Действия при выходе 2 | k2 + +; kolPolKat2 = k2/kolProg; editbox2.setText (kolPolKat2, true); main.k2++; main.всегоПолКат2 = main. k2/kolProg; main. editbox2.setText( main.всегоПолКат2, true); |
Условие 3 | agent.numKat == 3. |
Действия при выходе 3 | k3 + +; kolPolKat3 = k3/kolProg; editbox3.setText (kolPolKat3, true); main.k3++; main.всегоПолКатЗ = main. k3/kolProg; main. editbox3.setText < main.всегоПолКатЗ, true); |
Условие 4 | agent.numKat == 4. |
Действия при выходе 4 | k4++; kolPolKat4 = k4/kolProg; editbox4.setText (kolPolKat4, true); main.k4++; main.всегоПолКат4 = main. k4/kolProg; main. editbox4.setText{ main. всегоПолКат4# true); |
Имя | select Output 5 |
Тип заявки | Message |
Использовать | Условия |
Условие 1 | agent.numAbOtpr == 1. |
Условие 2 | agent.numAbOtpr == 2. |
Действия при выходе 2 | OTA62++; main.KnpCn21 = OTA62/main.OTnp21; main.КПрСп21.setText (main.кПрСп21, true); |
Свойство. | Значение. |
Условие 3. | agent.numAbOtp r== 3. |
Действия при выходе 3. | ОТА63++; main.кПрСпЗ1=отАбЗ/main.отпр31; main.КПрСп31.setText (main.кПрСпЗ1, true); |
Условие 4. | agent.numAbOtpr == 4. |
Действия при выходе 4. | OTA64++; main. KlIpCn41=OTA64/main. отпр41; main. KIIpCn41 .setText (main.KlIpCn41, true) ; |
Имя. | selectOutput6. |
Тип заявки. | Message. |
Использовать. | Условия. |
Условие 1. | agent.numAbOtpr == 5. |
Действия при выходе 1. | otA65++; main.KlIpCn51 = OTA65/main. отпрБ1; main. КПрСп51.setText (main.кПрСп51, true); |
Условие 2. | agent.numAbOtpr==6. |
Действия при выходе 2. | OTA66++; main.KlIpCn61 = отАбб/main. отпр61; main. KnpCn61.setText (main.кПрСпб!, true); |
- 1. Перетащите объект sink2. Его вход соедините с выходами 1—4 объекта selectOutput5 и выходами объекта selectOutput6.
- 2. Установите свойства объекта sink2 согласно табл. 4.6. Код предназначен для расчета коэффициента пропускной способности сети связи и времени передачи одного сообщения.
Таблица 4.6 Свойства объекта sink2 | |
Свойство. | Значение. |
Тип заявки. | Message. |
Действия при входе. | врПередачи.add (time () — agent. timeOtpr); editboxll. setText (врПередачи.mean (), true); editboxl2. setText (врПередачи.max (), true); editboxl3. setText (врПередачи.min (), true); main. коэфПропСпособ =. main. всегоПол/main.всегоОтпр; main.editboxlO.setText (. main.коэфПропСпособ, true); main.врПередСооб.add (time () — agent. timeOtpr); main.editboxll.setText (. main.врПередСооб.mean (), true); main. editboxl2.setText (. mmain.врПередСооб.max (), true); main. editboxl3.setText (. main.врПередСооб.min (), true); |
Приступим к построению сегмента Маршрутизатор.