예제 #1
0
    def evoluir(self):
        self.a = 0
        global result_list
        
        historico_populacao = [] # melhor populacao em cada evolucao
        historico_populacao.append(self._cromossomo_inicial)
        melhor_cromossomo = self._cromossomo_inicial
        while self.__condicao_parada(extremo(deepcopy(historico_populacao), 1)[0]):
            #print('evol\t' + str(self.a) + ' - ' + self._experimento)
            self.a = self.a+1
            
            """prints de controle
            print("evolucao - " + str(self.a) + '       temperatura - ' + str(self._T))
            
            # Debug print ---- Remover apos corrigir os erros
            print("Inicio do AG e antes do SA - \n")
            print(self._populacao)
            print("\n\n")
            """

            #--------   Simulated Annealing  ---------------#
            
            pool = Pool()
            results = []
            i = 0
            #Dispara as N threads de SA (onde N e o tamanho da populacao)
            for cromossomo in self._populacao:
                results.append(pool.apply_async(func = simulated_annealing, args = (cromossomo, self._NR, self._T, self._mutacao_SA, self._argumentos)))
                i += 1
            pool.close()
            pool.join()
            
            self._populacao = list(map(lambda x, y: x.get(timeout = y), results, range(self._tam_populacao)))
            
            """
            # Debug print ---- Remover apos corrigir os erros
            print("Depois do SA - \n")
            print(self._populacao)
            print("\n\n")
            """
            
            #--------  Algoritmo genetico  -----------------#
            for _ in range(self._evolucoesAG):
                # execultar o calculo de aptidao / func avaliacao #
                for cromossomo in self._populacao:
                    cromossomo.funcao_avaliacao()  # atualiza o score do cromossomo
                
                # selecao #
                if self._selecao is extremo:
                    nova_populacao = self._selecao(deepcopy(self._populacao), self._n_melhores)
                elif self._selecao is media:
                    nova_populacao = self._selecao(deepcopy(self._populacao))
                elif self._selecao is roleta:
                    nova_populacao = self._selecao(deepcopy(self._populacao))
                
                # mutacao #
                n_elementos_mutados = self._tam_populacao - len(nova_populacao)
                if self._mutacao is embaralhar:
                    nova_populacao.extend(self._mutacao(deepcopy(nova_populacao), n_elementos_mutados))
                elif self._mutacao is janela:
                    nova_populacao.extend(self._mutacao(deepcopy(nova_populacao), self._janela, self._randomizar_janela, n_elementos_mutados))
                elif self._mutacao is randomPosition:
                    nova_populacao.extend(self._mutacao(deepcopy(nova_populacao), n_elementos_mutados))
                elif self._mutacao is trocaFontes:
                    nova_populacao.extend(self._mutacao(deepcopy(nova_populacao), n_elementos_mutados))
                elif self._mutacao is centraliza:
                    nova_populacao.extend(self._mutacao(deepcopy(nova_populacao), n_elementos_mutados))
                elif self._mutacao is troca_temperatura:
                    nova_populacao.extend(self._mutacao(deepcopy(nova_populacao), self._T, n_elementos_mutados))
                elif self._mutacao is colocaFontes:
                    nova_populacao.extend(self._mutacao(deepcopy(nova_populacao), n_elementos_mutados))
                    
                self._populacao = deepcopy(nova_populacao)
            
            """
            # Debug print ---- Remover apos corrigir os erros
            print("Final do AG - \n")
            print(self._populacao)
            print("\n\n")
            """
            #print(extremo(deepcopy(self._populacao), 1))
            melhor_cromossomo = extremo(deepcopy(self._populacao), 1)[0]
            historico_populacao.append(melhor_cromossomo)  # vetor com o melhor de cada populacao
            
            self._T = self._T * self._alfa
            
            if self.a % 5 == 0:
                desenha_cromossomo("evolucao_" + str(self.a),melhor_cromossomo)
        
        melhor_solucao = extremo(deepcopy(historico_populacao), 1)
        if melhor_solucao[0].score[1] == 1:
            print("Nenhuma solucao viavel encontrada")
        else:
            print("Melhor solucao:")
            print(melhor_solucao)
            #desenha_cromossomo("melhor solucao",melhor_solucao[0])
        return historico_populacao
예제 #2
0

if __name__ == '__main__':
    tipo = "Excel"
    #medindo o tempo
    ini = time.time()
            
    cromossomo = Cromossomo('0', fontes_iniciais())
    
    #cromossomo = gera_cromossomo_banco()
    cromossomo.funcao_avaliacao()
    
    """<doc>"""
    print('Cromossomo original')
    print(cromossomo)
    desenha_cromossomo('cromossomo_inicial',cromossomo)
    """</doc>"""
    
    if tipo == "Hibrido":
        #Hibrido - SA
        hibrido = Hibrido()
        
        hibrido.set_Hibrido('teste unico', cromossomo, tam_populacao=100, prob_inicial=0.8, prob_final=0.1, evolucoesH=40, evolucoesAG=50)
        hibrido.set_selecao(extremo, 10)
        hibrido.set_mutacao(troca_temperatura)
        hibrido.set_mutacao_SA(troca_temperatura)
        
        hibrido.evoluir()
    
    elif tipo == "AG":
        #AG - Normal