private void ChooseRecombinationStrategy()
 {
     if (EvolutionaryAlgorithmConstants.IS_USING_RANDOM_START_END_CITY == false)
     {
         recombination = new Recombination();
     }
     else
     {
         recombination = new RecombinationVariableStartEnd();
     }
 }
        public Individual<T>[] CreateNextGeneration(Individual<T>[] originalPopulation, ISelectionStrategy<T> selection, 
                                             IRecombinationStrategy<T> recombination, IMutationStrategy<T> mutation)
        {
            Array.Sort(originalPopulation); // sorting may not always be mandatory (e.g. 1-3 elites, selection does not sort)
            int offspringsCount = populationSize - elitesCount;
            // TODO: Redundant copying. A linked list would be better.
            Individual<T>[] offsprings = recombination.Apply(selection, originalPopulation, offspringsCount);
            mutation.Apply(offsprings);

            Individual<T>[] nextPopulation = new Individual<T>[populationSize];
            Array.Copy(originalPopulation, nextPopulation, elitesCount);
            Array.Copy(offsprings, 0, nextPopulation, elitesCount, offsprings.Length);
            return nextPopulation;
        }
        public Individual<T>[] CreateNextGeneration(Individual<T>[] originalPopulation, ISelectionStrategy<T> selection,
                                                    IRecombinationStrategy<T> recombination, IMutationStrategy<T> mutation)
        {
            Array.Sort(originalPopulation);

            // Selection and rcombination: Only the elites and the rest of survivors will have a chance to reproduce
            Individual<T>[] selectionPool = new Individual<T>[elitesCount + survivorsCount];
            Array.Copy(originalPopulation, selectionPool, selectionPool.Length);
            // TODO: Redundant copying. A linked list would be better.
            Individual<T>[] offsprings = recombination.Apply(selection, selectionPool, offspringsCount);

            // Mutation will be applied to the survivors and their offsprings but not on the elites
            Individual<T>[] mutants = new Individual<T>[survivorsCount + offsprings.Length];
            Array.Copy(originalPopulation, elitesCount, mutants, 0, survivorsCount);
            Array.Copy(offsprings, 0, mutants, survivorsCount, offspringsCount);
            mutation.Apply(mutants);

            // The next population will contain the elites, the mutated survivors and the mutated offsprings
            Individual<T>[] nextPopulation = new Individual<T>[originalPopulation.Length];
            Array.Copy(originalPopulation, nextPopulation, elitesCount);
            Array.Copy(mutants, 0, nextPopulation, elitesCount, survivorsCount + offspringsCount);
            return nextPopulation;
        }
        private GeneticAlgorithm(int continuousVariablesCount, int integerVariablesCount, IDesignFactory designFactory,
                                 IOptimizationLogger logger, IConvergenceCriterion convergenceCriterion, IInitializer <double> initializer,
                                 IEncoding <T> encoding, int populationSize, IPopulationStrategy <T> populationStrategy,
                                 ISelectionStrategy <T> selection, IRecombinationStrategy <T> recombination, IMutationStrategy <T> mutation)
        {
            this.continuousVariablesCount = continuousVariablesCount;
            this.integerVariablesCount    = integerVariablesCount;
            this.designFactory            = designFactory;

            this.logger = logger;
            this.convergenceCriterion = convergenceCriterion;
            this.initializer          = initializer;

            this.encoding           = encoding;
            this.populationSize     = populationSize;
            this.populationStrategy = populationStrategy;
            this.selection          = selection;
            this.recombination      = recombination;
            this.mutation           = mutation;

            this.CurrentIteration = -1; // Initialization phase is not counted towards iterations
            this.BestPosition     = null;
            this.BestFitness      = double.MaxValue;
        }
 public Individual <T>[] CreateNextGeneration(Individual <T>[] originalPopulation, ISelectionStrategy <T> selection,
                                              IRecombinationStrategy <T> recombination, IMutationStrategy <T> mutation)
 {
     throw new NotImplementedException();
 }