/// <summary> /// Linear xover executor. /// </summary> /// <param name="population">Input population.</param> /// <param name="xover">Xover operator.</param> /// <param name="xoverProbability">Xover probability</param> /// <param name="parents">Parents list</param> /// <returns>Childten(individuals)</returns> public virtual IList <IIndividual> Cross(IPopulation population, IXover xover, float xoverProbability, IList <IIndividual> parents) { var size = population.Size; var offspring = new List <IIndividual>(size); for (int i = 0; i < size; i += xover.ChildrenNumber) { // selected parents from population var selectedParents = parents.Skip(i).Take(xover.ParentsNumber).ToList(); // If match the probability cross is made, otherwise the offspring is an exact copy of the parents. // Checks if the number of selected parents is equal which the crossover expect, because the in the end of the list we can // have some rest individual if (selectedParents.Count == xover.ParentsNumber && FastRandom.GetDouble() <= xoverProbability) { offspring.AddRange(xover.Cross(selectedParents)); } else { offspring.AddRange(selectedParents); } } return(offspring); }
/// <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; }