public IPopulation EvolvePopulation(IPopulation oldPopulation)
        {
            var newPopulation = _populationFactory.CreatePopulation(oldPopulation.Size);

            var individualIndexOffset = 0;

            if (_elitism)
            {
                newPopulation.SetIndividual(0, oldPopulation.MostSuitableIndividualToProblem);
                individualIndexOffset = 1;
            }

            // Populate 'newPopulation' with children from the parents in 'oldPopulation' to exploit the current knowledge.
            for (var individualIndex = individualIndexOffset; individualIndex < newPopulation.Size; individualIndex++)
            {
                var resultingIndividualFromCrossoverOperation =
                    _crossoverOperator.PerformCrossover(oldPopulation);

                _problemService.MakeSolutionValid(resultingIndividualFromCrossoverOperation);

                newPopulation.SetIndividual(individualIndex, resultingIndividualFromCrossoverOperation);
            }

            // Mutate each individual in the new population to explore the problem domain.
            for (var individualIndex = individualIndexOffset; individualIndex < oldPopulation.Size; individualIndex++)
            {
                // TODO: Refactor the 'currentIndividual.Chromosome' - shouldn't be able to view Chromosome.
                var currentIndividual = newPopulation.GetIndividual(individualIndex);
                _mutationOperator.PerformMutation(currentIndividual);
            }

            return(newPopulation);
        }
Ejemplo n.º 2
0
        public IPopulation GenerateInitialisedPopulation(int size)
        {
            var population = _populationFactory.CreatePopulation(size);

            population.InitialisePopulation();

            UpdatePopulationSuitability(population);

            return(population);
        }
Ejemplo n.º 3
0
        /// <summary>
        ///     Finds the individual with the highest suitability from a random population sample.
        /// </summary>
        /// <param name="population">The population to select from</param>
        /// <returns>The most suitable individual from the population sample</returns>
        public IIndividual SelectIndividualFromPopulation(IPopulation population)
        {
            var tournamentPopulation = _populationFactory.CreatePopulation(tournamentSize);

            for (var i = 0; i < tournamentPopulation.Size; i++)
            {
                var randomIndividualIndex = _random.Next(0, population.Size);
                var randomIndividual      = population.GetIndividual(randomIndividualIndex);
                tournamentPopulation.SetIndividual(i, randomIndividual);
            }

            _environmentService.UpdatePopulationSuitability(tournamentPopulation);

            return(tournamentPopulation.MostSuitableIndividualToProblem);
        }