/// <summary>
        /// Funkcja wykonuje Metadynamikę
        /// </summary>
        public void DoMetaDynamic()
        {
            Populationn.SortAscByProbability();
            var howManyToTake = Options.nWorstGenToThrow;

            if (howManyToTake > Populationn.Gens.Count)
            {
                howManyToTake = Populationn.Gens.Count;
            }
            Populationn.Gens.RemoveRange(0, howManyToTake);
            for (int i = 0; i < howManyToTake; i++)
            {
                Populationn.Add(SimpleGensGenerator.GetSingleGen(Options, Function));
            }
            Populationn.CalculateSimilarity(AntiGen);
            Populationn.SortDescByProbability();
        }
        /// <summary>
        /// Funkcja wykonuje hipermutację oraz zajmuje się dojrzewaniem
        /// </summary>
        public void DoHiperMutation()
        {
            // mutacja polegająca na tym ze jezeli wylosuje 0 to od roznicy wartosci funkcji antygenu i genu
            // odejmuje polowe tej wartosci a w.p.p dodaje polowe tej wartosci
            workingPopulation.Gens.ForEach(g =>
            {
                var operation = RandomNumberGenerator.Next(0, 1);
                var value     = Math.Abs(AntiGen.FunctionValue - g.FunctionValue);
                if (operation == 0)
                {
                    g.FunctionValue -= (value / 2);
                }
                else
                {
                    g.FunctionValue += (value / 2);
                }
            });

            workingPopulation.CalculateSimilarity(AntiGen);

            // posortowanie i wybranie n1 najlepszych
            workingPopulation.SortDescByProbability();
            var howManyToTake = Options.nBestGensToTake;

            if (howManyToTake > workingPopulation.Gens.Count)
            {
                howManyToTake = workingPopulation.Gens.Count;
            }
            var bestGens = workingPopulation.Take(howManyToTake);


            // dodanie i zastapienie n1 nalepszych
            var pCount = Populationn.Gens.Count;

            Populationn.Gens = Populationn.Gens.Concat(bestGens).ToList();
            Populationn.SortDescByProbability();
            Populationn.Gens = Populationn.Take(pCount).ToList();
        }
 /// <summary>
 /// Funkcja oblicza podobienstwo do antygenu
 /// </summary>
 public void CalculateProbabilityForPopulation()
 {
     Populationn.CalculateSimilarity(AntiGen);
     Populationn.SortDescByProbability();
 }