1
0

Program.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System.Diagnostics;
  2. using AntColony.Algorithm;
  3. namespace AntColony;
  4. class Program
  5. {
  6. /// <summary></summary>
  7. /// <param name="file">Путь до файла с ребрами</param>
  8. /// <param name="hasHeader">Файл содержит заголовок</param>
  9. /// <param name="iterations">Количество итераций</param>
  10. /// <param name="ants">Количество муравьев</param>
  11. /// <param name="alpha">Значение α (определяет вес феромонов)</param>
  12. /// <param name="beta">Значение β (определяет вес расстояния)</param>
  13. /// <param name="evaporationRate">Скорость испарения феромонов</param>
  14. /// <param name="q">Значение Q</param>
  15. public static void Main(FileInfo file, bool hasHeader = false, int iterations = 100, int ants = 20, double alpha = 1, double beta = 2, double evaporationRate = 0.1, double q = 100)
  16. {
  17. Console.Write("Чтение файла...");
  18. var sw = new Stopwatch();
  19. sw.Start();
  20. double[][] distances = ParseEdgeFile(file.FullName, hasHeader);
  21. Console.WriteLine($"\rСчитано {distances.Length} вершин за {sw.Elapsed} ({sw.ElapsedMilliseconds} мс).\n");
  22. var aco = new AntColonyOptimizer(
  23. distances: distances,
  24. numberOfAnts: 20,
  25. alpha: 1,
  26. beta: 2,
  27. evaporationRate: 0.1,
  28. Q: 100
  29. );
  30. sw.Restart();
  31. var (bestTour, bestDistance) = aco.Solve(iterations);
  32. Console.WriteLine($"Задача решена за {sw.Elapsed} ({sw.ElapsedMilliseconds} мс).");
  33. Console.WriteLine($"Лучший путь: {string.Join(" -> ", bestTour)}.");
  34. Console.WriteLine($"Итоговое расстояние: {bestDistance}.");
  35. }
  36. private static double[][] ParseEdgeFile(string filePath, bool skipHeader)
  37. {
  38. List<string> lines = [.. File.ReadAllLines(filePath)];
  39. if (skipHeader) lines.RemoveAt(0);
  40. HashSet<int> vertices = [];
  41. int maxVertex = 0;
  42. foreach (string line in lines)
  43. {
  44. string[] parts = line.Split();
  45. if (parts.Length != 3)
  46. continue;
  47. if (int.TryParse(parts[0], out int v1))
  48. vertices.Add(v1);
  49. if (int.TryParse(parts[1], out int v2))
  50. vertices.Add(v2);
  51. maxVertex = int.Max(maxVertex, v1);
  52. maxVertex = int.Max(maxVertex, v2);
  53. }
  54. double[][] adjacencyMatrix = new double[maxVertex + 1][];
  55. for (int i = 0; i < maxVertex + 1; i++)
  56. {
  57. adjacencyMatrix[i] = new double[maxVertex + 1];
  58. for (int j = 0; j < maxVertex + 1; j++)
  59. {
  60. adjacencyMatrix[i][j] = 0.0;
  61. }
  62. }
  63. foreach (string line in lines)
  64. {
  65. string[] parts = line.Split();
  66. if (parts.Length != 3)
  67. continue;
  68. if (int.TryParse(parts[0], out int v1) &&
  69. int.TryParse(parts[1], out int v2) &&
  70. double.TryParse(parts[2], out double distance))
  71. {
  72. adjacencyMatrix[v1][v2] = distance;
  73. adjacencyMatrix[v2][v1] = distance;
  74. }
  75. }
  76. return adjacencyMatrix;
  77. }
  78. }