public static Individuo[] selecaoTorneio(Populacao populacao) { Random r = new Random(); Populacao populacaoIntermediaria = new Populacao(3); //seleciona 3 indivíduos aleatóriamente na população populacaoIntermediaria.setIndividuo(populacao.getIndivduo(r.Next(populacao.getTamPopulacao()))); populacaoIntermediaria.setIndividuo(populacao.getIndivduo(r.Next(populacao.getTamPopulacao()))); populacaoIntermediaria.setIndividuo(populacao.getIndivduo(r.Next(populacao.getTamPopulacao()))); //ordena a população populacaoIntermediaria.ordenaPopulacao(); Individuo[] pais = new Individuo[2]; //seleciona os 2 melhores deste população pais[0] = populacaoIntermediaria.getIndivduo(0); pais[1] = populacaoIntermediaria.getIndivduo(1); return(pais); }
public static Populacao novaGeracao(Populacao populacao, bool elitismo) { Random r = new Random(); //nova população do mesmo tamanho da antiga Populacao novaPopulacao = new Populacao(populacao.getTamPopulacao()); //se tiver elitismo, mantém o melhor indivíduo da geração atual if (elitismo) { novaPopulacao.setIndividuo(populacao.getIndivduo(0)); } //insere novos indivíduos na nova população, até atingir o tamanho máximo while (novaPopulacao.getNumIndividuos() < novaPopulacao.getTamPopulacao()) { //seleciona os 2 pais por torneio Individuo[] pais = selecaoTorneio(populacao); Individuo[] filhos = new Individuo[2]; //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 (r.NextDouble() <= taxaDeCrossover) { filhos = crossover(pais[1], pais[0]); } else { filhos[0] = new Individuo(pais[0].getGenes()); filhos[1] = new Individuo(pais[1].getGenes()); } //adiciona os filhos na nova geração novaPopulacao.setIndividuo(filhos[0]); novaPopulacao.setIndividuo(filhos[1]); } //ordena a nova população novaPopulacao.ordenaPopulacao(); return(novaPopulacao); }