|
|
@ -9,26 +9,26 @@ namespace komvo |
|
|
|
{ |
|
|
|
{ |
|
|
|
class Program |
|
|
|
class Program |
|
|
|
{ |
|
|
|
{ |
|
|
|
public static List<Point> Points = new List<Point>(); |
|
|
|
|
|
|
|
public static List<string> Infinitives = new List<string>(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void Main(string[] args) |
|
|
|
static void Main(string[] args) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
Beginig: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<Point> Points = new List<Point>(); |
|
|
|
|
|
|
|
Random random = new Random(); |
|
|
|
|
|
|
|
int pCount; |
|
|
|
|
|
|
|
Write("Введите количество точек: "); |
|
|
|
|
|
|
|
pCount = Convert.ToInt32(ReadLine()); |
|
|
|
Stopwatch stopwatch = new Stopwatch(); |
|
|
|
Stopwatch stopwatch = new Stopwatch(); |
|
|
|
stopwatch.Start(); |
|
|
|
stopwatch.Start(); |
|
|
|
string file = "coord.txt"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
using (StreamReader cr = new StreamReader(file)) |
|
|
|
for(int i = 0; i < pCount; i++) |
|
|
|
{ |
|
|
|
{ |
|
|
|
string line; |
|
|
|
int x = random.Next(80); |
|
|
|
while ((line = cr.ReadLine()) != null) |
|
|
|
int y = random.Next(70); |
|
|
|
{ |
|
|
|
Points.Add(new Point { X = x, Y = y }); |
|
|
|
string[] str = line.Split(); |
|
|
|
WriteLine("Точка {0} [{1};{2}]", i + 1, x, y); |
|
|
|
Points.Add(new Point { X = int.Parse(str[0]), Y = int.Parse(str[1]) }); |
|
|
|
|
|
|
|
WriteLine(str[0] + " " + str[1]); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
WriteLine(); |
|
|
|
WriteLine("\n"); |
|
|
|
|
|
|
|
|
|
|
|
int matr = Points.Count; |
|
|
|
int matr = Points.Count; |
|
|
|
double[,] Matrix = new double[matr, matr]; |
|
|
|
double[,] Matrix = new double[matr, matr]; |
|
|
@ -47,128 +47,66 @@ namespace komvo |
|
|
|
|
|
|
|
|
|
|
|
int[] toSwap = new int[Points.Count - 1]; |
|
|
|
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 - 1; i++) toSwap[i] = i + 2; |
|
|
|
|
|
|
|
//for (int i = 0; i < toSwap.Length; i++) Write(toSwap[i]); //debug |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int index = 0; |
|
|
|
//for (int i = 0; i < toSwap.Length; i++) WriteLine(toSwap[i]); |
|
|
|
double opLength = 0, prevResult = 0; |
|
|
|
|
|
|
|
string opRoute = string.Empty; |
|
|
|
int fct = Fact(Points.Count - 1); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string[] routes = new string[fct]; |
|
|
|
|
|
|
|
double[] leng = new double[fct]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double optim = leng[0]; |
|
|
|
|
|
|
|
int oIndex = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Permutations<int> perm = new Permutations<int>(toSwap); |
|
|
|
Permutations<int> perm = new Permutations<int>(toSwap); |
|
|
|
int index = 0; |
|
|
|
|
|
|
|
foreach(IList<int> p in perm) |
|
|
|
foreach(IList<int> p in perm) |
|
|
|
{ |
|
|
|
{ |
|
|
|
string res = string.Empty; |
|
|
|
string route = string.Empty; |
|
|
|
for (int i = 0; i < toSwap.Length; i++) res += p[i].ToString() + ";"; |
|
|
|
for (int i = 0; i < toSwap.Length; i++) route += p[i].ToString() + ";"; |
|
|
|
routes[index++] = res; |
|
|
|
opLength = CountLength(Matrix, route); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//for (int i = 0; i < routes.Length; i++) WriteLine(routes[i]); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (index != 0) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (opLength > prevResult) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
opLength = prevResult; |
|
|
|
|
|
|
|
opRoute = route; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else prevResult = opLength; |
|
|
|
|
|
|
|
|
|
|
|
//CountLen(ref leng, Matrix, routes); |
|
|
|
index++; |
|
|
|
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}", |
|
|
|
WriteLine("\n\n1;{1}1 - оптимальный маршрут длинной {0:00.00}\nИз {2} маршрутов при {3} точках\nПосчитано за {4} мс\n\n", |
|
|
|
optim, routes[oIndex], routes.Length, fct, Points.Count); |
|
|
|
opLength, opRoute, Fact(Points.Count-1), Points.Count, stopwatch.ElapsedMilliseconds); |
|
|
|
WriteLine(stopwatch.ElapsedMilliseconds + "ms"); |
|
|
|
|
|
|
|
stopwatch.Stop(); |
|
|
|
stopwatch.Stop(); |
|
|
|
|
|
|
|
|
|
|
|
ReadKey(); |
|
|
|
Write("Ещё раз? (y/n)"); |
|
|
|
|
|
|
|
char answer = Convert.ToChar(ReadLine()); |
|
|
|
|
|
|
|
if (answer == 'y') |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
Points.Clear(); |
|
|
|
|
|
|
|
goto Beginig; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static double CountLength(double[,] mtr, string route) |
|
|
|
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; |
|
|
|
double result = 0; |
|
|
|
//char[] ch = rts[i].ToCharArray(); |
|
|
|
string[] index = route.Split(';'); |
|
|
|
//CursorLeft -= 3; |
|
|
|
|
|
|
|
//int percent = i / rts.Length * 100; |
|
|
|
|
|
|
|
//Write("{0:00}%"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
string[] index = rts[i].Split(';'); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int j = 0; j < index.Length - 1; j++) |
|
|
|
for (int j = 0; j < index.Length - 1; j++) |
|
|
|
{ |
|
|
|
{ |
|
|
|
string dg = index[j]; |
|
|
|
string dg = index[j]; |
|
|
|
int db = int.Parse(index[j]) - 2; //debug |
|
|
|
int db = int.Parse(index[j]) - 2; //debug |
|
|
|
string db1 = rts[i].ToString(); //debug |
|
|
|
if (j == 0) result += mtr[0, int.Parse(index[j]) - 1]; |
|
|
|
if (j == 0) res += mtr[0, int.Parse(index[j]) - 1]; |
|
|
|
|
|
|
|
else if (j == index.Length - 1) |
|
|
|
else if (j == index.Length - 1) |
|
|
|
{ |
|
|
|
{ |
|
|
|
res += mtr[int.Parse(index[j - 1]) - 2, int.Parse(index[j]) - 2]; |
|
|
|
result += mtr[int.Parse(index[j - 1]) - 2, int.Parse(index[j]) - 2]; |
|
|
|
res += mtr[0, int.Parse(index[j]) - 2]; |
|
|
|
result += mtr[0, int.Parse(index[j]) - 2]; |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
|
res += mtr[int.Parse(index[j - 1]) - 2, int.Parse(index[j]) - 2]; |
|
|
|
result += mtr[int.Parse(index[j - 1]) - 2, int.Parse(index[j]) - 2]; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
result[i] = res; |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void CountLen (ref double[] result, double[,] mtr, string[] rts) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
for (int i = 0; i < rts.Length; i++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
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; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static void SearchBest(ref double optim, ref int oIndex, string[] routes, double[] leng) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
optim = leng[0]; |
|
|
|
|
|
|
|
oIndex = 0; |
|
|
|
|
|
|
|
for (int i = 0; i < leng.Length; i++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
//WriteLine("{0:N2} - {1}", leng[i], routes[i]); |
|
|
|
|
|
|
|
if (optim > leng[i]) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
optim = leng[i]; |
|
|
|
|
|
|
|
oIndex = i; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public partial struct Point |
|
|
|
public partial struct Point |
|
|
|