Example #1
0
 private void CalculateFitness()
 {
     foreach (var chromosome in _currentSession.CurrentPopulation.Where(x => x.FitnessScore == null))
     {
         chromosome.FitnessScore = _fitnessEvaluator.Evaluate(chromosome);
     }
 }
Example #2
0
        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);
        }