Ejemplo n.º 1
0
    static void ordenar(List <Cromossomo> populacao)
    {
        //implementação do método do pente - combsort
        int  distancia = populacao.Count;
        bool houveTroca;

        do
        {
            distancia = (int)(distancia / 1.3);

            if (distancia < 1)
            {
                distancia = 1;
            }
            houveTroca = false;
            for (int i = 0; i + distancia < populacao.Count; i++)
            {
                if ((int)populacao[i].aptidao < (int)populacao[i + distancia].aptidao)
                {
                    houveTroca = true;
                    Cromossomo temp = populacao[i];
                    populacao[i]             = populacao[i + distancia];
                    populacao[i + distancia] = temp;
                }
            }
        } while (distancia != 1 || houveTroca);
    }
    //
    // ─── FUNÇÕES BÁSICAS DO ALGORITMO GENÉTICO ──────────────────────────────────────
    //

    /**
     * Cria e configura os indivíduos da primeira geração.
     */
    void inicializarPopulacao()
    {
        qtdIndividuosMortos = 0;

        populacao = new List <Individuo>(tamanhoPopulacao);
        individuosSelecionados = new List <Individuo>();

        for (int i = 0; i < tamanhoPopulacao; i++, qtdIndividuosGerados++)
        {
            Individuo carro = InstanciarIndividuo();

            carro.nome = "Individuo_" + qtdIndividuosGerados;

            // Inicializar cada cromossomo.
            Cromossomo[] cromossomos = new Cromossomo[qtdCromossomos];
            for (int j = 0; j < qtdCromossomos; j++)
            {
                cromossomos[j] = new Cromossomo(qtdGenes, limitesInfSupCromo[j]);
            }

            carro.cromossomos = cromossomos;

            populacao.Add(carro);
        }
    }
Ejemplo n.º 3
0
    static void mutar(List <Cromossomo> populacao, String estadoFinal)
    {
        Random gerador = new Random();

        int qtdMutantes = gerador.Next((int)populacao.Count / 5); //20% NO MÁXIMO DE MUTANTES

        Cromossomo mutante;
        int        posicaoMutante;

        for (; qtdMutantes > 0; qtdMutantes--)
        {
            posicaoMutante = gerador.Next((int)populacao.Count / 2, populacao.Count);

            mutante = populacao[posicaoMutante];

            Console.WriteLine("vai mutar " + mutante.valor + "  " + mutante.aptidao);

            //mutando
            String valorMutado = mutante.valor;

            char caracterMutante  = mutante.valor[gerador.Next(mutante.valor.Length)];
            char caracterSorteado = Util.letras[gerador.Next(Util.tamanho)];

            valorMutado = valorMutado.Replace(caracterMutante, caracterSorteado);

            mutante = new Cromossomo(valorMutado, estadoFinal);
            Console.WriteLine("por esse " + mutante.valor + "  " + mutante.aptidao);

            populacao[posicaoMutante] = mutante;
        }
    }
Ejemplo n.º 4
0
 public bool Equals(Cromossomo o)
 {
     if (o == null)
     {
         return(false);
     }
     return(this.valor.Equals(o.valor));
 }
Ejemplo n.º 5
0
    void ProximaGeracao(Cromossomo primeiro, Cromossomo segundo)
    {
        Cromossomo penultimo = new Cromossomo();
        Cromossomo ultimo    = new Cromossomo();

        if (SaveControl.RetornarEvolutionState())
        {
            int menor = 10;

            for (int i = 0; i < cromossomosUsados.Count; i++)
            {
                if (cromossomosUsados[i].FuncaoAvaliacao() <= menor)
                {
                    menor = cromossomosUsados[i].FuncaoAvaliacao();

                    if (i == 0)
                    {
                        penultimo = cromossomosUsados[i];
                        ultimo    = cromossomosUsados[i];
                    }
                    else
                    {
                        ultimo    = penultimo;
                        penultimo = cromossomosUsados[i];
                    }
                }
            }
        }
        else
        {
            int maior = 0;

            for (int i = 0; i < cromossomosUsados.Count; i++)
            {
                if (cromossomosUsados[i].FuncaoAvaliacao() >= maior)
                {
                    maior = cromossomosUsados[i].FuncaoAvaliacao();

                    if (i == 0)
                    {
                        penultimo = cromossomosUsados[i];
                        ultimo    = cromossomosUsados[i];
                    }
                    else
                    {
                        ultimo    = penultimo;
                        penultimo = cromossomosUsados[i];
                    }
                }
            }
        }

        cromossomosUsados[penultimo.id].cromossomo = primeiro.cromossomo;
        cromossomosUsados[ultimo.id].cromossomo    = segundo.cromossomo;

        arquivoGame.cromossomos = cromossomosUsados;
        SaveControl.AtualizarArquivoJogo(arquivoGame);
    }
Ejemplo n.º 6
0
    void Selecao()
    {
        Cromossomo primeiro = new Cromossomo();
        Cromossomo segundo  = new Cromossomo();

        if (SaveControl.RetornarEvolutionState())
        {
            int maior = 0;

            for (int i = 0; i < cromossomosUsados.Count; i++)
            {
                if (cromossomosUsados[i].FuncaoAvaliacao() >= maior)
                {
                    maior = cromossomosUsados[i].FuncaoAvaliacao();

                    if (i == 0)
                    {
                        primeiro = cromossomosUsados[i];
                        segundo  = cromossomosUsados[i];
                    }
                    else
                    {
                        segundo  = primeiro;
                        primeiro = cromossomosUsados[i];
                    }
                }
            }
        }
        else
        {
            int menor = 10;

            for (int i = 0; i < cromossomosUsados.Count; i++)
            {
                if (cromossomosUsados[i].FuncaoAvaliacao() <= menor)
                {
                    menor = cromossomosUsados[i].FuncaoAvaliacao();

                    if (i == 0)
                    {
                        primeiro = cromossomosUsados[i];
                        segundo  = cromossomosUsados[i];
                    }
                    else
                    {
                        segundo  = primeiro;
                        primeiro = cromossomosUsados[i];
                    }
                }
            }
        }


        Crossover(primeiro, segundo);
    }
