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