Розглянемо, як використовуючи метод оберненої функції, можна змоделювати випадкову величину, розподілену за експоненційним законом. Нехай λ=1. Виконаємо апроксимацію експоненційного розподілу лінійними ділянками, щоб можна було використовувати її для моделювання методом оберненої функції. Для апроксимації достатньо 24-х точок.
У разі необхідності моделювання випадкової величини Х, роходіленої за експоненційним розподілом з λ≠1, яка використовується як затримка у часі (наприклад, для моделювання пуасонівського потоку надходження заявок), виконується наступним чином:
1) генерується значення випадкової величини, розподіленої за експоненційним розподілом з λ=1;
2) знаходиться добуток цього значення та математичне сподівання випадкової величини Х; у результаті отримаємо шукану послідовність значень шуканої величини Х.
8.Блок-схеми
Загальна блок-схема програми.
Блок-схема потоку обслуговування.
Блок-схема гнератора випадкових чисел.
Генератор випадкових чисел з експоненційним законом розподілу(в програмі використовується з попередньо згенерованим рівномірно розподіленим випадковим числом) .
Де: r – генерується на попередньому генераторі.
9.Технічні характеристики
1. Intel – сумісний процесор з тактовою частотою >50 Мгц
2. IBM – сумісний монітор
3. IBM-сумісний відео адаптер
4. Операційна система Windows 95 і вище.
5. Пакет розробки програмного забезпечення MicrosoftVisualStudio 6.0
6. 64 МbRAM
7.IBM-сумісна клавіатура
10. Результати моделювання
Дослід 1.
Середня довжина черги клієнтів типу 1: 954
Середня довжина черги клієнтів типу 2: 513
Загальна середня довжина черги: 733
Середній час очікування заявок типу 1: 8,475 сек.
Середній час очікування заявок типу 2: -
Загальний середній час очікування: -
Дослід 2.
Середня довжина черги клієнтів типу 1: 952
Середня довжина черги клієнтів типу 2: 509
Загальна середня довжина черги: 730
Середній час очікування заявок типу 1: 8,615 сек.
Середній час очікування заявок типу 2: -
Загальний середній час очікування: -
Дослід 3.
Середня довжина черги клієнтів типу 1: 954
Середня довжина черги клієнтів типу 2: 504
Загальна середня довжина черги: 729
Середній час очікування заявок типу 1: 8,987 сек.
Середній час очікування заявок типу 2: -
Загальний середній час очікування: -
Дослід 4.
Середня довжина черги клієнтів типу 1: 957
Середня довжина черги клієнтів типу 2: 510
Загальна середня довжина черги: 733
Середній час очікування заявок типу 1: 8,991 сек.
Середній час очікування заявок типу 2: -
Загальний середній час очікування: -
Дослід 5.
Середня довжина черги клієнтів типу 1: 958
Середня довжина черги клієнтів типу 2: 509
Загальна середня довжина черги: 733
Середній час очікування заявок типу 1: 9,049 сек.
Середній час очікування заявок типу 2: -
Загальний середній час очікування: -
11.Висновки
Після проведення експериментів можна зробити такі висновки:
Система працює стабільно, але не ефективно. Дуже швидко зростає довжина черги, це пов”язане із тим, що система не справляється із поступаючим потоком заявок. Існує також проблема того, що клієнти типу 2 взагалі не обслуговуються. Ймовірність простою системи рівна нулю, оскільли заявки надходять на багато швидше ніж система може їх опрацювати.
Отже, можна дати такі рекомендації щодо покращення системи:
1. Зменшення часу обслуговування (особливо клієнтів типу 1).
2. Збільшення періоду між надходженням заявок (особливо клієнтів типу 1).
3. Введення в систему додаткового обслуговуючого пристрою.
Особисто на мій погляд, найкращим є третій варйант. Він дає можливість розвантажити систему, але без зменшення її продуктивності.
Список використаної літератури
1. Саати Т. Л. Элементы теории обслуживания. М.: Советское радио , 1971.
2. Гнеденко Б. В., Коваленко И. Н. Введение в теорию массового обслуживания , 2-е изд. М.:Наука , 1987.
3. Советов Б.Я., Яковлев С.А. “Моделирование систем” Учебник для ВУЗов- М.: Высшая школа , 1985.
4. Рябов В.Ф.,Советов Б.Я.Яковлев С.А. Машинное моделирование при проектировании больших систем .Л., 1978
5. Сочнев А.В.,Яковлев С.А. Методические указания к выполнению курсовой работы по дисциплине “Моделирование систем” Л.,1986.
6. Якимов И.М.,Мосунов В.Е.,Яхина З.Т. Имитационное моделирование сложных систем. Казань,1984.
7. Ивахненко А.Г.,Юрачковский Ю.П. Моделирование сложных систем по экспериментальным данным.М., 1987.
8. Имитационное моделирование в задачах синтеза структуры сложных систем /А.Д.Цвиркун и др.М.,1985.
Додаток 1.
Лістинг програми на мові С++
Файл functions.h
#include <math.h>
#define a 16807
#define m 2147483647;
#define LAMBDAi 2;
double p = (int)GetTickCount();
//генераторнормальнорозподіленихвипадковихчисел
doubleRand(doublep0)
{
double t, x, q;
x = a * p0;
t = x / m;
q = (int)t;
p = x - q * m;
t = p / m
return t;
}
// генератор випадкових чисел, розподілених по експоненційному закону
double Exponent(UINT lambda)
{
double r;
r = Rand(p);
return ( (-1 / lambda) * log(r) );
}
//return -1000 ... +1000
int Generator()
{
double d1;
int res;
static bool b = TRUE;
d1 = Exponent(900000);
res = (int)d1;
if(res<0) res *= -1;
while(res>1000)
{
res = (int)res / 2;
}
if(b) res *= -1;
b = !b;
return res;
}
//////////////////////////////////////////////////////////////////////////////
void IntToStr(char *lpResultBuff, int iDigit)
{
// PARAMETRS:
// lpResult -- buffer, wich will get string
// iDigit -- integer digit, wich will translated to string
wsprintf(lpResultBuff, "%d", iDigit);
return;
}
#define MESSAGE(szText) MessageBox(0, szText, "Kursova", 0);
Файл types.h
typedef struct _CLIENT
{
UINT uIn;
UINT uOut;
UINT uNumber;
} CLIENT;
Файл Kursova.cpp
#include "stdafx.h"
#include <shlwapi.h>
#include <fstream.h>
#include "resource.h"
#include "functions.h"
#include "types.h"
////////// all times in miliseconds
#define CLIENT1_SERVTIME 3000
#define CLIENT2_SERVTIME 2000
#define CLIENT1_COMETIME 1500
#define CLIENT2_COMETIME 3000
#define TIME_RATIO 1 //1 - 1min == 1sec
//0.5 - 1min == 0.5sec
// prototipes ///////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);
DWORD WINAPI ServerThread(HWND);
DWORD WINAPI Client1Thread(HWND);
DWORD WINAPI Client2Thread(HWND);
VOID CALLBACK TimerProc(HWND, UINT, UINT, DWORD);
void Serving(CLIENT*, UINT, UINT);
/////////////////////////////////////////////////////////////////////////////////////
// global variables /////////////////////////////////////////////////////////////////
char szResults[150];
UINT uWorkingTime = 0;
HANDLE hServerThread, hClient1Thread, hClient2Thread;
DWORD dwServerID, dwTread1ID, dwTread2ID;
HWND hMainWindow;
HANDLE hSemaphore;
UINT uTimerID;
//controls
UINT uTurn1 = 0;
UINT uTurn2 = 0;
UINT uTurn = 0;
//turns
bool bCMOWork = TRUE;
CLIENT Turn1[5000] = {0, 0, 0};
UINT uAmount1 = 0; //кількість
CLIENT Turn2[5000] = {0, 0, 0};
UINT uAmount2 = 0;
// code /////////////////////////////////////////////////////////////////////////////
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//create semaphore
hSemaphore = CreateSemaphore(NULL, 1, 1, "JustASemaphore");
if(hSemaphore==NULL)
{
MessageBox(NULL, "Failed to create semaphore.", "Kursova", 0);
return 0;
}
DialogBoxParam(hInstance, (LPSTR)IDD_DIALOG1, NULL, (DLGPROC)WindowProc, 0);
return 0;
}
//*****
LRESULT CALLBACK WindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_COMMAND:
if(LOWORD(wParam) == IDC_QUIT)
SendMessage(hWnd, WM_CLOSE, 0, 0);
case WM_INITDIALOG:
//create clients generators
hClient1Thread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Client1Thread,
hWnd, 0, &dwTread1ID);
hClient2Thread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Client2Thread,
hWnd, 0, &dwTread2ID);
if(hClient1Thread==NULL || hClient2Thread==NULL)
{
MessageBox(NULL, "Can't create client threads", "Kursova", 0);
PostMessage(hWnd, WM_CLOSE, 0, 0);
}
//create server thread
hServerThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ServerThread,
hWnd, 0, &dwServerID);
if(hServerThread == NULL)
{
MessageBox(NULL, "Can't create server thread", "Kursova", 0);
PostMessage(hWnd, WM_CLOSE, 0, 0);
}
//create timer
uTimerID = SetTimer(0, 0, 1000, TimerProc);
if(uTimerID==NULL)
{
MessageBox(NULL, "Can't create timer", "Kursova", 0);
PostMessage(hWnd, WM_CLOSE, 0, 0);
}
hMainWindow = hWnd;
break;
case WM_CLOSE:
TerminateThread(hServerThread, 0);
TerminateThread(hClient1Thread, 0);
TerminateThread(hClient2Thread, 0);
CloseHandle(hSemaphore);
KillTimer(0, uTimerID);
EndDialog(hWnd, 0);
break;
}
return FALSE;
}
/// main thread, wich is serv clients ///////////////////////////////////////////////
DWORD WINAPI ServerThread(HWND hWnd)
{
UINT uServing1 = 0;
UINT uServing2 = 0;
UINT uCount;
bool bWait;
CLIENT Client;
UINT ClientType;
UINT uServingTime;
char cBuff[100]; //!!!!!!!! 100 --> 10
UINT TurnLength;
ofstream File;
File.open("Results.txt");
for(uCount=0; uCount<=1000; uCount++)
{
do
{
WaitForSingleObject(hSemaphore, INFINITE);
if(uServing1 >= uAmount1)
{
if(uServing2 >= uAmount2) bWait = TRUE;
else
{
Client = Turn2[uServing2];
ClientType = 2;
uServing2++;
bWait = FALSE;
}
}
else
{
Client = Turn1[uServing1];
ClientType = 1;
uServing1++;
bWait = FALSE;
}
ReleaseSemaphore(hSemaphore, 1, NULL);
Sleep(0);
}
while(bWait==TRUE);
//update main window
if(ClientType == 1)
{
uTurn1--;
IntToStr(cBuff, uTurn1);
SendDlgItemMessage(hWnd, IDC_TURN1, WM_SETTEXT, 0, (long)cBuff);
}
else
{
uTurn2--;
IntToStr(cBuff, uTurn2);
SendDlgItemMessage(hWnd, IDC_TURN2, WM_SETTEXT, 0, (long)cBuff);
}
uTurn--;
IntToStr(cBuff, uTurn);
SendDlgItemMessage(hWnd, IDC_TURN, WM_SETTEXT, 0, (long)cBuff);
//serving client
//generate serving time and sleep for this time
uServingTime = (unsigned)(Generator() * TIME_RATIO);
if(ClientType==1) uServingTime += (unsigned)(CLIENT1_SERVTIME * TIME_RATIO);
else uServingTime += (unsigned)(CLIENT2_SERVTIME * TIME_RATIO);
Serving(&Client, ClientType, uServingTime);
//save results in Results.txt
File << "Клієнт номер: " << uCount << endl;
File << " тип: " << ClientType << endl;
File << " порядковий номер у групі: " << uCount << endl;
File << " поступив у чергу: " << Client.uIn << endl;
File << " обслугований: " << Client.uOut << endl;
File << " час роботи системи: " << uWorkingTime << endl;
File << " черга клієнтів 1 : " << uAmount1 << endl;
File << " черга клієнтів 2 : " << uAmount2 << endl;
//update main window
if(ClientType == 1)
{
IntToStr(cBuff, uServing1);
SendDlgItemMessage(hWnd, IDC_SERVED1, WM_SETTEXT, 0, (long)cBuff);
}
else
{
IntToStr(cBuff, uServing2);
SendDlgItemMessage(hWnd, IDC_SERVED2, WM_SETTEXT, 0, (long)cBuff);
}
IntToStr(cBuff, uServing1+uServing2);
SendDlgItemMessage(hWnd, IDC_SERVED, WM_SETTEXT, 0, (long)cBuff);
} // while(TRUE) Sleep(10000);
SendMessage(hWnd, WM_CLOSE, 0, 0);
File.close();
return 0;