/// <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); }
/// <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); }
/// <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)); }