//cria um indivíduo com os genes definidos public Individuo(String genes) { this.genes = genes; Random r = new Random(); //se for mutar, cria um gene aleatório if (r.NextDouble() <= Algoritmo.getTaxaDeMutacao()) { String caracteres = Algoritmo.getCaracteres(); String geneNovo = ""; int posAleatoria = r.Next(genes.Length); for (int i = 0; i < genes.Length; i++) { if (i == posAleatoria) { geneNovo += caracteres[(r.Next(caracteres.Length))]; } else { geneNovo += genes[i]; } } this.genes = geneNovo; } geraAptidao(); }
//gera o valor de aptidão, será calculada pelo número de bits do gene iguais ao da solução private void geraAptidao() { String solucao = Algoritmo.getSolucao(); for (int i = 0; i < solucao.Length; i++) { if (solucao[i] == genes[i]) { aptidao++; } } }
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() + ")"); } }
//gera um indivíduo aleatório public Individuo(int numGenes) { genes = ""; Random r = new Random(); String caracteres = Algoritmo.getCaracteres(); for (int i = 0; i < numGenes; i++) { genes += caracteres[(r.Next(caracteres.Length))]; } geraAptidao(); }