예제 #1
0
        public override Gen Replicar(float Coef = 1)
        {
            InstrucciónGen ret = new InstrucciónGen();

            ret.ReplicaSexual = ReplicaSexual;
            ret.Instrucción   = Instrucción;

            return(ret);
        }
예제 #2
0
파일: Individuo.cs 프로젝트: karv/ApreTa
        /// <summary>
        /// Initializes a new instance of the <see cref="ApreTa.Individuo"/> class.
        /// </summary>
        /// <param name="s">Secuencia de instrucciones genéticas.</param>
        public Individuo(string s)
        {
            InstrucciónGen G;

            foreach (var x in s)
            {
                G             = new InstrucciónGen();
                G.Instrucción = x.ToString();
                Genética.AddGen(G);
            }
        }
예제 #3
0
        /// <summary>
        /// Genera un gen de instrucción aleatorio.
        /// </summary>
        /// <param name="R">R.</param>
        public static InstrucciónGen Aleatorio(Random R)
        {
            InstrucciónGen ret = new InstrucciónGen();

            ret.Instrucción = _Símbolos [R.Next(_Símbolos.Length)];
            if (ret.Instrucción == null)
            {
                ret.Instrucción = R.Next(10).ToString();
            }

            return(ret);
        }
예제 #4
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);
        }