public GeneticAlgorithm <T> Create(IMutator <T> mutator,
                                    ICrossOver <T> crossOver,
                                    IPopulationCreator <T> populationCreator,
                                    Func <T[], int> fitnessFunction) =>
 new GeneticAlgorithm <T>(mutator,
                          crossOver,
                          populationCreator,
                          PopulationSize,
                          MutationProbability,
                          maxGenerations,
                          eliteSize,
                          solutionPrecision,
                          fitnessFunction);
 internal GeneticAlgorithm(
     IMutator <T> mutator,
     ICrossOver <T> crossOver,
     IPopulationCreator <T> populationCreator,
     int populationSize,
     double mutationProbability,
     int maxGenerations,
     int eliteSize,
     double solutionPrecision,
     Func <T[], int> fitnessFunction)
 {
     this.mutator             = mutator;
     this.crossOver           = crossOver;
     this.populationCreator   = populationCreator;
     this.populationSize      = populationSize;
     this.mutationProbability = mutationProbability;
     this.fitnessFunction     = fitnessFunction;
     this.maxGenerations      = maxGenerations;
     this.eliteSize           = eliteSize;
     this.solutionPrecision   = solutionPrecision;
 }