Exemple #1
0
def roleta(populacao, p_melhores=30):
    
    n_elementos = int((len(populacao) * p_melhores) / 100)
    ''' TODO: Lancar uma excecao caso:
        se p_melhores > 100
        se p_melhores <=0
        se n_elementos <= 0
    '''
    #com os sem sobreposicao na frente
    populacao_ordenada = extremo(populacao, len(populacao))
    
    # pesos
    pesos = []
    for i in range(len(populacao_ordenada)):
        pesos.append(randrange(1, 10) * i + 1)
    
    # roleta
    selecionados = []
    while len(selecionados) < n_elementos:
        for i in range(len(populacao_ordenada)):
            if pesos[i] == min(pesos):
                selecionados.append(populacao_ordenada[i])
                pesos[i] = max(pesos)
    
    return selecionados
Exemple #2
0
def arquivar(f, n_evolucao, experimento, score_ini, melhores_evolucao, tempo):
    
    if not os.path.exists(join('dados', str(n_evolucao))):  # cria a pasta, se necessario
        os.makedirs(join('dados', str(n_evolucao)))
    
    txt = open(join('dados', str(n_evolucao), str(f) + '.txt'), mode='w')
    txt.write(experimento+'\n\n')
    for score in score_ini:
        txt.write(str(score[2])+'\t'+str(score[1])+'\n')
    txt.write('\nTempo de execucao:\t' + str(tempo)+'\n')
    txt.write('Melhor Cromossomo:\t' + str(extremo(deepcopy(melhores_evolucao), 1)[0].score[2])+'\t'+str(extremo(deepcopy(melhores_evolucao), 1)[0].score[1])+'\n\n')
    """
    for cromossomo in melhores_evolucao:
        txt.write(str(cromossomo.score[2])+'\t'+str(cromossomo.score[1])+'\n')
        log_resultado(f, str(melhores_evolucao.index(cromossomo)), n_evolucao, experimento, cromossomo)
    """
    log_resultado(f, 'melhor_resultado', n_evolucao, experimento, extremo(deepcopy(melhores_evolucao), 1)[0])
    txt.close
Exemple #3
0
def simulated_annealing(cromossomo, NR, T, mutacao_SA, *args):
    #configuração da mutação
    _mutacao_SA = mutacao_SA
    #print(args)
    if _mutacao_SA is janela:
        _janela = args[0][0]
        _randomizar_janela = args[0][1]
            
    ran = Random()
    _NR = NR
    _T = T
    cromossomo_sa = cromossomo
    cromossomo_sa_2 = None
    for _ in range(_NR):
        #Funcao de visinhanca - Mutacao
        if _mutacao_SA is embaralhar:
            cromossomo_sa_2 = _mutacao_SA(deepcopy(cromossomo_sa))
        elif _mutacao_SA is randomPosition:
            cromossomo_sa_2 = _mutacao_SA(deepcopy(cromossomo_sa))
        elif _mutacao_SA is centraliza:
            cromossomo_sa_2 = _mutacao_SA(deepcopy(cromossomo_sa))
        elif _mutacao_SA is troca_temperatura:
            cromossomo_sa_2 = _mutacao_SA(deepcopy(cromossomo_sa), _T)
        elif _mutacao_SA is colocaFontes:
            cromossomo_sa_2 = _mutacao_SA(deepcopy(cromossomo_sa))
        elif _mutacao_SA is janela:
            popula = []
            popula.append(deepcopy(cromossomo_sa))
            nova_populacao = []
            nova_populacao.extend(_mutacao_SA(popula, _janela, _randomizar_janela, 1)[0])
            nova_populacao.extend(_mutacao_SA(popula, _janela, _randomizar_janela+1, 1)[0])
            nova_populacao.extend(_mutacao_SA(popula, _janela, _randomizar_janela+2, 1)[0])
            nova_populacao.extend(_mutacao_SA(popula, _janela, _randomizar_janela+3, 1)[0])
            cromossomo_sa_2 = extremo(deepcopy(popula), 1)[0]
            
        #calculo do delta
        cromossomo_sa_2.funcao_avaliacao()
        cromossomo_sa.funcao_avaliacao()
        deltaE = cromossomo_sa_2.score[0] - cromossomo_sa.score[0]
            
        #decisão de escolha - probabilidade em funcao da temperatura
        #print('probabilidade de escolha SA: '+str(math.exp(-deltaE / T)))
        if deltaE <= 0 or (cromossomo_sa.score[1] == 1 and cromossomo_sa_2.score[1] == 0):
            cromossomo_sa = cromossomo_sa_2
        else:
            #if ran.random() < (1513096 * (-deltaE / _T) + (1072693248 - 90.253)):77


            if ran.random() < math.exp(-deltaE / _T):
                cromossomo_sa = cromossomo_sa_2
                
    return cromossomo_sa
Exemple #4
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