public Population Clone()
        {
            Population p = new Population(order.ToList());

            return(p);
        }
        public List <int> Solve(IReadOnlyList <Location> cities)
        {
            List <int> order = Enumerable.Range(1, cities.Count).ToList();

            Population[] populations    = new Population[5];
            double       recordDistance = 0;
            Population   bestPopulation = new Population(order);

            int cntFails    = 0;
            int cntMaxFails = cities.Count * 200;

            Console.WriteLine("Maximale Fails: " + cntMaxFails);

            Stopwatch sw = new Stopwatch();

            sw.Start();

            Random rnd = new Random();

            for (int i = 0; i < populations.Length; i++)
            {
                populations[i] = new Population(order.OrderBy(x => rnd.Next()).ToList());
            }

            int cntGeneration = 0;

            while (cntFails < cntMaxFails && sw.Elapsed.Minutes < 3)
            {
                cntGeneration++;
                for (int i = 0; i < populations.Length; i++)
                {
                    double d = Utils.GetDistance(populations[i].order, cities);
                    populations[i].Fitness = 1 / (d + 1);

                    if (i == 0)
                    {
                        recordDistance = d;
                        bestPopulation = populations[0];
                    }

                    if (d < recordDistance)
                    {
                        recordDistance = d;
                        bestPopulation = populations[i].Clone();
                        cntFails       = 0;
                    }
                    else
                    {
                        cntFails++;
                    }
                }

                NormalizeFitness(populations);

                populations    = NextGeneration(populations);
                populations[0] = bestPopulation;
            }

            sw.Stop();

            Console.WriteLine($"Dauer: {sw.Elapsed.Minutes} Minuten und {sw.Elapsed.Seconds} Sekunden");
            Console.WriteLine($"Anzahl Fails: {cntFails}");

            Console.WriteLine("Anzahl Generationen: " + cntGeneration);

            GC.Collect();

            return(bestPopulation.order);
        }