Selaa lähdekoodia

Hamiltonian cycle fix

Vsevolod Levitan 4 kuukautta sitten
vanhempi
commit
2413c4bedd
3 muutettua tiedostoa jossa 21 lisäystä ja 19 poistoa
  1. 12 11
      AntColony/Algorithm/ACO.cs
  2. 7 0
      AntColony/Program.cs
  3. 2 8
      AntColony/README.md

+ 12 - 11
AntColony/Algorithm/ACO.cs

@@ -1,5 +1,3 @@
-using Microsoft.VisualBasic;
-
 namespace AntColony.Algorithm;
 
 /// <summary>
@@ -71,7 +69,9 @@ public class AntColonyOptimizer
             // Каждый муравей строит путь
             for (int ant = 0; ant < numberOfAnts; ant++)
             {
-                var (tour, distance) = ConstructTour();
+                var ct = ConstructTour();
+                if (ct is null) continue;
+                var (tour, distance) = ct.Value;
                 antTours.Add(tour);
                 antDistances.Add(distance);
 
@@ -98,7 +98,7 @@ public class AntColonyOptimizer
         return (bestTourEver, bestDistanceEver);
     }
 
-    private (List<int> tour, double distance) ConstructTour()
+    private (List<int> tour, double distance)? ConstructTour()
     {
         List<int> tour = [];
         var visited = new bool[numberOfCities];
@@ -110,12 +110,14 @@ public class AntColonyOptimizer
         // Строим путь
         while (tour.Count < numberOfCities)
         {
-            int nextCity = SelectNextCity(currentCity, visited);
+            var sel = SelectNextCity(currentCity, visited);
+            if (sel is not { } nextCity) return null;
             tour.Add(nextCity);
             visited[nextCity] = true;
             currentCity = nextCity;
         }
 
+        if (distances[currentCity][tour[0]] == 0) return null;
         // Добавляем возврат на начальную точку
         tour.Add(tour[0]);
 
@@ -128,7 +130,7 @@ public class AntColonyOptimizer
     /// <param name="currentCity">В каком городе муравей находится сейчас</param>
     /// <param name="visited">Какие города муравей уже посетил</param>
     /// <returns>Номер следующего города</returns>
-    private int SelectNextCity(int currentCity, bool[] visited)
+    private int? SelectNextCity(int currentCity, bool[] visited)
     {
         var probabilities = new double[numberOfCities];
         double probabilitiesSum = 0;
@@ -147,20 +149,19 @@ public class AntColonyOptimizer
 
         // Случайно выбираем следующий город (по вероятностям)
         double randomValue = Random.Shared.NextDouble() * probabilitiesSum;
-        double sum = 0;
+        //double sum = 0;
 
         for (int i = 0; i < numberOfCities; i++)
         {
             if (!visited[i])
             {
-                sum += probabilities[i];
-                if (sum >= randomValue)
+                //sum += probabilities[i];
+                if (probabilities[i] >= randomValue)
                     return i;
             }
         }
 
-        // Иначе возвращаемся к первому непосещенному городу
-        return Array.FindIndex(visited, v => !v);
+        return null;
     }
 
     /// <summary>

+ 7 - 0
AntColony/Program.cs

@@ -38,6 +38,13 @@ class Program
         var (bestTour, bestDistance) = aco.Solve(iterations);
 
         Console.WriteLine($"Задача решена за {sw.Elapsed} ({sw.ElapsedMilliseconds} мс).");
+
+        if (bestTour.Count == 0)
+        {
+            Console.WriteLine("Гамильтонов цикл не найден.");
+            return;
+        }
+
         Console.WriteLine($"Лучший путь: {string.Join(" -> ", bestTour)}.");
         Console.WriteLine($"Итоговое расстояние: {bestDistance}.");
     }

+ 2 - 8
AntColony/README.md

@@ -1,15 +1,9 @@
 # Алгоритм оптимизации муравьиной колонии для решения задачи комивояжера (поиска Гамильтонова цикла)
 ### Результаты
-Сходимость на 1000 итерациях для файла 1000.txt
+Сходимость на 1000 итерациях
 
 ![График сходимости](readme-files/convergence.png "График сходимости")
 
 Участок до 80-й итерации
 
-![График сходимости до 80 итерации](readme-files/convergence-sm.png "График сходимости до 80 итерации")
-
-**Длина лучшего пути на 1000 итераций для файла 1000.txt:** 2691
-
-**Время синхронного выполнения для 1000 итераций для файла 1000.txt:** 00:00:33.7090225 (33709 мс)
-
-**Время параллельного выполнения для 1000 итераций для файла 1000.txt:** 00:00:13.2479228 (13247 мс)
+![График сходимости до 80 итерации](readme-files/convergence-sm.png "График сходимости до 80 итерации")