Below is Python code that simulates a queueing system. It should reflect the algorithm you developed in your groups.

>>> import random

>>> def simulate_queue(arrival_rate, service_rate, number_of_staff, time_period, limit):
...     """
...     Simulates one run of a queue and returns the proportion of customers
...     waiting over a given limit. The parameters are:
...     
...     + arrival_rate
...     + service_rate
...     + number_of_staff
...     + time_period
...     + limit
...     """
...     number_of_customers = 0
...     number_over_limit = 0
...     now = 0
...     server_available_dates = [0] * number_of_staff
...     service_times = []

...     while now < time_period:
...         inter_arrival_time = random.expovariate(arrival_rate)
...         now += inter_arrival_time
...         number_of_customers += 1
...         
...         service_start_date = max(now, min(server_available_dates))
...         
...         service_time = random.expovariate(service_rate)
...         service_end_date = service_start_date + service_time
...         
...         server_available_dates.append(service_end_date)
...         server_available_dates.sort()
...         server_available_dates = server_available_dates[-number_of_staff:]
...                 
...         wait = service_start_date - now
...         if wait > limit:
...             number_over_limit += 1
...     
...     return number_over_limit / number_of_customers


>>> def get_proportion_waiting_over_limit(
...     arrival_rate=1.5,
...     service_rate=0.15,
...     number_of_staff=10,
...     limit=0.5,
...     time_period=31*24,
...     number_of_repetitions=100,
... ):
...     """
...     Gives the average proportion of customers waiting over a given limit,
...     over number_of_repetitions repetitions. The parameters are:
...     
...     + arrival_rate
...     + service_rate
...     + number_of_staff
...     + time_period
...     + limit
...     + number_of_repetitions
...     """
...     proportions = []
...     for repetition in range(number_of_repetitions):
...         proportions.append(simulate_queue(arrival_rate=arrival_rate, service_rate=service_rate, number_of_staff=number_of_staff, limit=limit, time_period=time_period))
...     return sum(proportions) / len(proportions)
>>> get_proportion_waiting_over_limit()
0.8426850555949335

Study the code above, ensure that you understand what it is doing, and how it relates to the overall task of simulating a queue. The image below points out some key Python concepts used in the code:

Use the sentences below to fill in the blank boxes in the image above with the sentences below. Match the key concept with some description of its use:

A print out of these will be given in class.

Complete the task by the next session, you may wish to look ahead in the course notes.


Previous - Home - Next