static void branches(int[,] matrix, CompareResults cr) { Stopwatch branchesWatch = new Stopwatch(); branchesWatch.Start(); List<Salesman> ways = new List<Salesman>(); Salesman slm = new Salesman(matrix, N, null); Salesman best_way = slm; slm.step = N; slm.Prepare(); bool end = false; int min = INF; while (!end) { //включаем вершину Salesman sal1 = new Salesman(decreaseMatrix(slm), N, slm); sal1.matrix[slm.index_i, slm.index_j] = INF; sal1.step = slm.step - 1; slm.childs.Add(sal1); sal1.Prepare(); sal1.rootEstimation += slm.rootEstimation; //Console.WriteLine(sal1.rootEstimation + " " + sal1.step.ToString()); ways.Add(sal1); //не включаем вершину Salesman sal2 = new Salesman(slm.matrix, N, slm); sal2.matrix[slm.index_i, slm.index_j] = INF; sal2.step = slm.step - 1; slm.childs.Add(sal2); sal2.Prepare(); sal2.rootEstimation = slm.secondSanction + slm.rootEstimation; //Console.WriteLine(sal2.rootEstimation + " " + sal2.step.ToString()); ways.Add(sal2); //проверка min = INF; foreach (Salesman s in ways) { if ((s.rootEstimation < min) && (s.childs.Count == 0)) { slm = s; min = s.rootEstimation; } } if ((slm.step == 0))// && (slm == sal1))//&& (sal2.rootEstimation>=INF)) end = true; } branchesWatch.Stop(); cr.branchesTime = branchesWatch.Elapsed.TotalMilliseconds; cr.branchesWight = slm.rootEstimation; }
static void Main(string[] args) { List<CompareResults> results = new List<CompareResults>(); CompareResults res = new CompareResults(); StreamWriter strw = File.AppendText("max_values_test.txt"); for ( N = 6; N < 16; N++) { int[,] matrix = new int[N, N]; int[,] m2 = new int[N, N]; string filename = String.Format("just_results_test_{0}.txt", N.ToString()); StreamWriter writer = File.AppendText(filename); for (int j = 0; j < highB; j++) { matrix = ReadMatrixFromFile(N, j); optimalPath = new int[N]; markedCities = new bool[N]; path = new int[N]; m2 = matrix; CompareResults cr = new CompareResults(); cr.matrix = matrix; FullSearch(matrix, cr); Greedy(matrix, cr); branches(m2, cr); results.Add(cr); writer.WriteLine(String.Format("{0},{1},{2}", cr.fullsearchWeight, cr.greedyWeight, cr.branchesWight)); writer.WriteLine(String.Format("{0},{1},{2}", cr.fullsearchTime, cr.greedyTime, cr.branchesTime)); writer.WriteLine("********************"); Console.WriteLine(String.Format("FS = {0}, GR = {1}, BB = {2}", cr.fullsearchWeight, cr.greedyWeight, cr.branchesWight)); Console.WriteLine(String.Format("FS = {0}, GR = {1}, BB = {2}", cr.fullsearchTime, cr.greedyTime, cr.branchesTime)); Console.WriteLine("********************"); } writer.WriteLine("average/{0}/{1}/{2}", results.Sum(x => x.fullsearchTime) / highB, results.Sum(x => x.greedyTime) / highB, results.Sum(x => x.branchesTime) / highB); writer.WriteLine(" "); int m_b = 0; int m_g = 0; foreach (CompareResults r in results) { if (r.branchesWight == r.fullsearchWeight) m_b++; if (r.greedyWeight == r.fullsearchWeight) m_g++; } writer.WriteLine("Accuracy GR: {0}", 100 * m_g / results.Count); writer.WriteLine("Accuracy BR: {0}", 100 * m_b / results.Count); writer.Close(); //strw.WriteLine(N.ToString()); strw.Write("{3}/{0}/{1}/{2}", results.Max(x => x.fullsearchTime), results.Max(x => x.greedyTime), results.Max(x => x.branchesTime), N.ToString()); strw.WriteLine(); results.Clear(); } strw.Close(); Console.WriteLine("Done"); Console.ReadKey(); }
// жадный static void Greedy(int[,] matrix, CompareResults cr) { List<int> Path = new List<int>(); Path.Add(0); Stopwatch watchTCP = new Stopwatch(); watchTCP.Start(); while (Path.Count != N) { int minIndex = MinIndex(Path[Path.Count-1], matrix, Path); Path.Add(minIndex); } watchTCP.Stop(); cr.greedyTime = watchTCP.Elapsed.TotalMilliseconds ; cr.greedyWeight = CalculateWeight(Path.ToArray(), matrix); }
static void FullSearch(int [,] matrix, CompareResults cr) { for (int i = 0; i < N; i++) { markedCities[i] = false; } Stopwatch watchFS = new Stopwatch(); watchFS.Start(); markedCities[0] = true; weight = INF; int[] path = new int[N]; FS(matrix, 0, path); watchFS.Stop(); cr.fullsearchWeight = weight; cr.fullsearchTime = watchFS.Elapsed.TotalMilliseconds; }
static void show() { List<CompareResults> results = new List<CompareResults>(); CompareResults res = new CompareResults(); N = 6; int[,] matrix = new int[N, N]; int[,] m2 = new int[N, N]; //matrix = GenerateMatrix(N); for (int i = 13; i < 14; i++) { matrix = ReadMatrixFromFile(N, i); optimalPath = new int[N]; markedCities = new bool[N]; path = new int[N]; m2 = matrix; CompareResults cr = new CompareResults(); cr.matrix = matrix; FullSearch(matrix, cr); Greedy(matrix, cr); branches(m2, cr); results.Add(cr); } foreach (CompareResults r in results) { Console.WriteLine(String.Format("FS = {0}, GR = {1}, BB = {2}", r.fullsearchTime, r.greedyTime, r.branchesTime)); Console.WriteLine(String.Format("FS = {0}, GR = {1}, BB = {2}", r.fullsearchWeight, r.greedyWeight, r.branchesWight)); } Console.WriteLine("Done"); Console.ReadKey(); }
static void old_main() { List<CompareResults> results = new List<CompareResults>(); CompareResults res = new CompareResults(); StreamWriter strw = File.AppendText("max_values_test.txt"); for (N = 3; N < 8; N++) { int[,] matrix = new int[N, N]; int[,] m2 = new int[N, N]; for (int j = 0; j < highB; j++) { matrix = ReadMatrixFromFile(N, j); //matrix = GenerateMatrix(N); optimalPath = new int[N]; markedCities = new bool[N]; path = new int[N]; m2 = matrix; CompareResults cr = new CompareResults(); cr.matrix = matrix; FullSearch(matrix, cr); Greedy(matrix, cr); branches(m2, cr); results.Add(cr); //Console.WriteLine(String.Format("FS = {0}, GR = {1}, BB = {2}", cr.fullsearchWeight, cr.greedyWeight, cr.branchesWight)); //Console.WriteLine(String.Format("FS = {0}, GR = {1}, BB = {2}", cr.fullsearchTime, cr.greedyTime, cr.branchesTime)); //Console.WriteLine("********************"); } int m_b = 0; int m_g = 0; foreach (CompareResults r in results) { if (r.branchesWight == r.fullsearchWeight) m_b++; else Console.WriteLine(String.Format("FS = {0}, BB = {1}", r.fullsearchWeight, r.branchesWight)); if (r.greedyWeight == r.fullsearchWeight) m_g++; } Console.WriteLine("Dimension: {0}", N.ToString()); Console.WriteLine("Accuracy GR: {0}", 100 * m_g / results.Count); Console.WriteLine("Accuracy BB: {0}", 100 * m_b / results.Count); Console.WriteLine("******************"); results.Clear(); } strw.Close(); Console.WriteLine("Done"); Console.ReadKey(); }