Sensores
Revisão de 17h19min de 2 de maio de 2020 por Fernando.m01 (discussão | contribs)
TAREFA 6
- Adaptar o código de tratamento de uma fila MM1 simples, conforme colocado no slide para um formato de um simulador de eventos discretos com filas. Use o código abaixo como apoio.
<br />//Basead em http://stdcxx.apache.org/doc/stdlibug/2-2.html#225
#include <queue><br />#include <iostream><br />#include <cstdlib>
//==================================================================<br />// classes evento e simulação - base para o desenvolvimento da simulação<br />//==================================================================
class event {<br />public:<br /> // Construct sets time of event.<br /> event (double t) : time (t)<br /> { }
// Execute event by invoking this method.<br /> virtual void processEvent () = 0;
const double time;<br />};<br />class simulation {<br />public:<br /> simulation () : simtime (0), eventQueue () <br /> {}<br /> void run ();<br /> void scheduleEvent (event * newEvent) {<br /> eventQueue.push (newEvent);<br /> }<br /> double simtime;<br />protected:<br /> class eventComparator {<br /> public:<br /> bool operator() (const event * left, const event * right) const {<br /> return left->time > right->time;<br /> }<br /> };<br /> std::priority_queue<event*,<br /> std::vector<event *, std::allocator<event*> >,<br /> eventComparator> eventQueue; //fila de eventos <br />};
void simulation::run () {
while (! eventQueue.empty ()) { //enquanto exisitr eventos na fila de eventos
event * nextEvent = eventQueue.top (); //captura evento no topo da fila<br /> eventQueue.pop (); //retira evento da fila<br /> simtime = nextEvent->time; //ajusta tempo de simulação<br /> nextEvent->processEvent (); //processa evento<br /> delete nextEvent; //remove evento<br /> }<br />}
//===================================================================<br />//Customização dos eventos e do simulador<br />//===================================================================
class standardArrival : public event {<br />public:<br /> standardArrival (double t)<br /> : event (t)<br /> { }<br /> virtual void processEvent ();<br />};
void standardArrival::processEvent () {<br /> std::cout << "processando evento no tempo " << time << '\n';<br />}
class simuladorFilas : public simulation {<br />public:<br /> simuladorFilas ()<br /> { }<br /> <br />} oSimulador;
// from https://stackoverflow.com/questions/2704521/generate-random-double-numbers-in-c
double fRand(double fMin, double fMax)<br />{<br /> double f = (double)rand() / RAND_MAX;<br /> return fMin + f * (fMax - fMin);<br />}
int main () {
// Inicializar aqui a fila de eventos<br /> double t;
oSimulador.scheduleEvent (new standardArrival (t=fRand(1.0,10.0)));<br /> oSimulador.scheduleEvent (new standardArrival (t=t+fRand(1.0,10.0)));<br /> oSimulador.scheduleEvent (new standardArrival (t=t+fRand(1.0,10.0)));
// Executar simulador<br /> oSimulador.run ();<br /> return 0;<br />}