class Simulation: def __init__(self): with open('simulation.txt', 'r') as file: self._data = Queue() for line in file.readlines(): self._data.enqueue(line.strip('\n')) self._description = self._data.dequeue() self._clock = Clock(int(self._data.dequeue())*60) self._number_of_windows = int(self._data.dequeue()) self._lines = self._data.dequeue() self._theater = Theater(self._number_of_windows, self._lines) for window in range(self._number_of_windows): self._theater.add_window(int(self._data.dequeue())) end = False while self._clock.check_stop(): if self._clock._time == 0: print('Time {:5} - Simulation started'.format(self._clock._time)) if self._data.front() == 'END': end = True if end == False: if int(self._data.front().split()[1]) == self._clock._time: for customer in range(int(self._data.dequeue().split()[0])): line_number = self._theater.add_customer( self._clock._time) print('Time {:5} - Customer entered line #{}'.format( self._clock._time, line_number)) self._theater.move_customer_to_window(self._clock._time) self._clock.increment()
def __init__(self, line_num: int, clock: Clock): self._line_num = line_num self._clock = clock self._queue = Queue() # Statistics self._max_length = 0 self._customer_wait_times = []
class TicketWindow: def __init__(self, window_number, process_time): self._queue = Queue() self._window_number = window_number self._process_time = process_time def __repr__(self): return 'Ticket Window {} Customer: {} Process Time: {}'.format( self._window_number, repr(self._queue), self._process_time) def enqueue(self, customer): self._queue.enqueue(customer) def check_empty(self): return len(self._queue) == 0
def __init__(self, line_number): self._line_number = line_number self._queue = Queue() self._max_length = 0 self._current_wait_time = 0 self._total_wait_time = 0 self._max_wait_time = 0
class TicketLine: def __init__(self, line_num: int, clock: Clock): self._line_num = line_num self._clock = clock self._queue = Queue() # Statistics self._max_length = 0 self._customer_wait_times = [] def __str__(self): result = 'Line #{}'.format(self._line_num) + ": " result += str(list(self._queue)) return result def __len__(self): return len(self._queue) def get_statistics(self): return TicketLineStatistics(len(self), self._max_length, self._customer_wait_times) def is_empty(self): return len(self._queue) == 0 def get_line_num(self): return self._line_num def enqueue_customer(self, customer: Customer): self._queue.enqueue(customer) if len(self._queue) > self._max_length: self._max_length = len(self._queue) def dequeue_customer(self): first_in_line = self._queue.front() self._customer_wait_times.append(first_in_line.get_time_spent_in_line()) return self._queue.dequeue() def update_waiting_times(self): for customer in self._queue: customer.increment_wait_time()
class TicketLine: def __init__(self, line_number): self._line_number = line_number self._queue = Queue() self._max_length = 0 self._current_wait_time = 0 self._total_wait_time = 0 self._max_wait_time = 0 def enqueue(self, time): self._queue.enqueue((Customer(), time)) def dequeue(self): return self._queue.dequeue() def front(self): return self._queue.front() def customer_in_line(self): return len(self._queue) > 0 def __len__(self): return len(self._queue) def __gt__(self, line): return len(self) > len(line) def __repr__(self): return 'Ticket Line {}: {}'.format(self._line_number, repr(self._queue))
def __init__(self, window_number, process_time): self._queue = Queue() self._window_number = window_number self._process_time = process_time