public Population(int count, IPopulationGenerator <T> generator, IFitnessEvaluator <T> evaluator) { if (count <= 0) { throw new ArgumentException($"{nameof(count)} must be greater than 0. Actual: {count}."); } if (generator == null) { throw new System.ArgumentNullException(nameof(generator)); } if (evaluator == null) { throw new System.ArgumentNullException(nameof(evaluator)); } TargetSize = count; // TODO: This really shouldn't be here. We should instead pass the // population for (var i = 0; i < count; i++) { var value = generator.Generate(); var fitness = evaluator.ComputeFitness(value); var chromosome = new Chromosome <T>(value, fitness); Chromosomes.Add(chromosome); } }
public Population(int count, IPopulationGenerator <T> generator, IFitnessEvaluator <T> evaluator) { Contract.Requires <ArgumentOutOfRangeException>(count > 0); Contract.Requires <ArgumentNullException>(generator != null); Contract.Requires <ArgumentNullException>(evaluator != null); TargetSize = count; Evaluator = evaluator; // TODO: This really shouldn't be here. We should instead pass the // population for (var i = 0; i < count; i++) { var value = generator.Generate(); var chromosome = new Chromosome <T>(value); chromosome.Fitness = evaluator.ComputeFitness(chromosome.Genes); Chromosomes.Add(chromosome); } }
// TODO: Write results to InnerResult. public InnerResult start(int population_size, int max_generations = int.MaxValue, bool silent = false) { int last_index = population_size - 1; int convergence_hit = -1; current_generation = 0; int first_goal_hit = -1; population = new List <T>(); //Console.WriteLine("Going to run algorithm. Max generations: {0}, Min fitness: {1}", goal.MaxGenerations, goal.MinFitness); var stopwatch = System.Diagnostics.Stopwatch.StartNew(); population = generator.Generate(population_size, genome_size); population[0].FunctionEvaluations = 0; do { shufflePopulation(); procreatePopulation(population_size); //sortPopulation(); //selectPopulation(population_size); population = selector.DoSelection(population, population_size).ToList(); if (!silent) { printPopulation(); } //Dit moet nog even netter worden gemaakt eigenlijk met Goal enzo...: if (population[0].Fitness == 2) { break; } current_generation++; if (first_goal_hit < 0 && population[0].Fitness >= goal.MinFitness) { first_goal_hit = current_generation; } // No new genes entered the population (whatever the genome as, the last one should have shifted. // Comparing pointers here if ((IGenome)previous_last == (IGenome)population[last_index]) { convergence_hit = current_generation; break; } // Or if all genomes are the same, possibly costly operation. if (converged(last_index)) { convergence_hit = current_generation; break; } if (current_generation >= max_generations) { break; } } while (true); stopwatch.Stop(); Console.WriteLine(results(population_size)); InnerResult res = new InnerResult(); res.FirstHitGeneration = first_goal_hit; res.Success = goal.AchievedFitnessGoal(population[0].Fitness); res.ConvergenceGeneration = convergence_hit; res.CPUTime = stopwatch.ElapsedTicks; res.FunctionEvaluations = population[0].FunctionEvaluations; res.BestScore = population[0].Fitness; res.BestSolution = population[0].Data; if (best_result == null || population[0].Fitness > best_result.Fitness) { best_result = population[0]; } return(res); }