Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Simulation Begin
- !fronty;
- Ref(Head) FrontaVoziky, FrontaLahudky;
- Ref(Head) Array Pokladna(1:8);
- ! obsazene obsluhy;
- Boolean array PokladnaObsazena(1:8);
- Integer ObsazeneVoziky, ObsazeneLahudky;
- ! pocty obsluh;
- Integer Lahudky, Voziky, Pokladny; ! počet obsluh;
- ! statitistiky;
- Long Real TotalTime, TimeSpent; ! proměnné pro statistiky;
- Integer CustomersOut; ! Počet obsloužených zákazníků;
- Integer MaxZakazniku, MaxLahudky, MaxFronta, PrisloZakazniku;
- Integer LahudkyZakaznici;
- Ref(OutFile) Statistiky;
- ! parametry modelu;
- Real DobaPrichodu, DobaObsluhy, DobaPlatbyMin, DobaPlatbyMax; ! Parametry rozdeleni;
- Real DobaNakupuMin, DobaNakupuMax;
- Real Pravdepodobnost;
- Integer Seed; ! Nasada pro generatory nahodnych promennych;
- Real TrialDuration; ! Délka experimentu [min];
- ! citac;
- integer i;
- ! generator do systemu posila nove zakazniky s exp. rozlozenim;
- Process Class Generator;
- Begin
- ! v nekonecnem cyklu;
- While true do begin
- ! vytvori noveho zakaznika;
- Activate New Zakaznik(Time);
- ! a na nahodny cas se uspi;
- Hold(Negexp(DobaPrichodu, Seed));
- End While;
- End of Generator;
- ! proces Zakaznik s jednim parametrem - casem vstupu do systemu;
- Process Class Zakaznik(Prichod); Real Prichod;
- Begin
- Integer poradi; ! poradi zakaznika v systemu;
- Ref(Zakaznik) Next; ! dalsi zakaznik ve fronte;
- integer i; ! citac cyklu;
- ! promenne pro vyber pokladny s nejmensi frontou;
- integer NejvolnejsiPokladna, min;
- boolean NalezenaPrazdnaPokladna;
- ! inicialisace promennych;
- NejvolnejsiPokladna := 1;
- min := MaxInt;
- poradi := PrisloZakazniku + 1;
- PrisloZakazniku := poradi;
- ! pokud existuje pred voziky fronta nebo pokud voziky dosly;
- If not FrontaVoziky.Empty or (ObsazeneVoziky >= Voziky) then
- begin
- OutText("Zakaznik "); OutInt(poradi ,0); OutText(" ceka ve frontena vozik."); OutImage;
- Wait(FrontaVoziky); ! stoupne si do fronty a ceka;
- end;
- OutText("Zakaznik "); OutInt(poradi,0); OutText(" ma vozik"); OutImage;
- ! zakaznik obsadi vozik;
- ObsazeneVoziky := ObsazeneVoziky + 1;
- If ObsazeneVoziky>MaxZakazniku then MaxZakazniku := ObsazeneVoziky;
- ! Cas se zacne pocitat az kdyz se dostane do obchodu!!!;
- Prichod := Time;
- ! s danou pravdepodobnosti pujde zakaznik k lahudkam;
- If draw(Pravdepodobnost,Seed) then
- Begin
- ! k lahudkam prisel dalsi zakaznik;
- LahudkyZakaznici := LahudkyZakaznici + 1;
- ! pripadne upraveni statisticke promenne;
- If LahudkyZakaznici>MaxLahudky then
- MaxLahudky := LahudkyZakaznici;
- ! pokud je pred lahudkami fronta nebo pokud jsou obe prodavacky vytizene;
- If not FrontaLahudky.Empty or (ObsazeneLahudky >= Lahudky) then
- Begin
- OutText("Zakaznik "); OutInt(poradi,0); OutText(" ceka na lahudky"); OutImage;
- ! zakaznik si stoupne do fronty a ceka;
- Wait(FrontaLahudky);
- End;
- ! zakaznik prijde na radu a obsadi obsluhu ;
- ObsazeneLahudky := ObsazeneLahudky + 1;
- OutText("Zakaznik "); OutInt(poradi,0); OutText(" je v lahudkach"); OutImage;
- OutText("Zakazniku v lahudkach "); OutInt(LahudkyZakaznici,0); OutImage;
- ! je obsluhovan;
- Hold(Negexp(DobaObsluhy, Seed));
- OutText("Zakaznik "); OutInt(poradi,0); OutText(" jde z lahudek"); OutImage;
- ! obsluha dokoncena a uvolnena;
- ObsazeneLahudky := ObsazeneLahudky - 1;
- ! aktivace dalsiho zakaznika ve fronte;
- If not FrontaLahudky.Empty then
- Begin
- Next :- FrontaLahudky.First;
- Next.Out;
- Activate Next after Current;
- End;
- ! uprava statisticke promenne;
- LahudkyZakaznici := LahudkyZakaznici - 1;
- End;
- OutText("Zakaznik "); OutInt(poradi,0); OutText(" jde nakupovat"); OutImage;
- ! vlastni nakup;
- Hold(Uniform(DobaNakupuMin, DobaNakupuMax, Seed));
- OutText("Zakaznik "); OutInt(poradi,0); OutText(" jde k pokladnam."); OutImage;
- NalezenaPrazdnaPokladna := false;
- ! nakup dokoncen, hleda nejvolnejsi pokladnu;
- for i := 1 step 1 until Pokladny do
- begin
- OutInt(i, 0); OutText(": "); OutInt(Pokladna(i).Cardinal,0); OutImage;
- ! pokud nenalezl prazdnou pokladnu;
- if (not NalezenaPrazdnaPokladna) then
- begin
- If Pokladna(i).Cardinal>MaxFronta then MaxFronta := Pokladna(i).Cardinal;
- ! hleda pokladnu s nejmensim poctem lidi ve fronte;
- if (min > Pokladna(i).Cardinal) then
- begin
- ! nalezena prazdna pokladna;
- if (Pokladna(i).Cardinal = 0) and (not PokladnaObsazena(i)) then
- NalezenaPrazdnaPokladna := true;
- ! ulozeni minima lidi ve fronte a polohy teto pokladny;
- min := Pokladna(i).Cardinal;
- NejvolnejsiPokladna := i;
- end;
- end;
- end;
- OutText("Zakaznik "); OutInt(poradi,0); OutText(" si vybral pokladnu c. "); OutInt(NejvolnejsiPokladna, 0); OutImage;
- ! pokud je pred pokladnou fronta nebo je obsazena;
- If not Pokladna(NejvolnejsiPokladna).Empty or (PokladnaObsazena(NejvolnejsiPokladna)) then
- begin
- OutText("Zakaznik "); OutInt(poradi,0); OutText(" ceka u pokladny c. "); OutInt(NejvolnejsiPokladna, 0); OutImage;
- ! zaradi se do fronty;
- Wait(Pokladna(NejvolnejsiPokladna));
- end;
- ! obsadi pokladnu;
- PokladnaObsazena(NejvolnejsiPokladna) := true;
- OutText("Zakaznik "); OutInt(poradi,0); OutText(" zacina platit u pokladny c. "); OutInt(NejvolnejsiPokladna, 0); OutImage;
- ! je obsluhovan;
- Hold(Normal(DobaPlatbyMin, DobaPlatbyMax, Seed));
- OutText("Zakaznik "); OutInt(poradi,0); OutText(" zaplatil u pokladny c. "); OutInt(NejvolnejsiPokladna, 0); OutImage;
- !uvolni pokladnu;
- PokladnaObsazena(NejvolnejsiPokladna) := false;
- ! aktivace dalsiho ve fronte;
- If not Pokladna(NejvolnejsiPokladna).Empty then
- Begin
- Next :- Pokladna(NejvolnejsiPokladna).First;
- Next.Out;
- Activate Next after Current;
- End;
- TotalTime := TotalTime + (Time - Prichod);
- !OutText("Zakaznik "); !OutInt(poradi,0); !OutText(" celkova doba nakupu: ");
- !OutFix((Time - Prichod), 3, 10); !OutImage;
- ! vrati vozik;
- ObsazeneVoziky := ObsazeneVoziky - 1;
- ! aktivace dalsiho zakaznika ve fronte;
- If not FrontaVoziky.Empty then
- Begin
- Next :- FrontaVoziky.First;
- Next.Out;
- Activate Next after Current;
- End;
- OutText("Zakaznik "); OutInt(poradi,0); OutText(" vratil vozik a jde do riti."); OutImage;
- CustomersOut := CustomersOut + 1;
- End of Zakaznik;
- ! trida pro vypis informaci do souboru;
- Process Class Monitor;
- Begin
- While true do
- Begin
- Statistiky.OutFix(Time,0,5);
- Statistiky.OutInt(ObsazeneVoziky,10);
- Statistiky.OutInt(FrontaVoziky.Cardinal,9);
- Statistiky.OutInt(LahudkyZakaznici,9);
- Statistiky.OutInt(FrontaLahudky.Cardinal,10);
- Statistiky.OutInt(Pokladna(1).Cardinal,8);
- Statistiky.OutInt(Pokladna(2).Cardinal,9);
- Statistiky.OutInt(Pokladna(3).Cardinal,9);
- Statistiky.OutInt(Pokladna(4).Cardinal,9);
- Statistiky.OutInt(Pokladna(5).Cardinal,9);
- Statistiky.OutInt(Pokladna(6).Cardinal,9);
- Statistiky.OutInt(Pokladna(7).Cardinal,9);
- Statistiky.OutInt(Pokladna(8).Cardinal,9);
- Statistiky.OutImage;
- Hold(1);
- End While
- End;
- ! Tělo hlavního programu ;
- ! nastaveni parametru modelu;
- Seed := ClockTime; ! Nasada pro nahodne promenne;
- Voziky := 100; ! pocet voziku;
- Lahudky := 2; ! pocet obsluhujicich v lahudkach;
- Pokladny := 8; ! pocet pokladen;
- DobaPrichodu := 5; ! zakaznici chodi po 1 minute;
- DobaObsluhy := 1/2; ! doba obsluhy u lahudek 2 minuty;
- DobaPlatbyMin := 1; ! min doba placeni u pokladny 1 minutu;
- DobaPlatbyMax := 3; ! max doba placeni u pokladny 3 minuty;
- DobaNakupuMin := 10; ! min doba stravena nakupovanim;
- DobaNakupuMax := 20; ! max doba stravena nakupovanim;
- Pravdepodobnost := 0.3; ! pravdepodobnost navstiveni lahudek po prichodu;
- ! inicialisace promennych;
- LahudkyZakaznici := 0;
- MaxZakazniku := 0;
- MaxLahudky := 0;
- MaxFronta := 0;
- ObsazeneVoziky := 0;
- ObsazeneLahudky := 0;
- FrontaVoziky :- New Head;
- FrontaLahudky :- New Head;
- for i:= 1 step 1 until Pokladny do
- begin
- Pokladna(i) :- new Head;
- PokladnaObsazena(i) := false;
- end;
- ! ziskani delky simulace od uzivatele;
- OutText("Zadejte delku simulace : "); OutImage;
- TrialDuration := InInt;
- ! do souboru vypiseme popis a hlavicku tabulek;
- Statistiky:- new OutFile("monitor.txt");
- Statistiky.open(blanks(150));
- Statistiky.OutText("Vystup simulace Samoobsluhy"); Statistiky.OutImage;
- Statistiky.OutText("---------------------------"); Statistiky.OutImage;
- Statistiky.OutImage;
- Statistiky.OutText("Legenda"); Statistiky.OutImage;
- Statistiky.OutText("-------"); Statistiky.OutImage;
- Statistiky.OutText("Cas "); Statistiky.OutText("Cas od zacatku simulace (v minutach)"); Statistiky.OutImage;
- Statistiky.OutText("ZakSam "); Statistiky.OutText("Aktualni pocet zakazniku v samoobsluze"); Statistiky.OutImage;
- Statistiky.OutText("ZakVoz "); Statistiky.OutText("Aktualni pocet zakazniku, kteri cekaji na voziky"); Statistiky.OutImage;
- Statistiky.OutText("ZakLah "); Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou obsluhovani v lahudkach"); Statistiky.OutImage;
- Statistiky.OutText("ZakLahF "); Statistiky.OutText("Aktualni pocet zakazniku, kteri ve fronte na lahudky"); Statistiky.OutImage;
- Statistiky.OutText("Pokl.1 "); Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.1"); Statistiky.OutImage;
- Statistiky.OutText("Pokl.2 "); Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.2"); Statistiky.OutImage;
- Statistiky.OutText("Pokl.3 "); Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.3"); Statistiky.OutImage;
- Statistiky.OutText("Pokl.4 "); Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.4"); Statistiky.OutImage;
- Statistiky.OutText("Pokl.5 "); Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.5"); Statistiky.OutImage;
- Statistiky.OutText("Pokl.6 "); Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.6"); Statistiky.OutImage;
- Statistiky.OutText("Pokl.7 "); Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.7"); Statistiky.OutImage;
- Statistiky.OutText("Pokl.8 "); Statistiky.OutText("Aktualni pocet zakazniku, kteri jsou u pokladny c.8"); Statistiky.OutImage;
- Statistiky.OutImage;
- Statistiky.OutText("Statistiky v zavislosti na case"); Statistiky.OutImage;
- Statistiky.OutText("-------------------------------"); Statistiky.OutImage;
- Statistiky.OutText("Cas ");
- Statistiky.OutText("ZakSam ");
- Statistiky.OutText("ZakVoz ");
- Statistiky.OutText("ZakLah ");
- Statistiky.OutText("ZakLahF ");
- Statistiky.OutText("Pokl.1 ");
- Statistiky.OutText("Pokl.2 ");
- Statistiky.OutText("Pokl.3 ");
- Statistiky.OutText("Pokl.4 ");
- Statistiky.OutText("Pokl.5 ");
- Statistiky.OutText("Pokl.6 ");
- Statistiky.OutText("Pokl.7 ");
- Statistiky.OutText("Pokl.8 ");
- Statistiky.OutImage;
- ! vytvorime novy monitor, ktery pobezi celou dobu a vypisuje statistiky;
- Activate New Monitor;
- ! vytvoreni noveho generatoru;
- Activate New Generator;
- ! nastaveni trvani experimentu po zadanou dobu;
- Hold(TrialDuration);
- ! tisk souhrnnych statistik;
- TimeSpent := TotalTime/(CustomersOut-1);
- Statistiky.OutImage;
- Statistiky.OutText("Souhrnne statistiky"); Statistiky.OutImage;
- Statistiky.OutText("-------------------"); Statistiky.OutImage;
- Statistiky.OutText("Prumerna doba nakupu: ");
- Statistiky.OutFix(TimeSpent, 3, 6); Statistiky.OutImage;
- Statistiky.OutText("Maximalni soucasny pocet zakazniku v lahudkach: ");
- Statistiky.OutInt(MaxLahudky, 0); Statistiky.OutImage;
- Statistiky.OutText("Maximalni soucasny pocet zakazniku v samoobsluze: ");
- Statistiky.OutInt(MaxZakazniku, 0); Statistiky.OutImage;
- Statistiky.OutText("Nejdelsi fronta u pokladen: ");
- Statistiky.OutInt(MaxFronta, 0); Statistiky.OutImage;
- Statistiky.close;
- End of program;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement