def nova_geracao(self, populacao, elitismo): nova_populacao = Populacao(tam_pop=populacao.get_tam_populacao()) if (elitismo): nova_populacao.set_individuo(populacao.get_individuo(0)) while (nova_populacao.get_num_individuos() < nova_populacao.get_tam_populacao()): pais = self.selecao_torneio(populacao) filhos = [] # verifica a taxa de crossover, se sim realiza o crossover, se não, mantém os pais selecionados para a próxima geração if (random.uniform(0.0, 1.0) <= self.taxa_crossover): filhos = self.crossover(pais[1], pais[0]) else: filhos.append(Individuo(genes=pais[0].get_genes())) filhos.append(Individuo(genes=pais[1].get_genes())) # adiciona os filhos na nova geração nova_populacao.set_individuo(filhos[0]) nova_populacao.set_individuo(filhos[1]) # ordena a nova população nova_populacao.ordena_populacao() return nova_populacao
def selecao_torneio(self, populacao): populacao_intermediaria = Populacao(tam_pop=3) # seleciona 3 indivíduos aleatóriamente na população populacao_intermediaria.set_individuo( populacao.get_individuo( random.randint(0, (populacao.get_tam_populacao() - 1)))) populacao_intermediaria.set_individuo( populacao.get_individuo( random.randint(0, (populacao.get_tam_populacao() - 1)))) populacao_intermediaria.set_individuo( populacao.get_individuo( random.randint(0, (populacao.get_tam_populacao() - 1)))) # ordena a população populacao_intermediaria.ordena_populacao() pais = [] # seleciona os 2 melhores deste população pais.insert(0, populacao_intermediaria.get_individuo(0)) pais.insert(1, populacao_intermediaria.get_individuo(1)) return pais