SYMULACJA CYFROWA

PRZEMYSŁAW ANDRZEJEWSKI

Program przedstawiający symulację obsługi kolejki samochodów przez 2 policjantów sprawdzających stan pojazdów. Kierowcy podjeżdżają, są obsługiwani i odjeżdżają ze stanowiska. Kierowcy przyjmowani są wg systemu FIFO. W Naszej symulacji zakładamy że po drogach jeżdżą sami porządni kierowcy i sprawne samochody. Żaden nie musi być zatrzymany. Dane wejściowe programu symulacyjnego stanowią:

SCHEMAT BLOKOWY:

0x01 graphic

KOD PROGRAMU:

#include <time.h>

#include <stdlib.h>

#include <queue>

#include <iostream>

using namespace std;

int main()

{

int X;

do

{

queue<int> kolejka; // inicjacja kolejki

int nowy = 0; // czas przybycia nowego auta

int A = 0; // stanowisko A

int B = 0; // stanowisko B

int sr_t_obsl; // średni czas obslugi

int sr_t_nowego; // średni czas przybycia nowego auta

int t_s; // czas symulacji

int dl_kolejki; //długość kolejki

int max_kolejka = 0; // maksymalna ilość aut jaka była w kolejce

int sum_kolejka = 0; // suma aut z kolejki

int t_oczekiwania = 0; // łaczny czas oczekiwania

int suma_aut = 0; // suma aut

cout<<"JAKI CZAS SYMULACJI ??"<<endl;

cout<<"\n"<<endl;

cin>>t_s;

cout<<"\nJAKI SREDNI CZAS OBSLUGI??"<<endl;

cout<<"\n"<<endl;

cin>>sr_t_obsl;

cout<<"\nJAKI SREDNI CZAS DOLACZENIA AUT W KOLEJKE ??"<<endl;

cout<<"\n"<<endl;

cin>> sr_t_nowego;

cout<<"\nJAKA DLUGOSC KOLEJKI ??"<<endl;

cout<<"\n"<<endl;

cin>>dl_kolejki;

srand(time(NULL));

nowy = (rand() % (sr_t_nowego + 1)); // wyznaczenie czasu nowego auta

for(int t = 0; t < t_s; t++)

{

if(nowy == 0)

{

if(dl_kolejki > kolejka.size())

{

suma_aut = suma_aut + 1; // dodanie kolejnego auta do sumy wszystkich

kolejka.push(t); // dodanie auta do kolejki z czasem przyjazdu

}

nowy = (rand() % (sr_t_nowego + 1)); // wyznaczenie czasu kiedy pojawi się kolejne auto

}

if(A == 0 && kolejka.size() > 0)

{

t_oczekiwania = t_oczekiwania + (t - kolejka.front()); // dodanie czasu oczekiwania auta

kolejka.pop(); // usunięcie auta z kolejki

A = (rand() % (sr_t_obsl + 1)); // wyznaczenie czasu obslugi A

}

if(B == 0 && kolejka.size() > 0)

{

t_oczekiwania = t_oczekiwania + (t - kolejka.front()); // dodanie czasu oczekiwania auta

kolejka.pop(); //usunięcie auta z kolejki

B = (rand() % (sr_t_obsl + 1)); // wyznaczenie czasu obslugi B

}

if(A > 0)

{

A = A - 1; // zmniejszenie czasu za ile skończy się mycie

}

if(B > 0)

{

B = B - 1; // zmniejszenie czasu za ile skończy się mycie

}

if(nowy > 0)

{

nowy = nowy - 1; // zmniejszenie czasu za ile przyjdzie nastepny klient

}

if(max_kolejka < kolejka.size())

{

max_kolejka = kolejka.size();

}

sum_kolejka = sum_kolejka + kolejka.size();

}

cout<<"---------------------------------------------------------------";

cout<<"\n";

cout<<"SUMA AUT: "<<suma_aut <<endl;

cout<<"\n";

cout<<"MAKSYMALNA ILOSC AUT CZEKAJACYCH W KOLEJCE: "<<max_kolejka<<endl;

cout<<"\n";

cout<<"SREDNIO W KOLEJCE CZEKALO: "<<sum_kolejka / t_s <<endl;

cout<<"\n";

cout<<"SREDNI CZAS OCZEKIWANIA: "<<t_oczekiwania / (suma_aut - kolejka.size())<<endl;

cout<<"\n";

cout<<"---------------------------------------------------------------";

cout<<"\n";

cout<<"*** NOWA SYMULACJA?? <press 1 and ENTER to confirm> ***\n\n";

cin>>X;

cout<<"\n";

cout<<"\n";

cout<<"\n";

}

while (X==1);

system("pause");

return 0;

}

SYMULACJE:

0x01 graphic

Przy budowaniu programu skorzystałem z adaptera kolejki FIFO [queue] dostępnego w bibliotece C++. W strukturze tej mamy dostęp tylko do pierwszego i ostatniego elementu kolejki. Operacje tej kolejki wykorzystane w tym programie to:

Przypisanie wartosci czasów obsługi i przyjazdu nowych aut było realizowane przy pomocy generatora liczb losowych funkcji „rand()”. Generator ten ma rozkład równomierny. Oznacza to, że szanse wylosowania kazdej liczby z wybranego zakresu są takie same.

Dane wyjsciowe programu stanowią:

W obydwóch przypadkach symulacji mieliśmy do czynienia z przepełnieniem kolejki. W przypadku przepełnienia kolejki, pozostałe auta przyjeżdżające, musiały kierować się na inną drogę. Nie zostały więc obsłużone. Problem przepełnienia mógł zostać zniwelowany, gdyby przy kontroli stał jeszcze jeden policjant. Wyjściowe wartosci średnie zostały nieco przybliżone, ponieważ program operuje na liczbach całkowitych.