Вы находитесь на странице: 1из 10

2 Дробышев Сергей 4601BN

Содержание
1. Постановка задачи. ....................................................................................................................3
2. Разработка в среде Visual Studio 2005. ....................................................................................4
2.1. Интерфейс программы. ......................................................................................................4
2.1.1. Вкладка “Исходные данные”. .................................................................................4
2.1.2. Вкладка “Таблица”. .................................................................................................5
2.1.3. Вкладка “Статистика”. ............................................................................................6
2.2. Блок-схема реализованного алгоритма без интерфейсной части. .................................7
2.2.1. Укрупненная схема..................................................................................................7
2.2.2. InitializeModel(). .......................................................................................................8
2.2.3. UpdateStatistics(). .....................................................................................................8
2.2.4. GetNextEvent(). .........................................................................................................9
2.2.5. ArriveEvent(). ..........................................................................................................10
2.2.6. DepartEvent(). .........................................................................................................10
2.2.7. Report(). ...................................................................................................................11
2.3. Пояснения к реализованному алгоритму и тексту программы. ..................................12
3. Проверка качества генераторов случайных чисел. ..............................................................15
3.1. Генератор величин, распределенных по закону Эрланга. ............................................15
3.2. Генератор экспоненциального распределения. .............................................................17
3.3. Генератор нормально распределеннных значений. ......................................................18
4. Разработка в среде GPSS World. Валидация разработанной программы с помощью
модели в среде GPSS World. .......................................................................................................20
4.1. Программа в среде GPSS World ......................................................................................20
4.2. Результат одного прогона. ...............................................................................................20
4.3. Сравнение результатов с прогоном программы на Visual C++. ..................................21
5. Используемая литература. ......................................................................................................23
6. Текст программы на языке Visual C++. .................................................................................24
6.1. Файл Model.cpp. ................................................................................................................24
6.2. Файл StackEvent.h. ............................................................................................................24
6.3. Файл RandomGenerators.h. ...............................................................................................24
6.4. Файл ModelEvents.h. .........................................................................................................25
6.5. Файл MainForm.h. .............................................................................................................25
3 Дробышев Сергей 4601BN

1. Постановка задачи.

Система с очередями имеет один сервер и обслуживает поступающие заявки двух типов.
Заявки 1 типа образуют поток {1}. Заявки 2 типа поступают в систему с интервалом
времени, распределенным {2}. Они обслуживаются сервером с разным временем
обслуживания: заявки первого типа – {3}; заявки второго типа – {4}.. Если сервер занят,
когда поступает заявка, то заявка присоединяется к очереди с дисциплиной обслуживания
{5}. Время моделирования Tf=500 мин.

Результаты имитации отразить в таблице. В таблицу занести последовательно шаги


имитационного процесса. Каждая строка соответствует одному событию. В нее заносятся
разыгрываемые времена осуществления будущих событий и значения парамеров, которые
были изменены при наступлении текущего. В качестве следующего выбирается событие с
минимальным временем осуществления.
r
Событ. tm l1 l2 h S n Q
0 50 44 501 0 0 0
l2 44 - 75 54 1 0 0
l1 50 112 - - 1 1 1

В таблице использованы следующие обозначения для событий и переменных:

· L1 - прибытие следующей заявки типа 1;


· L2 - прибытие следующей заявки типа 2;
· tm - таймер модельного времени;
· S - статус сервера (0 – свободен, 1 – занят);
· h - окончание обслуживания текущей заявки. Для tm =0 h=501 мин.;
· n – текущая длина очереди;
· Q – содержимое очереди (1 заявка 1 типа, 2 заявка второго типа).

1. Реализовать модель системы, на любом языке программирования используя


событийный принцип отсчета модельного времени. Разработать генераторы случайных
чисел.
2. Протестировать реализованные генераторы случайных чисел.
3. Найти значения показателей функционирования системы заданные в колонках 6 и 7.
4. Провести валидацию разработанной модели используя, модель на языке GPSS.

Индивидуальный вариант:

1 2 3 4 5 6 7 8
Вероятность
Нормальное Коэффициент обслуживания
Эрланговский Пуассоновский
( µ = 14,σ =
Экспоненциальное
LIFO простоя заявки без
S.
( l=3,λ =0.25) (среднее=0.5) (λ =3) Drobiševs
1.5) сервера пребывания в
очереди
4 Дробышев Сергей 4601BN

2. РАЗРАБОТКА В СРЕДЕ VISUAL STUDIO 2005.


2.1. Интерфейс программы.

Главное окно программы содержит три вкладки. Работа с программой заключается в


последовательном переходе от первой до последней вкладки.

2.1.1. Вкладка “Исходные данные”.

Все необходимые исходные данные при старте программы устанавливаются в значения по


умолчанию – в соответствии со значениями индивидуального варианта. При
необходимости их можно изменить на этой вкладке в группе “Исходные данные”.

