Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Форма.docx
Скачиваний:
22
Добавлен:
12.02.2016
Размер:
275.07 Кб
Скачать

Висновок

Таким чином поставлена задача про створення програми, що дозволяє змоделювати багатоканальну систему масового обслуговування з обмеженою довжиною черги, вирішена. Створена програма дозволяє зробити розрахунок таких параметрів системи як:

  1. Pi - імовірності станів;

  2. Pвід - імовірність відмовлення;

  3. a - абсолютну пропускну здатність системи;

  4. q - відносну пропускну здатність системи;

  5. tоч - середній час чекання в черзі;

  6. tсист - середній час перебування в системі;

  7. Nреаліз - число реалізацій для досягнення імовірності відмовлення відмінної від теоретичної на величину  ;

при заданих початкових умовах :

  • n - число каналів обслуговування;

  • m - число місць у черзі;

  •  - інтенсивність надходження заявок;

  •  - інтенсивність обслуговування;

  •  - точність для розрахунку числа реалізацій;

  •  - рівень довіри.

А також візуально простежити роботу системи і порівняти теоретичні та практичні результати розрахунків. Програма може підлягати подальшій доробці , наприклад можна задати ще декілька різних законів розподілу для інтенсивностей  і  чи зробити так, щоб система сама вибирала оптимальний час роботи, тобто час коли система ввійде в сталий режим.

Список використаної літератури

1. Советов, Б. Я. Моделирование систем [Текст]: навчальний посібник / Б. Я. Советов,С. А. Яковлев – М.: Высшая школа, 2001. – 343c. – ISBN 966- 574-022-9

2. Советов, Б. Я. Моделирование систем [Текст] / Б. Я. Советов – Практикум. – М.: Высшая школа, 2003. – 295c. – ISBN 966-346-160-4

3. Наконечний, С. І. Стохастичні процеси та моделі в економіці, соціології, екології [Текст] / С. І. Наконечний, В. І. Жлуктенко, С. С. Савіна: Навч. посібник. – К.: КНЕУ, 2002. – 226 с. – ISBN: 966-574-422-4

4. Ситник, В. Ф. Імітаційне моделювання [Текст] / В. Ф. Ситник, Н. С. Орленко: Навч. посібник. – К.: КНЕУ, 1998. –232 с. – ІSBN 966-574- 404-6

5. Афанасьев, М. Ю. Исследование операций в экономике: модели, задачи, решения [Текст] / М. Ю. Афанасьев, Б. П. Суворов: Учеб. пособие. – М.: ИНФРА-М, 2003. – 444 с. – ISBN 966-683-024-8

Додаток

Лістинг програми в С++:

//**********************СМО з обмеженою довжиною черги*********************

#include <conio.h>

#include <iostream.h>

#include <math.h>

#include <stdlib.h>

#include <dos.h>

#include <stdio.h>

#include <string.h>

#define size 10

#define DOWN 80

#define UP 72

#define ENTER 13

float lam=7;

float mu=2;

int n=5;

int m=7;

float Q=0.97;

float eps=0.03;

struct Request

{

int Num;

unsigned long Time;

unsigned long Time_format;

};

struct Channel

{

int Busy;

int NumReq;

unsigned long TimeBegin;

unsigned long TimeBegin_format;

float TimeToProcess;

};

Channel ChanArray[size];

Request ReqArray[size];

float ProcTime[size];

int ReqInArray;

long unsigned LastRequestTime;

float LastRivnVar;

int CurReqNum=1;

void Phon(void);

//-------------------------------Степiнь числа------------------------------

unsigned long Stepen(int a,int b)

{

unsigned long s=a;

for(int i=1;i<b;i++)

s*=a;

return s;

}

//--------------------------------------------------------------------------

//------------------------------Факторiал числа-----------------------------

int Faktor(int c)

{

int i=1;

int f=1;

do

f*=i++;

while (i<=c);

return f;

}

//--------------------------------------------------------------------------

//------------------------------Системний час-------------------------------

unsigned long GetSTime(int format)

