/// <summary>
        /// Generate new random population
        /// </summary>
        /// <param name="chromosomesCount"></param>
        /// <returns></returns>
        private List <List <double> > GeneratePopulation(int chromosomesCount)
        {
            List <List <double> > generation = new List <List <double> >();

            ServiceWeightsGenerator serviceWeightsGenerator = new ServiceWeightsGenerator();
            Random rnd = new Random(DateTime.Now.Millisecond);

            Parallel.For(0, chromosomesCount, i =>
            {
                lock (_sync)
                {
                    generation.Add(serviceWeightsGenerator.GenerateMemoryWeights(NetworkStructure, rnd));
                }
            });

            return(generation);
        }
        /// <summary>
        /// Cataclysm operation
        /// </summary>
        /// <param name="generation"></param>
        /// <param name="removingPercent"></param>
        /// <returns></returns>
        private List <List <double> > DoCataclysm(List <List <double> > generation, double removingPercent = 0.5)
        {
            // Thanos snap:
            int generationRemovedResultCount = (int)(generation.Count * removingPercent);

            ShuffleList(generation);

            // Creating queue by generation list:
            Queue <List <double> > generationInQueue = new Queue <List <double> >(generation);

            ServiceWeightsGenerator serviceWeightsGenerator = new ServiceWeightsGenerator();
            Random rnd = new Random(DateTime.Now.Millisecond);

            for (int i = 0; i < generationRemovedResultCount; i++)
            {
                generationInQueue.Dequeue();
                generationInQueue.Enqueue(serviceWeightsGenerator.GenerateMemoryWeights(NetworkStructure, rnd));
            }

            return(generationInQueue.ToList());
        }