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ą:
CZAS SYMULACJI,
ŚREDNI CZAS OBSŁUGI POJAZDÓW,
ŚREDNI CZAS PRZYJAZDU POJAZDÓW,
DŁUGOŚĆ KOLEJKI.
SCHEMAT BLOKOWY:
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:
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:
kolejka.size - zwraca ilość elementów umieszczonych w kolejce
kolejka.push - umieszcza nowy element na końcu kolejki
kolejka.front - zwraca wartosć pierwszego elementu w kolejce
kolejka.pop - usuwa element z początku kolejki (jeśli istnieje)
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ą:
SUMA OBSŁUZONYCH AUT
MAKSYMALNA ILOŚĆ AUT CZEKAJĄCYCH W KOLEJCE
ŚREDNIA ILOŚĆ OCZEKUJĄCYCH W KOLEJCE
ŚREDNI CZAS OCZEKIWANIA
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.