{

struct time t;

gettime(&t);

if (!format)

return ((unsigned long)t.ti_hour*1000000+(unsigned long)t.ti_min*10000+(unsigned long)t.ti_sec*100+(unsigned long)t.ti_hund);

else

return ((unsigned long)t.ti_hour*100*60*60+(unsigned long)t.ti_min*100*60+(unsigned long)t.ti_sec*100+(unsigned long)t.ti_hund);

}

//--------------------------------------------------------------------------

//-----Генератор псевдо-виподкових чисел з рiвномiрним розподiлом-----------

float RivnRoz()

{

int i;

unsigned long n;

float nn;

i=random(100);

const int M=1236;

const int L=3;

const int n0=225;

const int m=300;

n=Stepen(L,i)*n0+((M*(Stepen(L,i)-1)/(L-1)))%m;

nn=(n-(n/1000)*1000)/1000.0;

return (nn*2*lam);

}

//--------------------------------------------------------------------------

//--------------------------Формування заявок-------------------------------

int GetRequest(Request &rq)

{

int f=0;

unsigned long SystemTime;

SystemTime=GetSTime(1);

if ((SystemTime-LastRequestTime)>=LastRivnVar)

{

delay(1);

LastRivnVar=RivnRoz();

rq.Num=CurReqNum;

rq.Time=SystemTime;

rq.Time_format=GetSTime(0);

LastRequestTime=SystemTime;

if (CurReqNum>=100) CurReqNum=1;

else CurReqNum++;

f=1;

}

// else cout<<"\n????";

// getch();

return f;

//--------------------------------------------------------------------------

//--------------------------Звiльнення каналiв------------------------------

}

void CheckChannels(int &SumBusyChan)

{

unsigned long SystemTime;

unsigned long t;

int th,tx,ts,tm;

SystemTime=GetSTime(1);

for(int i=0;i<n;i++)

if (ChanArray[i].Busy)

{

SumBusyChan++;

if (SystemTime-ChanArray[i].TimeBegin>=ChanArray[i].TimeToProcess)

{

ChanArray[i].Busy=0;

t=GetSTime(0);

tm=t%100;

ts=(t%10000)/100;

tx=(t%1000000)/10000;

th=(t%100000000)/1000000;

gotoxy(16,22);

cprintf("Заявка №%d покинула систему о %d:%d:%d.%d ",ChanArray[i].NumReq,th,tx,ts,tm);

}

}

}

//--------------------------------------------------------------------------

//--------------------------Обслуговування заявок---------------------------

int ProcessRequest(Request &rq)

{

int f=0;

for(int i=0;i<n;i++)

if (!ChanArray[i].Busy)

{

ChanArray[i].TimeBegin=GetSTime(1);

ChanArray[i].TimeBegin_format=GetSTime(0);

ChanArray[i].TimeToProcess=ProcTime[i];

ChanArray[i].Busy=1;

ChanArray[i].NumReq=rq.Num;

f=1;

break;

}

return f;

}

//--------------------------------------------------------------------------

//--------------------------Формування черги--------------------------------

int InsertIntoOchered(Request &rq,long &vid)

{

int f=0;

if (ReqInArray<m)

{

ReqArray[ReqInArray++]=rq;

f=1;

}

else

{

gotoxy(16,22);

cout<<"Заявцi було вiдмовила в обслуговуваннi ";

vid++;

}

return f;

}

//--------------------------------------------------------------------------

//------------------------Видiлення заявок з черги--------------------------

int GetFromOchered(Request &rq)

{

int f=0;

if (ReqInArray>0)

{

rq=ReqArray[0];

for(int i=0;i<ReqInArray-1;i++)

{

ReqArray[i].Time=ReqArray[i+1].Time;

ReqArray[i].Time_format=ReqArray[i+1].Time_format;

ReqArray[i].Num=ReqArray[i+1].Num;

}

ReqInArray--;

f=1;

}

return f;

}

//--------------------------------------------------------------------------

//----------------------------Теоретичнi обрахунки--------------------------

void TeoretObrahynok(void)

