public static void Main(string[] args) { //Define a solução Algoritimo.Solucao = "Algorítimos Genéticos, AGs, são métodos de busca inspirados na evolução dos seres vivos, introduzidos por John Holland e popularizados por um de seus alunos, David Goldberg, seguem o princípio da seleção natural e sobrevivência dos mais aptos, segundo Charles Darwin."; //Define os caracteres existentes Algoritimo.Caracteres = "!,.:;?áÁãÃâÂõÕôÔóÓéêíÉÊQWERTYUIOPASDFGHJKLÇZXCVBNMqwertyuiopasdfghjklçzxcvbnm1234567890 "; //taxa de crossover de 60% Algoritimo.TaxaDeCrossover = 0.6; //taxa de mutação de 3% Algoritimo.TaxaDeMutacao = 0.3; //elitismo bool eltismo = true; //tamanho da população int tamPop = 100; //numero máximo de gerações int numMaxGeracoes = 10000; //define o número de genes do indivíduo baseado na solução int numGenes = Algoritimo.Solucao.Length; //cria a primeira população aleatérioa Populacao populacao = new Populacao(numGenes, tamPop); bool temSolucao = false; int geracao = 0; Console.WriteLine("Iniciando... Aptidão da solução: " + Algoritimo.Solucao.Length); //loop até o critério de parada while (!temSolucao && geracao < numMaxGeracoes) { geracao++; //cria nova populacao populacao = Algoritimo.novaGeracao(populacao, eltismo); Console.WriteLine("Geração " + geracao + " | Aptidão: " + populacao.getIndivduo(0).Aptidao + " | Melhor: " + populacao.getIndivduo(0).Genes); //verifica se tem a solucao temSolucao = populacao.temSolocao(Algoritimo.Solucao); } if (geracao == numMaxGeracoes) { Console.WriteLine("Número Maximo de Gerações | " + populacao.getIndivduo(0).Genes + " " + populacao.getIndivduo(0).Aptidao); } if (temSolucao) { Console.WriteLine("Encontrado resultado na geração " + geracao + " | " + populacao.getIndivduo(0).Genes + " (Aptidão: " + populacao.getIndivduo(0).Aptidao + ")"); } }
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; }