Exemple #1
0
        /// <summary>
        /// Replica este grupo genético.
        /// </summary>
        public override Gen Replicar(float Coef = 1)
        {
            GrupoGen ret = new GrupoGen();

            foreach (var x in _Genes)
            {
                if (r.NextDouble() >= 0.01 * Coef)                  // La probabilidad de eliminación base es 0.01
                {
                    ret._Genes.Add(x.Replicar(Coef * 0.3f));        // Probabilidad recursiva/iterada es de 0.3
                }
            }

            // AgregarInstrucción
            while (r.NextDouble() < Coef * 0.01)
            {
                int indAgrega = r.Next(ret._Genes.Count + 1);                  //Índice para agregar
                ret._Genes.Insert(indAgrega, InstrucciónGen.Aleatorio(r));
            }

            // Estado de Replicar
            ret.ReplicaSexual = r.NextDouble() < 0.001 * Coef ? !ReplicaSexual : ReplicaSexual;

            // Dividir gen
            if (r.NextDouble() < 0.001 * Coef)                // La probabilidad de dividir gen base es 0.001// Esta mutación no tiene fenotipo directo.
            {
                int      indCorte = r.Next(ret._Genes.Count + 1);
                GrupoGen G0       = new GrupoGen();
                GrupoGen G1       = new GrupoGen();
                for (int i = 0; i < ret._Genes.Count; i++)
                {
                    if (i < indCorte)
                    {
                        G0._Genes.Add(ret._Genes [i]);
                    }
                    else
                    {
                        G1._Genes.Add(ret._Genes [i]);
                    }
                }
                ret._Genes = new List <Gen> ();
                ret._Genes.Add(G0);
                ret._Genes.Add(G1);
            }
            // Color (no entra)
            if (r.NextDouble() < 0.05)
            {
                clr = (ConsoleColor)r.Next(16);
            }

            return(ret);
        }
Exemple #2
0
        /// <summary>
        /// Replica sexualmente un GrupoGen, a partir de dos GrupoGen.
        /// Excluye mutación
        /// </summary>
        /// <param name="G1">Un GrupoGen</param>
        /// <param name="G2">Un GrupoGen</param>
        public static GrupoGen Replicar(GrupoGen G1, GrupoGen G2, float prob = 0.5f, Random r = null)
        {
            if (r == null)
            {
                r = new Random();
            }
            GrupoGen tmp = new GrupoGen();
            GrupoGen ret = new GrupoGen();

            // 大体:
            // Agregar cada gen en G1 (con probabilidad prob), luego hacer lo mismo con G2.
            // Finalmente reordenarlos aleatoriamente.

            foreach (var x in G1.Genes)
            {
                if (r.NextDouble() < prob)
                {
                    tmp._Genes.Add(x);
                }
            }

            foreach (var x in G2.Genes)
            {
                if (r.NextDouble() < prob)
                {
                    tmp._Genes.Add(x);
                }
            }

            // Reordenar
            foreach (var x in tmp._Genes)
            {
                ret._Genes.Insert(r.Next(ret._Genes.Count + 1), x);
            }

            // Note que llegar aquí no implica que ambos sean sexualmente replicables, al menos uno lo es.
            ret.ReplicaSexual = true;

            return(ret);
        }
Exemple #3
0
 /// <summary>
 /// Replica sexualmente un individuo.
 /// Incluye mutaciones.
 /// </summary>
 /// <param name="Pareja">Pareja sexual</param>
 public GrupoGen Replicar(GrupoGen Pareja, float CoefMut = 1)
 {
     return((GrupoGen)GrupoGen.Replicar(this, Pareja).Replicar(CoefMut));
 }