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