////////////////////////////////////////////////////////////////////////////
// Model MULTIEXP.CPP             SIMLIB/C++
//
// Více experimentů s různými parametry
//

#include "simlib.h"

//SIMLIB_DEBUG_ON;

const double ENDTime = 2000;      // doba simulace

// deklarace globálních objektů:
Facility  Box("Linka");
Histogram Tabulka("Tabulka",0,25,20);

class Zakaznik : public Process { // popis třídy zákazníků
  double Prichod;                 // atribut každého zákazníka
  void Behavior() {               // --- popis chování zákazníka ---
    Prichod = Time;               // čas příchodu zákazníka
    Seize(Box);                   // obsazení zařízení Box
    Wait(10);                     // obsluha
    Release(Box);                 // uvolnění
    Tabulka(Time-Prichod);        // doba obsluhy a čekání
  }
 public:
  Zakaznik() { Activate(); }
};

class Generator : public Event {  // generátor zákazníků
  double dt;
  void Behavior() {               // --- popis chování generátoru ---
    new Zakaznik;                    // nový zákazník, aktivace
    Activate(Time+Exponential(dt));  // interval mezi příchody
  }
 public:
  Generator(double d) : dt(d) { Activate(); }
};

void Sample() {
   if(Time>0) Print(" %g", Tabulka.stat.MeanValue());
}
Sampler s(Sample,500);

int main() {
  SetOutput("multiexp.dat");    // přesměrování výstupu
  _Print("# MULTIEXP -- test více experimentů (čas=%g) \n", ENDTime);
  for(int i=1; i<=20; i++)  {
    Print("# Experiment#%d \n", i);
    Init(0,ENDTime);            // inicializace, čas bude 0..ENDTime
    Box.Clear();                // zde musíme inicializovat všechny objekty
    Tabulka.Clear();
    double interval = i;
    new Generator(interval);    // generátor zákazníků, aktivuje se
    Print("%g ", interval);
    Run();                      // jeden simulační experiment
    Print(" %g\n", Tabulka.stat.MeanValue());
  }
  return 0;
}

// konec


syntax highlighted by Code2HTML, v. 0.9.1