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.Individuo = populacao.getIndivduo(r.Next(populacao.TamPopulacao)); populacaoIntermediaria.Individuo = populacao.getIndivduo(r.Next(populacao.TamPopulacao)); populacaoIntermediaria.Individuo = populacao.getIndivduo(r.Next(populacao.TamPopulacao)); //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.TamPopulacao); //se tiver elitismo, mant�m o melhor indiv�duo da gera��o atual if (elitismo) { novaPopulacao.Individuo = populacao.getIndivduo(0); } //insere novos indiv�duos na nova popula��o, at� atingir o tamanho m�ximo while (novaPopulacao.NumIndividuos < novaPopulacao.TamPopulacao) { //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].Genes); filhos[1] = new Individuo(pais[1].Genes); } //adiciona os filhos na nova gera��o novaPopulacao.Individuo = filhos[0]; novaPopulacao.Individuo = filhos[1]; } //ordena a nova popula��o novaPopulacao.ordenaPopulacao(); return novaPopulacao; }