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