def process_event(self): self.t, event_type = self.events.pop() if event_type == INCOMING: self.update_n() if self.warm_up_sample > 0: new_client = Client(TRANSIENT) self.warm_up_sample -= 1 else: new_client = Client(EQUILIBRIUM) new_client.set_queue(1) new_client.set_arrival(self.t) self.queue1.append(new_client) self.clients.append(new_client) self.events.push((self.t + dist.exp_time(self.entry_rate), INCOMING)) if not self.server_current_client: self.events.push((self.t, SERVER_1_IN)) elif event_type == SERVER_1_IN: server_time = dist.exp_time(self.server_rate) self.server_current_client = self.pop_queue1() self.server_current_client.set_leave(self.t) self.server_current_client.set_server(server_time) self.events.push((self.t + server_time, SERVER_OUT)) elif event_type == SERVER_2_IN: server_time = dist.exp_time(self.server_rate) self.server_current_client = self.pop_queue2() self.server_current_client.set_leave(self.t) self.server_current_client.set_server(server_time) self.events.push((self.t + server_time, SERVER_OUT)) elif event_type == SERVER_OUT: self.update_n() if self.queue1: self.events.push((self.t, SERVER_1_IN)) elif self.queue2: self.events.push((self.t, SERVER_2_IN)) if self.server_current_client.queue == 1: self.queue_2_in() else: self.server_current_client.set_served(1) self.server_current_client = None
def init_sample(self): self.queue1 = deque([]) self.queue2 = deque([]) self.server_current_client = None self.clients = [] self.N_samples = { 'Nq_1': 0, 'N_1': 0, 'Nq_2': 0, 'N_2': 0, } self.warm_up_sample = self.warm_up self.t = 0.0 self.previous_event_time = 0.0 self.events = EventHeap() self.events.push((dist.exp_time(self.entry_rate), INCOMING))
def init_sample(self): # Filas do sistema. self.queue1 = deque([]) self.queue2 = deque([]) # Cliente que está no servidor ( Quando esta variável for nula significa que o servidor está ocioso ) self.server_current_client = None # Lista dos clientes que entraram no sistema durante a rodada. self.clients = [] # Dicionário com a soma das variáveis que indicam o número de pessoas nas filas (N) e em espera (Nq) self.N_samples = { 'Nq_1': 0, 'N_1': 0, 'Nq_2': 0, 'N_2': 0 } self.warm_up_sample = self.warm_up # Tempo do simulador. self.t = 0.0 # Tempo do evento anterior ao que está sendo processado. self.previous_event_time = 0.0 # Lista de eventos. self.events = EventHeap() # Inicializa o simulador com o evento de chegada do primeiro cliente ao sistema. self.events.push((dist.exp_time(self.entry_rate), INCOMING))
def process_event(self): # Remove um evento da lista para ser processado e atualiza o tempo do simulador self.t, event_type = self.events.pop() # Evento do tipo: Chegada ao sistema. if event_type == INCOMING: self.update_n() # Define a cor do cliente, verificando se ele chegou durante a fase transiente ou não. if self.warm_up_sample > 0: new_client = Client(len(self.clients), TRANSIENT) self.warm_up_sample -= 1 else: new_client = Client(len(self.clients), EQUILIBRIUM) # Adiciona o cliente na fila 1 e define o seu tempo de chegada nessa fila. new_client.set_queue(1) new_client.set_arrival(self.t) self.queue1.append(new_client) self.clients.append(new_client) # Teste de correção if self.test and (new_client.id in self.test_list): print "Cliente", new_client.id, "gerou o evento Chegada ao sistema." print "Cliente", new_client.id, "entrou na fila 1." # Assim que uma chegada é processada, adiciona outro evento de chegada, dando o tempo que ela irá ocorrer. self.events.push((self.t + dist.exp_time(self.entry_rate), INCOMING)) # Se o servidor estiver ocioso, adiciona o evento Entrada ao servidor pela fila 1 para esse cliente na lista. if not self.server_current_client: self.events.push((self.t, SERVER_1_IN)) # Evento do tipo: Entrada ao servidor pela fila 1. elif event_type == SERVER_1_IN: # Define o tempo que o cliente vai ficar no servidor. server_time = dist.exp_time(self.server_rate) # Adiciona o cliente no servidor e define o seu tempo de saída da fila 1. self.server_current_client = self.pop_queue1() self.server_current_client.set_leave(self.t) self.server_current_client.set_server(server_time) # Teste de correção if self.test and (self.server_current_client.id in self.test_list): print "Cliente", self.server_current_client.id, "gerou o evento Entrada ao servidor pela fila 1." print "Cliente", self.server_current_client.id, "entrou no servidor." # Adiciona o evento Saída do servidor na lista. self.events.push((self.t + server_time, SERVER_OUT)) # Evento do tipo: Entrada ao servidor pela fila 2. elif event_type == SERVER_2_IN: # Define o tempo que o cliente vai ficar no servidor. server_time = dist.exp_time(self.server_rate) # Adiciona o cliente no servidor e define o seu tempo de saída da fila 2. self.server_current_client = self.pop_queue2() self.server_current_client.set_leave(self.t) self.server_current_client.set_server(server_time) # Teste de correção if self.test and (self.server_current_client.id in self.test_list): print "Cliente", self.server_current_client.id, "gerou o evento Entrada ao servidor pela fila 2." print "Cliente", self.server_current_client.id, "entrou no servidor." # Adiciona o evento Saída do servidor na lista. self.events.push((self.t + server_time, SERVER_OUT)) # Evento do tipo: Saída do servidor. elif event_type == SERVER_OUT: self.update_n() # Se a fila 1 possuir clientes, adiciona o evento Entrada ao servidor pela fila 1 na lista. if self.queue1: self.events.push((self.t, SERVER_1_IN)) # Se a fila 2 possuir clientes e a fila 1 vazia, ou se o sistema estiver vazio e o cliente que # está no servidor entrou nele pela fila 1, adiciona o evento Entrada ao servidor pela fila 2 na lista. elif self.queue2 or self.server_current_client.queue == 1: self.events.push((self.t, SERVER_2_IN)) # Teste de correção if self.test and (self.server_current_client.id in self.test_list): print "Cliente", self.server_current_client.id, "gerou o evento Saída do servidor." # Se o cliente que está no servidor entrou nele pela fila 1, adiciona ele na fila 2. if self.server_current_client.queue == 1: self.queue_2_in() # Senão, define que ele foi servido e saiu do sistema. else: self.server_current_client.set_served(1) self.server_current_client = None