コード例 #1
0
 public void startPopulation()
 {
     // For que inicializa todos os individuos da população e calcula o fitness inicial de cadas individuo.
     for (int i = 0; i < population.Length; i++)
     {
         population[i] = new Individuo();
         NewPopulation[i] = new Individuo();
         FitnesCalc(population[i]);
     }
 }
コード例 #2
0
 public Individuo(Individuo x)
 {
     CadeiaAmino = new List<Aminoacido>();
     foreach (var item in x.getlistaAmino())
     {
         this.CadeiaAmino.Add(item);
     }
     fitness = x.fitness;
     this.diferencial = x.diferencial;
     Rank = x.Rank;
 }
コード例 #3
0
        public void FitnesCalc(Individuo x)
        {
            double PonderaFitnessAlvo = (100.0 / this.gabarito.Count) / 100;
            int PCorretas = GetposiçõesCorretas(x);
            double PorcentagemPosições  = ((Convert.ToDouble(PCorretas) * 100) / x.returnTamanhoIndividuo())/100;
            double Diferencial = 1 - PorcentagemPosições;
            double resultado = 0.0;
            resultado = (PorcentagemPosições * PonderaFitnessAlvo)*PCorretas;

            //for (int i = 0; i < gabarito.Length; i++)
            //{
            //    if (i < x.returnTamanhoIndividuo())
            //    {
            //        if (gabarito[i] == x.getGeneAt(i))
            //            posiçõesCorretas++;
            //    }
            //}
            //if (posiçõesCorretas == 0)
            //    resultado = 0.0;
            //else
            //    resultado = (posiçõesCorretas - 1.0) / (gabarito.Length - 1);

            x.setDiferencial(Diferencial);
            x.setFitness(resultado);
        }
コード例 #4
0
 public void AtualizaNovaGeração()
 {
     for (int i = 0; i < population.Length; i++)
     {
         population[i] = new Individuo(NewPopulation[i]);
     }
 }
コード例 #5
0
        public void InsereImigrantes()
        {
            
            for (int i = 0; i < population.Length; i++)
			{

                if (population[i].getDiferencial() > 0.60)
                {
                    population[i] = new Individuo();
                    FitnesCalc(population[i]);
                }
            }
        }
コード例 #6
0
        public Individuo CopiarGenes(Individuo pai1, Individuo pai2, Individuo filho)
        {
            filho.getlistaAmino().Clear();
            foreach (var item in pai1.getlistaAmino())
            {
                filho.getlistaAmino().Add(item);
            }
            foreach (var item in pai2.getlistaAmino())
            {
                filho.getlistaAmino().Add(item);
            }

            return filho;
            // CrossOver de um ponto 
            //int x = 0;
            //while (x < pai1.returnTamanhoIndividuo())
            //{
            //    if (x <= tradePosition)
            //    {
            //        filho.setGeneAt(pai1.getGeneAt(x), x);
            //    }
            //    else
            //    {
            //        filho.setGeneAt(pai2.getGeneAt(x), x);
            //    }
            //    x++;
            //}

            //CrossOver uniforme de varios pontos
            //for (int i = 0; i < pai1.returnTamanhoIndividuo(); i++)
            //{
            //    if (Random.NextDouble() >= 0.5)
            //    {
            //        filho.setGeneAt(pai1.getGeneAt(i), i);
            //    }
            //    else
            //    {
            //        filho.setGeneAt(pai2.getGeneAt(i), i);
            //    }
            //}
            
        }
コード例 #7
0
 public Individuo MutationGene(Individuo x)
 {
     x.setGeneAt(Random.Next(1, 20), Random.Next(0, x.returnTamanhoIndividuo() - 1));
     return x;
 }
コード例 #8
0
        public void StarCrossOver()
        {
            int i = 0;
            Individuo Pai1;
            Individuo Pai2;
            Individuo filho = new Individuo();
            double S = 0.0;
            bool newPopulationFull = false;
            this.GerarRank();
            foreach (var item in population)
            {
                S += item.getRank();
            }

            while (i < 2)
            {
                NewPopulation[i] = new Individuo(population.OrderByDescending(x => x.getFitness()).ElementAt(i));
                i++;
            }
            //for (int j = 0; j < 50; j++)
            //{
            //    NewPopulation[i] = new Individuo();
            //    FitnesCalc(NewPopulation[i]);
            //    i++;
            //}

            while (newPopulationFull == false)
            {

                Pai1 = SelectIndividuo(S);
                Pai2 = SelectIndividuo(S);

                if (crossOverRate <= Random.NextDouble())
                {
                    filho = CopiarGenes(Pai1, Pai2, filho);

                    if (Random.NextDouble() <= mutationRate)
                    {
                        filho = MutationGene(filho);
                    }
                    FitnesCalc(filho);
                    if (i < population.Length)
                    {
                        NewPopulation[i] = new Individuo(filho);
                        i++;
                    }
                    else
                        newPopulationFull = true;
                }
                Pai1.setLivreCruzamento();
                Pai2.setLivreCruzamento();
            }
        }
コード例 #9
0
        public int GetposiçõesCorretas(Individuo x)
        {
            int indexTeste = 0;
            int MaxPosCorretas = 0;
            int ContagemAux = 0;

            while (indexTeste < x.returnTamanhoIndividuo())
            {
                    List<int> IndexOco = GetIndexOcorrencias(x.getGeneAt(indexTeste));
                    if (IndexOco.Count != 0)
                    {
                        foreach (var item in IndexOco)
                        {
                            if ((gabarito.Count- item ) > (x.returnTamanhoIndividuo() - indexTeste))
                            {
                                for (int j = item, k = indexTeste; k < x.returnTamanhoIndividuo(); j++, k++)
                                {
                                    if (gabarito.ElementAt(j).Equals(x.getGeneAt(k)))
                                        ContagemAux++;
                                }
                            }
                            else
                            {
                                for (int j = item, k = indexTeste; j < gabarito.Count; j++, k++)
                                {
                                    if (gabarito.ElementAt(j).Equals(x.getGeneAt(k)))
                                        ContagemAux++;
                                }
                            }
                            if (ContagemAux > MaxPosCorretas)
                                MaxPosCorretas = ContagemAux;
                            ContagemAux = 0;
                        }
                    }
                    
                indexTeste++;
                ContagemAux = 0;
            }
            return MaxPosCorretas;
        }
コード例 #10
0
 public Individuo MutationGene(Individuo x)
 {
     x.setGeneAt(Random.Next(1, 20), Random.Next(0, x.returnTamanhoIndividuo() - 1));
     return(x);
 }