Решение обратной задачи

Для решения обратной задачи возьмем количество запросов, ожидаемое время обработки которых нужно определить, N =16 - результат решения прямой задачи.

Программа модели приведена ниже.

; Обработка запросов сервером. Обратная задача; Задание исходных данныхT1_ EQU 120; Средний интервал поступления запросов, сS1_ EQU 60000000; Среднее значение вычислительной сложности запросов, опS2_ EQU 200000; Стандартное отклонение вычислительной сложности запросов, опQ_ EQU 600000; Среднее значение производительности сервера, оп/cKoef EQU 1; Коэффициент изменения характеристик нормального распределенияKoef1 EQU 1; Коэффициент учета дробной частиN_ EQU 16; Количество запросов; Сегмент имитации обработки запросов GENERATE (Exponential(1,0,T1_)); Источник запросовKolZap GATE NU Server,PotZap; Свободен ли сервер? Если да, то SEIZE Server; занять сервер ADVANCE ((Normal(2,(S1_#Koef),(S2_#Koef)))/Q_); Имитация обработки запроса RELEASE Server; Освободить сервер TRANSFER,ObrZap; Запрос отправляется в сегмент завершения моделированияPotZap TERMINATE; Потерянные запросы; Сегмент организации завершения моделирования и расчета результатовObrZap TEST L X$Prog,TG1,Met1; Если X$Prog < TG1, SAVEVALUE Prog,TG1; то X$Prog = TG1 SAVEVALUE NZap,0; Обнуление счетчика обработанных запросовMet1 SAVEVALUE NZap+,1; Счет количества обработанных запросов TEST E X$NZap,N_,Ter1; Если X$NZap = N_, то TEST E TG1,1,Met2; если TG1 = 1, то SAVEVALUE VerObr,(N$ObrZap/N$KolZap); расчет и сохранение в ячейке VerObr вероятности обработки запросов SAVEVALUE TimeNZap,((AC1-X$AC2)/(X$Prog#Koef1));расчет и сохранение в ячейке TimeNZap времени обработки запросов SAVEVALUE AC2,AC1; Запомнить абсолютное модельное время в ячейке АС2Met2 SAVEVALUE NZap,0; Обнуление счетчика обработанных запросов TERMINATE 1Ter1 TERMINATE START 1000,NP; Прогоны до установившегося режима RESET; Сброс накопленной статистики START 9604; Количество прогонов модели

При решении обратной задачи один прогон определяется заданным количеством запросов N_, а не временем моделирования. Для этого организован счетчик обработанных запросов в виде сохраняемой ячейки NZap. Как только содержимое X$NZap = N_, из счетчика завершений вычитается единица.

Для расчета времени обработки заданного количества запросов используется арифметическое выражение (AC1-X$AC2)/X$Prog. В состав этого выражения входят абсолютное модельное время АС1 и опять количество прогонов. Запоминается количество прогонов также как и при решении прямой задачи.

Кроме этого, в арифметическом выражении есть сохраняемая ячейка X$AC2. Дело в том, что команда RESET не влияет на абсолютное модельное время АС1. Время же выполнения 1000 прогонов до установившегося режима не должно участвовать в расчете. Поэтому оно запоминается, а затем вычитается из абсолютного модельного времени выполнения 1000 + 9604 = 10604 прогонов. Количество прогонов до установившегося режима может быть и другим.

В результате моделирования получим время обработки 16 запросов 3523,658 с.

Фрагмент из отчета моделирования приведен ниже:

SAVEVALUE RETRY VALUEPROG 0 9604.000NZAP 0 0VEROBR 0 0.546TIMENZAP 0 3523.658

А почему не 3600 с? Ведь это же время моделирования было задано при решении прямой задачи. Потому что мы отбросили дробную часть, т. е. взяли 16, а не 16,345. Как же поступить, чтобы учесть и отброшенную дробную часть? Ведь в счетчике фиксируются обработанные запросы только целыми числами, а не дробными?

Для учета десятых долей дробной части зададим N_ = 163, т. е. увеличим в 10 раз. Это нужно учесть и в арифметическом выражении: ((AC1-X$AC2)/(X$Prog#Koef1)). Переменной пользователяKoef1 задается значение 10. По завершении моделирования получим 3586,504. Этот результат уже ближе к 3600.

Для учета сотых долей дробной части зададим N_ = 1634, а Koef1 = 100. Получим 3595,399 с.

Вероятность обработки запросов во всех случаях практически одна и та же, т. е. 0,54 Однако время моделирования существенно возрастает: 4 с, 39 с и 6 мин 29 c, т. е. в 10 и 100 раз соответственно.

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

Например (см. сегмент организации завершения моделирования и расчета результатов):

ADVANCE ((Normal(2,(S1_#Koef),(S2_#Koef)))/Q_); Розыгрыш времени обработки запросаSAVEVALUE VerObr,(N$ObrZap/N$KolZap)); Расчет вероятности обработки запросовSAVEVALUE TimeNZap,((AC1-X$AC2)/(X$Prog#Koef1));Расчет среднего времени обработки запросов

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: