private SA_Solution Run(double?initTemp, double?tempDecreasingCoefficient, long?maxRepetitionsWithoutImprovement) { Random random = new Random(); SA_Solution initSolution = new SA_Solution(_distanceMatrix.GetLength(0), true, random); SA_Solution oldSolution = initSolution; SA_Solution bestSolution = new SA_Solution(initSolution.Clone()); double?temp = initTemp; double oldResult = 0; double newResult = 0; int repetitionsWithoutImprovement = 0; while (repetitionsWithoutImprovement < maxRepetitionsWithoutImprovement) { SA_Solution newSolution = oldSolution.CreateNewSolutionWithSwappedTwoElements(random); oldResult = oldSolution.FunctionValue(_distanceMatrix); newResult = newSolution.FunctionValue(_distanceMatrix); if (newResult < bestSolution.FunctionValue(_distanceMatrix)) { bestSolution = newSolution; } if (newResult < oldResult) { oldSolution = newSolution; repetitionsWithoutImprovement = 0; } else if (random.NextDouble() < CalculateProbability(oldResult, newResult, temp)) { oldSolution = newSolution; repetitionsWithoutImprovement++; } else { repetitionsWithoutImprovement++; } temp *= tempDecreasingCoefficient; } PrepareLogger(); _loggerFile.WriteLine(""); LogPermutation(bestSolution.Permutation, bestSolution.FunctionValue(_distanceMatrix)); LogDistancesForSolution(bestSolution); FinalizeLogger(); return(bestSolution); }
private void viewMapForSolution_Click(object sender, RoutedEventArgs e) { MapDataSource.MapViewWindow.clearRoutes(); List <int> path = _solution.Clone(); GeoData[] points = MapDataSource.DistanceMatrix.GeoPoints; for (int i = 0; i < path.Count() - 1; ++i) { GeoData point1 = points[path[i]]; GeoData point2 = points[path[i + 1]]; MapDataSource.MapViewWindow.drawRouteForLocation(point1.latitude, point1.longitude, point2.latitude, point2.longitude, GetPathColor(path, i, i + 1)); } GeoData retPoint1 = points[path[path.Count() - 1]]; GeoData retPoint2 = points[path[0]]; MapDataSource.MapViewWindow.drawRouteForLocation(retPoint1.latitude, retPoint1.longitude, retPoint2.latitude, retPoint2.longitude, GetPathColor(path, path.Count() - 1, 0)); MapDataSource.MapViewWindow.Show(); }