{

float Tobsl,Toch,Tsystem,psi,P0,P1,x;

float Pvid,q,a,z;

float r=0;

Tobsl=1/mu;

psi=lam/mu;

P0=0;

x=psi/n;

for(int i=0;i<=n;i++)

P0+=pow(psi,i)/Faktor(i);

for(i=1;i<=m;i++)

P0+=pow(psi,n+i)/(Faktor(n)*pow(n,i));

P0=1/P0;

Pvid=(pow(psi,(n+m))/(pow(n,m)*Faktor(n)))*P0;

q=1-Pvid;

a=lam*q;

z=a/mu;

for(i=0;i<m;i++)

r+=(i+1)*pow(x,i);

r*=((pow(psi,(n+1))*P0)/(Faktor(n)))/n;

Toch=r/lam;

Tsystem=Toch+q*Tobsl;

//вивод результатiв

Phon();

textcolor(BLACK);

textbackground(BLACK);

gotoxy(14,22);

cprintf(" ");

for(i=4;i<22;i++)

{

gotoxy(67,i);

putch(' ');

}

textcolor(WHITE);

textbackground(BLUE);

gotoxy(13,3);

cprintf("г================Теоретичнi розрахунки===============¬");

gotoxy(13,4);

cprintf("¦ lam=%.2f mu=%.2f n=%d m=%d Q=%.2f eps=%.4f ¦",lam,mu,n,m,Q,eps);

gotoxy(13,5);

cprintf("¦=============================================T======¦");

gotoxy(13,6);

cprintf("¦ Iмовiрнiсть простою каналу обслуговування Po¦%.4f¦",P0);

gotoxy(13,7);

cprintf("¦=============================================+======¦");

gotoxy(13,8);

cprintf("¦ Iмовiрнiсть вiдмови Pvid ¦%.4f¦",Pvid);

gotoxy(13,9);

cprintf("¦=============================================+======¦");

gotoxy(13,10);

cprintf("¦ Вiдносна пропускна здатнiсть q ¦%.4f¦",q);

gotoxy(13,11);

cprintf("¦=============================================+======¦");

gotoxy(13,12);

cprintf("¦ Абсолютна пропускна здатнiсть a ¦%.4f¦",a);

gotoxy(13,13);

cprintf("¦=============================================+======¦");

gotoxy(13,14);

cprintf("¦ Середнє число зайнятих каналiв z ¦%.4f¦",z);

gotoxy(13,15);

cprintf("¦=============================================+======¦");

gotoxy(13,16);

cprintf("¦ Середнє число заявок у черзi r ¦%.4f¦",r);

gotoxy(13,17);

cprintf("¦=============================================+======¦");

gotoxy(13,18);

cprintf("¦ Середнiй час чекання в черзi Toch ¦%.4f¦",Toch);

gotoxy(13,19);

cprintf("¦=============================================+======¦");

gotoxy(13,20);

cprintf("¦ Середнiй час перебування в системi Tsystem ¦%.4f¦",Tsystem);

gotoxy(13,21);

cprintf("L=============================================¦======-");

}

//--------------------------------------------------------------------------

//-----------------------------------Модель---------------------------------

void Model(void)

