static void Main(string[] args) { TaskLogger.Start(); ParseData(); InitializeClusterSet(); InitializeBestTour(); InitializeSecondBestTour(); UpdateLoggerFooter(); CrossOptimize(); Console.WriteLine("Genetic?"); Console.ReadKey(); var optimizer = new TwoOptimizer(cities); var geneticEngine = new GeneticTspEngine(cities); var nnTourFinder = new NNTourFinder(cities); while (secondBestTourDistance > TargetDistance) { TaskLogger.TaskName = "Genetic algorithm on first tour"; geneticEngine.StartFromKnownSolutions(bestTour); while (geneticEngine.CurrentGeneration < 1000) { geneticEngine.NextGeneration(); var currentSolution = geneticEngine.CurrentBestSolution; if (currentSolution.Distance < bestTourDistance) { bestTour = currentSolution; bestTourDistance = currentSolution.Distance; SaveTour(bestTour, BestTourFileName); UpdateLoggerFooter(); } } TaskLogger.TaskName = "Optimizationg of first tour"; TaskLogger.ShowProgress(); var gain = 0.0; do { var oldDistance = bestTourDistance; optimizer.Optimize(bestTour); bestTourDistance = cities.GetDistance(bestTour); UpdateLoggerFooter(); gain = oldDistance - bestTourDistance; if (gain > 0) SaveTour(bestTour, BestTourFileName); } while (gain > 1000.0); TaskLogger.TaskName = "Genetic algorithm on second disjoint tour"; geneticEngine.Reset(); geneticEngine.StartFromKnownSolutions( secondBestTour, new IntegerPermutation(nnTourFinder.FindRandomDisjointTour(bestTour))); while (geneticEngine.CurrentGeneration < 1000) { geneticEngine.NextGeneration(); foreach (var currentSolution in geneticEngine.CurrentSolutionPool) { if (currentSolution.Distance > secondBestTourDistance) break; if (!CheckDisjointness(bestTour, secondBestTour)) continue; if (currentSolution.Distance < secondBestTourDistance) { secondBestTour = currentSolution; secondBestTourDistance = currentSolution.Distance; SaveTour(secondBestTour, SecondBestTourFileName); UpdateLoggerFooter(); } } } TaskLogger.TaskName = "Optimization of second disjoint tour"; TaskLogger.ShowProgress(); do { var oldDistance = secondBestTourDistance; optimizer.OptimizeDisjoint(secondBestTour, bestTour); secondBestTourDistance = cities.GetDistance(secondBestTour); UpdateLoggerFooter(); gain = oldDistance - secondBestTourDistance; if (gain > 0) SaveTour(secondBestTour, SecondBestTourFileName); } while (gain > 1000.0); } TaskLogger.Stop(); }
static void InitializeSecondBestTour() { TaskLogger.TaskName = "Initializing second disjoint tour"; if (TourExists(SecondBestTourFileName)) { secondBestTour = LoadTour(SecondBestTourFileName); } else { var nnTourFinder = new NNTourFinder(cities); secondBestTour = new IntegerPermutation(nnTourFinder.FindRandomDisjointTour(bestTour)); SaveTour(secondBestTour, SecondBestTourFileName); } secondBestTourDistance = cities.GetDistance(secondBestTour); }