コード例 #1
0
 public GenerationResult(int generationNumber, ScoredGeneration <T, TScore> orderedGenomes)
 {
     GenerationNumber        = generationNumber;
     OrderedGenomes          = orderedGenomes.OrderedFitnessResults.ToArray();
     FittestGenome           = OrderedGenomes.First();
     AverageGenomeGeneration = OrderedGenomes.Average(g => g.GenomeInfo.Generation);
 }
コード例 #2
0
        public IGenerationResult <T, TScore> Evolve(int iterations, IEnumerable <T> originalGeneration = null)
        {
            GenerationResult <T, TScore> generationResult = null;

            var originalGenomes  = originalGeneration ?? _genomeFactory.GetNewGenomes(_solverParameters.InitialGenerationSize);
            var scoredGeneration = new ScoredGeneration <T, TScore>(originalGenomes.Select(g => new GenomeInfo <T>(g, 0)), _evaluator);


            for (int generationNum = 0; generationNum < iterations; generationNum++)
            {
                _logger.LogStartGeneration(generationNum);

                IEnumerable <IGenomeInfo <T> > elite = scoredGeneration.OrderedGenomes.Take(_solverParameters.MaxEliteSize);


                var num      = generationNum;
                var children = _genomeReproductionStrategies
                               .SelectMany(reproductionStrategy =>
                                           reproductionStrategy.ProduceOffspring(elite.Select(g => g.Genome)))
                               .Select(g => new GenomeInfo <T>(g, num));

                var nextGenerationGenomes = elite.Concat(children).ToArray();

                scoredGeneration = new ScoredGeneration <T, TScore>(nextGenerationGenomes, _evaluator);

                generationResult = new GenerationResult <T, TScore>(generationNum, scoredGeneration);

                OnNewGeneration(generationResult);
                _logger.LogGenerationInfo(generationResult);

                if (IsEarlyStopConditionHit(generationResult))
                {
                    return(generationResult);
                }
            }

            return(generationResult);
        }