public GeneticAlgorithm(
            RandomWeightsGenerator randomWeightsGenerator,
            TrainingSpecification trainingSpecification,
            NeuralNetworkSpecification neuralNetworkSpecification)
        {
            this.randomWeightsGenerator     = randomWeightsGenerator;
            this.trainingSpecification      = trainingSpecification;
            this.neuralNetworkSpecification = neuralNetworkSpecification;

            topToKeepCount          = (int)(trainingSpecification.PopulationSize * trainingSpecification.TopFractionToKeep);
            childrenToGenerateCount = (int)(trainingSpecification.PopulationSize * trainingSpecification.ChildrenFractionToGenerate);
        }
        private static GeneticAlgorithm CreateGeneticAlgorithm(NeuralNetworkSpecification neuralNetworkSpecification, TrainingSpecification trainingSpecification)
        {
            var randomWeightsGenerator = new RandomWeightsGenerator(neuralNetworkSpecification);

            return(new GeneticAlgorithm(randomWeightsGenerator, trainingSpecification, neuralNetworkSpecification));
        }