import umontreal.iro.lecuyer.simevents.*; import umontreal.iro.lecuyer.rng.*; import umontreal.iro.lecuyer.probdist.ExponentialDist; import umontreal.iro.lecuyer.randvar.RandomVariateGen; import umontreal.iro.lecuyer.stat.*; import java.util.LinkedList; public class QueueEv { RandomVariateGen genArr; RandomVariateGen genServ; LinkedList waitList = new LinkedList (); LinkedList servList = new LinkedList (); Tally custWaits = new Tally ("Waiting times"); Accumulate totWait = new Accumulate ("Size of queue"); class Customer { double arrivTime, servTime; } public QueueEv (double lambda, double mu) { genArr = new RandomVariateGen (new MRG32k3a(), new ExponentialDist(lambda)); genServ = new RandomVariateGen (new MRG32k3a(), new ExponentialDist (mu)); } public void simulateOneRun (double timeHorizon) { Sim.init(); new EndOfSim().schedule (timeHorizon); new Arrival().schedule (genArr.nextDouble()); Sim.start(); } class Arrival extends Event { public void actions() { new Arrival().schedule (genArr.nextDouble()); // Next arrival. Customer cust = new Customer(); // Cust just arrived. cust.arrivTime = Sim.time(); cust.servTime = genServ.nextDouble(); if (servList.size() > 0) { // Must join the queue. waitList.addLast (cust); totWait.update (waitList.size()); } else { // Starts service. custWaits.add (0.0); servList.addLast (cust); new Departure().schedule (cust.servTime); } } } class Departure extends Event { public void actions() { servList.removeFirst(); if (waitList.size() > 0) { // Starts service for next one in queue. Customer cust = (Customer)waitList.removeFirst(); totWait.update (waitList.size()); custWaits.add (Sim.time() - cust.arrivTime); servList.addLast (cust); new Departure().schedule (cust.servTime); } } } class EndOfSim extends Event { public void actions() { Sim.stop(); } } public static void main (String[] args) { QueueEv queue = new QueueEv (1.0, 2.0); queue.simulateOneRun (1000.0); System.out.println (queue.custWaits.report()); System.out.println (queue.totWait.report()); } }