Учебное пособие AnyLogic (1). Учебное пособие по дисциплине имитационое и математическое моделирование Составитель Ремезова Е. М
Скачать 4.41 Mb.
|
Уточнение модели согласно ёмкости входного буфераНа Рисунке 58 (сделан по окончании времени моделирования) видно, что длина очереди равна 16 запросам при установленной максимальной длине 20. Но ведь в постановке задачи ёмкость буфера была определена в 5 запросов. Нам не удалось до этого построить модель с такой ёмкостью из-за ошибки - невозможности очередного запроса покинуть блок source, так как длина очереди уже была равна 5 запросам. Нам пришлось во избежание этой ошибки увеличить ёмкость буфера до 15 запросов, а далее изменив до 20. А возможно ли выполнить данное условие постановки задачи средствами AnyLogic? Оказывается, что можно. Причем, различными способами. Уточним модель согласно постановке задачи одним из этих способов. Объект queue моделирует очередь заявок, ожидающих приёма объектами, следующими за ним в потоковой диаграмме, или же моделирует хранилище заявок общего назначения. При необходимости вы можете задать максимальное время ожидания заявки в очереди. Вы также можете с помощью написанной вами программы извлекать заявки из любых позиций в очереди. Заявка может покинуть объект queue различными способами: обычным способом через порт out, когда объект, следующий в блок-схеме за этим объектом, готов принять заявку; через порт outTimeout, если заявка проведет в очереди заданное количество времени (если включен режим таймаута); через порт outPreempted, будучи вытесненной другой поступившей заявкой при заполненной очереди (если включен режим вытеснения); "вручную", путем вызова функции remove() или removeFirst(). В первом случае объект queue покидает заявка, находящаяся в самом начале очереди (в нулевой позиции). Если заявка направлена в порт outTimeout или outPreempted, то она должна покинуть объект мгновенно. Если включена опция вытеснения, то объект queue всегда готов принять новую заявку, в противном случае при заполненной очереди заявка принята не будет. Поступающие заявки помещаются в очередь в определенном порядке: либо согласно правилу FIFO (в порядке поступления в очередь), либо согласно приоритетам заявок. Приоритет может быть либо явно храниться в заявке, либо вычисляться согласно свойствам заявки и каким-то внешним условиям. Очередь с приоритетами всегда примет новую входящую заявку, вычислит её приоритет, и поместит в очередь в позицию, соответствующую её приоритету. Если очередь будет заполнена, то приход новой заявки вынудит последнюю хранящуюся в очереди заявку покинуть объект через порт outPreempted. Но если приоритет новой заявки не будет превышать приоритет последней заявки, то тогда вместо неё будет вытеснена именно эта новая заявка. Для выполнения условия постановки задачи воспользуемся последним способом вытеснения. Все запросы, вырабатываемые объектом source, имеют один и тот же приоритет. Поэтому при полном заполнении накопителя (5 запросов) теряться будет последний запрос. Уточните модель. Выделите объект queue. На панели «Свойства» измените «Вместимость» на 5 запросов. Здесь же установите «Разрешить вытеснение». Для уничтожения потерянных запросов вследствие полного заполнения накопителя нужно добавить второй объект sink. Добавте блок sink на диаграмму (Рисунок 59). Тогда соедините порт outPreempted объекта queue с входным портом InPort блока sink1. Рисунок 59 Sink1 Запустите уточненную модель и понаблюдайте за ее работой. На Рисунке 60 видно, что запросы при длине очереди в 5 запросов теряются, и ошибки при этом не возникает. Модель по ограничению ёмкости входного буфера и значениям других параметров соответствует постановке задачи. Рисунок 60 Уточнённая модель сервера Однако согласно постановке задачи требуется определить математическое ожидание времени обработки одного запроса и математическое ожидание вероятности обработки запросов. Сбор статистики по показателям обработки запросовСогласно постановке задачи нужно определять математическое ожидание времени и вероятности обработки запросов сервером. Математическое ожидание или среднее время обработки одного запроса определяется как отношение суммарного времени обработки 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 класс. В поле Имя: введите имя нового класса Inquiry. В поле Базовый класс: введите Entity в качестве базового класса. Щёлкните кнопку Далее. Появится вторая страница «Мастера создания Java класса». (Рисунок 61). Рисунок 61 Создание класса Добавьте поля Java класса: time_vxod типа double, time_vixod типа double, col_vxod типа int, col_vixod типа int. Оставьте выбранными флажки Создать конструктор и Создать метод toString (). Тогда у класса будут созданы сразу два конструктора: один, по умолчанию, без параметров, и второй, с параметрами, инициализирующими поля класса. Эти конструкторы используются объектами, создающими новые заявки, такие, как Source. Щёлкните кнопку Готово. Вы увидите редактор кода, в котором будет показан автоматически созданный код вашего Java класса. Теперь нужно преобразовать Java класс в тип агента. Для этого щёлкните правой кнопкой мыши в панели Проект только что созданный Java класс и в контекстном меню выберите «Преобразовать» Java класс в тип агента. Появится окно c автоматически созданными параметрами нестандартного типа заявок Inquiry. Закройте окно. Удалите всё, что касается только что созданного Java класса и заявки. Перейдём к созданию непосредственно нестандартного типа заявки вторым способом. Создайте тип заявок Inquiry. Откройте палитру Библиотека моделирования процесов. Перетащите элемент Agent в графический редактор. В поле Имя нового агента: введите Inquiry. Выберите анимацию агента: установите 2D и выберите из выпадающего списка, например, Сообщение. Щёлкните Далее. Появится диалоговое окно Создание агента. Шаг 2. Параметры агента . Щёлкните <добавить…>. В поле Параметр: введите time_vxod (Рисунок 62). Из выпадающего списка Тип: выберите double. Щёлкните второй раз <добавить…>. В поле Параметр: введите time_vixod. Из выпадающего списка Тип: выберите double. Щёлкните третий раз <добавить…>. В поле Параметр: введите col_vxod. Из выпадающего списка Тип: оставьте int. Щёлкните третий раз <добавить…>. В поле Параметр: введите col_vixod. Из выпадающего списка Тип: оставьте int. Рисунок 62 Типы данных Так как в поле Значение по умолчанию мы не устанавливали никаких значений, то всем параметрам будет установлен 0. Щёлкните кнопку «Готово». Вы увидите окно, в котором будут показаны автоматически созданные параметры нестандартного типа заявок Inquiry (Рисунок 63). Рисунок 63 Inquiry |