private static Tuple<double[,], int[,]> TsTestsTspLib() { double[,] timesArray = new double[25, 10]; int[,] distancesArray = new int[25, 10]; int i = 0; TspGraph graph = new TspGraph(); graph.ReadGraphFromFile(AppDomain.CurrentDomain.BaseDirectory + @"\tsplib\gr24.tsp"); for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 8); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 6); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 4); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 2); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension * 3); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; graph = new TspGraph(); graph.ReadGraphFromFile(AppDomain.CurrentDomain.BaseDirectory + @"\tsplib\ftv70.atsp"); for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 8); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 6); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 4); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 2); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension * 3); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; graph = new TspGraph(); graph.ReadGraphFromFile(AppDomain.CurrentDomain.BaseDirectory + @"\tsplib\kro124p.atsp"); for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 8); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 6); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 4); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 2); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension * 3); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; graph = new TspGraph(); graph.ReadGraphFromFile(AppDomain.CurrentDomain.BaseDirectory + @"\tsplib\ftv170.atsp"); for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 8); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 6); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 4); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 2); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension * 3); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; graph = new TspGraph(); graph.ReadGraphFromFile(AppDomain.CurrentDomain.BaseDirectory + @"\tsplib\rbg323.atsp"); for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 8); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 6); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 4); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension / 2); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } i++; for (int j = 0; j < timesArray.GetLength(1); j++) { TspTabuSearch.SolveTsp(graph, graph.Dimension * 3); timesArray[i, j] = TspTabuSearch.TimeMeasured.TotalMilliseconds; distancesArray[i, j] = TspTabuSearch.PathDistance; } Tuple<double[,], int[,]> returnTuple = new Tuple<double[,], int[,]>(timesArray, distancesArray); return returnTuple; }
static void Main (string[] args) { TspGraph graph = new TspGraph(); char primaryMenuKey, secondaryMenuKey; string input; CancellationTokenSource cts = new CancellationTokenSource(); CancellationToken ct = cts.Token; do { Console.WriteLine (); Console.WriteLine ("PEA - problem komiwojażera"); Console.WriteLine ("-Menu główne"); Console.WriteLine ("--1. Wczytaj graf z pliku."); Console.WriteLine ("--2. Przejrzyj właściwości grafu."); Console.WriteLine ("--3. Rozwiąż problem za pomocą wybranego algorytmu."); Console.WriteLine ("--4. Stwórz zestaw o określonej ilości miast."); Console.WriteLine ("--5. Przeprowadź testy czasowe dla losowych instancji."); Console.WriteLine ("--6. Przeprowadź testy czasowe dla danych z tsplib (Programowanie dynamiczne)."); Console.WriteLine ("--7. Przeprowadź testy dla danych z tsplib (Tabu Search)."); Console.WriteLine ("--8. Przeprowadź testy jakościowe parametrów dla gr48.tsp (Algorytm genetyczny)."); Console.WriteLine ("--9. Przeprowadź testy dla danych z tsplib (Algorytm genetyczny)."); primaryMenuKey = Console.ReadKey().KeyChar; switch (primaryMenuKey) { case '1': Console.Clear (); Console.WriteLine ("Wpisz ścieżkę pliku."); string filename = Console.ReadLine(); filename = filename?.Replace(@"\", @"\\"); graph.ReadGraphFromFile(filename); break; case '2': Console.Clear (); try { Console.WriteLine("---Graf"); Console.WriteLine("----Nazwa: " + graph.Name); Console.WriteLine("----Typ: " + graph.Type); Console.WriteLine("----Wymiary: " + graph.Dimension); graph.PrintGraph(); } catch (NullReferenceException) { Console.WriteLine("Graf albo jego właściwości są null."); } Console.ReadKey(); break; case '3': do { Console.Clear (); Console.WriteLine("---Algorytmy"); Console.WriteLine("----1. Rozwiąż algorytmem programowania dynamicznego."); Console.WriteLine("----2. Rozwiąż algorytmem przeszukiwania z zakazami."); Console.WriteLine("----3. Rozwiąż algorytmem genetycznym."); secondaryMenuKey = Console.ReadKey().KeyChar; switch (secondaryMenuKey) { case '1': cts = new CancellationTokenSource(); Console.Clear (); Task.Run(() => { while (!cts.IsCancellationRequested) { Console.Write("."); Thread.Sleep(1000); } }, ct); TspDynamicProgramming.SolveTsp(graph); cts.Cancel(); cts.Dispose(); Console.WriteLine(); TspDynamicProgramming.ShowResults(); TspDynamicProgramming.ClearCollections(); Console.ReadKey(); break; case '2': Console.Clear(); int mr, pt, tlc; Console.WriteLine("---Podaj ilość restartów:"); input = Console.ReadLine(); while (!Int32.TryParse(input, out mr)) { input = Console.ReadLine(); } Console.WriteLine("---Podaj ilość prób bez polepszenia rezultatu:"); input = Console.ReadLine(); while (!Int32.TryParse(input, out pt)) { input = Console.ReadLine(); } Console.WriteLine("---Podaj długość listy tabu:"); input = Console.ReadLine(); while (!Int32.TryParse(input, out tlc)) { input = Console.ReadLine(); } cts = new CancellationTokenSource(); Console.Clear(); Task.Run(() => { while (!cts.IsCancellationRequested) { Console.Write("."); Thread.Sleep(1000); } }, ct); TspTabuSearch.SolveTsp(graph, tlc, mr, pt); cts.Cancel(); cts.Dispose(); Console.WriteLine(); TspTabuSearch.ShowResults(); Console.ReadKey(); break; case '3': Console.Clear(); int pop, elites; double mutrate, crossrate; Console.WriteLine("---Podaj prawdopodobieństwo krzyżowania:"); input = Console.ReadLine(); while (!double.TryParse(input, out crossrate)) { input = Console.ReadLine(); } Console.WriteLine("---Podaj prawdopodobieństwo mutacji:"); input = Console.ReadLine(); while (!double.TryParse(input, out mutrate)) { input = Console.ReadLine(); } Console.WriteLine("---Podaj wielkość populacji:"); input = Console.ReadLine(); while (!Int32.TryParse(input, out pop)) { input = Console.ReadLine(); } Console.WriteLine("---Podaj liczbę elit:"); input = Console.ReadLine(); while (!Int32.TryParse(input, out elites)) { input = Console.ReadLine(); } cts = new CancellationTokenSource(); Console.Clear(); Task.Run(() => { while (!cts.IsCancellationRequested) { Console.Write("."); Thread.Sleep(1000); } }, ct); TspGenetic.SolveTsp(graph, elites, crossrate, mutrate, pop, CrossoverType.OX, 300, 1000); cts.Cancel(); cts.Dispose(); Console.WriteLine(); TspGenetic.ShowResults(); Console.ReadKey(); break; default: break; } } while (secondaryMenuKey != 27); break; case '4': Console.Clear(); int dim, maxDist; Console.WriteLine("---Podaj ilość miast:"); input = Console.ReadLine(); while (!Int32.TryParse(input, out dim)) { input = Console.ReadLine(); } Console.WriteLine("---Równe odległości A-B i B-A? (t - tak, n - nie)"); do { input = Console.ReadLine() ?? ""; } while (!(input.Equals("t") || input.Equals("n"))); bool tspOrAtsp = false; if (input.Equals("t")) tspOrAtsp = false; else if (input.Equals("n")) tspOrAtsp = true; Console.WriteLine("---Podaj maksymalną odległość między miastami:"); input = Console.ReadLine(); while (!Int32.TryParse(input, out maxDist)) { input = Console.ReadLine(); } graph = new TspGraph(dim, tspOrAtsp, maxDist); Console.WriteLine("---Utworzono graf o następujących właściwościach:"); Console.WriteLine("----Nazwa: " + graph.Name); Console.WriteLine("----Typ: " + graph.Type); Console.WriteLine("----Wymiary: " + graph.Dimension); Console.ReadKey(); break; case '5': Console.Clear(); Console.WriteLine("Zostaną przprowadzone testy. Wciśnij ESC aby anulować albo dowolny klawisz aby kontynuować."); secondaryMenuKey = Console.ReadKey().KeyChar; if (secondaryMenuKey != 27) { Console.WriteLine("Wykonywane są testy dla tsp. Może to zająć dużo czasu."); double[,] results = DpTests(false); TimesToFile("DpTsp.txt", GetAverageTimes(results)); Console.WriteLine("Wykonywane są testy dla atsp. Może to zająć dużo czasu."); results = DpTests(true); TimesToFile("DpAtsp.txt", GetAverageTimes(results)); Console.WriteLine("Koniec testów. Wciśnij dowolny klawisz aby wrócić do menu."); Console.ReadKey(); } break; case '6': Console.Clear(); Console.WriteLine("Zostaną przprowadzone testy dla danych z tsplib. Wciśnij ESC aby anulować albo dowolny klawisz aby kontynuować."); secondaryMenuKey = Console.ReadKey().KeyChar; if (secondaryMenuKey != 27) { Console.WriteLine("Wykonywane są testy. Może to zająć dużo czasu."); double[,] results = DpTestsTspLib(); TimesToFile("DpTspLib.txt", GetAverageTimes(results)); Console.WriteLine("Koniec testów. Wciśnij dowolny klawisz aby wrócić do menu."); Console.ReadKey(); } break; case '7': Console.Clear(); Console.WriteLine("Zostaną przprowadzone testy dla danych z tsplib. Wciśnij ESC aby anulować albo dowolny klawisz aby kontynuować."); secondaryMenuKey = Console.ReadKey().KeyChar; if (secondaryMenuKey != 27) { Console.WriteLine("Wykonywane są testy. Może to zająć dużo czasu."); Tuple<double[,], int[,]> results = TsTestsTspLib(); TimesToFile("TsTspLibTests.txt", GetAverageTimes(results.Item1)); DistancesToFile("TsTspLibDistances.txt", GetAverageDistances(results.Item2)); Console.WriteLine("Koniec testów. Wciśnij dowolny klawisz aby wrócić do menu."); Console.ReadKey(); } break; case '8': Console.Clear(); Console.WriteLine("Zostaną przprowadzone testy dla danych z tsplib. Wciśnij ESC aby anulować albo dowolny klawisz aby kontynuować."); secondaryMenuKey = Console.ReadKey().KeyChar; if (secondaryMenuKey != 27) { Console.WriteLine("Wykonywane są testy. Może to zająć dużo czasu."); GaParametersTests(); Console.WriteLine("Koniec testów. Wciśnij dowolny klawisz aby wrócić do menu."); Console.ReadKey(); } break; case '9': Console.Clear(); Console.WriteLine("Zostaną przprowadzone testy dla danych z tsplib. Wciśnij ESC aby anulować albo dowolny klawisz aby kontynuować."); secondaryMenuKey = Console.ReadKey().KeyChar; if (secondaryMenuKey != 27) { Console.WriteLine("Wykonywane są testy. Może to zająć dużo czasu."); Tuple<double[,], int[,]> results = GaTestsTspLib(); TimesToFile("GaTspLibTests.txt", GetAverageTimes(results.Item1)); DistancesToFile("GaTspLibDistances.txt", GetAverageDistances(results.Item2)); Console.WriteLine("Koniec testów. Wciśnij dowolny klawisz aby wrócić do menu."); Console.ReadKey(); } break; default: break; } } while (primaryMenuKey != 27); }