2015-05-10 6 views
1

Существует определенный набор городов, позволяющих говорить .. A, B, C, D, E, F, G. Проблема заключается в том, чтобы найти путь минимальной стоимости, который охватывает города A, B, C, F. Очень важно, чтобы путь охватывал города A, B, C, F. Путь может (но не обязательно) проходить через любой из других городов (D, E, G). Разрешается повторение пути. Путь должен начинаться и заканчиваться на A. Как я должен решить проблему вдоль подобных линий?эффективный алгоритм для поиска пути минимальной стоимости

+0

у меня есть список смежности представление графа для проблема, теперь я пытаюсь реализовать алгоритм dijkstra, чтобы найти минимальные пути затрат для «интересных городов», как это предлагает @Kolmar. – fsociety

ответ

3

Это вариант Travelling Salesman Problem (TSP) в маскировке.

Вы можете видеть, что если вы отмечаете каждый город как «необходимый для покрытия» (я буду называть их «интересными» впредь). Вариант TSP, где вам разрешено посещать узел более одного раза, по-прежнему NP-завершен.

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

Во-первых, предвычисления кратчайших путей между интересными городами. Это можно сделать с помощью Dijkstra's algorithm от любого интересного города или Floyd-Warshall algorithm. Затем либо попробуйте каждую перестановку порядка посещения интересных городов; или использовать какой-либо существующий решатель TSP или эвристический алгоритм.

Так Простейшая реализация выглядит следующим образом:

  1. Применить Floyd-Воршалла в городе графике. Это намного проще реализовать, чем Dijkstra's. Я нашел хороший PDF с их сравнением. Он получает матрицу со всеми кратчайшими путями для AB, AC, AF, BC, BF и CF. Если вам нужно получить фактический путь, как в последовательности городов, посмотрите на Path reconstruction section в Википедии.
  2. Попробуйте каждую перестановку порядка посещения интересных городов, кроме A (т. Е. Только B, C и F). Если вы используете C++, Python или Ruby, они имеют функцию перестановки в стандартной библиотеке. Для других языков вы можете использовать стороннюю библиотеку или выполнить поиск стека для алгоритма.
  3. Найти перестановку с наименьшей общей стоимостью пути. Например, для перестановки C-F-B общая стоимость составляет AC + CF + FB + BA. У вас уже есть все эти значения от Floyd-Warshall, поэтому вы можете просто их суммировать.

Если у вас есть V всего города и N интересные города, среда выполнения этой реализации будет составлять около O (V + N! · N)

+0

Благодарим за ответ, не могли бы вы уточнить окончательный пункт? – fsociety

+0

@ user269952 Извините, я думал, что это будет более сложное решение, чем второе, но с экспоненциальным временем вместо факториала. Но теперь я подумал немного больше, и, похоже, он также дает экспоненциальную память. Поэтому я удалил его. Если вам нужно быстро реализовать какое-то решение для небольших случаев, то метод пемутации проще, потому что многие современные языки (например, C++, Python, Ruby) имеют функцию генерации перестановок в стандартной библиотеке. И для максимальной эффективности лучше использовать эвристику (например, имитированный отжиг) или сторонние решатели. – Kolmar

+0

«прекомпретировать кратчайшие пути между интересными городами», вы имеете в виду, что я нахожу кратчайшие пути для всех возможных комбинаций городов A, B, C, F в приведенном выше примере?это был бы самый короткий путь из AB, AC, AF, BC, BF, C, F – fsociety

Смежные вопросы