/// <summary> /// Constructor for genetic algorithm. /// Genetic algorithms imitate natural biological processes, /// </summary> /// <param name="population">Init population. </param> /// <param name="fitness">Fitness.</param> /// <param name="selection">Selection operator.</param> /// <param name="xover">Xover operator.</param> /// <param name="mutation">Mutation operator.</param> /// <param name="elitizmus">Elitizmus.</param> /// <param name="termination">Termination GA.</param> /// <param name="executor">Executor.</param> /// <param name="mutationProbability">Mutation probability.</param> /// <param name="xoverProbability">Xover probability.</param> public GeneticAlgorithm(IPopulation population, IFitness fitness, ISelection selection, IXover xover, IMutation mutation, IElite elitizmus, ITermination termination, IExecutor executor, float mutationProbability, float xoverProbability) { Population = population; this.fitness = fitness; this.selection = selection; this.xover = xover; this.mutation = mutation; this.elitizmus = elitizmus; this.executor = executor; this.termination = termination; // base probability this.xoverProbability = xoverProbability; this.mutationProbability = mutationProbability; TimeEvolving = TimeSpan.Zero; CurrentGenerationsNumber = 1; }
/// <summary> /// Evolutionary strategy /// </summary> /// <param name="fitness">fit. func.</param> /// <param name="population">init pop</param> public ES_μ_λ(IFitness fitness, IPopulation population) : base(fitness, population) { xover = new XoverUniform(); elite = new EliteByFitness(0.1); selection = new SelectionTournament(); termination = new TerminationMaxNumberGeneration(); termination.InitializeTerminationCondition(15_000); mutationProbability = 0.01f; xoverProbability = 0.5f; }
/// <summary> /// Creates a new population. /// </summary> /// <param name="population">The current population.</param> /// <param name="elite">The elite operator.</param> /// <param name="mutate">The mutate operator.</param> /// <param name="crossover">The crossover operator.</param> /// <param name="diversify">The diversify operator.</param> /// <returns></returns> public Population CreateNewPopulation(Population population, IElite elite, IMutate mutate, ICrossOver crossover, IDiversify diversify) { IChromosome parent1, parent2; IChromosome child1 = null, child2 = null; // create a new population var nextPopulation = new Population(); // copy all elites to the new population elite?.Process(population, nextPopulation); // make sure the population is diversified enough diversify?.Process(nextPopulation, population.Count); // while next population is not filled completely while (nextPopulation.Count < population.Count) { // select 2 parents DoTournament(population, out parent1, out parent2); // perform crossover so we get 2 children crossover?.Process(parent1, parent2, out child1, out child2); // mutate both children mutate?.Process(child1); mutate?.Process(child2); // and add the children to the next population nextPopulation.Add(child1); if (nextPopulation.Count < population.Count) { nextPopulation.Add(child2); } } return(nextPopulation); }
/// <summary> /// Adds the specified elite operator /// </summary> /// <param name="elite">The elite operator</param> public void Add(IElite elite) { _elite = elite; }