-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSimulator.java
More file actions
119 lines (95 loc) · 3.88 KB
/
Copy pathSimulator.java
File metadata and controls
119 lines (95 loc) · 3.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import java.util.function.Supplier;
class Simulator {
private final int numOfServers;
private final int qmax;
private final ImList<Pair<Double,Supplier<Double>>> inputTimes;
private final Supplier<Double> restTimes;
Simulator(int numOfServers, int qmax, ImList<Pair<Double,Supplier<Double>>> inputTimes, Supplier<Double> restTimes) {
this.numOfServers = numOfServers;
this.qmax = qmax;
this.inputTimes = inputTimes;
this.restTimes = restTimes;
}
ImList<Server> listServers() { // servers with no queue
ImList<Server> servers = new ImList<>();
Supplier<Double> restTimes = this.restTimes;
for (int i = 1; i <= this.numOfServers; i++) {
servers = servers.add(new Server(i, 0, new Queue(this.qmax, new ImList<>()), restTimes));
}
return servers;
}
public ImList<Event> arriveEvents() {
ImList<Event> events = new ImList<>();
int count = 1;
for (Pair<Double, Supplier<Double>> pair : this.inputTimes) {
Pair<Double, Supplier<Double>> timings = pair;
double arrivalTime = timings.first();
Supplier<Double> serviceTime = timings.second();
Customer cust = new Customer(count, arrivalTime, serviceTime);
Event arrive = new Arrive(cust, arrivalTime);
events = events.add(arrive);
count++;
}
return events;
}
public PQ<Event> pqArriveEvents() {
ImList<Event> events = this.arriveEvents();
PQ<Event> pq = new PQ<Event>(new EventComp());
for (Event event: events) {
pq = pq.add(event);
}
return pq;
}
public Pair<Server, Event> processor(ImList<Server> servers, Event event) {
Server s = new Server(0, 0, new Queue(0, new ImList<>()), this.restTimes);
Pair<Server, Event> serverEvent = new Pair<Server, Event>(s, event);
for (Server server: servers) { // arrive serve done
if (server.serverAvail(event.getCust())) {
event = event.updateEvent();
return event.nextEvent(server);
}
}
for (Server server: servers) { // arrive wait continuewait serve done
if (server.queueNotFull()) {
event = event.updateEvent();
return event.nextEvent(server);
}
}
for (Server server: servers) { // arrive leave
event = event.updateEvent();
return event.nextEvent(server);
}
return serverEvent;
}
public String simulate() {
int numServed = 0;
double totalWaitTime = 0;
double avgWaitingTime = 0;
int numLeft = 0;
String stats = "";
String string = "";
PQ<Event> pq = new PQ<Event>(new EventComp());
pq = this.pqArriveEvents();
ImList<Server> servers = this.listServers();
while (!pq.isEmpty()) {
Pair<Event, PQ<Event>> pr = pq.poll();
Event eventpolled = pr.first();
pq = pr.second();
string += eventpolled.toString();
Pair<Server, Event> pair = processor(servers, eventpolled);
Server newServer = pair.first();
Event newEvent = pair.second();
if (eventpolled.haveNext()) {
pq = pq.add(newEvent);
}
servers = servers.set(newServer.getServerId() - 1, newServer);
numServed += eventpolled.numServed();
totalWaitTime += eventpolled.addWaitTime();
totalWaitTime -= eventpolled.minusWaitTime();
avgWaitingTime = totalWaitTime / numServed;
numLeft += eventpolled.numLeft();
stats = String.format("[%.3f %d %d]", avgWaitingTime, numServed, numLeft);
}
return string + stats;
}
}