private static Driving2DAiTrainer CreateDriving2DAiTrainer()
        {
            var neuralNetworkSpecification = Driving2DNeuralNetworkSpecification.Specification;

            var trainingSpec = new TrainingSpecification
            {
                PopulationSize             = 100,
                TopFractionToKeep          = 0.05,
                ChildrenFractionToGenerate = 0.92,
                MutationRate = 0.05,
                FittestKeptScoreThreshold = 0
            };

            var geneticAlgorithm = CreateGeneticAlgorithm(neuralNetworkSpecification, trainingSpec);

            var trainingTextPosition = new Vector2(10, 75);
            var trainingTextColor    = Color.Blue;

            IDriving2DController createController(int id, NeuralNetwork neuralNetwork) => new Driving2DAiController(id, neuralNetwork);

            var aiTrainingFramework = new AiTrainingFramework <IDriving2DController>(neuralNetworkSpecification, geneticAlgorithm, trainingTextPosition, trainingTextColor, createController);
            var controllers         = aiTrainingFramework.CreateNewControllers(new List <(int id, int score)>());

            return(new Driving2DAiTrainer(aiTrainingFramework, controllers));
        }
        private static GeneticAlgorithm CreateGeneticAlgorithm(NeuralNetworkSpecification neuralNetworkSpecification, TrainingSpecification trainingSpecification)
        {
            var randomWeightsGenerator = new RandomWeightsGenerator(neuralNetworkSpecification);

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