/// <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;
 }