private Population InitPopulation() { Population pop = new Population(); pop.Add(new Sequence(parent.BSSF)); City[] cities = parent.GetCities(); City start = cities[0]; GreedyMaker maker = new GreedyMaker(cities); List <City> greedy = new List <City>(); City source = start; greedy.Add(source); while (greedy.Count < cities.Length) { var destinations = maker[source]; foreach (var c in destinations) { City gcity = c.Destination; if (!greedy.Contains(gcity)) { greedy.Add(gcity); source = gcity; break; } } } pop.Add(new Sequence(greedy)); while (pop.Size < PopulationSize) { City city = start; List <City> gene = new List <City>(); while (gene.Count < cities.Length) { if (!gene.Contains(city)) { gene.Add(city); } city = maker[city][(random.Next() <= GreedyPreferenceRate ? random.Next(GreedyVariance) : random.Next(maker[city].Count))].Destination; } pop.Add(new Sequence(gene)); } return(pop); }
public string[] Solve(ProblemAndSolver parent) { this.parent = parent; string[] results = new string[3]; Dictionary <string, double> improvementRate = new Dictionary <string, double>(); Population pop = InitPopulation(); Sequence imdabest = pop.Best; Stopwatch timer = new Stopwatch(); improvementRate[timer.Elapsed.ToString()] = imdabest.Score; timer.Start(); int iterationsSanChangement = 0; int count = 0; int generations = 0; List <Sequence> bestones = new List <Sequence>(); bestones.Add(imdabest); while ((iterationsSanChangement < MaxGenerations && timer.Elapsed.TotalSeconds < 90) || pop.Size < 2) { generations++; CrossPopulation(ref pop); MutatePopulation(pop); PrunePopulation(pop); if (pop.Best.Score < imdabest.Score) { iterationsSanChangement = 0; count++; imdabest = pop.Best; improvementRate[timer.Elapsed.ToString()] = imdabest.Score; bestones.Add(imdabest); } else { iterationsSanChangement++; } } timer.Stop(); parent.BSSF = imdabest.ToRoute(); Console.WriteLine(); results[ProblemAndSolver.COST] = imdabest.Score.ToString(); // load results into array here, replacing these dummy values results[ProblemAndSolver.TIME] = timer.Elapsed.ToString(); results[ProblemAndSolver.COUNT] = count.ToString(); //*** should this be 1 or the number of greedy solutions that we find??? StringBuilder bob = new StringBuilder(); bob.Append("Time,Best Cost\r\n"); foreach (var entry in improvementRate) { bob.Append(entry.Key); bob.Append(","); bob.Append(entry.Value); bob.Append("\r\n"); } bob.Append("Best," + imdabest.Score.ToString() + "\r\n"); bob.Append("Problem Size," + parent.GetCities().Length + "\r\n"); bob.Append("Seed," + parent.Seed + "\r\n"); bob.Append("Generations," + generations.ToString() + "\r\n"); bob.Append("Total Time," + timer.Elapsed.ToString()); bob.Append("\r\n"); System.IO.File.AppendAllText(@"C:\Users\Matt\Desktop\tsp_results.csv", bob.ToString()); return(results); }