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