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