public override Gen Replicar(float Coef = 1) { InstrucciónGen ret = new InstrucciónGen(); ret.ReplicaSexual = ReplicaSexual; ret.Instrucción = Instrucción; return(ret); }
/// <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); } }
/// <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); }
/// <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); }