Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        // 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);
        }