/// <summary>
        /// Must return an array of size 2
        /// </summary>
        /// <param name="chromosone1"></param>
        /// <param name="chromosone2"></param>
        /// <returns></returns>
        private Individual[] CreateChildren(string chromosone1, string chromosone2)
        {
            Individual[] newChildren = new Individual[2];
            double probabilityOfCrossover = this.RandomNumberGenerator.NextDouble();
            double probabilityOfChild1Mutating = this.RandomNumberGenerator.NextDouble();
            double probabilityOfChild2Mutating = this.RandomNumberGenerator.NextDouble();
            int length = chromosone1.Length;
            char [] child1 = new char[length];
            char [] child2 = new char[length];
            // Position Based Crossover
            if (probabilityOfCrossover < this.ProbabilityOfCrossover)
            {
                List<int> randomPositions = new List<int>();
                for (int i = 0; i < this.NumberOfCrossoverPoints; i++)
                {
                    int index = -1;
                    do
                    {
                        index = this.RandomNumberGenerator.Next(0, length);
                    } while (randomPositions.Contains(index));
                    randomPositions.Add(index);
                }

                List<char> remainingCharacters1 = new List<char>(chromosone2.ToCharArray());
                List<char> remainingCharacters2 = new List<char>(chromosone1.ToCharArray());

                foreach (int point in randomPositions)
                {
                    char c1 = chromosone1[point];
                    char c2 = chromosone2[point];
                    child1[point] = c1;
                    child2[point] = c2;
                    remainingCharacters1.Remove(c1);
                    remainingCharacters2.Remove(c2);
                }
                int j = 0;
                for (int i = 0; i < length; i++)
                {
                    if (!randomPositions.Contains(i))
                    {
                        child1[i] = remainingCharacters1[j];
                        child2[i] = remainingCharacters2[j];
                        j++;
                    }
                }
            }
            else
            {
                for (int i = 0; i < length; i++)
                {
                    child1[i] = chromosone1[i];
                    child2[i] = chromosone2[i];
                }
            }
            // Will Child One Mutate
            if (probabilityOfChild1Mutating < this.ProbabilityOfMutation)
            {
                int oldPosition = this.RandomNumberGenerator.Next(0, length);
                int newPosition = -1;
                do
                {
                    newPosition = this.RandomNumberGenerator.Next(0, length);
                } while (oldPosition == newPosition);
                char oldChar = child1[oldPosition];
                child1[oldPosition] = child1[newPosition];
                child1[newPosition] = oldChar;
            }
            // Will Child Two Mutate
            if (probabilityOfChild2Mutating < this.ProbabilityOfMutation)
            {
                int oldPosition = this.RandomNumberGenerator.Next(0, length);
                int newPosition = -1;
                do
                {
                    newPosition = this.RandomNumberGenerator.Next(0, length);
                } while (oldPosition == newPosition);
                char oldChar = child2[oldPosition];
                child2[oldPosition] = child2[newPosition];
                child2[newPosition] = oldChar;
            }
            // Create new children
            newChildren[0] = new Individual(this.NGramFrequencies, this.encryptedText, new String(child1));
            newChildren[1] = new Individual(this.NGramFrequencies, this.encryptedText, new String(child2));
            return newChildren;
        }
 private int CompareIndividuals(Individual a, Individual b)
 {
     return -a.Fitness.CompareTo(b.Fitness);
 }