{

LastRequestTime=0;

LastRivnVar=0;

ReqInArray=0;

for(int i=0;i<n;i++)

ChanArray[i].Busy=0;

for(i=0;i<n;i++)

ProcTime[i]=lam/mu*50;//*5.5;

Request rq,rqTmp;

float Tobsl,Toch,Tsystem;

float q,a,z;

float r=0;

long shet=0;

long vid=0;

long schetReq=0;

float p,NumRealiz,TimeRealiz;

int SumBusyChan=0;

int SumReqInOcher=0;

unsigned long t;

int th,tx,ts,tm;

Phon();

textcolor(WHITE);

textbackground(BLUE);

gotoxy(3,2);

cprintf("г========T===T=======T===========T=========T========¬");

gotoxy(3,3);

cprintf("¦ ¦ № ¦ Занят.¦ Час пост. ¦Час обсл.¦№ заявки¦");

gotoxy(3,4);

cprintf("¦========+===+=======+===========+=========+========¦");

gotoxy(3,5);

cprintf("¦ Канали ¦ 1 ¦ ¦ ¦ ¦ ¦");

for(i=2;i<=n;i++)

{

gotoxy(3,4+i);

cprintf("¦ ¦ %d ¦ ¦ ¦ ¦ ¦",i);

}

gotoxy(3,5+n);

cprintf("¦========+===+=======+===========+=========+========¦");

gotoxy(3,6+n);

cprintf("¦ Черга ¦ 1 ¦ ¦ ¦ ¦ ¦");

for(i=2;i<=m;i++)

{

gotoxy(3,5+n+i);

cprintf("¦ ¦ %d ¦ ¦ ¦ ¦ ¦",i);

}

gotoxy(3,6+n+m);

cprintf("L========¦===¦=======¦===========¦=========¦========-");

textcolor(BLACK);

textbackground(BLACK);

gotoxy(4,7+n+m);

cprintf(" ");

for(i=3;i<7+n+m;i++)

{

gotoxy(56,i);

putch(' ');

}

textcolor(WHITE);

textbackground(BLUE);

gotoxy(59,4);

cprintf("г=================¬");

gotoxy(59,5);

cprintf("¦ Показники СМО ¦");

gotoxy(59,6);

cprintf("¦======T==========¦");

gotoxy(59,7);

cprintf("¦ Pvid ¦ ¦");

gotoxy(59,8);

cprintf("¦ q ¦ ¦");

gotoxy(59,9);

cprintf("¦ a ¦ ¦");

gotoxy(59,10);

cprintf("¦ z ¦ ¦");

gotoxy(59,11);

cprintf("¦ r ¦ ¦");

gotoxy(59,12);

cprintf("¦ Tche ¦ ¦");

gotoxy(59,13);

cprintf("¦ Tsys ¦ ¦");

gotoxy(59,14);

cprintf("¦ Nrel ¦ ¦");

gotoxy(59,15);

cprintf("¦ Trel ¦ ¦");

gotoxy(59,16);

cprintf("L======¦==========-");

textcolor(BLACK);

textbackground(BLACK);

gotoxy(60,17);

cprintf(" ");

for(i=4;i<17;i++)

{

gotoxy(78,i);

putch(' ');

}

textcolor(WHITE);

textbackground(BLUE);

gotoxy(15,21);

cprintf("г==================================================¬");

gotoxy(15,22);

cprintf("¦ ¦");

gotoxy(15,23);

cprintf("L==================================================-");

textcolor(BLACK);

textbackground(BLACK);

gotoxy(16,24);

cprintf(" ");

for(i=22;i<25;i++)

{

gotoxy(67,i);

putch(' ');

}

textcolor(WHITE);

textbackground(BLUE);

do

{

CheckChannels(SumBusyChan);

if (GetRequest(rqTmp))

{

schetReq++;

if (!ProcessRequest(rqTmp))

InsertIntoOchered(rqTmp,vid);

}

for(int i=0;i<n;i++)

if (!ChanArray[i].Busy)

if (GetFromOchered(rqTmp))

{

ChanArray[i].TimeBegin=GetSTime(1);

ChanArray[i].TimeBegin_format=GetSTime(0);

ChanArray[i].TimeToProcess=ProcTime[i];

ChanArray[i].Busy=1;

ChanArray[i].NumReq=rqTmp.Num;

}

shet++;

SumReqInOcher+=ReqInArray;

// p=(float)vid/schetReq;

z=(float)SumBusyChan/shet;

r=(float)SumReqInOcher/shet;

a=z*mu;

q=a/lam;

p=1-q;

Toch=r/lam;

Tobsl=1/mu;

Tsystem=Toch+q*Tobsl;

NumRealiz=p*(1-p)*Q*Q/(4*eps*eps);

TimeRealiz=NumRealiz*Tsystem;

for(i=0;i<n;i++)

if (ChanArray[i].Busy)

{

gotoxy(19,5+i);

cprintf("Так");

gotoxy(25,5+i);

t=ChanArray[i].TimeBegin_format;

tm=t%100;

ts=(t%10000)/100;

tx=(t%1000000)/10000;

th=(t%100000000)/1000000;

cout<<" ";

gotoxy(25,5+i);

cprintf("%0d:%0d:%0d.%0d",th,tx,ts,tm);

gotoxy(40,5+i);

cprintf("%.0f",lam/mu*100);

gotoxy(51,5+i);

cprintf("%d",ChanArray[i].NumReq);

}

else

{

gotoxy(19,5+i);

cprintf("Нi ");

gotoxy(25,5+i);

cprintf(" ");

gotoxy(40,5+i);

cprintf(" ");

gotoxy(51,5+i);

cprintf(" ");

}

for(int j=0;j<m;j++)

if (j<ReqInArray)

{

gotoxy(19,6+n+j);

cprintf("Так");

gotoxy(25,6+n+j);

t=ReqArray[j].Time_format;

tm=t%100;

ts=(t%10000)/100;

tx=(t%1000000)/10000;

th=(t%100000000)/1000000;

cout<<" ";

gotoxy(25,6+n+j);

cprintf("%0d:%0d:%0d.%0d",th,tx,ts,tm);

gotoxy(51,6+n+j);

cprintf("%d",ReqArray[j].Num);

}

else

{

gotoxy(19,6+n+j);

cprintf("Нi ");

gotoxy(25,6+n+j);

cprintf(" ");

gotoxy(51,6+n+j);

cprintf(" ");

}

gotoxy(67,7);

cprintf("%.4f",p);

gotoxy(67,8);

cprintf("%.4f",q);

gotoxy(67,9);

cprintf("%.4f",a);

gotoxy(67,10);

cprintf("%.4f",z);

gotoxy(67,11);

cprintf("%.4f",r);

gotoxy(67,12);

cprintf("%.4f",Toch);

gotoxy(67,13);

cprintf("%.4f",Tsystem);

gotoxy(67,14);

cprintf("%.4f",NumRealiz);

gotoxy(67,15);

cprintf("%.4f",TimeRealiz);

}

while (getch()!=ENTER);

}

