Алгоритм: кратчайший путь между всеми точками

Предположим, у меня есть 10 очков. Я знаю расстояние между каждой точкой.

Мне нужно найти кратчайший маршрут, проходящий через все точки.

Я попробовал несколько алгоритмов (Dijkstra, Floyd Warshall,...) и все они дают мне кратчайший путь между началом и концом, но они не делают маршрут со всеми точками на нем.

перестановки работают нормально, но они слишком дороги для ресурсов.

какие алгоритмы вы можете посоветовать мне взглянуть на эту проблему? Или есть документированный способ сделать это с помощью вышеупомянутых алгоритмов?

4 ответов


посмотреть задача коммивояжера.

вы можете посмотреть в некоторые из эвристические решения. Они могут не дать вам 100% точных результатов, но часто они могут придумать достаточно хорошие решения (от 2 до 3% от оптимальных решений) за разумное количество времени.


Это очевидно задача коммивояжера. Специально для N=10, вы можете попробовать O(N!) наивный алгоритм, или используя Динамическое Программирование, вы можете уменьшить это O(n^2 2^n), на Торговой площади.

помимо этого, поскольку это NP-трудная проблема, вы можете только надеяться на приближение или эвристику, учитывая обычные предостережения.


Как уже упоминали другие, это экземпляр TSP. Я думаю согласие, разработанный в Georgia Tech, является современным решателем. Он может обрабатывать более 10 000 точек в течение нескольких секунд. Он также имеет API, с которым легко работать.


Я думаю, что это то, что вы ищете, на самом деле:

Для Floyd Warshall

в информатике, алгоритм Floyd–Warshall алгоритм (иногда известный как алгоритм WFI[требуется уточнение], алгоритм Роя-Флойда или просто Алгоритм Флойда) - алгоритм анализа графов для нахождения кратчайшего пути в взвешенном графике (с положительным или отрицательным весом ребер). Ля одиночное выполнение алгоритма позволит найти длины (суммированные Весов) кратчайших путей между всеми парами вершин, хотя это не возвращает детали самих путей

в подразделе " реконструкция пути "объясняется структура данных, которую вам нужно будет сохранить" пути " (на самом деле вы просто храните следующий узел, чтобы перейти, а затем тривиально реконструировать любой путь, который требуется по мере необходимости).