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(); }