Exemplo n.º 1
0
        /// <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);
        }