1  import java.util.LinkedList;
  2  import java.util.Queue;
  3  
  4  /**
  5     Simulation of customer traffic in a bank.
  6  */
  7  public class BankSimulation extends Simulation
  8  {
  9     private Customer[] tellers;
 10     private Queue<Customer> custQueue;
 11  
 12     private int totalCustomers;
 13     private double totalTime;
 14  
 15     private static final double INTERARRIVAL = 1; 
 16        // average of 1 minute between customer arrivals
 17     private static final double PROCESSING = 5; 
 18        // average of 5 minutes processing time per customer
 19  
 20     public BankSimulation(int numberOfTellers) 
 21     { 
 22        tellers = new Customer[numberOfTellers]; 
 23        custQueue = new LinkedList<Customer>();
 24        totalCustomers = 0;
 25        totalTime = 0;
 26     }
 27  
 28     /** 
 29         Adds a customer to the bank.
 30         @param c the customer
 31     */
 32     public void add(Customer c) 
 33     {
 34        boolean addedToTeller = false;
 35        for (int i = 0; !addedToTeller && i < tellers.length; i++)
 36        {
 37           if (tellers[i] == null)
 38           {  
 39              addToTeller(i, c);
 40              addedToTeller = true;
 41           }
 42        }
 43        if (!addedToTeller) { custQueue.add(c); }
 44  
 45        addEvent(new Arrival(getCurrentTime() + expdist(INTERARRIVAL)));
 46     }
 47  
 48     /**
 49        Adds a customer to a teller and schedules the departure event.
 50        @param i the teller number
 51        @param c the customer
 52     */
 53     private void addToTeller(int i, Customer c)
 54     {
 55        tellers[i] = c;
 56        addEvent(new Departure(getCurrentTime() + expdist(PROCESSING), i));
 57     }
 58     
 59     /** 
 60         Removes a customer from a teller.
 61         @param i teller position
 62     */
 63     public void remove(int i)
 64     {
 65        Customer c = tellers[i];
 66        tellers[i] = null;
 67  
 68        // Update statistics
 69        totalCustomers++; 
 70        totalTime = totalTime + getCurrentTime() - c.getArrivalTime();
 71  
 72        if (custQueue.size() > 0)
 73        {
 74           addToTeller(i, custQueue.remove());
 75        }
 76     }
 77  
 78     /**
 79        Displays tellers and queue.
 80     */
 81     public void display()
 82     {
 83        for (int i = 0; i < tellers.length; i++)
 84        {
 85           if (tellers[i] == null)
 86           {
 87              System.out.print(".");
 88           } 
 89           else
 90           {
 91              System.out.print("C");
 92           } 
 93        }
 94        System.out.print("<");
 95        int q = custQueue.size();
 96        for (int j = 1; j <= q; j++) { System.out.print("C"); }
 97        System.out.println();
 98     }
 99  
100     /** 
101         Displays a summary of the gathered statistics.
102     */
103     public void displaySummary()
104     {
105        double averageTime = 0;
106        if (totalCustomers > 0) 
107        { 
108           averageTime = totalTime / totalCustomers; 
109        }
110        System.out.println(totalCustomers + " customers. Average time "
111           + averageTime + " minutes.");
112     }
113  }