public void insere(Individuo x)
 {
     this.ultimo.prox = new Celula();
     this.ultimo = this.ultimo.prox;
     this.ultimo.item = x;
     this.ultimo.prox = null;
     this.TamanhoLista++;
     
 }
 /* Metodo que inicia a população */
 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(i);
         NewPopulation[i] = new Individuo(i);
         FitnesCalc(population[i]);
     }
 }
        public Individuo(Individuo x)
        {
            this.individuo = new int[50];
            ID = x.getID();
            fitness = x.getFitness();
            for (int i = 0; i < individuo.Length; i++)
            {
                individuo[i] = x.getGeneAt(i);
            }

        }
 // metodo utilizada para o calculo do fitness de cada individuo.
 public void FitnesCalc(Individuo x)
 {
     double posiçõesCorretas = 0.0;
     double resultado = 0.0;
     for (int i = 0; i < gabarito.Length; i++)
     {
         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.setFitness(resultado);
 }
 /*Metodo para atualizar a nova geração de individuos com os novos individuos gerados*/
 public void AtualizaNovaGeração()
 {
     for (int i = 0; i < population.Length; i++)
     {
         population[i] = new Individuo(NewPopulation[i]);
     }
 }
 /* Metodo que copia os genes que serão transmitidos para os individuos filhos do cruzamento*/
 public Individuo CopiarGenes(Individuo pai1, Individuo pai2, Individuo filho, int tradePosition)
 {
     int x = 0;
     while (x < pai1.returnTamanhoIndividuo())
     {
         if (x <= tradePosition)
         {
             filho.setGeneAt(pai1.getGeneAt(x), x);
         }
         else
         {
             filho.setGeneAt(pai2.getGeneAt(x), x);
         }
         x++;
     }
     return filho;
 }
 /* Metodo que realiza a mutação de um gene no individuo especifico*/
 public Individuo MutationGene(Individuo x)
 {
     x.setGeneAt(Random.Next(1, 20), Random.Next(0, x.returnTamanhoIndividuo() - 1));
     return x;
 }
        /* Metodo que executa o cruzamento dos individuos da minha população*/
        public void StarCrossOver()
        {
            int TradePosition;
            int i = 0;
            Individuo Pai1;
            Individuo Pai2;
            Individuo filho = new Individuo(0);
            double S = 0.0;
            bool newPopulationFull = false;
            foreach (var item in population)
            {
                S += item.getFitness();
            }
            while (newPopulationFull == false)
            {
                Pai1 = SelectRollet(S);
                Pai2 = SelectRollet(S);

                if (crossOverRate <= Random.NextDouble())
                {
                    TradePosition = Random.Next(0, Pai1.returnTamanhoIndividuo() - 1);

                    filho = CopiarGenes(Pai1, Pai2, filho, TradePosition);

                    if (mutationRate <= Random.NextDouble())
                    {
                        filho = MutationGene(filho);
                    }
                    FitnesCalc(filho);
                    if (i < population.Length)
                    {
                        filho.setID(i);
                        NewPopulation[i] = new Individuo(filho);
                        i++;
                    }
                    else
                        newPopulationFull = true;
                }
                Pai1.setLivreCruzamento();
                Pai2.setLivreCruzamento();
            }
        }