Опубликован: 07.11.2014 | Доступ: свободный | Студентов: 442 / 37 | Длительность: 15:17:00
ISBN: 978-5-9556-0161-8
Тема: САПР
Лекция 2:

Модель обработки запросов сервером

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >
Ввод текста программы модели, исправление ошибок и проведение моделирования
  1. Запустите GPSS World.
  2. Закройте окно напоминания о необходимости обновления "Заметок". Откроется главное меню.
  3. Для ввода текста GPSS World имеет текстовый редактор. Откройте окно текстового редактора. Для этого выберите в меню File / New и в появившемся меню выберите Model. Нажмите Ok.
  4. Наберите текст программы модели, т. е. создайте объект "Модель". При вводе текста следует использовать клавишу [Tab]. Например, после набора Т1_ нужно нажать клавишу [Tab]. Интервалы табуляции установлены по умолчанию.
  5. После ввода программы модели создайте объект "Процесс моделирования", представляющий собой оттранслированный объект "Модель". Для трансляции выберите Command / Create Simulation. По этой команде транслятор GPSS проверяет программу модели на наличие синтаксических ошибок.
  6. При наличии синтаксических ошибок система в окне JOURNAL выдаст список сообщений об ошибках трансляции. Перейдите к п. 7. При отсутствии ошибок в окне JOURNAL появится сообщение Model Translation Begun. Ready. Перейдите к п. 9.
  7. Исправьте ошибки. Для поиска ошибок в тексте программы модели и их исправления используйте команду Search / Next Error, предварительно перейдя из окна JOURNAL в текст программы модели. При первом выполнении этой команды курсор мыши помещается в строке текста модели с ошибкой. После исправления первой ошибки вновь используйте команду Search / Next Error и т.д. столько раз, сколько ошибок в тексте программы.
  8. После исправления ошибок перейдите к п.5.
  9. Сохраните модель. Для этого выберите в главном меню File / Save As. Дайте модели имя Модель процессов изготовления изделий и нажмите Ok.
  10. Откликом в данной модели является вероятность обработки запросов сервером. Ранее вы рассчитали количество прогонов модели для худшего случая при точности \varepsilon =0,01, и доверительной вероятности \alpha=0,95 : N=9604.
  11. Запустите модель. Для этого в главном меню выберите Command / Start и в диалоговом окне вместо 1 наберите 9604. Нажмите Ok.
  12. При наличии логических ошибок для их поиска в тексте программы модели и исправления используйте команду Search / Goto Line столько раз, сколько ошибок указано в окне JOURNAL. Там же (в окне JOURNAL) указаны номера строк с ошибками.
  13. При отсутствии логических ошибок в модели по окончании её работы система GPSS World автоматически создает стандартный отчет, который появится в окне Report. В окне будут содержаться следующие данные:
    • об именах объектов модели;
    • блоках модели;
    • ОКУ и МКУ;
    • очередях;
    • сохраняемых величинах.

В результате решения прямой задачи получим, что за один час сервером будет обработано N=29 запросов, а вероятность обработки составит VerObr=0,97. Если не использовать процедуру INT - выделения целого числа с отбрасыванием дробной части, будет обработано 29,161 запроса. Среднее время обработки одного запроса составит TimeMean=255,262

Дисперсионный анализ (отсеивающий эксперимент)

Сущность этого эксперимента состоит в проведении многофакторного дисперсионного анализа с целью выявления степени влияния различных факторов и их комбинаций (взаимодействий) на значение целевой функции (функции отклика, представленной в виде уравнения регрессии).

Для каждого фактора необходимо выбрать два уровня - нижний и верхний. Рекомендуется выбирать уровни, значительно отстоящие друг от друга. Это необходимо для получения также значительно отличающихся откликов.

В условиях прямой задачи требуется исследовать зависимость вероятности обработки запросов от трех факторов, например, при следующих их минимальных и максимальных значениях (Табл. 1.1):

Таблица 1.1.
Уровни факторов Факторы
T1_, с Koef Q_, оп/c
Нижний 60 0,5 300000
Верхний 180 1,5 700000

Для проведения дисперсионного анализа нужно воспользоваться созданным в п. 1.1.1.4 объектом "Модель". В программе модели удалите последнюю строку.

Откройте модель Прямая задача. Выберите Edit / Insert Experiment / Screening … (Правка / Вставить эксперимент / Отсеивающий …).

