public static void RunGeneticAlgorithm(List <Classifier> actionset, char[] condition, List <Classifier> population) { // Calculate sum over all Classifier in [A] with Timestamp * Numerosity double sumTsNumerosity = 0; double sumNumerosity = 0; foreach (var classifier in actionset) { sumTsNumerosity += classifier.Ts * classifier.Numerosity; sumNumerosity += classifier.Numerosity; } if (DateTime.Now.Ticks - sumTsNumerosity / sumNumerosity < XcsParamerter.ThetaGA) { // Update Timestamp of classifiers in [A] foreach (var classifier in actionset) { classifier.Ts = DateTime.Now.Ticks; } Classifier parentOne = RouletteWheelSelection.SelectOffspring(actionset); Classifier parentTwo = RouletteWheelSelection.SelectOffspring(actionset); Classifier childOne = parentOne.Clone(parentOne); Classifier childTwo = parentTwo.Clone(parentTwo); childOne.Numerosity = childTwo.Numerosity = 1; childOne.Experience = childTwo.Experience = 0; // Do crossover if (Helper.RandomGenerator.NextDouble() < XcsParamerter.Crossoverprobability) { OnePointCrossover.ApplyCrossover(childOne, childTwo); childOne.Prediction = childTwo.Prediction = (parentOne.Prediction + parentTwo.Prediction) / 2; childOne.Epsilon = childTwo.Epsilon = (parentOne.Epsilon + parentTwo.Epsilon) / 2; childOne.Fitness = childTwo.Epsilon = (parentOne.Fitness + parentTwo.Fitness) / 2; } childOne.Fitness = childOne.Fitness * 0.1; childTwo.Fitness = childTwo.Fitness * 0.1; List <Classifier> children = new List <Classifier>() { childOne, childTwo }; foreach (var child in children) { Mutation.ApplyMutation(child, condition); if (XcsParamerter.DoGaSubsumption) { if (Subsumtion.DoesSubsume(parentOne, child)) { parentOne.Numerosity++; } else if (Subsumtion.DoesSubsume(parentTwo, child)) { parentTwo.Numerosity++; } else { InsertClassifierIntoPopulation(population, child); } } else { InsertClassifierIntoPopulation(population, child); } DeleteFromPopulation(population); } } }