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); }