Beispiel #1
0
    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
Beispiel #2
0
 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