/// <summary>
        /// Regroups sub Harmony Memories
        /// </summary>
        private void RegroupHarmonyMemories()
        {
            var allSolutions = _subHarmonyMemories.SelectMany(h => h.GetAll()).ToList();
            var solutionIds  = Enumerable.Range(0, allSolutions.Count).ToList();

            foreach (var subHarmonyMemory in _subHarmonyMemories)
            {
                subHarmonyMemory.Clear();

                for (var index = 0; index < subHarmonyMemory.MaxCapacity; index++)
                {
                    var randomIndex    = solutionIds.GetRandomElement();
                    var randomSolution = allSolutions.ElementAt(randomIndex);

                    if (subHarmonyMemory.Add(new Harmony <T>(randomSolution)))
                    {
                        solutionIds.Remove(randomIndex);
                    }
                }
            }

            foreach (var subHarmonyMemory in _subHarmonyMemories.Where(hm => hm.Count < hm.MaxCapacity))
            {
                while (subHarmonyMemory.Count < subHarmonyMemory.MaxCapacity)
                {
                    var randomHarmony = HarmonyGenerator.GenerateRandomHarmony();
                    subHarmonyMemory.Add(randomHarmony);
                }
            }
        }
        /// <inheritdoc/>
        /// <summary>
        /// Initializes a collection of sub-harmony memories with random solutions
        /// </summary>
        public override void InitializeHarmonyMemory()
        {
            _subHarmonyMemories = new List <HarmonyMemory <T> >(4);

            var subHarmonyMemoriesCount = (int)Math.Ceiling((decimal)HarmonyMemory.MaxCapacity / 4);

            for (var i = 0; i < _subHarmonyMemories.Capacity; i++)
            {
                _subHarmonyMemories.Add(new HarmonyMemory <T>(subHarmonyMemoriesCount));
            }

            foreach (var subHarmonyMemory in _subHarmonyMemories)
            {
                var triesCount = 0;
                while (subHarmonyMemory.Count < subHarmonyMemory.MaxCapacity && triesCount < subHarmonyMemory.MaxCapacity * 3)
                {
                    var randomHarmony = HarmonyGenerator.GenerateRandomHarmony();
                    subHarmonyMemory.Add(randomHarmony);
                    triesCount++;
                }
            }
        }