//--------------------------------------------------------------------------

//---------------------------------Параметри--------------------------------

void Parametr(void)

{

Phon();

textcolor(WHITE);

textbackground(BLUE);

gotoxy(10,8);

cprintf("г========================================¬");

gotoxy(10,9);

cprintf("¦ lam - iнтенсивнiсть надходження заявок ¦");

gotoxy(10,10);

cprintf("¦ mu - iнтенсивнiсть обслуговування ¦");

gotoxy(10,11);

cprintf("¦ n - число каналiв обслуговування ¦");

gotoxy(10,12);

cprintf("¦ m - число мiсць у черзi ¦");

gotoxy(10,13);

cprintf("¦ Q - рiвень довiри ¦");

gotoxy(10,14);

cprintf("¦ eps - точнiсть ¦");

gotoxy(10,15);

cprintf("L========================================-");

textcolor(BLACK);

textbackground(BLACK);

gotoxy(11,16);

cprintf(" ");

for(int i=9;i<16;i++)

{

gotoxy(52,i);

putch(' ');

}

textcolor(BLACK);

textbackground(BLACK);

gotoxy(59,22);

cprintf(" ");

for(i=4;i<22;i++)

{

gotoxy(75,i);

putch(' ');

}

textcolor(WHITE);

textbackground(BLUE);

gotoxy(58,3);

cprintf("г===============¬");

gotoxy(58,4);

cprintf("¦ попереднi: ¦");

gotoxy(58,5);

cprintf("¦---------------¦");

gotoxy(58,6);

cprintf("¦ lam = %.2f ¦",lam);

gotoxy(58,7);

cprintf("¦ mu = %.2f ¦",mu);

gotoxy(58,8);

cprintf("¦ n = %d ¦",n);

gotoxy(58,9);

cprintf("¦ m = %d ¦",m);

gotoxy(58,10);

cprintf("¦ Q = %.2f ¦",Q);

gotoxy(58,11);

cprintf("¦ eps = %.3f ¦",eps);

gotoxy(58,12);

cprintf("¦---------------¦");

gotoxy(58,13);

cprintf("¦ новi: ¦");

gotoxy(58,14);

cprintf("¦---------------¦");

gotoxy(58,15);

cprintf("¦ lam = ¦");

gotoxy(58,16);

cprintf("¦ mu = ¦");

gotoxy(58,17);

cprintf("¦ n = ¦");

gotoxy(58,18);

cprintf("¦ m = ¦");

gotoxy(58,19);

cprintf("¦ Q = ¦");

gotoxy(58,20);

cprintf("¦ eps = ¦");

gotoxy(58,21);

cprintf("L===============-");

_setcursortype(2);

gotoxy(66,15);

cin>>lam;

gotoxy(66,16);

cin>>mu;

gotoxy(66,17);

cin>>n;

gotoxy(66,18);

cin>>m;

gotoxy(66,19);

cin>>Q;

gotoxy(66,20);

cin>>eps;

_setcursortype(0);

}

