Коллеги, спасибо за очень информативный и полезный курс. Прошёл три лекции. Столкнулся с проблемой, что обе модели не могут закончить расчёт по причине ограничения бесплатной версии "создано максимально допустимое число динамически создаваемых агентов (50000)". По скриншотам Лекции 2 видно, что да, модель создает гораздо больше 50000 агентов. В принципе, мне то и диплом не особо нужен. Но хотелось бы выполнить практические работы. Нет ли возможности откорректировать эту проблему? Или может я чего не так делаю? Еще раз спасибо за прекрасный курс! |
Модель обработки запросов сервером
Сбор статистики по показателям обработки запросов
Entity (заявка) являются базовым классом для всех заявок, которые создаются и работают с ресурсами в процессе, описанном вами с помощью диаграммы из объектов Библиотеки моделирования процессов. Entity по существу является обычным Java классом с теми функциональными возможностями, которые необходимы и достаточны для обработки и отображения анимации заявки объектами Библиотеки моделирования процессов. Эти функциональные возможности можно расширить добавлением дополнительных полей и методов и работой с ними из объектов диаграммы, описывающей моделируемый процесс.
Согласно постановке задачи нужно определять математическое ожидание времени и вероятности обработки запросов сервером.
Математическое ожидание или среднее время обработки одного запроса определяется как отношение суммарного времени обработки n запросов к их количеству, т. е. к n. Для определения суммарного времени нужно знать время обработки i-го запроса. Для этого введем дополнительные поля:
- time_vxod - время входа запроса в буфер сервера,
- time_vixod - время выхода запроса с сервера (входа в блок sink).
Тогда
time_obrabotki=time_vixod-time_vxod
Вероятность обработки запросов сервером определяется как отношение количества обработанных запросов к количеству всех поступивших запросов. Значит, нужно вести счет запросов на выходе источника запросов и на выходе с сервера (входе в блок sink). Для этого также введем дополнительные поля:
- col_vxod - количество поступивших всего запросов,
- col_vixod - количество обработанных сервером запросов.
Тогда
ver_obrabotki=col_vixod/col_vxod
Создание нестандартного Java класса
Для включения в запросы дополнительных полей необходимо создать нестандартный тип заявки. Это возможно двумя способами. Создадим первым способом тип заявок Inquiry.
- В панели Проект щёлкните правой кнопкой мыши элемент модели верхнего уровня дерева и выберите из контекстного меню Создать/Java класс.
- Появится диалоговое окно Новый Java класс (Рис. 1.41). В поле Имя: введите имя нового класса Inquiry.
- В поле Базовый класс: выберите из выпадающего списка Entity в качестве базового класса. Щёлкните кнопку Далее.
- Появится вторая страница Мастера создания Java класса. (Рис. 1.42).
- Добавьте поля Java класса: time_vxod типа double, time_vixod типа double, col_vxod типа int, col_vixod типа int. Типы полей выбираются из выпадающего списка. Начальные значения всех параметров, поскольку не указаны, по умолчанию будут установлены равными нулю.
- Оставьте выбранными флажки Создать конструктор и Создать метод toString (). Тогда у класса будут созданы сразу два конструктора: один, по умолчанию, без параметров, и второй, с параметрами, инициализирующими поля класса. Эти конструкторы используются объектами, создающими новые заявки, такие, как Source.
- Щёлкните кнопку Готово. Вы увидите редактор кода, в котором будет показан автоматически созданный код вашего Java класса (Рис. 1.43). Закройте редактор, щелкнув крестик в закладке рядом с его названием.
- Теперь нужно преобразовать Java класс в тип агента. Для этого щёлкните правой кнопкой мыши в панели Проект только что созданный Java класс и в контекстном меню выберите Преобразовать Java класс в тип агента.
- Появится окно c автоматически созданными параметрами нестандартного типа заявок Inquiry (см. Рис. 1.48).
- Закройте оно, щелкнув крестик в закладке рядом с его названием. Удалите всё, что касается только что созданного Java класса и заявки. Перейдём к созданию непосредственно нестандартного типа заявки вторым способом.
Создайте тип заявок Inquiry.
- Откройте палитру Библиотека моделирования процесов.
- Перетащите элемент Тип заявки в графический редактор. Появится тип заявки Entity (Рис. 1.44).
- Появится диалоговое окно Создание агента. Шаг 1. Анимация агента (Рис. 1.45).
В поле Имя нового агента: введите Inquiry.
Выберите анимацию агента: установите 2D и выберите из выпадающего списка, например, Сообщение.
Щёлкните Далее.
- Появится диалоговое окно Создание агента. Шаг 2. Параметры агента (Рис. 1.46).
- Щёлкните <добавить…>. В поле Параметр: введите time_vxod (Рис. 1.47).
- Из выпадающего списка Тип: выберите double.
- Щёлкните второй раз <добавить…>. В поле Параметр: введите time_vixod.
- Из выпадающего списка Тип: выберите double.
- Щёлкните третий раз <добавить…>. В поле Параметр: введите col_vxod.
- Из выпадающего списка Тип: оставьте int.
- Щёлкните третий раз <добавить…>. В поле Параметр: введите col_vixod.
- Из выпадающего списка Тип: оставьте int.
увеличить изображение
Рис. 1.47. Диалоговое окно Создание агента. Шаг 2. Параметры агента с установленными параметрами нестандартного типа заявок Inquiry - Так как в поле Значение по умолчанию мы не устанавливали никаких значений, то всем параметрам будет установлен 0.
- Щёлкните кнопку Готово. Вы увидите окно, в котором будут показаны автоматически созданные параметры нестандартного типа заявок Inquiry (Рис. 1.48). Закройте оно, щелкнув крестик в закладке рядом с его названием.
Добавление элементов статистики
Для сбора статистических данных о времени обработки запросов сервером необходимо добавить элемент статистики. Этот элемент будет запоминать значения времен для каждого запроса. На основе этого он предоставит пользователю стандартную статистическую информацию (среднее, минимальное, максимальное из измеренных значений, среднеквадратичное отклонение и т.д.).
- Чтобы добавить элемент сбора данных гистограммы на диаграмму, перетащите элемент Данные гистограммы с палитры Статистика на диаграмму активного класса.
- Задайте свойства элемента (Рис. 1.49):
- измените Имя: на time_obrabotki;
- сделайте Кол-во интервалов: равным 50;
- задайте Нач. размер интервала: 0.01.
Добавьте еще элемент сбора статистики для определения вероятности обработки запросов.
- Перетащите элемент Данные гистограммы с палитры Статистика на диаграмму активного класса.
- Задайте свойства элемента (Рис. 1.50):
- измените Имя: на ver_obrabotki;
- сделайте Кол-во интервалов: равным 50;
- задайте Нач. размер интервала: 0.01.
Диаграмма после добавления элементов сбора статистики представлена на Рис. 1.51.
Изменение свойств объектов диаграммы
Чтобы создавать заявки нестандартного типа, как в нашем случае Inquiry, вам нужно поместить вызов конструктора этого типа в поле Новая заявка объекта source. Но, несмотря на то, что заявки в потоке теперь и будут типа Inquiry, остальные объекты диаграммы будут продолжать их считать заявками типа Entity.
Поэтому они не позволят явно обращаться к дополнительным полям класса Inquiry. Чтобы разрешить доступ к полям вашего нестандартного типа заявки в коде динамических параметров объектов потоковой диаграммы, вам нужно указать имя нестандартного типа заявки в качестве Типа заявки этого объекта. В нашей потоковой диаграмме с учётом блока source всего пять объектов.
Измените их свойства.
- Измените свойства объекта source (Рис. 1.52):
- введите Inquiry в поле Тип заявки:. Это позволит напрямую обращаться к полям типа заявки Inquiry в коде динамических параметров этого объекта;
- выберите из выпадающего списка Inquiry() в поле Новая заявка:. Теперь этот объект будет создавать заявки нашего типа Inquiry;
- введите entity.time_vxod=time(); в поле Действия При выходе:. Код будет сохранять время создания заявки-запроса в параметре time_vxod нашего типа заявки Inquiry.
Функция time() возвращает текущее значение модельного времени.
- Измените свойства объекта queue:
- введите Inquiry в поле Тип заявки:.
- Измените свойства объекта delay:
- введите Inquiry в поле Тип заявки:.
- Измените свойства объекта sink1:
- введите Inquiry в поле Тип заявки:.
- Измените свойства объекта sink:
- введите Inquiry в поле Тип заявки:;
- введите в поле Действие при входе следующие коды:
time_obrabotki.add(time()-entity.time_vxod);
Этот код добавляет время обработки одного запроса в объект сбора данных гистограммы time_obrabotki. Данное время определяется как разность между текущим модельным временем time() и временем входа запроса в модель. add - встроенная функция добавления элемента в массив.
entity.col_vixod=sink.count(); entity.col_vxod=source.count();
Эти коды заносят количество запросов, вошедших в блок sink и вышедших из блока source соответственно. count() - встроенная функция этих блоков, возвращает количество вошедших в блок sink и количество вышедших из блока source заявок.
ver_obrabotki.add(entity.col_vixod/entity.col_vxod);
Этот код добавляет относительную долю обработанных запросов в объект сбора данных гистограммы ver_obrabotki при поступлении каждого обработанного запроса в блок sink. На основе множества таких относительных долей определяется математическое ожидание вероятности обработки запросов сервером.
- Запустите модель. Появится сообщение об ошибке. Щёлкните Продолжить. Появится второе сообщение (Рис. 1.53).
- Щёлкните выделенный Java код в панели Консоль Main.java.399 (Рис. 1.54). Появится код с выделенными ошибками.
Мы установили тип int для col_vxod и col_vixod (см. Рис. 1.42). Изменим этот тип на double.
Удаление и добавление новых полей типа заявок
Обратите внимание, что вам не пришлось использовать поле time_vixod, так как вместо него была использована функция time(), возвращающая, как вам уже известно, текущее значение модельного времени.
Удалите поле time_vixod.
- В поле Проект дважды Щёлкните кнопку Inquiry. Откроется окно Inquiry (см. Рис. 1.48).
- Удалите time_vixod, выделив его и нажав Delete.
- Выделите col_vxod. Из выпадающего списка Тип: вместо int выберите double (Рис. 1.55).
- Выделите col_vixod. Из выпадающего списка Тип: вместо int выберите double.
- Из процедуры удаления поля следует, что так же можно вводить новые дополнительные поля нестандартного типа заявок. Например, перетащите из библиотеки Основная элемент Параметр. Дайте ему любое имя и установите Тип: из выпадающего списка. В дальнейшем это поле нестандартного типа заявки вы можете использовать в кодах модели.
Итак, все условия постановки задачи выполнены. Чтобы наблюдать за работой модели, установите, что время остановки модели не задано. Запустите модель. (Рис. 1.56).