Существует определенный набор городов, позволяющих говорить .. A, B, C, D, E, F, G. Проблема заключается в том, чтобы найти путь минимальной стоимости, который охватывает города A, B, C, F. Очень важно, чтобы путь охватывал города A, B, C, F. Путь может (но не обязательно) проходить через любой из других городов (D, E, G). Разрешается повторение пути. Путь должен начинаться и заканчиваться на A. Как я должен решить проблему вдоль подобных линий?эффективный алгоритм для поиска пути минимальной стоимости
ответ
Это вариант Travelling Salesman Problem (TSP) в маскировке.
Вы можете видеть, что если вы отмечаете каждый город как «необходимый для покрытия» (я буду называть их «интересными» впредь). Вариант TSP, где вам разрешено посещать узел более одного раза, по-прежнему NP-завершен.
Таким образом, зная, что сложность каждого точного решения вашей проблемы будет экспоненциальной в ряде интересных городов, вы можно переходить следующим образом:
Во-первых, предвычисления кратчайших путей между интересными городами. Это можно сделать с помощью Dijkstra's algorithm от любого интересного города или Floyd-Warshall algorithm. Затем либо попробуйте каждую перестановку порядка посещения интересных городов; или использовать какой-либо существующий решатель TSP или эвристический алгоритм.
Так Простейшая реализация выглядит следующим образом:
- Применить Floyd-Воршалла в городе графике. Это намного проще реализовать, чем Dijkstra's. Я нашел хороший PDF с их сравнением. Он получает матрицу со всеми кратчайшими путями для AB, AC, AF, BC, BF и CF. Если вам нужно получить фактический путь, как в последовательности городов, посмотрите на Path reconstruction section в Википедии.
- Попробуйте каждую перестановку порядка посещения интересных городов, кроме A (т. Е. Только B, C и F). Если вы используете C++, Python или Ruby, они имеют функцию перестановки в стандартной библиотеке. Для других языков вы можете использовать стороннюю библиотеку или выполнить поиск стека для алгоритма.
- Найти перестановку с наименьшей общей стоимостью пути. Например, для перестановки C-F-B общая стоимость составляет AC + CF + FB + BA. У вас уже есть все эти значения от Floyd-Warshall, поэтому вы можете просто их суммировать.
Если у вас есть V всего города и N интересные города, среда выполнения этой реализации будет составлять около O (V + N! · N)
Благодарим за ответ, не могли бы вы уточнить окончательный пункт? – fsociety
@ user269952 Извините, я думал, что это будет более сложное решение, чем второе, но с экспоненциальным временем вместо факториала. Но теперь я подумал немного больше, и, похоже, он также дает экспоненциальную память. Поэтому я удалил его. Если вам нужно быстро реализовать какое-то решение для небольших случаев, то метод пемутации проще, потому что многие современные языки (например, C++, Python, Ruby) имеют функцию генерации перестановок в стандартной библиотеке. И для максимальной эффективности лучше использовать эвристику (например, имитированный отжиг) или сторонние решатели. – Kolmar
«прекомпретировать кратчайшие пути между интересными городами», вы имеете в виду, что я нахожу кратчайшие пути для всех возможных комбинаций городов A, B, C, F в приведенном выше примере?это был бы самый короткий путь из AB, AC, AF, BC, BF, C, F – fsociety
- 1. Нужен алгоритм для поиска минимальной стоимости в подмножестве элементов
- 2. Эффективный алгоритм поиска пути, избегающий zigzag's
- 3. эффективный алгоритм поиска области полигона
- 4. Алгоритм для поиска минимальной точки значения функции
- 5. Самый эффективный алгоритм памяти для поиска пути на сетке
- 6. Выбор комбинации минимальной стоимости
- 7. Эффективный алгоритм поиска для поиска повторяющихся строк
- 8. Эффективный алгоритм поиска строк?
- 9. Эффективный кортеж алгоритм поиска
- 10. Алгоритм для минимальной стоимости + максимальное совпадение в общем графике
- 11. Поиск минимальной стоимости в двоичной матрице
- 12. Алгоритм поиска пути
- 13. Эффективный алгоритм поиска несортированного массива
- 14. Алгоритм поиска условной минимальной разности в массиве
- 15. Эффективный алгоритм для поиска связанных представлений
- 16. Эффективный алгоритм поиска для файла Capture
- 17. Эффективный алгоритм для поиска первого доступного имени
- 18. C++ - эффективный алгоритм для поиска соответствующих подстрок
- 19. Более эффективный алгоритм для поиска кратчайшего суперстрока
- 20. Эффективный алгоритм для поиска последних обновлений json
- 21. эффективный алгоритм для поиска минимума многопараметрической функции
- 22. Алгоритм поиска пути (классы расписания)
- 23. Алгоритм поиска A * (star) для кратчайшего пути
- 24. Алгоритм для поиска неориентированного пути графа
- 25. Алгоритм для поиска «минимального связующего пути»?
- 26. Мне нужен алгоритм для поиска наилучшего пути
- 27. Алгоритм поиска пути к точке
- 28. Программа требует оптимизации для минимальной стоимости
- 29. Цикл минимальной стоимости на полный график
- 30. алгоритм лабиринта для поиска всего пути (и кратчайшего пути)
у меня есть список смежности представление графа для проблема, теперь я пытаюсь реализовать алгоритм dijkstra, чтобы найти минимальные пути затрат для «интересных городов», как это предлагает @Kolmar. – fsociety