Ejemplo n.º 1
0
        protected override IList <IChromosome> PerformCross(IList <IChromosome> parents)
        {
            ExpressionChromosome parent1 = parents[0] as ExpressionChromosome;
            ExpressionChromosome parent2 = parents[1] as ExpressionChromosome;

            int index1 = (int)Math.Floor(RandomizationProvider.Current.GetDouble() * parent1.Length);
            int index2 = (int)Math.Floor(RandomizationProvider.Current.GetDouble() * parent2.Length);

            Gene[] subtree1 = GetSubtree(parent1.GetGenes(), index1);
            Gene[] subtree2 = GetSubtree(parent2.GetGenes(), index2);

            // Copy subtree2 to parent1 at index1.
            ExpressionChromosome child1 = parent1.CreateNew() as ExpressionChromosome;

            Gene[] result = GetNewGenes(parent1.GetGenes(), index1, subtree1, subtree2);
            child1.SetGenes(result);

            // Copy subtree1 to parent2 at index2.
            ExpressionChromosome child2 = parent2.CreateNew() as ExpressionChromosome;

            result = GetNewGenes(parent2.GetGenes(), index2, subtree2, subtree1);
            child2.SetGenes(result);

            List <IChromosome> childs = new List <IChromosome>();

            if (child1.Length < maxLength)
            {
                childs.Add(child1);
            }

            if (child2.Length < maxLength)
            {
                childs.Add(child2);
            }

            return(childs);
        }