Предусмотрена возможность повторения эксперемента с одними и теми же


последовательностями случайных величин – для этого вместо системных часов для
инициализации генератора случайных чисел нужно ввести другое значение в группе
”Инициализация генератора”.

В группе “Сохранение выборок в файл” при нажатии на кнопку “Сохранить” в текущем


каталоге создаются три файла с указанным числом значений, распределенных по трем
законам:

erlang.txt
exp.txt
normal.txt

Данные из этих файлов затем можно экспортировать в статистическое приложение для


исследования качества используемых генераторов.

Во всех полях ввода реализована валидация введенных данных. Если в поле введены
данные в неправильном формате, около этого поля появляется иконка, при наведении
мышью на которую, появляется всплывающая подсказка с описанием ошибки:
5 Дробышев Сергей 4601BN

2.1.2. Вкладка “Таблица”.

После установки исходных данных на этой вкладке для начала процесса моделирования
необходимо нажать на кнопку “Запуск”. Ход процесса моделирования отражает прогресс-
бар в статусной строке.

В эту таблицу на каждом шаге процесса моделирования при возникновении события


заносятся их времена и значения параметров на момент поступления события.

При нажатии на кнопку “Сохранить результаты в файл” в текущем каталоге создается


файл с этой таблицей и итоговой статистикой с именем

simulation_текущая_временная_отметка.txt

Формат этого файла следующий:


6 Дробышев Сергей 4601BN

ИТОГОВАЯ СТАТИСТИКА

Поступление заявок
L1: 37
L2: 250
Всего заявок: 287
-------------------------------------------------------
Очередь
Вхождений L1 в очередь: 36
Вхождений L2 в очередь: 243
Всего вхождений в очередь: 279

Осталось в очереди L1: 5


Осталось в очереди L2: 89
Всего осталось в очереди: 94
-------------------------------------------------------
Сервер
Вхождений L1 без очереди: 1
Вхождений L2 без очереди: 7
Всего вхождений без очереди: 8

Всего вхождений L1: 32


Всего вхождений L2: 161
Всего вхождений на сервер: 193

Суммарное время простоя сервера: 8,475


Коэффициэнт простоя сервера: 0,017

Вероятность обслуживания заявки без очереди: 0,041


-------------------------------------------------------

Событие Время Приход L1 Приход L2 Уход Сервер В очереди (<-- верш.)Стек


*************************************************************************************************
0 Старт 0 5,316 1,539 501 Свободен 0
1 L2 на сервер 1,539 ------ 1,682 1,655 Занят 0
2 Освобождение 1,655 ------ ------ ------ Свободен 0
3 L2 на сервер 1,682 ------ 2,93 2,163 Занят 0
4 Освобождение 2,163 ------ ------ ------ Свободен 0
5 L2 на сервер 2,93 ------ 2,998 3,132 Занят 0
6 L2 в стек 2,998 ------ 3,681 ------ Занят 1 L2
7 Освобождение 3,132 ------ ------ ------ Свободен 1 L2
8 L2 из стека 3,132 ------ ------ 3,803 Занят 0
9 L2 в стек 3,681 ------ 7,744 ------ Занят 1 L2
10 Освобождение 3,803 ------ ------ ------ Свободен 1 L2
11 L2 из стека 3,803 ------ ------ 3,848 Занят 0
12 Освобождение 3,848 ------ ------ ------ Свободен 0
13 L1 на сервер 5,316 21,9 ------ 21,16 Занят 0
14 L2 в стек 7,744 ------ 8,136 ------ Занят 1 L2
15 L2 в стек 8,136 ------ 9,731 ------ Занят 2 L2 L2
16 L2 в стек 9,731 ------ 10,809 ------ Занят 3 L2 L2 L2
17 L2 в стек 10,809 ------ 11,123 ------ Занят 4 L2 L2 L2
.................................................................................................
.................................................................................................
.................................................................................................

Для начала следующего процесса моделирования необходимо нажать на кнопку


“Очистить таблицу”.

2.1.3. Вкладка “Статистика”.

На этой вкладке отображается итоговая статистика процесса моделирования.


7 Дробышев Сергей 4601BN

2.2. Блок-схема реализованного алгоритма без интерфейсной части.


2.2.1. Укрупненная схема.

Start

InitializeModel()

No currentTime <= modellingTime

Yes
currentTime = modellingTime
UpdateStatistics()

UpdateStatistics()

No nextEvent == L1

Report()
No nextEvent == L2 Yes

ArriveEvent(L1)
nextEvent ==
End Yes
Depart

ArriveEvent(L2)
Yes

DepartEvent()
No

GetNextEvent()
8 Дробышев Сергей 4601BN

2.2.2. InitializeModel().

Start

currentTime = 0.0;
nextEvent = -1; // не установлено
serverStatus = Idle;

// Инициализация списка будущих событий


