Здравствуйте, прошел курс "Концептуальное проектирование систем в AnyLogic и GPSS World". Можно ли получить по нему сертификат? У нас в институте требуют сертификаты для создания портфолио. |
Модель функционирования сети связи
Построение событийной части сегмента
Событийная часть сегмента, назовём её блок Абонент1, предназначена для имитации отправителя-получателя сообщений, поступления сообщений через случайные интервалы времени, розыгрыша параметров сообщений и счёта количества всего отправленных-полученных сообщений по категориям и абонентам, запоминания времени поступления каждого сообщения, используемого в последующем для расчёта минимального, максимального и среднего времени передачи одного сообщения.
Алгоритм блока Абонент1 приведен на рис. 4.7, а его реализация средствами AnyLogic - на рис. 4.8.
- Из палитры Презентация перетащите элемент Прямоугольник.
- Перейдите на страницу Дополнительные панели Свойства. Введите в поля X: 10, Y: 50, Ширина: 450, Высота: 380.
- Перетащите элемент text и в поле Текст: введите Абонент1.
- Перетащите из Основной библиотеки (Enterprise Library) объект source. Поместите его так же, как на рис. 4.8. Остальные объекты блока Абонент1 вы будете размещать по мере необходимости.
При построении модели нам придётся воспользоваться Java-кодом, в котором потребуются дополнительные поля сообщений. Для этого мы должны создать нестандартный класс заявки с дополнительными полями для записи и хранения параметров, о которых мы упоминали ранее (см. п. 4.1.4).
Создайте класс заявки Message.
- Выделите объект source.
- В панели Проект щелкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите Создать/Java класс.
- Появится диалоговое окно Новый Java класс. В поле Имя: введите имя нового класса: Message.
- В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса (в ранних версиях - anylogic.libraries.enterprise.Entity). Щелкните кнопку Далее.
- Появится вторая страница Мастера создания Java класса. Добавьте поля Java класса, показанные на рис. 4.9.
- Оставьте выбранными флажки Создать конструктор и Создать метод toString ().
- Щелкните Готово. Закройте редактор кода.
Продолжим построение блока Абонент1.
- Выделите объект source. На странице Основные панели Свойства установите следующие свойства:
- Класс заявки: Message
- Заявки прибывают согласно Времени между прибытиями
- Время между прибытиями exponential(1/timeAbonent)
- Количество заявок, прибывающих за один раз 1
- Новая заявка new Message()
- Действие при выходе
double a=0; double b=kolAbonent; // Розыгрыш номера получателя сообщения a=uniform(); for (int i=1; i<(kolAbonent+1); i++) {if (a<=((1/kolAbonent)*b)) entity.numAbPol=i; b=b-1;} entity.timeOtpr=time(); entity.numAbOtpr=numAbonent;
Объект source будет генерировать сообщения с интервалами времени, распределёнными по экспоненциальному закону. Принято, что сообщения от данного абонента-отправителя с равной вероятностью могут быть отправлены любому абоненту сети. Поэтому разыгрывается номер абонента-получателя сообщения, и заносится в numAbPol. В поле timeOtpr заносится время отправления сообщения.
Замечание. Основная библиотека (Enterprise Library) содержит объекты TimeMeasureStart и TimeMeasureEnd, позволяющие измерять время прохождения заявки между двумя заданными точками диаграммы процесса. TimeMeasureStart запоминает момент времени, в который заявка проходит через этот объект. TimeMeasureEnd вычисляет для поступившей в него заявки разность между текущим временем и запомненным объектом TimeMeasureStart, на который ссылается этот объект. Эта разность добавляется в элементы сбора статистики, встроенные в объект TimeMeasureEnd. - Перетащите объект selectOutput. Соедините его вход с выходом объекта source. Объект selectOutput выделяет и направляет объекту sink на уничтожение сообщения, адресованные абоненту-отправителю, то есть самому себе. Перетащите объект sink. Его вход соедините с выходом T объекта selectOutput.
- Перетащите объект selectOutput5. Данный объект предназначен для розыгрыша категорий отправляемых сообщений. Его вход соедините с выходом F объекта selectOutput. На странице Основные панели Свойства установите свойства согласно табл. 4.4. Эти свойства являются кодом. Код предназначен для счёта отправленных сообщений за сеть связи в целом и по категориям сообщений, определения количества отправленных сообщений за один прогон, розыгрыша длин сообщений по категориям, вывода расчётов по каждому абоненту, а также за сеть связи в целом.
- Перетащите два объекта selectOutput5 (имена selectOutput1 и selectOutput2). Объекты предназначены для разделения и счёта отправляемых сообщений по абонентам.
Таблица 4.4. Свойство selectOutput Класс заявки: Message Выход true выбирается При выполнении условия Условие entity.numAbOtpr==entity.numAbPol Класс заявки: Message Использовать: Условия Действие при входе: a=uniform(); f++; kolOtpr=f/kolProg; editbox5.setText(kolOtpr, true); get_Main().f++; get_Main().всегоОтпр=get_Main().f/ kolProg; get_Main().editbox5.setText(get_Main(). всегоОтпр, true); Условие 0 a<=verKat.get(1) Действие при выходе 0 entity.numKat=1; b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); entity.dlina=(int)(b); d1++; kolOtprKat1=d1/kolProg; editbox6.setText(kolOtprKat1, true); get_Main().d1++; get_Main().всегоОтпрКат1=get_Main().d1/kolProg; get_Main().editbox6.setText(get_Main().всегоОтпрКат1, true); Условие 1 a<=ver verKat.get(2) Действие при выходе 1 entity.numKat=2; b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); entity.dlina = (int)(b); d2++; kolOtprKat2=d2/kolProg; editbox7.setText(kolOtprKat2, true); get_Main().d2++; get_Main().всегоОтпрКат2=get_Main().d2/kolProg; get_Main().editbox7.setText(get_Main().всегоОтпрКат2, true); Условие 2 a<=verKat.get(3) Действие при выходе 2 entity.numKat=3; b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); entity.dlina=(int)(b); d3++; kolOtprKat3=d3/kolProg; editbox8.setText(kolOtprKat3, true); get_Main().d3++; get_Main().всегоОтпрКат3=get_Main().d3/ kolProg; get_Main().editbox8.setText(get_Main().всегоОтпрКат3, true); Условие 3 a<=verKat.get(4) Действие при выходе 3 entity.numKat=4; b=normal(dlKatO.get(entity.numKat), dlKat.get(entity.numKat)); entity.dlina=(int)(b); d4++; kolOtprKat4=d4/kolProg; editbox9.setText(kolOtprKat4, true); get_Main().d4++; get_Main().всегоОтпрКат4=get_Main().d4/kolProg; get_Main().editbox9.setText(get_Main().всегоОтпрКат4, true); Свойство selectOutput1 Класс заявки: Message Использовать: Условия Условие 0 entity.numAbPol==1 Условие 1 entity.numAbPol==2 Действие при выходе 1 отпрАб2++; get_Main().отпр12=отпрАб2; Условие 2 entity.numAbPol==3 Действие при выходе 2 отпрАб3++; get_Main().отпр13=отпрАб3; Условие 3 entity.numAbOtpr==entity.numAbPol Свойство selectOutput2 Класс заявки: Message Использовать: Условия Условие 0 entity.numAbPol==4 Действие при выходе 0 отпрАб4++; get_Main().отпр14=отпрАб4; Условие 1 entity.numAbPol==5 Действие при выходе 1 отпрАб5++; get_Main().отпр15=отпрАб5; Условие 2 entity.numAbPol==6 Действие при выходе 2 отпрАб6++; get_Main().отпр16=отпрАб6; - Перетащите объект queue. Укажите его свойства: Имя:Буфер. Класс заявки: Message. Вместимость 100. Соедините выходы 0…3 selectOutput1 с входом элемента Буфер (см. рис. 4.8).
- Соедините выход по умолчанию selectOutput1 с входом selectOutput2. Через этот выход будут проходить на selectOutput2 сообщения, адресованные абонентам 4, 5 и 6.
- Выделите selectOutput2 и установите значения свойств, указанных также в табл. 4.4. Соедините все выходы selectOutput2 с входом элемента Буфер.