/// <summary>
        /// Converts genome (array of bits) to the path through the all cities (where index in array = sequential number of city; value = city "name")
        /// </summary>
        /// <param name="genome"></param>
        /// <example>
        /// Input:              0010.0110.1000.1001.0001
        /// Covert bits to int  ↓
        ///                     2.6.8.9.1
        /// Convert to path     ↓
        ///                     5.1.2.3.4
        ///               Path (5=>1=>2=>3=>4)
        /// </example>
        /// <returns></returns>
        private int[] genomeToPath(IIndividual genome)
        {
            const int bitsPerPoint = 4;
            int       pointsCount  = PathMatrix.GetLength(0);

            if (genome.Count() != pointsCount * bitsPerPoint)
            {
                throw new ArgumentException();
            }

            return(Enumerable.Range(0, pointsCount)
                   .Select(i =>
                           new {
                city = i,
                number = BitsToInt(genome
                                   .Skip(i * bitsPerPoint)
                                   .Take(bitsPerPoint)
                                   .ToArray())
            })
                   .OrderBy(x => x.number)
                   .Select(x => x.city)
                   .ToArray());
        }