Skip to content
Snippets Groups Projects
Commit 55d2f18a authored by adrian.spycher's avatar adrian.spycher
Browse files

add graph

parent 8970923e
Branches
No related tags found
No related merge requests found
graph.py 0 → 100644
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
...@@ -11,14 +11,11 @@ class PoissonQueueSimulator: ...@@ -11,14 +11,11 @@ class PoissonQueueSimulator:
self.num_queues = num_queues self.num_queues = num_queues
self.queue_policy = queue_policy self.queue_policy = queue_policy
self._round_robin_count = 0 self._round_robin_count = 0
self.visitor_queue = [[] for _ in range( self.visitor_queue = [[] for _ in range(self.num_queues)] # (end time, total time)
self.num_queues)] # (end time, total time)
def simulate(self): def simulate(self):
arrival_times = np.random.exponential( arrival_times = np.random.exponential(scale = 1 / self.arrival_rate, size = self.num_visitors)
scale=1 / self.arrival_rate, size=self.num_visitors) process_times = np.random.exponential(scale = 1 / self.service_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 max_queue_lengths = [0] * self.num_queues
total_waiting_times = [0] * self.num_queues total_waiting_times = [0] * self.num_queues
num_visitors_in_queue = [0] * self.num_queues num_visitors_in_queue = [0] * self.num_queues
...@@ -90,52 +87,20 @@ class PoissonQueueSimulator: ...@@ -90,52 +87,20 @@ class PoissonQueueSimulator:
minQueues.append(queue_id) minQueues.append(queue_id)
return minQueues[np.random.randint(0, len(minQueues))] return minQueues[np.random.randint(0, len(minQueues))]
def _run(arrival_rate, service_rate, num_visitors, num_queues, queue_policy):
def _run(): simulator = PoissonQueueSimulator(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() visitors, max_queue_lengths, average_waiting_times = simulator.simulate()
################ WRITING TO CSV ################## print(f"Visitor ID\tArrival Time\t\tStart Time\t\tEnd Time\t\tProcess Time\t\tWaiting Time\t\tQueue ID")
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")
for visitor in visitors: for visitor in visitors:
print(f"{visitor['visitor_id']};{visitor['arrival_time']};" print(f"{visitor['visitor_id']}\t\t{visitor['arrival_time']}\t"
f"{visitor['start_time']};{visitor['end_time']};" f"{visitor['start_time']}\t{visitor['end_time']}\t"
f"{visitor['process_time']};{visitor['total_time']};" f"{visitor['process_time']}\t{visitor['total_time']}\t"
f"{visitor['queue_id']}") 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()
# Example usage for queue_id, max_length in enumerate(max_queue_lengths):
seed = int(time.time()) print(f"Queue ID: {queue_id}, Max Queue Length: {max_length}, Average Waiting Time: {average_waiting_times[queue_id]}")
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 i in range(100): print("\n")
_run()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment