- •Навчально-науковий інститут автоматики, кібернетики та обчислювальної техніки національного університету водного господарства та природокористування
- •Курсова робота
- •1. Теоретико-методичні основи моделювання систем масового обслуговування
- •1.1 Опис загальних особливостей систем масового обслуговування
- •1.2 Характеристики основних елементів моделі системи масового обслуговування
- •1.3 Класифікація систем масового обслуговування
- •2. Основні відомості про задачу і метод її роз’язання
- •2.1 Перелік скорочень і основних термінів
- •2.2.Постановка задачі
- •2.3.Теоретичні відомості
- •2.4.Опис алгоритму моделювання
- •3. Детальний опис машинної програми
- •3.1 Мова програмування
- •3.2 Основні функції
- •3.3 Змінні використовувані в програмі
- •4. Інструкція користувача
- •Тестування програми
- •Висновок
- •Список використаної літератури
- •Додаток
Висновок
Таким чином поставлена задача про створення програми, що дозволяє змоделювати багатоканальну систему масового обслуговування з обмеженою довжиною черги, вирішена. Створена програма дозволяє зробити розрахунок таких параметрів системи як:
Pi - імовірності станів;
Pвід - імовірність відмовлення;
a - абсолютну пропускну здатність системи;
q - відносну пропускну здатність системи;
tоч - середній час чекання в черзі;
tсист - середній час перебування в системі;
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); } |