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 }