public List <City> SimulatedAnnealing(string path) { double temperature = 10000; double alpha = 0.9999; double minimTemperature = 0.00001; Cities = new List <City>(); FileReaderHelper.ReadValues(path, Cities); Map = GenerateMap(); int startIndex = 0; int endIndex = 0; List <City> solution = GenerateRandomSolution(); while (temperature > minimTemperature) { startIndex = random.Next(0, Cities.Count); endIndex = random.Next(startIndex, Cities.Count); List <City> temporarySolution = GetTwoOptNeighbour(startIndex, endIndex, solution); int solutionTotalDistance = CalculateDistanceBetweenCities(solution); int temporarySolutionTotalDistance = CalculateDistanceBetweenCities(temporarySolution); int delta = temporarySolutionTotalDistance - solutionTotalDistance; if (delta < 0) { solution = temporarySolution; } else if (random.NextDouble() < Math.Exp(-delta / temperature)) { solution = temporarySolution; } temperature = alpha * temperature; } Console.WriteLine("Total distance: " + CalculateDistanceBetweenCities(solution)); return(solution); }
public List <City> GreedyMethod(string path) { Cities = new List <City>(); FileReaderHelper.ReadValues(path, Cities); Map = GenerateMap(); List <City> solution = new List <City> { GenerateRandomSolution().First <City>() }; while (solution.Count < Cities.Count - 1) { solution.Add(GetNearestNeighbourCity(solution.Last <City>(), solution)); } Console.WriteLine("Total distance: " + CalculateDistanceBetweenCities(solution)); return(solution); }
public List <City> TwoOptMethod(string path) { Cities = new List <City>(); FileReaderHelper.ReadValues(path, Cities); Map = GenerateMap(); List <City> solution = GenerateRandomSolution(); int firstDistance = CalculateDistanceBetweenCities(solution); int iterations = 0; int initialDistance = 0; int newDistance = 0; int startIndex = 0; int endIndex = 0; List <City> newSolution = new List <City>(solution); bool MoreTransfomations = true; while (iterations < 1000) { newSolution = new List <City>(solution); initialDistance = CalculateDistanceBetweenCities(solution); newDistance = 0; startIndex = random.Next(0, Cities.Count); endIndex = random.Next(startIndex, Cities.Count); for (int i = startIndex; i <= endIndex; i++) { City temporary = newSolution[i]; newSolution[i] = newSolution[endIndex]; newSolution[endIndex] = temporary; endIndex--; } newDistance = CalculateDistanceBetweenCities(newSolution); if (newDistance < initialDistance) { solution = newSolution; iterations = 0; } else { iterations++; } } Console.WriteLine("Initial distance: " + firstDistance); Console.WriteLine("Final distance: " + newDistance); return(newSolution); }