Откроется диалоговое окно Screening Experiment Generator (Генератор отсеивающего эксперимента) (Рис. 1.2).

Приступите к заполнению полей диалогового окна.

В поля Experiment Name (Имя эксперимента) и Run Procedure Name (Имя процедуры запуска) введите, например, Dis_Server и Dis_Server_Run соответственно (Рис. 1.3).

Имена эксперименту и процедуре запуска эксперимента даёт пользователь.

Дальше расположена группа полей Factors (Факторы). В рассматриваемом примере определяется вероятность обработки запросов, поступающих на сервер. Факторы, влияние которых необходимо исследовать, были определены нами ранее (см. Табл. 1.1).

Диалоговое окно (незаполненное) Screening Experiment Generator (Генератор отсеивающего эксперимента)

Рис. 1.2. Диалоговое окно (незаполненное) Screening Experiment Generator (Генератор отсеивающего эксперимента)
Диалоговое окно (заполненное) Screening Experiment Generator (Генератор отсеивающего эксперимента)

Рис. 1.3. Диалоговое окно (заполненное) Screening Experiment Generator (Генератор отсеивающего эксперимента)

В GPSS World максимальное количество факторов, влияние которых на функцию отклика можно исследовать посредством дисперсионного анализа, равно шести.

Введите ранее выбранные факторы, начиная с фактора А. В поле Name (User Variable) (Имя (Переменная пользователя)) введите имя фактора, в поля Value1 и Value2 - его нижний и верхний уровни соответственно. После ввода всех факторов для дальнейшей работы будем иметь факторы А, В и С.

Ниже идет группа Fraction (Часть полного эксперимента). Эксперимент, проводимый в GPSS World, может быть полным факторным экспериментом (ПФЭ) или дробным факторным экспериментом (ДФЭ). Группа Fraction (Часть дробного эксперимента) позволяет это задавать, т. е. позволяет провести стратегическое планирование эксперимента, цель которого, как вам известно, является определение количества наблюдений и сочетаний уровней факторов в них для получения наиболее полной и достоверной информации о поведении системы.

Установке ПФЭ соответствует кнопка Full, для ДФЭ в 1/2 от ПФЭ - Half, в 1/4 - Quarter, в 1/8 - Eight, в 1/16 - Sixteen.

Установите пока Half (1/2). Справа под Run Count появится число 4, так как 2^2=4. Это количество наблюдений, которое необходимо сделать. Количество прогонов в каждом наблюдении будет указано позже.

В поле Expression (Выражение) группы Result (Результат) введите выражение, по которому вычисляется вероятность обработки запросов: N$ObrZap/N$KolZap.

После группы Result (Результат) расположены два флажка, позволяющие выбирать опции.

При выборе опции Generate Run Procedure вместе с экспериментом создается стандартная процедура запуска, которую пользователь может корректировать согласно своим требованиям. Выбор второй опции Load F11 with CONDUCT Command закрепляет команду CONDUCT за функциональной клавишей F11. Тогда после создания объекта "Процесс моделирования" для запуска эксперимента нужно только нажать функциональную клавишу F11. Выберите обе опции.

Перед созданием эксперимента необходимо изучить группы смешивания с целью осуществления стратегического планирования эксперимента. Для этого нужно нажать кнопку Alias Groups (Группы смешивания). Появится диалоговое окно Alias Groups (Группы смешивания) (Рис. 1.4).

При изучении групп смешивания необходимо вначале найти отсутствующие факторы, а затем факторы, которые неразличимы, так как находятся в одной группе смешивания. Например, взаимодействие факторов А и В - АВ.

Диалоговое окно Alias Groups (Группы смешивания)

Рис. 1.4. Диалоговое окно Alias Groups (Группы смешивания)

Из Рис. 1.4 видно, что отсутствующих факторов нет. Факторы А, В и С находятся в различных группах смешивания по два фактора в каждом. Невозможно будет судить об эффектах, т. е. о влиянии на отклик взаимодействий двух факторов. В некоторых случаях этого будет достаточно.

Нажмите кнопку Cancel (Отмена).

В диалоговом окне Screening Experiment Generator (Генератор отсеивающего эксперимента) в группе Fraction (Часть дробного эксперимента) установите Full (ПФЭ). Под Run Count появится число 8.

