Математическое моделирование. Документ Microsoft Word. исследование и оптимизация свойств локальных информационных систем
Скачать 1.67 Mb.
|
Тема 12. Средства и приемы создания имитационных моделей Цели изучения темы: · познакомиться с понятием и примерами замкнутой системы; · получить представление о методике и приемах создания моделей замкнутой системы. Задачи изучения темы: · изучить определение замкнутой системы; · рассмотреть задачу моделирования замкнутой системы на примере корпоративной информационной системы; · познакомиться с приемами, применяемыми для создания моделей замкнутых систем; · освоить приемы сбора данных с помощью имитационной модели. Успешно изучив тему, Вы: получите представление о: · том, что называется замкнутой системой; · почему важно знать способы построения моделей замкнутых систем; · способах инициализации моделируемых процессов; · способах отладки имитационной модели; будете знать: · типовые схемы «зарядки» моделей замкнутых систем; · узлы и сигнальные функции системы Pilgrim, применяемые в схемах «зарядки» моделей замкнутых систем; · приемы моделирования на примере модели корпоративной информационной системы. Вопросы темы: 1. Моделирование замкнутых систем. 2. Определение нестандартных выходных параметров. 3. Отладка модели. 4. Получение гистограмм. Вопрос 1. Моделирование замкнутых систем. Под модельюзамкнутой системы понимается модель, в которой транзакты, будучи единожды сгенерированы, циркулируют в пределах графа модели, не погибая в терминаторах. Такой моделью, например, может быть модель работы, группы пользователей корпоративной информационной системы с компьютерной сетью в диалоговом режиме. Транзакт в этом случае имитирует запрос пользователя. Выйдя из узла, имитирующего работу пользователя, транзакт проходит по графу модели, имитируя обработку в системе, возвращается к пользователю (узел), имитируя сформированный ответ, после чего вновь преобразуется в запрос того же пользователя. Моделировать каждый новый запрос отдельным транзактом нельзя, так как нельзя рассчитать заранее время обработки запроса системой (это случайная величина) и, следовательно, нельзя задать частоту генератора. В этом случае модель может быть построена следующим образом: · Пользователи (или группы пользователей, в зависимости от сложности моделируемой системы) представляются одно- или многоканальными узлами типа serv (серверы). · Число каналов сервера соответствует числу пользователей, время обработки транзакта сервером соответствует времени подготовки пользователями запроса. · Конкретное состояние транзакта (запрос – ответ) фиксируется значением одного из его параметров. · Для зарядки транзактами серверов пользователей, принадлежащих к одному классу, используется единственный генератор, порождающий всего один транзакт. Далее транзакты размножаются с помощью узлов типа creat. Так, если требуется смоделировать работу за терминалами (клиентскими компьютерами) нескольких пользователей, причем работа каждого пользователя описывается своими временными характеристиками, то это может быть сделано следующим образом (рис. 45): Рис. 45. Схема «зарядки» замкнутой модели В этом графе каждый пользователь имитируется одним узлом модели типа serv. Текст программы на языке Pilgrim будет выглядеть так: ag («Старт»,1,none, none,1.О,zero,zero,2); top (2): creat («Размножитель», none, Users, none, 4, 3); place; top (3): term («Терминатор»); cheg (1, none, none, modtime, zero, zero,3); place; top (4): t->ft = addr[4]->na + 5; t->ru0 = Think_time [addr[4]->na]; t->ru1 = Query_time [addr[4]->na]; queue («Распределитель», none, t->ft) ; place; Значения переменных Users, modtime задают соответственно число пользователей и время моделирования, массивы Think_time и Query_time среднее время обдумывания пользователем запроса и среднее время реакции системы на запрос (значения могут устанавливаться в начале программы вместе с описаниями переменных). Конструкция реализует следующую последовательность инициализирующих действий. Запрос, сгенерированный узлом ag (узел 1), попадает в узел creat (узел 2), который генерирует Users транзактов (по числу пользователей), не присваивая им номер семейства. Далее эти транзакты попадают в очередь (узел 4), где каждому из них присваивается свой номер семейства, равный номеру сервера, в который этот транзакт должен будет попасть после выхода из узла 2. Присваивание производится с помощью системной переменной addr[4]->na, в которой в каждый момент модельного времени хранится значение числа транзактов, прошедших через узел (в данном примере, через узел 4). Таким образом будет обеспечено автоматическое присвоению системной переменной) t->ft нужной последовательности номеров узлов-приемников. В параметр транзакта t->ru0 заносится значение среднего времени задержки в сервере, моделирующем работу пользователя. Этот параметр используется при описании серверов пользователей (узлы с номерами из диапазона [5, Users + 4], где Users - число серверов). Кроме того, в параметр транзакта t->ru1 заносится значение среднего времени задержки запроса (обработки) в сервере, моделирующем процессор системы. Транзакт, вышедший из узла ag и покинувший узел 2, переходит далее в терминатор (узел 3). В этом узле он инициирует выполнение сигнальной функции cheg, которая переустанавливает параметр узла ag, задающей средний интервал между двумя генерируемыми транзактами в modtime (что, по сути, означает отключение узла ag), и уничтожается. Вопрос 2. Определение нестандартных выходных параметров. В ряде моделей помимо выходных данных, собираемых автоматически системой Pilgrim относительно каждого из узлов графа модели, необходимо оценить также и ряд других. В частности, для систем замкнутого типа может представлять интерес время реакции моделируемой системы на пользовательский запрос. Наиболее информативным описанием случайной величины (каковой является в данном примере время реакции), как это известно из теории вероятностей, является ее распределение. Однако во многих случаях оказывается вполне достаточно ограничиться выяснением среднего значения (математического ожидания) этого параметра. Для оценивания среднего времени реакции системы на пользовательский запрос в замкнутой системе можно воспользоваться такими приемами. 1) Значение среднего времени реакции можно рассчитать на основании стандартного отчета с результатами моделирования системы Pilgrim. Для этого можно воспользоваться следующим выражением: где означает среднее время обдумывания пользователем ответа системы перед выдачей нового ей очередного запроса (вывод этого выражение весьма несложен). 2) Значенииt можно получить в явном виде как среднее значение нахождения узла key в закрытом состоянии, если прибегнуть к приему, который поясним на примере модели, рассмотренной выше. Для получения нужного результата в модель нужно добавить дополнительные узлы типа key вместе с соответствующей логикой (рис. 46): Рис. 46. Узел key как средство сбора данных При использовании первого подхода каждому пользователю, который имитируется одним узлом типа serv, придается дополнительный узел key, который служит только для целей измерений. Транзакт (запрос к КИС) сначала попадает в узел key и запирает его с помощью сигнальной функции hold (5) (для примера выше). После обработки запроса, когда транзакт возвращается из модели КИС сервер, имитирующий пользователя, при входе в узел serv он открывает соответствующий узел key с помощью сигнальной функции rels(5) (для примера выше). В программной модели автоматически измеряется средний интервал нахождения узла key в закрытом состоянии, что и есть не что иное, как математическое ожидание, а также среднеквадратичное отклонение этой величины. Рассмотрим следующий пример упрощенной модели КИС, граф которой включает схему зарядки, описанную ранее в настоящей теме, а граф, имитирующий обработку, состоит из одного узла типа queue, имитирующего очередь на обработку, и одного узла типа serv, имитирующего собственно обработку (Рис.): Рис. 47. Пример модели КИС В модели присутствуют четыре пользователя, представленные узлами П_1, П_2, П_3, П_4 типа serv. Для сбора данных о времени реакции системы на запрос пользователя в модель встроены узлы КП_1, КП_2, КП_3, КП_4 типа key. Узлы 101, 102, 103 обеспечивают первоначальную зарядку транзактами узлов П_1, П_2, П_3, П_4 модели. Для некоторой совокупности параметров модели (см. значения параметров в тексте программы следующего вопроса настоящей темы) можно получить следующий результат (рис. 48):
Рис. 48. Результаты запуска модели КИС Если теперь провести сопоставление значений параметров, полученных для каждого из четырех пользователей непосредственно с помощью узлов типа key и рассчитанных по приведенной выше формуле, то результаты будут следующими (рис. 49):
Рис. 49. Время реакции КИС Как видим, наблюдаемые расхождения в значениях параметров оказываются крайне незначительными. Вопрос 3. Отладка модели. Обязательным этапом процесса моделирования является этап обоснования модели, или подтверждения адекватности. К одному из типовых приемов, используемых для этой цели, принадлежит трассировка программной модели. Целью трассировки является построения временной диаграммы имитируемых процессов и сопоставления ее с ожидаемой. Рассмотрим возможный вариант реализации трассировки на примере упрощенной модели КИС (см. предыдущий вопрос настоящей темы),. Ниже приводится текст программной модели, имеющей дополнительные конструкции С++, которые обеспечивают отслеживание во времени состояние транзактов модели: /****************************************************************************/ #include //Для вывода результатов трассировки --------------------------------------------------------------------- #include #include #include //---------------------------------------------------------------------------------------------------------------------- forward { int USERS=4; float Q_time[]={57.6,67.2,72,64.8}; float T_time[]={72, 96, 120, 144}; float modtime=50000.0; //Выводной файл-------------------------------------------------------------------------------------------------- int fileNumb=creat («C:\\MyResults.txt», S_IWRITE); // файла для вывода ofstream fileOut; fileOut.attach (fileNumb); //---------------------------------------------------------------------------------------------------------------------- modbeg («КИС», 120, modtime, (long)1234567890, none, 109, none, none, 2); ag («Старт», 101, none, none, 1, none, none, 102); network (dummy, dummy) { top (102): creat («Размножитель», none, USERS, none, 104, 103); place; top (103): term («Стоп»); clcode { cheg (101,none,none,modtime,zero,zero,102); } place; top (104): t->ft=addr[104]->na + 105; t->ru0=T_time[addr[104]->na]; t->ru1=Q_time[addr[104]->na]; queue («Распределитель», none, t->ft); place; top (105): rels (115); serv («П_1», 1, none, norm, t->ru0, t->ru0/3, none, 115); clcode { fileOut << «\n» << t->ft << « Тотв=« << timer ; } place; top (106): rels (116); serv («П_2», 1, none, norm, t->ru0, t->ru0/3, none, 116); clcode { fileOut << «\n» << t->ft << « Тотв=« << timer ; } place; top (107): rels (117); serv («П_3», 1, none, norm, t->ru0, t->ru0/3, none, 117); clcode { fileOut << «\n» << t->ft << « Тотв=« << timer ; } place; top (108): rels (118); serv («П_4», 1, none, norm, t->ru0, t->ru0/3, none, 118); clcode { fileOut << «\n» << t->ft << « Тотв=« << timer ; } place; top (115): key («КП_1», 109); hold (115); place; top (116): key («КП_2», 109); hold (116); place; top (117): key («КП_3», 109);; hold (117); place; top (118): key («КП_4», 109); hold (118); place; top (109): queue («Очередь», none, 110); clcode { fileOut << «\n» << t->ft << « Tвыд=« << timer ; } place; top (110): serv(«КИС», 1, none, norm, t->ru1, t->ru1/3, none, t->ft); clcode { fileOut << «\n» << t->ft << « Tобс=« << timer; } place; fault (123); } modend («КИС.rep», 1, 28, page); return 0; } В программной модели присутствуют операторы, которые выводят в fileOut (описан в начальной части программы) моменты появления транзактов в основных узлах модели: Тотв (получение пользователем ответа от системы), Tвыд (выдача пользователем запроса системе), Tобс (начало обработки пользовательского запроса). Операторы записываются в блоках clcode, что гарантирует их выполнение точно в моменты вхождения транзакта в соответствующий узел. Ниже приведен начальный фрагмент трассировки (содержимого файла C:\\MyResults.txt) без первых строк, в которой содержатся моменты первоначального занесения транзактов, сгенерированных схемой зарядки: 105 Tвыд=49.9005 105 Tобс=49.9005 106 Tвыд=70.7441 107 Tвыд=93.8595 105 Тотв=121.851 106 Tобс=121.851 108 Tвыд=167.247 105 Tвыд=178.985 106 Тотв=181.122 107 Tобс=181.122 106 Tвыд=265.4 107 Тотв=274.487 108 Tобс=274.487 108 Тотв=349.432 105 Tобс=349.432 105 Тотв=370.114 106 Tобс=370.114 107 Tвыд=389.957 106 Тотв=420.103 107 Tобс=420.103 105 Tвыд=464.913 107 Тотв=476.97 105 Tобс=476.97 106 Tвыд=494.919 108 Tвыд=500.144 105 Тотв=523.164 Анализируя полученные записи можно оценить, насколько корректно воспроизводятся в имитационной модели процессы, протекающие в реальной системе. Вопрос 4. Построение гистограмм. В ряде задач результат в виде средних значений и среднеквадратичных отклонений показателей исследуемой системы бывает недостаточно информативен и требуется более подробное описание показателя, которое получается в этом случае в виде гистограмм, отображающих частоты распределения значений показателя. Собрать необходимые сведения для построения гистограммы можно непосредственным включением операторов языка С++ в текст исходного модуля pilgrim-модели. Поясним возможный прием на примере модели СМО, рассматривавшейся в предыдущих темах. Пусть необходимо получить детальную информацию о времени нахождения заявки (транзакта) в системе. Будем собирать эти сведения в виде массива частот counts, описание которого приведем в тексте программной модели: /* ЗАГОЛОВОЧНЫЕ ФАЙЛЫ***********************************************************/ #include #include #include #include #include #include /*Вывод данных гистограммы ************************************************************/ void printhist (char hdr[] /* заголовок отчета */, int fileNumb /* выводной файл */, int dim /* размерность массивов*/, float bounds[] /* границы значений */, int counts[] /* частоты значений */) { ofstream fileOut; int i; float sum, mn; fileOut.attach (fileNumb); for ( i=0,sum=0; i for ( i=0,mn=0; i if (bounds[i]!=FLT_MIN) if (bounds[i+1]!=FLT_MAX) mn+=counts[i]*(bounds[i]+bounds[i+1])/2/ sum; else mn+=counts[i]* bounds[i-1] / sum; else if (bounds[i+1]!=FLT_MAX) mn+=counts[i]*bounds[i+1] / sum; else mn+=counts[i] / sum; fileOut << hdr << setprecision(4); fileOut << «\n---------------------------------------------» << «\n» << setw(5)<<«MIN»<< setw(10)<<«MAX»< << «\n---------------------------------------------»; for ( i=0; i { if (bounds[i]==FLT_MIN) fileOut << «\n» << setw(5) << «<<<«; else fileOut << «\n» << setw(5) << bounds[i]; if (bounds[i+1]==FLT_MAX) fileOut < else fileOut < fileOut << setw(10) << counts[i] << « « << static_cast fileOut << «\n---------------------------------------------»; fileOut << «Среднее= « << mn << endl; } /***********************************************************************************/ forward { /********* ИНИЦИАЛИЗАЦИЯ СРЕДСТВ СБОРА СТАТИСТИКИ **************************/ int fileNumb=creat («C:\\MyResults.txt», S_IWRITE); // выводной файл float bounds[]={ 0.0, 10.0, 20.0, 30.0, 40.0, 50.0, // границы интервалов 60.0, 70.0, 80.0, 90.0, 100.0, FLT_MAX }; // границы интервалов int const dim = sizeof bounds / sizeof (float)-1; // число интервалов int counts [dim]={ 0 }; // счетчики ofstream fileOut; // выводной файл fileOut.attach (fileNumb); // присоединение int i; // индекс //-------------------------------------------------------------------------------------------------------------------------------- modbeg («СМО», 105, 15000, (long)time(NULL), none, 102, none,104, 2); ag («Генератор», 101, none, expo, 12.0, none, none, 102); network (dummy, dummy) { top (102): t->ru0 = timer; //Запоминание момента входа в систему queue («Очередь «, none, 103); place; top (103): serv («Сервер», 1, none, expo, 9.0, none, none, 104); place; top (104): term («Терминатор»); clcode /* Выход из системы - сбор статистики */ { for (i=0;i if (timer-t->ru0>bounds[i] & timer-t->ru0<=bounds[i+1]) counts[i]++; } place; fault(123); } printhist («Тпребывания «, fileNumb, dim, bounds, counts); // вывод собранной статистики modend («pilgrim.rep», 1, 8, page); return 0; } Границы интервалов изменения исследуемого показателя задаются в программе в массиве bounds, верхней границей которого являются максимально возможное значение чисел типа float (FLT_MAX). Вывод собранных в массиве counts частот осуществляет функция printhist, в которой подсчитывается и выводится также среднее значение показателя Тср Примером полученных статистических данных может быть (рис. 50): Тпребывания
Tср=32.15 Рис. 50. Пример вывода статистических данных Используя любое доступное средство (например, построитель диаграмм Excel) числовые данные можно представить графически (рис. 51): Рис. 51. Статистические данные в виде диаграммы В необходимых случаях результат можно аппроксимировать теоретическим распределением, применяя подход, который рассматривался ранее. Выводы: 1. Важным классом систем, для анализа и проектирования которых используется аппарат имитационного моделирования, являются замкнутые системы, в которых отсутствуют потоки между ними и внешней средой. Для создания моделей таких систем используются специальные приемы, называемые в системе Pilgrim схемами зарядки. 2. Задачами схемы зарядки являются внесение в программную модель необходимого числа транзактов, которые имитируют в случае моделирования информационной системы, пользователей системы. Для различных случаев, зависящих от характера работы и численности пользователей, разработаны специальные типовые приемы для решения этой задачи. 3. В ряде задач требуется получить результаты, не входящие в стандартный перечень, выдаваемый моделирующей системой. В таких ситуациях в моделях необходимо предусмотреть специальные средства для сбора и выдачи результатов. Эти средства реализуются применительно к специфике используемой моделирующей системы. 4. Важным этапом моделирования является этап ее отладки и обоснования адекватности модели. Для эффективной реализации этой задачи необходимо использовать различные методы и приемы. Одним из наиболее часто применяемых подходов является трассировка модели. Вопросы для самопроверки: 1. Что такое замкнутая система (модель)? 2. Почему в замкнутой модели нельзя моделировать каждый новый запрос отдельным транзактом? 3. Какие узлы используются для моделирования замкнутых систем? 4. Какие показатели могут потребоваться помимо автоматически получаемых системой Pilgrim? 5. Какими приемами можно воспользоваться для получения значения дополнительных показателей? Литература по теме: 1. Емельянов А.А., Власова Е.А., Дума Р.В. Имитационное моделирование экономических процессов / Под ред. А.А. Емельянова. – М.: Финансы и статистика, 2009. – 480 с. |