private void CalculateFitness() { foreach (var chromosome in _currentSession.CurrentPopulation.Where(x => x.FitnessScore == null)) { chromosome.FitnessScore = _fitnessEvaluator.Evaluate(chromosome); } }
public IList <GeneScore> Run(IList <BaseChromosomeType> chromosomeTypes, OptimiserParameters parameters) { var allScores = new List <GeneScore>(); var exiting = false; var iterationCount = 0; var totalIterations = parameters.MaximumGenerations * parameters.PopulationSize; var geneValidator = GetGeneValidator(chromosomeTypes, parameters.ParameterConditions); var evolver = new Evolver(chromosomeTypes, parameters.Seed, new CompositeGeneValidator(geneValidator, new OnceOnlyGeneValidator())); evolver.ReportNoProgress += ReportNoProgress; evolver.ReportNoProgress += delegate(object sender, CancelEventArgs args) { exiting |= args.Cancel; }; _fitnessEvaluator.Initialise(parameters); IList <Gene> population = evolver.GetInitialPopulation(parameters.PopulationSize); for (var generation = 0; generation < parameters.MaximumGenerations; generation++) { var scoresThisGeneration = new List <GeneScore>(); foreach (var gene in population) { var score = _fitnessEvaluator.Evaluate(gene); scoresThisGeneration.Add(score); iterationCount++; if (OnIterationComplete(score, iterationCount, totalIterations - iterationCount)) { exiting = true; break; } } scoresThisGeneration.Sort(); if (exiting) { break; } population = evolver.GetNextGeneration(parameters.ReproductionRate, parameters.MutationRate, scoresThisGeneration.ConvertAll(score => score.Gene)); allScores.AddRange(scoresThisGeneration); OnGenerationComplete(generation, scoresThisGeneration); } allScores.Sort(); OnComplete(); return(allScores); }