diff --git a/.vs/comivoyar/v15/.suo b/.vs/comivoyar/v15/.suo index 58a36e2..761631a 100644 Binary files a/.vs/comivoyar/v15/.suo and b/.vs/comivoyar/v15/.suo differ diff --git a/.vs/comivoyar/v15/Server/sqlite3/storage.ide b/.vs/comivoyar/v15/Server/sqlite3/storage.ide index d580d3d..17be4f6 100644 Binary files a/.vs/comivoyar/v15/Server/sqlite3/storage.ide and b/.vs/comivoyar/v15/Server/sqlite3/storage.ide differ diff --git a/comivoyar/Program.cs b/comivoyar/Program.cs index 13d5d0b..74d58ef 100644 --- a/comivoyar/Program.cs +++ b/comivoyar/Program.cs @@ -9,26 +9,26 @@ namespace komvo { class Program { - public static List Points = new List(); - public static List Infinitives = new List(); - static void Main(string[] args) { + Beginig: + + List Points = new List(); + Random random = new Random(); + int pCount; + Write("Введите количество точек: "); + pCount = Convert.ToInt32(ReadLine()); Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); - string file = "coord.txt"; - using (StreamReader cr = new StreamReader(file)) + for(int i = 0; i < pCount; i++) { - string line; - while ((line = cr.ReadLine()) != null) - { - string[] str = line.Split(); - Points.Add(new Point { X = int.Parse(str[0]), Y = int.Parse(str[1]) }); - WriteLine(str[0] + " " + str[1]); - } + int x = random.Next(80); + int y = random.Next(70); + Points.Add(new Point { X = x, Y = y }); + WriteLine("Точка {0} [{1};{2}]", i + 1, x, y); } - WriteLine(); + WriteLine("\n"); int matr = Points.Count; double[,] Matrix = new double[matr, matr]; @@ -47,128 +47,66 @@ namespace komvo int[] toSwap = new int[Points.Count - 1]; for (int i = 0; i <= toSwap.Length - 1; i++) toSwap[i] = i + 2; + //for (int i = 0; i < toSwap.Length; i++) Write(toSwap[i]); //debug - - //for (int i = 0; i < toSwap.Length; i++) WriteLine(toSwap[i]); - - int fct = Fact(Points.Count - 1); - - string[] routes = new string[fct]; - double[] leng = new double[fct]; - - double optim = leng[0]; - int oIndex = 0; + int index = 0; + double opLength = 0, prevResult = 0; + string opRoute = string.Empty; Permutations perm = new Permutations(toSwap); - int index = 0; foreach(IList p in perm) { - string res = string.Empty; - for (int i = 0; i < toSwap.Length; i++) res += p[i].ToString() + ";"; - routes[index++] = res; - } - - - //for (int i = 0; i < routes.Length; i++) WriteLine(routes[i]); - - - - - //CountLen(ref leng, Matrix, routes); - CountLen2(ref leng, Matrix, routes); - SearchBest(ref optim, ref oIndex, routes, leng); - //Debug(routes); - - WriteLine("\n\n1{1}1 - оптимальный маршрут длинной {0:00.00}\nВсего маршрутов {2}\n{4} {3}", - optim, routes[oIndex], routes.Length, fct, Points.Count); - WriteLine(stopwatch.ElapsedMilliseconds + "ms"); - stopwatch.Stop(); - - ReadKey(); - } - - - public static void CountLen2(ref double[] result, double[,] mtr, string[] rts) - { - //WriteLine("loading 00%"); - for (int i = 0; i < rts.Length; i++) - { - double res = 0; - //char[] ch = rts[i].ToCharArray(); - //CursorLeft -= 3; - //int percent = i / rts.Length * 100; - //Write("{0:00}%"); - - string[] index = rts[i].Split(';'); + string route = string.Empty; + for (int i = 0; i < toSwap.Length; i++) route += p[i].ToString() + ";"; + opLength = CountLength(Matrix, route); - for (int j = 0; j < index.Length - 1; j++) + if (index != 0) { - string dg = index[j]; - int db = int.Parse(index[j]) - 2; //debug - string db1 = rts[i].ToString(); //debug - if (j == 0) res += mtr[0, int.Parse(index[j]) - 1]; - else if (j == index.Length - 1) + if (opLength > prevResult) { - res += mtr[int.Parse(index[j - 1]) - 2, int.Parse(index[j]) - 2]; - res += mtr[0, int.Parse(index[j]) - 2]; - } - else - { - res += mtr[int.Parse(index[j - 1]) - 2, int.Parse(index[j]) - 2]; + opLength = prevResult; + opRoute = route; } } - result[i] = res; + else prevResult = opLength; + + index++; } - } + WriteLine("\n\n1;{1}1 - оптимальный маршрут длинной {0:00.00}\nИз {2} маршрутов при {3} точках\nПосчитано за {4} мс\n\n", + opLength, opRoute, Fact(Points.Count-1), Points.Count, stopwatch.ElapsedMilliseconds); + stopwatch.Stop(); - public static void CountLen (ref double[] result, double[,] mtr, string[] rts) - { - for (int i = 0; i < rts.Length; i++) + Write("Ещё раз? (y/n)"); + char answer = Convert.ToChar(ReadLine()); + if (answer == 'y') { - double res = 0; - char[] ch = rts[i].ToCharArray(); - for (int j = 0; j < ch.Length; j++) - { - int db = int.Parse(ch[j].ToString()) - 1; //debug - string db1 = rts[i].ToString(); //debug - if (j == 0) res += mtr[0, int.Parse(ch[j].ToString()) - 1]; - else if (j == ch.Length - 1) - { - res += mtr[int.Parse(ch[j - 1].ToString()) - 1, int.Parse(ch[j].ToString()) - 1]; - res += mtr[0, int.Parse(ch[j].ToString()) - 1]; - } - else - { - res += mtr[int.Parse(ch[j - 1].ToString()) - 1, int.Parse(ch[j].ToString()) - 1]; - } - } - result[i] = res; + Points.Clear(); + goto Beginig; } } - public static void SearchBest(ref double optim, ref int oIndex, string[] routes, double[] leng) + public static double CountLength(double[,] mtr, string route) { - optim = leng[0]; - oIndex = 0; - for (int i = 0; i < leng.Length; i++) + double result = 0; + string[] index = route.Split(';'); + + for (int j = 0; j < index.Length - 1; j++) { - //WriteLine("{0:N2} - {1}", leng[i], routes[i]); - if (optim > leng[i]) + string dg = index[j]; + int db = int.Parse(index[j]) - 2; //debug + if (j == 0) result += mtr[0, int.Parse(index[j]) - 1]; + else if (j == index.Length - 1) { - optim = leng[i]; - oIndex = i; + result += mtr[int.Parse(index[j - 1]) - 2, int.Parse(index[j]) - 2]; + result += mtr[0, int.Parse(index[j]) - 2]; + } + else + { + result += mtr[int.Parse(index[j - 1]) - 2, int.Parse(index[j]) - 2]; } } - } - - public static void Debug (string[] routes) - { - for (int i = 0; i < routes.Length; i++) - { - for (int j = i + 1; j < routes.Length - 1; j++) - if (routes[i].Equals(routes[j])) WriteLine("{0} {2}:: {1} {3}!!!!", routes[i], routes[j], i, j); - } + return result; } public partial struct Point diff --git a/comivoyar/bin/Debug/comivoyar.exe b/comivoyar/bin/Debug/comivoyar.exe index ede5e37..02b54f5 100644 Binary files a/comivoyar/bin/Debug/comivoyar.exe and b/comivoyar/bin/Debug/comivoyar.exe differ diff --git a/comivoyar/bin/Debug/comivoyar.pdb b/comivoyar/bin/Debug/comivoyar.pdb index c63c666..a7e2523 100644 Binary files a/comivoyar/bin/Debug/comivoyar.pdb and b/comivoyar/bin/Debug/comivoyar.pdb differ diff --git a/comivoyar/bin/Debug/coord.txt b/comivoyar/bin/Debug/coord.txt index 8012c37..7c54c0f 100644 --- a/comivoyar/bin/Debug/coord.txt +++ b/comivoyar/bin/Debug/coord.txt @@ -1,10 +1,7 @@ -0 0 -10 10 -30 20 -20 30 -10 40 -20 50 -10 60 -50 70 -20 80 -30 100 \ No newline at end of file +1 0 +2 10 +3 20 +4 30 +5 40 +6 50 +7 60 \ No newline at end of file diff --git a/comivoyar/obj/Debug/comivoyar.csproj.CoreCompileInputs.cache b/comivoyar/obj/Debug/comivoyar.csproj.CoreCompileInputs.cache index 37d3024..aa00d1d 100644 --- a/comivoyar/obj/Debug/comivoyar.csproj.CoreCompileInputs.cache +++ b/comivoyar/obj/Debug/comivoyar.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -f0bb9fd207d6bf2b73407612668fe4a2e047ddf3 +47ece507326a3ff73baa3b75434a7d03f71dc86d diff --git a/comivoyar/obj/Debug/comivoyar.exe b/comivoyar/obj/Debug/comivoyar.exe index ede5e37..02b54f5 100644 Binary files a/comivoyar/obj/Debug/comivoyar.exe and b/comivoyar/obj/Debug/comivoyar.exe differ diff --git a/comivoyar/obj/Debug/comivoyar.pdb b/comivoyar/obj/Debug/comivoyar.pdb index c63c666..a7e2523 100644 Binary files a/comivoyar/obj/Debug/comivoyar.pdb and b/comivoyar/obj/Debug/comivoyar.pdb differ