////////////////////////////////////////////////////////////////////////////
// Model KOSTKY.CPP SIMLIB/C++
//
// Příklad simulačního programu - prodejna s Rubikovými kostkami (verze 1)
//
// Do hračkářství přivezli Rubikovy kostky: ráno v 8 hodin 500 kusů
// a odpoledne v 15 hodin opět 500 kusů. V hračkářství se otevírá
// v 8 hodin ráno a zavírá se v 18 hodin večer. Zákazníci přicházeli
// od 8 hodin průměrně po 3/4 minuty (s exponenciálním
// rozložením) a každý zákazník koupil jen jednu kostku. Když
// už byly všechny kostky vyprodány, zákazníci se nevzdali, stáli
// způsobně ve frontě a čekali, až přivezou dalších 500 kusů odpo-
// ledne v 15 hodin. Mezitím ovšem přicházeli noví zákazníci. Určete
// max. délku fronty a průměrnou dobu čekání, spočítejte, kolik zá-
// kazníků odešlo s nepořízenou, protože vedoucí prodejnu striktně
// zavřela v 18 hodin a nebrala ohled na lidi, kteří už stáli ve
// frontě. Po 18.hodině už další zákazníci nepřicházeli. Doba obsluhy
// je 1 minuta.
//
#include "simlib.h"
// doba simulace : T_POC - počáteční, T_KON - konečná
#define T_POC 8.0 // hodin
#define T_KON 18.0 // hodin
// deklarace konstant
#define T_OBSLUHY 1.0/60 // doba obsluhy zákazníka - 1 minuta
#define T_DODAVKY1 T_POC // čas dodávky kostek - ráno
#define T_DODAVKY2 15.0 // čas dodávky kostek - odpoledne
#define T_PRICH 0.75/60 // průměrný interval příchodu zákazníků 3/4 min
// deklarace globalnich objektu
Facility Prodejna; // prodejna kostek
Histogram Tabulka ("Čekací doby zákazníků",0,0.15,20);
// histogram pro záznam čekacích dob zákazníků
unsigned Kostek = 0; // počet kostek v prodejně
unsigned PocZakazniku = 0; // celkový počet neobsloužených zákazníků
class Zakaznik : public Process { // třída zákazníků
double Prichod; // čas příchodu každého zákazníka
void Behavior() { // popis chování zákazníka
Prichod = Time;
PocZakazniku ++;
Seize(Prodejna);
WaitUntil (Kostek > 0); // čekej, jestliže kostky nejsou
Kostek --;
Wait(T_OBSLUHY);
Release(Prodejna);
PocZakazniku --;
Tabulka(Time - Prichod); // záznam doby čekání do tabulky
}
};
class Generator : public Event { // generátor zákazníků
void Behavior() { // popis chování generátoru
(new Zakaznik)->Activate(); // nový zákazník
Activate(Time+Exponential(T_PRICH));
}
};
class Dodavka : public Event { // dodávka kostek
void Behavior() {
Kostek = Kostek + 500;
Terminate();
}
};
int main() {
SetOutput("kostky.out"); // nastavení výstupního souboru
Prodejna.SetName("Prodejna");
Init(T_POC,T_KON); // inicializace experimentu
(new Dodavka)->Activate(T_DODAVKY1); // inicializace dodávky zboží ráno
(new Dodavka)->Activate(T_DODAVKY2); // inicializace dodávky zboží odpoledne
(new Generator)->Activate(); // inicializace generátoru zákazníků
_Print(" KOSTKY - simulace obchodu\n");
Run(); // simulace
Print("\n S nepořízenou odešlo %u zákazníků \n\n", PocZakazniku);
Prodejna.Output(); // tisk výsledků
Tabulka.Output();
return 0;
}
// konec
syntax highlighted by Code2HTML, v. 0.9.1