Обратите внимание, что кнопка Alias Groups (Группы смешивания) при установке полного факторного эксперимента Full (ПФЭ) не будет активной.

Теперь необходимо создать Plus - операторы и вставить их в нижнюю часть модели Прямая задача. Для этого нажмите кнопку Insert Experiment (Вставить эксперимент), расположенную в левой нижней части диалогового окна Screening Experiment Generator (Генератор отсеивающего эксперимента).

Так как была выбрана опция Generate Run Procedure, то создана стандартная процедура запуска с именем Dis_Server_Run. Появится ее диалоговое окно, дающее возможность пользователю изменить процедуру запуска согласно своим требованиям (Рис. 1.5).

Диалоговое окно стандартной процедуры запуска

Рис. 1.5. Диалоговое окно стандартной процедуры запуска
Условия стандартной процедуры запуска по умолчанию

Рис. 1.6. Условия стандартной процедуры запуска по умолчанию

Перейдите, пользуясь клавишами вверх-вниз, в конец процедуры запуска. Там в разделе Set up your own run conditions (Задайте свои условия наблюдения) имеются две команды START, между которыми находится команда RESET (Рис. 1.6).

Поясним назначение этих команд.

Первой командой START

DoCommand("START 100,NP");	/*Get past the Startup Period. */

определяется количество прогонов в неустоявшемся режиме.

Подразумевается, что если моделирование выполняется долго, то система приходит в стационарное состояние. Сколько времени следует вести моделирование, чтобы достичь стационарного состояния? Часто ответ на этот вопрос можно получить из опыта экспериментирования с моделью. Команда RESET служит для этого. Она сбрасывает в ноль накопленную на неустоявшемся режиме статистику без удаления транзактов из процесса моделирования.

Второй командой START

DoCommand("START 1000,NP");	/*Run the Simulation. */

определяется количество прогонов в наблюдении, т. е. количество прогонов, которое было определено ранее при тактическом планировании эксперимента: N = 9604. Измените 1000 на 9604 (Рис. 1.7).

Корректировка процедуры запуска возможна до и после того, как она будет добавлена к объекту "Модель".

Условия стандартной процедуры запуска после корректировки

Рис. 1.7. Условия стандартной процедуры запуска после корректировки

После корректировки нажмите Ok.

Сгенерированный Plus - эксперимент представлен ниже. Изучите его. Это необходимо для создания собственных экспериментов, отличающихся от стандартных экспериментов GPSS World.

В начале автоматически сгенерированного эксперимента определяется и инициализируется в неопределенное состояние (UNSPECIFIED) матрица результатов. Далее имеются Plus - операторы, которые для каждого из наблюдений определяют сочетания уровней факторов. В рассматриваемом примере таких сочетаний восемь.

Plus - эксперимент содержит также вызов Plus - процедуры запуска. Процедура запуска осуществляет связь между генерируемым экспериментом и процессом моделирования. Она вызывается столько раз, сколько требуется сделать наблюдений. Так как процедура запуска вызывается Plus - экспериментом, ей разрешается вызывать библиотечную процедуру DoCommand и, следовательно, выполнять RMULT, CLEAR, RESET и многие другие команды GPSS. Поэтому все команды, необходимые для определения условий наблюдения, например, обнуление сохраняемых ячеек, следует помещать в процедуру запуска.

Для сохранения матрицы результатов при обнулении переменных перед очередным наблюдением используется команда CLEAR OFF. Для изменения начального числа генератора случайных чисел в каждом наблюдении процедуре передается номер запуска.

****************************************************
*            Dis_Server                            *
*     Факторный отсеивающий эксперимент            *
****************************************************
Dis_Server_Results	MATRIX	,2,2,2
	INITIAL Dis_Server_Results,UNSPECIFIED
Dis_Server_NextRunNumber EQU	0
EXPERIMENT Dis_Server() BEGIN

	/*  Наблюдение 1  */
	T1_ = 60;
	Koef = 0.5;
	Q_ = 300000;
	IF (StringCompare(DataType(Dis_Server_Results[1,1,1]),
			"UNSPECIFIED")'E'0)
	THEN BEGIN
/* Установить начальное значение переменной количества наблюдений */
	Dis_Server_NextRunNumber = 1;
/*  Записать данные наблюдения и запустить процесс моделирования*/
	Dis_Server_GetResult();
	Dis_Server_Results[1,1,1] = N$ObrZap/N$KolZap;
	END;
	/*  Наблюдение 2  */
	T1_ = 60;
	Koef = 0.5;
	Q_ = 700000;
	IF (StringCompare(DataType(Dis_Server_Results[1,1,2]),
			"UNSPECIFIED")'E'0)
	THEN BEGIN
/*  Записать данные наблюдения и запустить процесс моделирования */
	Dis_Server_GetResult();
	Dis_Server_Results[1,1,2] = N$ObrZap/N$KolZap;
	END;
	/*  Наблюдения 3 - 7 для краткости пропущены */
	/*  Наблюдение 8  */
	T1_ = 180;
	Koef = 1.5;
	Q_ = 700000;
	IF (StringCompare(DataType(Dis_Server_Results[2,2,2]),
			"UNSPECIFIED")'E'0)
	THEN BEGIN
/*  Записать данные наблюдения и запустить процесс моделирования */
	Dis_Server_GetResult();
	Dis_Server_Results[2,2,2] = N$ObrZap/N$KolZap;
	END;
/*  Эффекты смешивания в дробном факторном эксперименте */
	SE_Effects(Dis_Server_Results,"I");
