Смекни!
smekni.com

Моделювання однофазної системи (стр. 4 из 5)

Розглянемо, як використовуючи метод оберненої функції, можна змоделювати випадкову величину, розподілену за експоненційним законом. Нехай λ=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;