// 0 – поступление L1; 1 – поступление L2; 2- уход заявки
futureEvents[0] = randValue->Erlang(erlangLen, erlangLambda);
futureEvents[1] = randValue->Poisson(poissonMean);
futureEvents[2] = modellingTime + 1;

// инициализация стека
eventStack = gcnew System::Collections::Generic::Stack<StackEvent^>();

// Инициализация статистических переменных


serverBusyTime = 0.0;
lastEventTime = 0.0;

l1WithoutQ = 0;
l2WithoutQ = 0;
l1Count = 0;
l2Count = 0;

L1FromStack = 0;
L2FromStack = 0;

return

2.2.3. UpdateStatistics().

Start

// Инфо о последнем событии


timeSinceLastEvent = currentTime - lastEventTime;
lastEventTime = currentTime;

// время занятости устройства


serverBusyTime += (double)serverStatus * timeSinceLastEvent;

return
9 Дробышев Сергей 4601BN

2.2.4. GetNextEvent().

Start

// принимаем за следующее событие приход L1


double minEvent = futureEvents[0];
int indexMin = 0;
i = 1;

i<3

Yes

futureEvents[i] <
minEvent

No Yes

minEvent = futureEvents[i];
No
indexMin = i;

i++;

nextEvent = indexMin;
currentTime = minEvent;

return
10 Дробышев Сергей 4601BN

2.2.5. ArriveEvent().

Start

No eventType == 0

Yes

eventType == 1
futureEvents[0] = currentTime + randValue->Erlang(erlangLen,
erlangLambda);

futureEvents[1] = currentTime + randValue->


Poisson(poissonMean); serverStatus == Busy
No Yes

serverStatus = Busy;
futureEvents[2] = currentTime+ randValue-> eventStack->Push(gcnew
serverStatus == Busy
Normal(normalSigma, normalMu); StackEvent(0, currentTime));
Yes
No l1WithoutQ++;

serverStatus = Busy;
eventStack->Push(gcnew
futureEvents[2] = currentTime + randValue-> l1Count++;
StackEvent(1, currentTime));
Exponential(expLambda);

l2Count++;

return

2.2.6. DepartEvent().

Start

serverStatus = Idle;

eventStack->Count == 0
No
// Стек пуст
serverStatus = Busy;
// выталкиваем из стека
StackEvent temp = eventStack->Pop();
Yes

temp->EventType == 0
No futureEvents[2] = System::Double::MaxValue;
// Вытолкнули L1

temp->EventType == 1
// Вытолкнули L2 Yes

futureEvents[2] = currentTime + randValue->


Normal(normalSigma, normalMu);
Yes
L1FromStack++;

futureEvents[2] = currentTime + randValue->


Exponential(expLambda); return
L2FromStack++;
11 Дробышев Сергей 4601BN

2.2.7. Report().
Start

// время простоя сервера


serverIdleTime = modellingTime - serverBusyTime;
// Коэффициэнт простоя сервера
lbIdleCoeff->Text = serverIdleTime / modellingTime;
// Вхождений L1 без очереди
lbL1WithoutQ->Text = l1WithoutQ;
// Вхождений L2 без очереди
lbL2WithoutQ->Text = l2WithoutQ;
// Всего вхождений без очереди
lbTotalWithoutQ->Text = l1WithoutQ + l2WithoutQ;

// Поступление заявок L1
lbL1Count->Text = l1Count;
// Поступление заявок L2
lbL2Count->Text = l2Count;
// Всего заявок
lbTotalCount->Text = l1Count + l2Count;

// Вероятность обслуживания заявки без очереди


lbProbWithoutQ->Text = (l1WithoutQ + l2WithoutQ)/(l1Count + l2Count);

int l1RemainInstack = 0;
int l2RemainInstack = 0;

for each (StackEvent^ se in eventStack)


{
if (se->EventType == 0) l1RemainInstack++;
else l2RemainInstack++;
}

// Осталось в очереди L1
lblL1RemainInstack->Text = l1RemainInstack;
// Осталось в очереди L2
lblL2RemainInstack->Text = l2RemainInstack;
// Всего осталось в очереди
lblRemainInstackTotal->Text = eventStack.Count;

// Вхождений L1 в очередь
lblL1InStack->Text = l1Count - l1WithoutQ;
// Вхождений L2 в очередь
lblL2InStack->Text = l2Count - l2WithoutQ;
// Всего вхождений в очередь
lblInStackTotal->Text = (l1Count - l1WithoutQ) + (l2Count - l2WithoutQ);

// Всего вхождений L1
lblL1ToServer->Text = l1WithoutQ + L1FromStack;
// Всего вхождений L2
lblL2ToServer->Text = l2WithoutQ + L2FromStack;
// Всего вхождений на сервер
lblToServerTotal->Text = (l1WithoutQ + L1FromStack) + (l2WithoutQ + L2FromStack);

return

Вам также может понравиться