END;
*******************************************************
*        Процедура запуска наблюдения                 *
*******************************************************
PROCEDURE Dis_Server_GetResult() BEGIN
/* Выполнить указанное число прогонов и записать результаты. */
/*  Факторы для этого наблюдения уже были определены.  */
TEMPORARY CurrentYield,ShowString,CommandString;
/*  Вызов процедуры запуска  */
    Dis_Server_Run(Dis_Server_NextRunNumber);
    CurrentYield = N$ObrZap/N$KolZap;
    ShowString = PolyCatenate("Run ",String(Dis_Server_NextRunNumber),". ", "" ); 
    ShowString = PolyCatenate(ShowString,"  Yield=",String(CurrentYield),". "); 
    ShowString = PolyCatenate(ShowString," T1_=",String(T1_), ";" ); 
    ShowString = PolyCatenate(ShowString," Koef=",String(Koef), ";" ); 
    ShowString = PolyCatenate(ShowString," Q_=",String(Q_), ";" ); 
    CommandString = PolyCatenate("SHOW """,ShowString,"""", "" ); 
    DoCommand(CommandString);
    Dis_Server_NextRunNumber = Dis_Server_NextRunNumber + 1;
    RETURN CurrentYield;
END;
*******************************************************
*                  Процедура запуска                  *
*******************************************************
PROCEDURE Dis_Server_Run(Run_Number) BEGIN
    DoCommand("CLEAR OFF");      /* Использовать OFF для сохранения результата. */
/* Увеличьте число команд RMULT, если у вас большее число ГСЧ. */
/* Задать новые случайные числа всем потокам случайных чисел. */
    TEMPORARY CommandString;
/* Вычислить, прежде чем перейти к DoCommand. */
    CommandString = Catenate("RMULT ",Run_Number#111);
/* DoCommand контролирует строку в глобальном контексте. */ 
    DoCommand(CommandString); 
/* Установить собственные условия наблюдения. */
    DoCommand("START 100,NP");     /* Пройти неустоявшийся режим. */
    DoCommand("RESET");                  /* Начать период измерений. */
    DoCommand("START 9604,NP");  /* Провести моделирование. */
END;

Проведем эксперимент. Для вызова эксперимента предназначена команда CONDUCT. Однако за функциональной клавишей [F11] была закреплена соответствующая команда CONDUCT (Edit / Settings / Function Keys (Правка / Настройки / Функциональные клавиши)).

Проведите трансляцию, т. е. создайте объект "Процесс моделирования", для чего нажмите [Ctrl]+[Alt]+[S] или выполните команду Command / Create Simulation (Команда / Создать процесс моделирования).

При отсутствии ошибок в сгенерированном эксперименте в окне Journal (Журнал) появится сообщение (Рис. 1.8), свидетельствующее об отсутствии ошибок. Нажмите функциональную клавишу [F11]. Эксперимент начинает работать.

Замечание. Во время эксперимента доступна только команда HALT. Остальные команды неактивны, т. е. процесс моделирования можно только остановить и потом продолжить, но просмотреть его с использованием меню, вызываемого командой WINDOW / SIMULATION WINDOW и другими командами, нельзя.

В ходе выполнения сгенерированного эксперимента автоматически создается отчет, который по готовности записывается в окно Journal (Журнал) объекта "Процесс моделирования". Фрагмент отчета для четырех наблюдений (Run1 … Run4) показан на Рис. 1.9. В отчете содержатся Yield - целевая функция и значения факторов, при которых получение значение целевой функции.

Окно Journal (Журнал) с сообщением об успешном создании объекта "Процесс моделирования"

Рис. 1.8. Окно Journal (Журнал) с сообщением об успешном создании объекта "Процесс моделирования"
Окно Journal (Журнал) с отчетами по каждому наблюдению

увеличить изображение
Рис. 1.9. Окно Journal (Журнал) с отчетами по каждому наблюдению

Так как эксперимент включает 8 наблюдений по 9604 прогонов в каждом из них, то будет выдано 8 отчетов (на Рис. 1.9 в целях сокращения показаны только первые четыре отчета). Окончательные результаты моделирования после статистической обработки будут выведены в виде таблицы Anova (Рис. 1.10).

В таблице каждый фактор и взаимодействие факторов представлены отдельной строкой. В каждой строке для всех эффектов указаны коэффициенты, с которыми они входят в целевую функцию (столбец Effect), а для главных эффектов (А, В, С) - суммы квадратов отклонений - столбец Sum of Squares.

В столбце Degrees of Freedom приведены степени свободы соответствующих измерений.

В столбце F-for Only Main Effects - вычисленные значения F-статистик для главных эффектов, а в столбце Critical Value of F (p=0,5) - соответствующие критические значения F - распределения для уровня значимости 50%.

В строке Error показаны остаточная составляющая дисперсии и соответствующая степень свободы.

В строке Total - общая сумма квадратов ошибок по всему эксперименту.

В строке Greand - среднее значение результата исследования (в примере - вероятности) по данным всего эксперимента.

Результаты дисперсионного анализа

увеличить изображение
Рис. 1.10. Результаты дисперсионного анализа

Чем больше значение F-статистики (F-for Only Main Effects), тем сильнее эффект. Эффект, а, следовательно, и фактор, считается значимым, если превышает критическое значение (Critical Value of F(p=.05)).

В данном примере факторы А и В являются значимыми, так как их F-статистики больше критического значения, равного 7.71. Обратите внимание, что эффекты факторов А и В противоположны.

Таким образом, по результатам моделирования можно сделать вывод, что при данном потоке и характеристиках сервера вероятность обработки запросов в среднем составляет 0,731, т. е. вероятность потерь запросов составляет 0,269. Для уменьшения потерь запросов нужно продолжить исследование каждого значимого фактора А и В.

Для того чтобы определить среднее количество запросов, которые будут обработаны при таких же значениях факторов, проведите ёще один дисперсионный анализ.

Для этого удалите сгенерированный эксперимент из программы модели. Затем выберите Edit / Insert Experiment / Screening … (Правка / Вставить эксперимент / Отсеивающий …). Всё, что вы ранее вводили (см. Рис. 1.3), останется неизменным. Вам нужно будет только заменить в поле Expression (Выражение) группы Result (Результат) выражение, по которому вычисляется вероятность обработки запросов, выражением для расчёта количества обработанных запросов: N$ObrZap/X$Prog.

После замены вставьте эксперимент и выполните его. Вы получите, что среднее количество обработанных запросов составит 25,889, а все факторы будут несущественными.

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >
Игорь Маникин
Игорь Маникин

Коллеги, спасибо за очень информативный и полезный курс. Прошёл три лекции. Столкнулся с проблемой, что обе модели не могут закончить расчёт по причине ограничения бесплатной версии "создано максимально допустимое число динамически создаваемых агентов (50000)". По скриншотам Лекции 2 видно, что да, модель создает гораздо больше 50000 агентов. В принципе, мне то и диплом не особо нужен. Но хотелось бы выполнить практические работы. Нет ли возможности откорректировать эту проблему? Или может я чего не так делаю?

Еще раз спасибо за прекрасный курс!

Артём Нагайцев
Артём Нагайцев

Выдает ошибку "entity cannot be resolved to a variable" при попытке запуска. В чем может быть причина? Ошибка в строках

entity.time_vxod=time(); 

time_obrabotki.add(time()-entity.time_vxod);