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