static void Main(string[] args) { //Define a solução Algoritmo.setSolucao("Hello World"); //Define os caracteres existentes Algoritmo.setCaracteres("!,.:;?áÁãÃâÂõÕôÔóÓéêÉÊíQWERTYUIOPASDFGHJKLÇZXCVBNMqwertyuiopasdfghjklçzxcvbnm1234567890 "); //taxa de crossover de 60% Algoritmo.setTaxaDeCrossover(0.9); //taxa de mutação de 3% Algoritmo.setTaxaDeMutacao(0.3); //elitismo bool eltismo = true; //tamanho da população int tamPop = 500; //numero máximo de gerações int numMaxGeracoes = 10000; //define o número de genes do indivíduo baseado na solução int numGenes = Algoritmo.getSolucao().Length; //cria a primeira população aleatérioa Populacao populacao = new Populacao(numGenes, tamPop); bool temSolucao = false; int geracao = 0; System.Console.WriteLine("Iniciando... Aptidão da solução: " + (Algoritmo.getSolucao().Length)); //loop até o critério de parada while (!temSolucao && geracao < numMaxGeracoes) { geracao++; //cria nova populacao populacao = Algoritmo.novaGeracao(populacao, eltismo); System.Console.WriteLine("Geração " + geracao + " | Aptidão: " + populacao.getIndivduo(0).getAptidao() + " | Melhor: " + populacao.getIndivduo(0).getGenes()); //verifica se tem a solucao temSolucao = populacao.temSolocao(Algoritmo.getSolucao()); } if (geracao == numMaxGeracoes) { System.Console.WriteLine("Número Maximo de Gerações | " + populacao.getIndivduo(0).getGenes() + " " + populacao.getIndivduo(0).getAptidao()); } if (temSolucao) { System.Console.WriteLine("Encontrado resultado na geração " + geracao + " | " + populacao.getIndivduo(0).getGenes() + " (Aptidão: " + populacao.getIndivduo(0).getAptidao() + ")"); } }
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); }