#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; }