/// <summary> /// Construct a neural genetic algorithm. /// </summary> /// <param name="network">The network to base this on.</param> /// <param name="randomizer">The randomizer used to create this initial population.</param> /// <param name="calculateScore">The score calculation object.</param> /// <param name="populationSize">The population size.</param> /// <param name="mutationPercent">The percent of offspring to mutate.</param> /// <param name="percentToMate">The percent of the population allowed to mate.</param> public NeuralGeneticAlgorithm(BasicNetwork network, IRandomizer randomizer, ICalculateScore calculateScore, int populationSize, double mutationPercent, double percentToMate) { this.Helper = new NeuralGeneticAlgorithmHelper(); this.Helper.CalculateScore = new GeneticScoreAdapter(calculateScore); IPopulation population = new BasicPopulation(populationSize); Helper.MutationPercent = mutationPercent; Helper.MatingPopulation = (percentToMate * 2); Helper.PercentToMate = (percentToMate); Helper.Crossover = (new Splice(network.Structure.CalculateSize() / 3)); Helper.Mutate = (new MutatePerturb(4.0)); Helper.Population = (population); for (int i = 0; i < population.PopulationSize; i++) { BasicNetwork chromosomeNetwork = (BasicNetwork)network .Clone(); randomizer.Randomize(chromosomeNetwork); NeuralGenome genome = new NeuralGenome(this, chromosomeNetwork); Helper.PerformScoreCalculation(genome); Helper.Population.Add(genome); } population.Sort(); }