//--------------------------------------------------------------------------

//--------------------------------Довiдка-----------------------------------

void About(void)

{

Phon();

textcolor(WHITE);

textbackground(BLUE);

gotoxy(19,8);

cprintf("г========================================¬");

gotoxy(19,9);

cprintf("¦ Курсова робота ¦");

gotoxy(19,10);

cprintf("¦ на тему: ¦");

gotoxy(19,11);

cprintf("¦ Багатоканальна СМО з ¦");

gotoxy(19,12);

cprintf("¦ обмеженою довжиною черги ¦");

gotoxy(19,13);

cprintf("¦ по курсу: ¦");

gotoxy(19,14);

cprintf("¦ Комп'ютерне моделювання ¦");

gotoxy(19,15);

cprintf("L========================================-");

textcolor(BLACK);

textbackground(BLACK);

gotoxy(20,16);

cprintf(" ");

for(int i=9;i<16;i++)

{

gotoxy(61,i);

putch(' ');

}

}

//--------------------------------------------------------------------------

//-------------------------------Визначення фону----------------------------

void Phon(void)

{

textbackground(BLACK);

clrscr();

textcolor(BLUE);

for(int i=1; i<2080; i++)

putch('-');

}

//--------------------------------------------------------------------------

//------------------------------Побудова рамки------------------------------

void Ramka(int x)

{

gotoxy(28,x);

cprintf("------------------------¬");

gotoxy(28,x+1);

cprintf("¦");

gotoxy(52,x+1);

cprintf("¦");

gotoxy(28,x+2);

cprintf("L------------------------");

}

//--------------------------------------------------------------------------

//-------------------------------Головне меню--- ---------------------------

void Menu(void)

{

textcolor(WHITE);

textbackground(BLUE);

for(int i=28;i<53;i++)

for(int j=5;j<22;j++)

{

gotoxy(i,j);

putch(' ');

}

gotoxy(27,4);

cprintf("г========== СМО ==========¬");

gotoxy(27,7);

cprintf(" Теоретичнi розрахунки ");

gotoxy(27,10);

cprintf(" Модель*************** ");

gotoxy(27,13);

cprintf(" Параметри************ ");

gotoxy(27,16);

cprintf(" Довiдка************** ");

gotoxy(27,19);

cprintf(" Вихiд**************** ");

gotoxy(27,22);

cprintf("L=========================- ");

for(i=5;i<22;i++)

{

gotoxy(27,i);

putch('¦');

gotoxy(53,i);

putch('¦');

}

textcolor(BLACK);

textbackground(BLACK);

gotoxy(29,23);

cprintf(" ");

for(i=5;i<24;i++)

{

gotoxy(54,i);

putch(' ');

}

}

void main()

{

clrscr();

randomize();

int s=1;

int ch;

_setcursortype(0);

Phon();

for(;;)

{

Menu();

textcolor(RED);

textbackground(BLUE);

switch (s)

{

case 1:

Ramka(6);

if (getch()==ENTER)

{

TeoretObrahynok();

getch();

Phon();

}

break;

case 2:

Ramka(9);

if (getch()==ENTER)

{

Model();

getch();

Phon();

}

break;

case 3:

Ramka(12);

if (getch()==ENTER)

{

Parametr();

getch();

Phon();

}

break;

case 4:

Ramka(15);

if (getch()==ENTER)

{

About();

getch();

Phon();

}

break;

case 5:

Ramka(18);

if (getch()==ENTER) exit(1);

}

ch=getch();

if (ch==DOWN) if (s==5) s=1; else s++;

if (ch==UP) if (s==1) s=5; else s--;

}

_setcursortype(2);

}

56