public GenerationResult(int generationNumber, ScoredGeneration <T, TScore> orderedGenomes) { GenerationNumber = generationNumber; OrderedGenomes = orderedGenomes.OrderedFitnessResults.ToArray(); FittestGenome = OrderedGenomes.First(); AverageGenomeGeneration = OrderedGenomes.Average(g => g.GenomeInfo.Generation); }
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); }