Exemplo n.º 1
0
        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 + ")");
            }
        }
Exemplo n.º 2
0
        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;
        }
Exemplo n.º 3
0
        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;
        }