/// <summary> /// Permet de creer deux enfants selon un partenaire choisi en combinant leurs deux adn. /// La combinaison des deux adn est fair selon unExemple /// </summary> /// <param name="partner"></param> /// <returns></returns> public virtual Genome[] ProduceOffspring(Genome partner) { Genome[] r = new Genome[2]; if (Dna.Length != partner.Dna.Length) { throw new Exception("Dna non compatible"); } int crossPoint = CrossOverRnd.Next(0, SizeDna); Genome Children1 = new Genome(this); Genome Children2 = new Genome(this); for (int i = 0; i < SizeDna; i++) { if (i < crossPoint) { Children1.Dna[i] = partner.Dna[i]; } else { Children2.Dna[i] = partner.Dna[i]; } } Children1.Mutate(); Children2.Mutate(); r[0] = Children1; r[0] = Children2; return(r); }
/// <summary> /// /// </summary> /// <param name="partner"></param> /// <returns></returns> public override Genome[] ProduceOffspring(Genome partner) { Genome[] r = new Genome[2]; if (Dna.Length != partner.Dna.Length) { //if (partner is NetworkGenome) // return ProduceOffspringNeat(partner as NetworkGenome); //else // throw new Exception("Les deux chromosones ne sont pas compatibles"); } NetworkGenome Children1 = new NetworkGenome(this); NetworkGenome Children2 = new NetworkGenome(this); int indexDna = 0; int crossPoint = 0;; for (int layer = 0; layer < this.Layout.Length; layer++) { for (int node = 0; node < this.Layout[layer]; node++) { //pour skip les biais A CHECKER indexDna++; crossPoint = CrossOverRnd.Next(0, ((layer == 0) ? NbInputs : Layout[layer - 1])); for (int weigths = 0; weigths < ((layer == 0) ? NbInputs:Layout[layer - 1]); weigths++) { if (weigths < crossPoint) { Children1.Dna[indexDna] = partner.Dna[indexDna]; } else { Children2.Dna[indexDna] = partner.Dna[indexDna]; } indexDna++; } } } Children1.Mutate(); Children2.Mutate(); Children1.Fitness = -1; Children2.Fitness = -1; r[0] = Children1; r[1] = Children2; return(r); }