diff --git a/graph.py b/graph.py new file mode 100644 index 0000000000000000000000000000000000000000..d905f4d27509558da50e0d564d193a4317fa7ffb --- /dev/null +++ b/graph.py @@ -0,0 +1,95 @@ +from simulator_v2 import * +import numpy as np +from scipy.stats import norm +import pandas as pd +import matplotlib.pyplot as plt + + +# --- CONST --- + +arrival_rate = 10 # average arrival rate of 2 visitors per time unit +service_rate = 1 # average service rate of 1 visitor per time unit +num_visitors = 100 # total number of visitors to simulate +num_queues = 3 # total number of queues + +generation_number = 10000 # number of generation + +queue_policy = ['random', 'round-robin', 'shortest-queue'] # queue selection policy + +# --- PROCESS --- + +lsit_averages_by_policy = {} + +for p in queue_policy: + lsit_averages_by_policy[p] = [] + + for i in range(generation_number): + + simulator = PoissonQueueSimulator(arrival_rate, service_rate, num_visitors, num_queues, p) + visitors, max_queue_lengths, average_waiting_times = simulator.simulate() + + average_queue_waiting_times = 0 + for avg in average_waiting_times: + average_queue_waiting_times += avg + + average_queue_waiting_times /= len(average_waiting_times) + lsit_averages_by_policy[p].append(average_queue_waiting_times) + + + +# --- CMD --- + +# print(f"Visitor ID\tArrival Time\t\tStart Time\t\tEnd Time\t\tProcess Time\t\tWaiting Time\t\tQueue ID") +# for visitor in visitors: +# print(f"{visitor['visitor_id']}\t\t{visitor['arrival_time']}\t" +# f"{visitor['start_time']}\t{visitor['end_time']}\t" +# f"{visitor['process_time']}\t{visitor['total_time']}\t" +# f"{visitor['queue_id']}") + +# print() + +# for queue_id, max_length in enumerate(max_queue_lengths): +# print(f"Queue ID: {queue_id}, Max Queue Length: {max_length}, Average Waiting Time: {average_waiting_times[queue_id]}") + +# print("\n") + + +# --- PLOT --- + +# fig, ax = plt.subplots() + +# g_id = range(len(list_averages)) + +# ax.hist(g_id, list_averages) + +# ax.set_ylabel('Average waiting time') +# ax.set_title(f"Waiting time per generation on {generation_number}") +# ax.legend(title='average waiting time') + +# plt.show() + +fig, ax = plt.subplots(3) +num_bins = 100 + +# mu, std = norm.fit(list_averages) +i = 0 +for p in queue_policy: + counts, bins = np.histogram(lsit_averages_by_policy[p], np.linspace(min(lsit_averages_by_policy[p]), max(lsit_averages_by_policy[p]), num_bins)) + + ax[i].hist(lsit_averages_by_policy[p], bins[:-1], alpha=0.75, + weights=(1 / sum(counts)) * np.ones_like(lsit_averages_by_policy[p]), + label="Height's distribution") + + ax[i].set(xlabel=p, ylabel='percentage') + i += 1 + +plt.xlabel("Averages waiting time") +plt.ylabel("Percentage") + +# xmin, xmax = plt.xlim() +# x = np.linspace(xmin, xmax, 100) +# p = norm.pdf(x, mu, std) +# plt.plot(x, p, 'k', linewidth=2, color='r') + + +plt.show() \ No newline at end of file diff --git a/simulator_v2.py b/simulator_v2.py index 4279b41c4db5475b1ef18fc235923d726b58d02b..3460529ac3c53c15858a236159de61cecb1053c9 100644 --- a/simulator_v2.py +++ b/simulator_v2.py @@ -11,14 +11,11 @@ class PoissonQueueSimulator: self.num_queues = num_queues self.queue_policy = queue_policy self._round_robin_count = 0 - self.visitor_queue = [[] for _ in range( - self.num_queues)] # (end time, total time) + self.visitor_queue = [[] for _ in range(self.num_queues)] # (end time, total time) def simulate(self): - arrival_times = np.random.exponential( - scale=1 / self.arrival_rate, size=self.num_visitors) - process_times = np.random.exponential( - scale=1 / self.service_rate, size=self.num_visitors) + arrival_times = np.random.exponential(scale = 1 / self.arrival_rate, size = self.num_visitors) + process_times = np.random.exponential(scale = 1 / self.service_rate, size = self.num_visitors) max_queue_lengths = [0] * self.num_queues total_waiting_times = [0] * self.num_queues num_visitors_in_queue = [0] * self.num_queues @@ -89,53 +86,21 @@ class PoissonQueueSimulator: elif len(self.visitor_queue[queue_id]) == minNbInQueue: minQueues.append(queue_id) return minQueues[np.random.randint(0, len(minQueues))] - - -def _run(): - simulator = PoissonQueueSimulator( - arrival_rate, service_rate, num_visitors, num_queues, queue_policy) + +def _run(arrival_rate, service_rate, num_visitors, num_queues, queue_policy): + simulator = PoissonQueueSimulator(arrival_rate, service_rate, num_visitors, num_queues, queue_policy) visitors, max_queue_lengths, average_waiting_times = simulator.simulate() - - ################ WRITING TO CSV ################## - with open(f"{policy}.csv", "w", newline="") as csvfile: - fieldnames = [ - "Visitor ID", "Arrival Time", "Start Time", "End Time", "Process Time", "Total Time", "Queue ID"] - writer = csv.DictWriter(csvfile, fieldnames=fieldnames) - - writer.writeheader() - - for visitor in visitors: - writer.writerow( - {"Visitor ID": visitor["visitor_id"], "Arrival Time": visitor["arrival_time"], "Start Time": visitor["start_time"], - "End Time": visitor["end_time"], "Process Time": visitor["process_time"], "Total Time": visitor["total_time"], "Queue ID": visitor["queue_id"]}) - ################ WRITING TO CSV ################## - - print("Visitors:") - print(f"Visitor ID;Arrival Time;Start Time;End Time;Process Time;Total Time;Queue ID") + + print(f"Visitor ID\tArrival Time\t\tStart Time\t\tEnd Time\t\tProcess Time\t\tWaiting Time\t\tQueue ID") for visitor in visitors: - print(f"{visitor['visitor_id']};{visitor['arrival_time']};" - f"{visitor['start_time']};{visitor['end_time']};" - f"{visitor['process_time']};{visitor['total_time']};" - f"{visitor['queue_id']}") - print("\nQueue Stats:") - for queue_id, max_length in enumerate(max_queue_lengths): - print( - f"Queue ID: {queue_id}, Max Queue Length: {max_length}, Average Waiting Time: {average_waiting_times[queue_id]}") + print(f"{visitor['visitor_id']}\t\t{visitor['arrival_time']}\t" + f"{visitor['start_time']}\t{visitor['end_time']}\t" + f"{visitor['process_time']}\t{visitor['total_time']}\t" + f"{visitor['queue_id']}") + print() -# Example usage -seed = int(time.time()) -np.random.seed(seed) -arrival_rate = 10 # average arrival rate of n visitors per time unit -service_rate = 1 # average service rate of n visitors per time unit -num_visitors = 10 # total number of visitors to simulate -num_queues = 3 # total number of queues -# queue selection policy: random, round-robin, shortest-queue -# queue_policy = 'shortest-queue' -policies = ["random", "round-robin", "shortest-queue"] - -for policy in policies: - queue_policy = policy + for queue_id, max_length in enumerate(max_queue_lengths): + print(f"Queue ID: {queue_id}, Max Queue Length: {max_length}, Average Waiting Time: {average_waiting_times[queue_id]}") - # for i in range(100): - _run() + print("\n")