//////////////////////////////////////////////////////////////////////////// // 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