public void Context()
 {
     TheGene = "+xy";
     MaxGeneSize = 4;
     Mutator = new GeneMutator(new[] { "+", "-", "/", "*", "r", "a", "b" }, 0, MaxGeneSize);
     Because();
 }
        public string Go(IGenePoolConfiguration configuration, Action<string, double> statusReport)
        {
            var probabilityOfMutation = configuration.ProbabilityOfMutation;
            var generationsToRunFor = configuration.GenerationRunCount;
            var maxGeneSize = configuration.MaximumGeneLength;
            var populationSizeToMaintain = configuration.PopulationSizeToMaintain;
            var keepTopNPerformers = configuration.KeepTheTopNPerformersEachGeneration;

            var god = new GeneGod(configuration.GeneGrammar, maxGeneSize);
            var breedingSelector = new BreedingSelection.BreedingSelectionProcess(configuration.GetProblemDescription());
            var mutator = new GeneMutator(configuration.GeneGrammar, probabilityOfMutation, maxGeneSize);
            var grotto = new GeneGrotto(maxGeneSize);

            var population = god.CreateCountOfGenes(populationSizeToMaintain);
            var veryBestGene = "";

            foreach (var generation in 0.Until(generationsToRunFor))
            {
                population = breedingSelector.ChooseTopNPerformers(population, keepTopNPerformers);
                veryBestGene = population.First();

                var topScore = configuration.GetProblemDescription().ScoreThis(veryBestGene);
                statusReport(veryBestGene, topScore);
                if(topScore >= configuration.StopIfScoreIsAtLeastThisHigh)
                    break;

                while(population.Count() < populationSizeToMaintain)
                {
                    population = grotto.GetItOn(population);
                    population = population.Select(x => mutator.Mutate(x));
                }

                population = _RemoveSurplusOrganisms(populationSizeToMaintain, population);

            }

            return veryBestGene;
        }