Учебное пособие AnyLogic (1). Учебное пособие по дисциплине имитационое и математическое моделирование Составитель Ремезова Е. М
Скачать 4.41 Mb.
|
Добавление элементов статистикиДля сбора статистических данных о времени обработки запросов сервером необходимо добавить элемент статистики. Этот элемент будет запоминать значения времен для каждого запроса. На основе этого он предоставит пользователю стандартную статистическую информацию (среднее, минимальное, максимальное из измеренных значений, среднеквадратичное отклонение и т.д.). Добавьте элемент Данные Гистограммы (Рисунок 64): измените Имя: на time_obrabotki; сделайте Кол-во интервалов: равным 50; задайте Нач. размер интервала: 0.01. Рисунок 64 - Элемент сбора статистики о времени обработки запросов Добавьте элемент Данные Гистограммы (Рисунок 65): измените Имя: на ver_obrabotki; сделайте Кол-во интервалов: равным 50; задайте Нач. размер интервала: 0.01. Рисунок 65 - Элемент сбора статистики о вероятности обработки запросов Изменение свойств объектов диаграммы Чтобы создавать заявки нестандартного типа, как в нашем случае Inquiry, вам нужно поместить вызов конструктора этого типа в поле Новая заявка объекта source. Но, несмотря на то, что заявки в потоке теперь и будут типа Inquiry, остальные объекты диаграммы будут продолжать их считать заявками типа Entity. Поэтому они не позволят явно обращаться к дополнительным полям класса Inquiry. Чтобы разрешить доступ к полям вашего нестандартного типа заявки в коде динамических параметров объектов потоковой диаграммы, вам нужно указать имя нестандартного типа заявки в качестве Типа заявки этого объекта. В нашей потоковой диаграмме с учётом блока source всего пять объектов. Измените их свойства. Измените свойства объекта source (Рисунок 66): Измените на Inquiry в поле Тип заявки:. Это позволит напрямую обращаться к полям типа заявки Inquiry в коде динамических параметров этого объекта; выберите из выпадающего списка Inquiry() в поле Новый агент:. Теперь этот объект будет создавать заявки нашего типа Inquiry; введите agent.time_vxod=time(); в поле Действия При выходе:. Код будет сохранять время создания заявки-запроса в параметре time_vxod нашего типа заявки Inquiry. Функция time() возвращает текущее значение модельного времени. Рисунок 66 Тип заявки Измените свойства объекта queue: введите Inquiry в поле Тип агента. Измените свойства объекта delay: введите Inquiry в поле Тип агента. Измените свойства объекта sink1: введите Inquiry в поле Тип агента. Измените свойства объекта sink: введите Inquiry в поле Тип агента и введите в поле Действие при входе следующие коды: time_obrabotki.add(time()-agent.time_vxod); Этот код добавляет время обработки одного запроса в объект сбора данных гистограммы time_obrabotki. Данное время определяется как разность между текущим модельным временем time() и временем входа запроса в модель. add - встроенная функция добавления элемента в массив. agent.col_vixod=sink.count(); agent.col_vxod=source.count(); Эти коды заносят количество запросов, вошедших в блок sink и вышедших из блока source соответственно. count() - встроенная функция этих блоков, возвращает количество вошедших в блок sink и количество вышедших из блока source заявок. ver_obrabotki.add(agent.col_vixod/ agent.col_vxod); Этот код добавляет относительную долю обработанных запросов в объект сбора данных гистограммы ver_obrabotki при поступлении каждого обработанного запроса в блок sink. На основе множества таких относительных долей определяется математическое ожидание вероятности обработки запросов сервером. Запустите модель. Появится сообщение об ошибке. Щёлкните Продолжить. Появится второе сообщение (Рисунок 67). Рисунок 67 Ошибка при выполнении дискретного собятия Мы установили тип int для col_vxod и col_vixod. Изменим этот тип на double. Удаление и добавление новых полей типа заявок Обратите внимание, что вам не пришлось использовать поле time_vixod, так как вместо него была использована функция time(), возвращающая, как вам уже известно, текущее значение модельного времени. Удалите поле time_vixod. Из процедуры удаления поля следует, что так же можно вводить новые дополнительные поля нестандартного типа заявок. Итак, все условия постановки задачи выполнены. Чтобы наблюдать за работой модели, установите, что время остановки модели не задано. Запустите модель (Рисунок 68). Рисунок 68 Фрагмент работы модели сервера Добавление параметров и элементов управленияАктивный объект может иметь параметры. Параметры обычно используются для задания статических характеристик объекта. Но значения параметров при необходимости можно изменять во время работы модели. Для этого нужно написать код обработчика события, то есть действий, которые должны выполняться при изменении значения параметра. Создайте параметр time_mean объекта delay. Добавьте объект «Параметр» Перейдите на панель Свойства (Рисунок 69). В поле Имя введите имя параметра time_mean (среднее время). По этому имени параметр будет доступен из кода. Задайте тип параметра double. Рисунок 69 Параметр В поле Значение по умолчанию установите 180. Если значение не задано явно, по правилам Java оно будет равно нулю. Выделите объект delay. На панели Свойства в поле Время задержки вместо выражения exponential(1/180.0) введите выражение exponential(1/time_mean). Пусть вы хотите изменять среднее время обработки запросов time_mean в ходе моделирования. Используйте для этого элемент управления - бегунок. Добавьте элемент «Бегунок». Поместите бегунок под параметром time_mean, чтобы было понятно, что с помощью этого бегунка будет меняться среднее время обработки запросов объектом delay. Пусть вы хотите варьировать среднее время от 1 до 300. Поэтому введите 1 в поле Минимальное значение:, а 300 - в поле Максимальное значение: (Рисунок 70). Установите флажок Связать с: и в активизированное поле введите time_mean. Рисунок 70 Бегунок Пусть теперь вы хотите также изменять ёмкость буфера в ходе моделирования. Используйте для этого также бегунок. Добавьте ещё один бегунок, под элементом queue. Пусть вы хотите варьировать ёмкость буфера от 0 до 15 запросов. Поэтому введите 15 в поле Максимальное значение. Установите флажок Связать с: и в активизированное поле введите queue.capacity. Запустите модель. Теперь вы можете изменять в процессе моделирования ёмкость входного буфера и среднее время обработки запросов с помощью бегунков. Существует и другой способ изменения свойств объектов во время выполнения модели: нужно щёлкнуть по элементу, войти в режим редактирования и ввести новое значение в одной из закладок всплывающего окна инспекта. Поэтому заранее не нужно продумывать, значения каких параметров планируется изменять, и не добавлять специальные элементы управления (например, бегунки). Изменение значения в окне инспекта поддерживается для следующих элементов: простая переменная; параметр; накопитель. И для следующих типов: численные; логический (boolean); текстовый (String). Удалите элемент Бегунок для Параметра time_mean. Запустите модель и приостановите её. Щёлкните по значку Параметра time_mean. Введите новое значение: 240.0. Закройте инспект. Рядом с элементом Параметр вы увидите введённое вами значение 240.0. Запустите модель с новым свойством объекта delay (Рисунок 71). Рисунок 71 Ввод нового значения параметра в окно инспекта Добавление гистограммТеперь добавим на диаграмму нашего потока гистограмму, которая будет отображать собранную временную статистику. Добавьте элемент Гистограмма. Укажите, какой элемент сбора данных хранит данные, которые вы хотите отображать на гистограмме: щёлкните кнопку «Добавить данные» и введите в поле Данные имя соответствующего элемента: time_obrabotki. Установите Отображать среднее. В поле Заголовок: введите Histogram Time obrabotki (Рисунок 72). Рисунок 72 Histogram Time obrabotki Добавим на диаграмму нашего потока гистограмму, которая будет отображать собранную вероятностную статистику. Добавьте элемент Гистограмма Щёлкните кнопку Добавить данные и введите в поле Данные имя элемента: ver_obrabotki. Установите Отображать среднее. В поле Заголовок: введите Histogram Ver obrabotki. Запустите модель. Фрагмент работы показан на Рисунке 73. Замечание. Обратите внимание, что после нового запуска модели time_mean=180, хотя ранее мы изменили его значение на 240. Рисунок 73 Фрагмент работы модели с элементом управления и гистограммами Изменение времени обработки запросов серверомПостроенная модель соответствует постановке задачи. В ней, с целью упрощения процесса построения первой модели, время обработки запросов сервером было принято распределённым по показательному (экспоненциальному) закону со средним значением T2 = 3 мин. Однако в модели время обработки поступающих запросов зависит от производительности сервера оп/с и вычислительной сложности запросов, распределенной по нормальному закону с математическим ожиданием оп и среднеквадратическим отклонением оп. Кроме того, в модели определяется среднее количество запросов, обработанных за время моделирования 3600 с. Внесите в модель изменения для аналогичного расчёта времени обработки запросов. Удалите элемент Параметр с именем time_mean элемент Бегунок для элемента queue. Добавьте 3 элемента «Параметр» В поле Имя каждого из элементов введите S1_, S2_ и Q_ соответственно. Выберите Тип double. В поле Значение по умолчанию каждого из элементов введите 60000000,200000 и 600000 соответственно. Перетащите элемент Переменная. В поле Имя укажите KolZap. Выделите объект delay. В поле Время задержки вместо exponential(1/time_mean) введите:(normal(S2_,S1_))/Q_ Выделите объект sink. В поле Действие при входе к имеющемуся там коду добавьте код: KolZap=sink.in.count()/9604.0; (Рисунок 74). Рисунок 74 Переменные Для получения результатов моделирования с доверительной вероятностью и точностью нужно выполнить 9604 прогонов модели: где - табулированный аргумент функции Лапласа, p - ожидаемая вероятность исхода события, в данном случае вероятность обаботки запросов сервером. Расчёт проведен для так называемого "худшего" случая, то есть в предположении, что ожидаемая вероятность обработки запросов p = 0,5. Увеличим время моделирования в AnyLogic-модели в 9604 раз. А так как статистические данные о количестве обработанных запросов собираются за всё время моделирования, увеличенное в 9604 раз, то для получения среднего значения это количество нужно разделить на 9604, что и предусмотрено в коде. Показатели моделируемой системы нужно определить в течение 3600 с, поэтому время моделирования в AnyLogic составит 3600*9604 = 34574400 единиц модельного времени. В панели Проект выделите Simulation. На странице Модельное время в поле Установить выберите В заданное время. В поле Конечное время установите 34574400. Запустите модель и дождитесь окончания моделирования. Результаты моделирования приведены на рисунке 75. Рисунок 75 Результаты моделирования обработки запросов сервером Интерпретация результатов моделированияДля проведения исследований на модели сделайте ещё несколько дополнений и изменений. Можно было бы обойтись и без них, но они улучшат эксплуатацию модели. Из палитры Основная перетащите три элемента Параметр на диаграмму агента Main. Разместите их выше параметров S1_,S2_, Q_. Выделите первый элемент Параметр. В поле Имя: первого параметра введите timeMean - среднее время поступления запросов для обработки на сервере. Оставьте тип double. В поле Значение по умолчанию введите 120. Выделите объект source. В поле Время между прибытиями вместо 120.0 введите timeMean. Теперь вам при изменении среднего времени поступления запросов не придётся искать нужный код в свойствах объекта модели. Выделите второй элемент Параметр. В поле Имя: введите kolProg - количество прогонов модели. Как и в предыдущем случае, при корректировке числа прогонов код в свойствах искать будет не нужно. Оставьте тип double. В поле Значение по умолчанию введите 9604. Выделите объект sink. В поле Действие при входе в имеющемся там коде замените последнюю строку следующей: KolZap=round(sink.in.count()/kolProg); Количество обработанных запросов KolZap сервером выдавалось с дробной частью. Теперь, вследствие применения процедуры round, количество запросов будет целым. Как уже отмечалось, при изменении количества прогонов модели не надо будет искать код для требуемой корректировки. Однако всё-таки потребуется изменить модельное время. Например, если нужно выполнять с моделью 1000 прогонов, то модельное время следует установить равным 3600*1000=3600000. Выделите третий элемент Параметр. В поле Имя: введите emkBuf - ёмкость в сообщениях входного буфера сервера. Установите тип int. В поле Значение по умолчанию введите 5. Выделите объект queue. В поле Вместимость введите emkBuf. (Рисунок 76). Рисунок 76 Новые параметры Запустите модель. Результаты моделирования на рисунке 77. Проведём несколько экспериментов. Будем изменять среднее время поступления запросов timeMean в предположении, что с течением времени количество источников запросов будет расти, то есть timeMean будет уменьшаться. В сторону увеличения будем изменять ёмкость входного буфера emkBuf и производительность Q_ сервера. Рисунок 77 Результаты моделирования при условиях постановки задачи Контрольные вопросы: ЗАКЛЮЧЕНИЕ БИБЛИОГРАФИЧЕСКИЙ СПИСОК |