event_queue.cpp


#include <math.h>
#include <assert.h>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

/* TYPES *******************************************************************/

typedef double Time; // measured in minutes

/*-------------------------------------------------------------------------*/

class Event
/* PURPOSE:    An event that is scheduled for execution at some time
*/
{
public:
	Event(Time t);
	static enum type { ARRIVAL, DEPARTURE };
	Event(const Event &src) { _time = src.time(); _type = src._type; cout << "copy: " << _time << endl; }
	Event(Time t, type my_type): _time(t), _type(my_type) { cout << "Created: " << time() << endl;}

   virtual void process() { }
   virtual void show() const;
   Time time() const { return _time; }
   virtual ~Event() { cout << "event " << time() << " deleted\n"; }
   bool operator <(const Event &ev) const { return _time>ev.time(); }
private:
	Time _time;
	type _type;
};

/*-------------------------------------------------------------------------*/

class Arrival : public Event
/* PURPOSE:    Customer arrives at bank
*/
{
public:
   Arrival(Time);
   virtual void process() { }
   void show() const;
};


const Time INTERARRIVAL = 1.0; // 1 minute
const Time AVG_PROCTIME = 5.0; // 5 minutes

static int event_compare(const Event* a, const Event* b);

priority_queue<Event> event_queue;
Time now;

/* FUNCTIONS ***************************************************************/

static double expdist(double mean)
/* PURPOSE:    Compute exponentially distributed random numbers
   RECEIVES:   mean - the mean of the number sequence
   RETURNS:    a random number
*/
{  double r = rand();
   r /= RAND_MAX;
   return -mean*log(r);
}

/*.........................................................................*/

#if defined(_COMPARE)
static int event_compare(const Event* a, const Event* b)
/* PURPOSE:    compare two events by their time stamp
   RECEIVES:   a, b - pointers to two events
   RETURNS:    -1 if a is scheduled earlier than b, 0 if they are
               scheduled at the same time, 1 otherwise
*/
{  Time d = a->time() - b->time();
   return (d > 0) - (d < 0);
}
#endif

/*.........................................................................*/

int main()
{
	//const Time STARTTIME = 9 * 60; // 9 a.m.
	//const Time ENDTIME = 17 * 60; // 5 p.m.

	now = 0.0;
   for (int i = 0; i<6; i++) {
	   Time t = expdist(INTERARRIVAL);
	   Event *e = new Event(now+t,Event::ARRIVAL);
	   event_queue.push(*e);
	   now += 2;
   }
   cout << "\nQueue size: " << event_queue.size() << endl;
   while (event_queue.size()>0) {
	   Event e = event_queue.top();
	   e.show();
	   event_queue.pop();
   }
   return 0;
}

/*-------------------------------------------------------------------------*/

Event::Event(Time t)
/* RECEIVES:   t - the execution time of this event
*/
: _time(t)
{}

void Event::show() const
{
	cout << (_type==ARRIVAL? "Arrival": "Departure") << ": " << time() << endl;
}


/*-------------------------------------------------------------------------*/

Arrival::Arrival(Time t)
/* RECEIVES:   t - the time at which the arrival will occur
*/
: Event(t)
{}

void Arrival::show() const
{
	cout << "Arrival: " << time() << endl;
}


Results

Created: 6.68361
copy: 6.68361
copy: 6.68361
event 6.68361 deleted
Created: 2.57344
copy: 2.57344
copy: 6.68361
copy: 2.57344
event 6.68361 deleted
event 2.57344 deleted
copy: 2.57344
event 2.57344 deleted
Created: 5.64349
copy: 5.64349
copy: 2.57344
copy: 6.68361
copy: 5.64349
event 2.57344 deleted
event 6.68361 deleted
event 5.64349 deleted
copy: 5.64349
event 5.64349 deleted
Created: 6.21228
copy: 6.21228
copy: 2.57344
copy: 6.68361
copy: 5.64349
copy: 6.21228
event 2.57344 deleted
event 6.68361 deleted
event 5.64349 deleted
event 6.21228 deleted
copy: 6.21228
event 6.21228 deleted
Created: 8.53613
copy: 8.53613
copy: 2.57344
copy: 6.21228
copy: 5.64349
copy: 6.68361
copy: 8.53613
event 2.57344 deleted
event 6.21228 deleted
event 5.64349 deleted
event 6.68361 deleted
event 8.53613 deleted
copy: 8.53613
event 8.53613 deleted
Created: 10.7342
copy: 10.7342
copy: 10.7342
event 10.7342 deleted

Queue size: 6
copy: 2.57344
Arrival: 2.57344
copy: 10.7342
copy: 10.7342
copy: 10.7342
event 10.7342 deleted
event 10.7342 deleted
event 10.7342 deleted
event 2.57344 deleted
event 2.57344 deleted
copy: 5.64349
Arrival: 5.64349
copy: 8.53613
copy: 8.53613
copy: 8.53613
event 8.53613 deleted
event 8.53613 deleted
event 8.53613 deleted
event 5.64349 deleted
event 5.64349 deleted
copy: 6.21228
Arrival: 6.21228
copy: 8.53613
copy: 8.53613
copy: 8.53613
event 8.53613 deleted
event 8.53613 deleted
event 8.53613 deleted
event 6.21228 deleted
event 6.21228 deleted
copy: 6.68361
Arrival: 6.68361
copy: 10.7342
copy: 10.7342
copy: 10.7342
event 10.7342 deleted
event 10.7342 deleted
event 10.7342 deleted
event 6.68361 deleted
event 6.68361 deleted
copy: 8.53613
Arrival: 8.53613
copy: 10.7342
copy: 10.7342
copy: 10.7342
event 10.7342 deleted
event 10.7342 deleted
event 10.7342 deleted
event 8.53613 deleted
event 8.53613 deleted
copy: 10.7342
Arrival: 10.7342
event 10.7342 deleted
event 10.7342 deleted


Maintained by John Loomis, updated Wed Feb 21 17:29:26 2007