public Estado getNewEstadoMutado()
 {
     Estado e = new Estado();
     for (int i = 0; i < Global.TamanhoGrade; i++) {
         e.Items[i] = Items[i];
     }
     e.Sorteia_EfetuaMutacao_Valida(true);
     return e;
 }
        public List<Estado> getFilhos(Estado progenitor2)
        {
            //Random r = new Random();
            int pnt_Corte = Global.Random.Next(0, Global.TamanhoGrade - 1);

            int tamanho1 = Global.TamanhoGrade - pnt_Corte;
            int tamanho2 = Global.TamanhoGrade - tamanho1;

            Estado e1 = new Estado();
            Estado e2 = new Estado();

            //O principal do algoritmo genetico, o ponto de corte e o cruzamento:
            Array.ConstrainedCopy(Items, 0, e1.Items, 0, tamanho1);
            Array.ConstrainedCopy(progenitor2.Items, Global.TamanhoGrade - pnt_Corte, e1.Items, Global.TamanhoGrade - pnt_Corte, tamanho2);

            Array.ConstrainedCopy(progenitor2.Items, 0, e2.Items, 0, tamanho1);
            Array.ConstrainedCopy(Items, Global.TamanhoGrade - pnt_Corte, e2.Items, Global.TamanhoGrade - pnt_Corte, tamanho2);

            e1.Sorteia_EfetuaMutacao_Valida(false);
            e2.Sorteia_EfetuaMutacao_Valida(false);

            List<Estado> ret = new List<Estado>();
            ret.Add(e1);
            ret.Add(e2);

            this.GerouFilhos = true;
            progenitor2.GerouFilhos = true;

            return ret;
        }