#include "cslpp.h" #include "conio.h" #define MaxLiczbaZgloszen 1000 #define SrOdstepZgl 1000 #define SrCzasObsl 450 #define SumZgloszen 10000 class Element : public Timer{ public: int LP; }; // typedef Timer Element ; Element Zgloszenie[MaxLiczbaZgloszen]; Set Wolne(MaxLiczbaZgloszen); Queue Kolejka(MaxLiczbaZgloszen); Timer NadZgl, KonObsl ; int StanObsl; Negexp GenOdstZgl (SrOdstepZgl), GenCzasObsl (SrCzasObsl); StatD StatCzasuPobytu; StatCRect StatDlKol; uint DlKol; Timer ZegarStat; Hist HistLP(7, 0, 1); long LiczbaObs; long SumLiczbaObs = 10000; uint El; Random rnd3(3); // funkcja prawdopodobienstwo 1/3 int bRet (){ if (rnd3.Get() > 2) return 1; else return 0; } void Eksperyment () { // inicjalizacja Wolne.Load(); Kolejka.Zero(); ZegarStat.t =0; StatDlKol.Clear(0); HistLP.Clear(); StatCzasuPobytu.Clear(); LiczbaObs = 0; StanObsl = -1; NadZgl.t = 0; NadZgl.SetOn(); // petla symulacji while (1) { // jesli nadchodzi zgloszenie if (NadZgl.Now()) { Wolne.Find(El, FIRST); // znajdujemy element ze zbioru Wolne Wolne.From(El); // usuwamy ten element Zgloszenie[El].LP =0; // liczba wystapien ustawiona na zero Zgloszenie[El].t= 0; // ustawiamy czas pobytu w systemie na zero Kolejka.To(El); // dodajemy element do kolejki przed stanowiskiem obslugi DlKol++ ; // inkrementacja zmiennej przechowujacej dlugosc kolejki StatDlKol.Add (DlKol, -ZegarStat.t); // aktualizacja statystyki dot. sredniej dl. kolejki // (aktualny czas to -ZegarStat.t) NadZgl.t = GenOdstZgl.Get(); // ustawienie czasu nadejscia kolejnego zgloszenia } // jesli nastepuje koniec obslugi elementu na stanowisku obslugi if (KonObsl.Now()) { /***************************************/ // miejsce ktore uzupelniamy // do histogramu liczby przejsc Zgloszenie[StanObsl].LP++; if (bRet()) { // wracamy element na poczatek kolejki z prawdopodobienstwem 1/3 Kolejka.To(StanObsl); DlKol++ ; // zwiekszamy dlugosc kolejki StatDlKol.Add (DlKol, -ZegarStat.t); // aktualizujemy statsytke sr. dlugosci kolejki } else { // koniec obslugi elementu LiczbaObs++; // histogram dotyczacy liczby przejsc elementow przez stanowisko obslugi HistLP.Add(Zgloszenie[StanObsl].LP); // sredni czas pobytu w systemie StatCzasuPobytu.Add(-Zgloszenie[StanObsl].t); Wolne.To( StanObsl); // wprowadzenie elementu do zbioru Wolne } StanObsl = -1 ; // stanowisko obslugi jest puste KonObsl.SetOff(); // zablokowanie obslugi } // jesli stanowisko obslugi jest wolne i sa elementy w kolejkce to pobierz element if ((StanObsl==-1) && (Kolejka.Find(El, FIRST)) ){ Kolejka.From (El); // usun element z kolejki DlKol--; // zmniejsz dlugosc kolejki StatDlKol.Add (DlKol, -ZegarStat.t); // aktualizuj statystyke sredniej dlugosci kolejki StanObsl = El; // zapamietujemy numer obslugiwanego elementu KonObsl.t = GenCzasObsl.Get(); // generacja czasu zakonczenia obslugi KonObsl.SetOn(); // wlaczene obslugi } if (LiczbaObs>=SumLiczbaObs) break; TimeFlow(); } } int main() { double sr; sr = 2.71828 ; /* for (int m=1; m<100;m++) cout << rnd3.Get() << " "; cout << endl ; */ clrscr() ; cout << "Symulacja" << endl ; Eksperyment(); cout << "Wyniki po przejciu " << LiczbaObs << " obserwacji"<< endl ; cout << "Czas symulacji: " << -ZegarStat.t << endl; StatCzasuPobytu.GetStat(sr); cout << "Sredni czas pobytu w systemie: " << sr << endl ; StatDlKol.GetStat(-ZegarStat.t,sr); cout << "Srednia dlugosc kolejki: " << sr << endl ; cout << "Histogram liczby przejsc:\n" << HistLP << endl ; cout << endl; return 0; }