Почти сломал голову, пытаясь найти алгоритм, который находит самый быстрый маршрут в графе, который проходит через ВСЕ вершины графа из начальной вершины (без необходимости возврата к начальному ребру).
Я проверил все основные алгоритмы для графиков и аналогичных задач на stackoverflow.
Почти все примеры TSP, которые я гуглил, были для полных графиков.
TSPLIB не похоже, может решить мою проблему.
Извините, если что-то пропустил.
График ввода (проверьте изображения):
• Взвешенный
• Ненаправленный
• Планарный
• Нет гамильтонова траектории
• Нет отрицательных ребер
• Размер: до 100 вершин (но обычно50-70)
Длина грани на графике почти одинакова, поэтому мы можем сказать, что это невзвешенный граф, и взять длину 1 равной.
Должен быть решен с помощью "тупика"случаи: ![dead_end_cases](https://i.imgur.com/A7g45CF.png)
Реальные входные графики выглядят так (начиная с вершины 0): ![real_input_graph](https://i.imgur.com/rPg0nHv.png)
Большой график:
![big_graph](https://i.imgur.com/mBBBi8u.png)
Ожидаемый результат:
• Кратчайший путь (набор индексов вершин) через все ребра от начального ребра.
• Нет необходимости возвращаться к начальному ребру в конце
Получил только одну идею:
1) Проверьте все возможные комбинации пути, измерьте расстояние и найдите путь с наименьшим расстоянием.
1a) Use Поиск в глубину или поиск в ширину
1b) Если при выполнении итерации у текущей вершины более одного ребра - создайте отдельные комбинации для всех из них (попробуйте все возможные способы).
1c) В моем случае существует много «тупиков» в графе, поэтому алгоритм должен найти путь (самый быстрый из них) оттуда и перебрать уже пройденные вершины и не застрять.
2)Восстановите путь
Может быть, я должен использовать здесь алгоритм Minimum Spanning Trees…
Или, возможно, для более быстрого вычисления я должен разделить мой график на несколько наименьших, которые связаны только с одним ребром (например, 49-52, 40-41 на скриншоте)
Буду признателен за любую помощь.
Предпочитаю примеры C # (libs), но я могу переносить код с любого языка.