public TimeSpan searchRoadMain(List <List <int> > coordinates, Func <Image, int> setImage, int Width, int Height, ref bool run) { DateTime timer1 = DateTime.Now; List <List <int> > road = new List <List <int> >(); float distance = 0; //File file = new File(); List <List <int> > original = help.getWeightsRoads(coordinates); List <List <int> > matrix = original.Select(x => x.Select(y => y).ToList()).ToList(); RoadsHelper roadsHelper = new RoadsHelper(original); DateTime timer2 = DateTime.Now; float H = 0; List <int> min_elements_row = help.get_min_in_row(matrix); //Найдем в каждой строке минимальное значение H += help.get_min_in_row(matrix).Where(x => x < MAXVALUE).Sum(); help.sub_row(matrix, min_elements_row); //Произведем редукцию строк List <int> min_elements_col = help.get_min_in_col(matrix); //найдем минимальное значение в каждом столбце H += help.get_min_in_col(matrix).Where(x => x < MAXVALUE).Sum(); help.sub_col(matrix, min_elements_col); //Произведем редукцию столбцов #region Главный алгоритм while (run) { if (min_elements_col.All(x => x > MAXVALUE) && min_elements_row.All(x => x > MAXVALUE)) { break; } List <int> coordinate = help.calc_ratings(matrix); //Найдем среди вычисленных оценок нулевых //клеток координату клетки с наивысшей оценкой: help.loop_removal(ref matrix, road); //Удаляем петли //Исключаем узел List <List <int> > temp = help.clone_matix(matrix); temp[coordinate[0]][coordinate[1]] = int.MaxValue; min_elements_row = help.get_min_in_row(temp); //Найдем в каждой строке минимальное значение float weight = H + help.get_min_in_row(temp).Where(x => x < MAXVALUE).Sum(); help.sub_row(temp, min_elements_row); //Произведем редукцию строк min_elements_col = help.get_min_in_col(temp); //найдем минимальное значение в каждом столбце weight += help.get_min_in_col(temp).Where(x => x < MAXVALUE).Sum(); help.sub_col(temp, min_elements_col); //Произведем редукцию столбцов //Console.WriteLine($"Матрица после исключения ребра: ({coordinate[0] + 1},{coordinate[1] + 1}) \nВес: {weight}"); //print_matrix(temp); roadsHelper.AddRoKnWe(weight, help.clone_matix(temp), help.clone_matix(road)); //Запоминаем узел setImage(getImageRoads(coordinates, road, Width, Height)); //Изображение //Application.DoEvents(); //Thread.Sleep(10); //Берем узел road.Add(new List <int>() { coordinate[0] + 1, coordinate[1] + 1 }); //Добавляем ветку(дорогу) help.fill_matrix(matrix, coordinate[0], coordinate[1]); matrix[coordinate[1]][coordinate[0]] = int.MaxValue; //print_matrix(matrix); help.loop_removal(ref matrix, road); //Удаляем петли min_elements_row = help.get_min_in_row(matrix); //Найдем в каждой строке минимальное значение weight = H + min_elements_row.Where(x => x < MAXVALUE).Sum(); help.sub_row(matrix, min_elements_row); //Произведем редукцию строк min_elements_col = help.get_min_in_col(matrix); //найдем минимальное значение в каждом столбце weight += min_elements_col.Where(x => x < MAXVALUE).Sum(); help.sub_col(matrix, min_elements_col); //Произведем редукцию столбцов //Console.WriteLine($"Матрица после взятия ребра: ({coordinate[0] + 1},{coordinate[1] + 1}) \nВес: {weight}"); //print_matrix(matrix); roadsHelper.AddRoKnWe(weight, help.clone_matix(matrix), help.clone_matix(road)); //Запоминаем узел setImage(getImageRoads(coordinates, road, Width, Height)); //Изображение Application.DoEvents(); //Thread.Sleep(10); //Возвращяем лучший узел road.Clear(); matrix.Clear(); H = roadsHelper.getBestMatrixAndRoad(ref matrix, ref road); } roadsHelper.Clear(); #endregion var time2 = DateTime.Now - timer2; string result = ""; int last_city = 1; for (int i = 0; i < road.Count; i++) { for (int j = 0; j < road.Count; j++) { if (road[j][0] == last_city) { result += $"{last_city} => "; last_city = road[j][1]; distance += original[road[j][0] - 1][road[j][1] - 1]; break; } } } result += "1"; Console.WriteLine(result); Console.WriteLine($"Длина пути: {distance}"); var time1 = DateTime.Now - timer1; Console.WriteLine($"\nВремя выполнения алгоритма: {time2}\n" + $"Полное время выполнение программы: {time1}"); //setImage(getImage(roadsToString(road), '2')); //getImage(pictureBox, roadsToString(road), '2'); setImage(getImageRoads(coordinates, road, Width, Height)); return(time2); }
public TimeSpan searchRoadTest(List <List <int> > original, List <List <int> > matrix) { RoadsHelper roadsHelper = new RoadsHelper(original); List <List <int> > road = new List <List <int> >(); DateTime timer2 = DateTime.Now; float H = 0; List <int> min_elements_row = help.get_min_in_row(matrix); //Найдем в каждой строке минимальное значение H += help.get_min_in_row(matrix).Where(x => x != float.MaxValue).Sum(); help.sub_row(matrix, min_elements_row); //Произведем редукцию строк List <int> min_elements_col = help.get_min_in_col(matrix); //найдем минимальное значение в каждом столбце H += help.get_min_in_col(matrix).Where(x => x != float.MaxValue).Sum(); help.sub_col(matrix, min_elements_col); //Произведем редукцию столбцов #region Главный алгоритм while (true) { if (min_elements_col.All(x => x == int.MaxValue) && min_elements_row.All(x => x == int.MaxValue)) { break; } float weight; List <int> coordinate = help.calc_ratings(matrix); //Найдем среди вычисленных оценок нулевых //клеток координату клетки с наивысшей оценкой: help.loop_removal(ref matrix, road); //Удаляем петли //Исключаем узел List <List <int> > temp = help.clone_matix(matrix); temp[coordinate[0]][coordinate[1]] = int.MaxValue; min_elements_row = help.get_min_in_row(temp); //Найдем в каждой строке минимальное значение weight = H + help.get_min_in_row(temp).Where(x => x != int.MaxValue).Sum(); help.sub_row(temp, min_elements_row); //Произведем редукцию строк min_elements_col = help.get_min_in_col(temp); //найдем минимальное значение в каждом столбце weight += help.get_min_in_col(temp).Where(x => x != int.MaxValue).Sum(); help.sub_col(temp, min_elements_col); //Произведем редукцию столбцов roadsHelper.AddRoKnWe(weight, help.clone_matix(temp), help.clone_matix(road)); //Запоминаем узел //Берем узел road.Add(new List <int>() { coordinate[0] + 1, coordinate[1] + 1 }); //Добавляем ветку(дорогу) help.fill_matrix(matrix, coordinate[0], coordinate[1]); matrix[coordinate[1]][coordinate[0]] = int.MaxValue; //print_matrix(matrix); help.loop_removal(ref matrix, road); //Удаляем петли min_elements_row = help.get_min_in_row(matrix); //Найдем в каждой строке минимальное значение weight = H + min_elements_row.Where(x => x != int.MaxValue).Sum(); help.sub_row(matrix, min_elements_row); //Произведем редукцию строк min_elements_col = help.get_min_in_col(matrix); //найдем минимальное значение в каждом столбце weight += min_elements_col.Where(x => x != int.MaxValue).Sum(); help.sub_col(matrix, min_elements_col); //Произведем редукцию столбцов roadsHelper.AddRoKnWe(weight, help.clone_matix(matrix), help.clone_matix(road)); //Запоминаем узел //Возвращяем лучший узел road.Clear(); matrix.Clear(); H = roadsHelper.getBestMatrixAndRoad(ref matrix, ref road); } #endregion var time2 = DateTime.Now - timer2; return(time2); }