Ejemplo n.º 7
0
 public static bool contem(List <Cromossomo> populacao, Cromossomo selecionado)
 {
     for (int i = 0; i < populacao.Count; i++)
     {
         if (populacao[i].valor.Equals(selecionado.valor))
         {
             return(true);
         }
     }
     return(false);
 }
    /**
     * Cruzamento de ponto único.
     */
    void CrossOver()
    {
        // Selecionando só 2 indivíduos por enquanto...
        Cromossomo[] cromossomos1 = individuosSelecionados[0].cromossomos;
        Cromossomo[] cromossomos2 = individuosSelecionados[1].cromossomos;

        foreach (Individuo individuo in populacao)
        {
            Cromossomo[] cromossomosCrossover = new Cromossomo[qtdCromossomos];

            // Para cada cromossomo
            for (int i = 0; i < qtdCromossomos; i++)
            {
                BitArray[] genesCrossover = new BitArray[qtdGenes];

                // Pegar os cromossomos dos 2 indivíduos selecionados.
                Cromossomo cromossomo1 = cromossomos1[i];
                Cromossomo cromossomo2 = cromossomos2[i];

                // Para cada gene
                for (int j = 0; j < qtdGenes; j++)
                {
                    int ponto = UnityEngine.Random.Range(0, Cromossomo.qtdBits);

                    BitArray gene1 = cromossomo1.genes[j];
                    BitArray gene2 = cromossomo2.genes[j];

                    BitArray geneCrossover = new BitArray(6);

                    // Antes e depois do ponto
                    for (int k = 0; k < ponto; k++)
                    {
                        geneCrossover[k] = gene1[k];
                    }

                    for (int k = ponto; k < gene1.Count; k++)
                    {
                        geneCrossover[k] = gene2[k];
                    }

                    genesCrossover[j] = geneCrossover;
                }

                cromossomosCrossover[i] = new Cromossomo(genesCrossover);
            }

            qtdIndividuosGerados++;
            individuo.Setar("Individuo_" + qtdIndividuosGerados, cromossomosCrossover);
        }
    }
Ejemplo n.º 9
0
        public void TestaGetFit()
        {
            //Arrange
            var obj = new Cromossomo();

            obj.Genes = "10000000001000000000"; //0 e 0
            double expected = 0;

            //Act
            double actual = obj.Fitness;

            //Assert
            Assert.AreEqual(actual, expected);
        }
Ejemplo n.º 10
0
        public void TestaDecodificaGenes()
        {
            //Arrange
            var ob = new Cromossomo();

            ob.Genes = "01000000001000000111"; //-256 e 7
            double[] expected = { -2.56, 0.07 };

            //Act
            double[] actual = ob.decodificaGenes();

            //Assert
            Assert.IsTrue(actual[0] == expected[0] && actual[1] == expected[1]);
        }
Ejemplo n.º 11
0
        public void TestaFormataNumBin()
        {
            //Arrange
            var    obj      = new Cromossomo();
            string sin      = "0";
            string n        = "11";//-3
            var    expected = "0000000011";

            //Act
            var actual = obj.formataNumBin(sin, n);


            //Assert
            Assert.AreEqual(actual, expected);
        }
Ejemplo n.º 12
0
    void Crossover(Cromossomo primeiro, Cromossomo segundo)
    {
        Cromossomo temp;

        temp = primeiro;

        int pontoCorte = UnityEngine.Random.Range(1, 9);

        for (int i = 0; i < pontoCorte; i++)
        {
            primeiro.cromossomo[i] = segundo.cromossomo[i];
            segundo.cromossomo[i]  = temp.cromossomo[i];
        }

        Mutacao(primeiro, segundo);
    }
Ejemplo n.º 13
0
    void GerarPopulacaoInicial()
    {
        for (int i = 0; i < 100; i++)
        {
            Cromossomo c = new Cromossomo();
            c.Inicializar();
            c.id = i;
            cromossomosUsados.Add(c);
        }

        arquivoGame.cromossomos    = cromossomosUsados;
        arquivoGame.evolutionState = true;

        for (int i = 0; i < arquivoGame.lastScores.Length; i++)
        {
            arquivoGame.lastScores[i] = -1;
        }

        SaveControl.AtualizarArquivoJogo(arquivoGame);
    }
Ejemplo n.º 14
0
    void Mutacao(Cromossomo primeiro, Cromossomo segundo)
    {
        int chance = UnityEngine.Random.Range(0, 100);

        if (chance <= 10 && chance >= 0)
        {
            int cromossomo    = UnityEngine.Random.Range(0, 1);
            int numCromossomo = UnityEngine.Random.Range(0, 7);
            int valGene       = UnityEngine.Random.Range(0, 2);

            if (cromossomo == 0)
            {
                primeiro.cromossomo[numCromossomo] = valGene;
            }
            else
            {
                segundo.cromossomo[numCromossomo] = valGene;
            }
        }

        ProximaGeracao(primeiro, segundo);
    }