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