Я хочу найти следующий короткий путь между двумя вершинами в графе, и путь имеет положительную стоимость. Следующий короткий путь позволяет обмениваться ребрами кратчайшего пути. Какой алгоритм я могу использовать?
Какой алгоритм можно использовать для поиска ближайшего к кратчайшему пути на графике?
Ответ 1
Я сомневаюсь, что это оптимально с точки зрения времени выполнения, но:
- Используйте алгоритм Дейкстры на графе G, чтобы получить путь P
- Для всех ребер E в пути P:
- - Если G - E не подключен, продолжите для следующего края (перейдите к 2)
- - Используйте алгоритм Дейкстры на G - E, чтобы найти путь X_i
- - Если длина текущего X_i короче всех остальных X_i, сохраните его
- X_i в конце цикла for - это второй самый короткий путь
Второй-самый короткий путь не может проходить через все ребра в P, но он может пройти через все, кроме одного из них, потенциально. Я предполагаю, что "второй-самый короткий", что вы не используете ребра более одного раза, иначе второй-самый короткий путь может содержать P.
Ответ 2
Используйте алгоритм K-кратчайшего пути, где k = 2 для вас, некоторый пример ссылки:
Поиск кратчайших путей. Д. Эппштейн. 35-й IEEE Symp. Основы Comp. Sci., Santa Fe, 1994, pp. 154-165. Tech. Rep. 94-26, ICS, UCI, 1994. SIAM J. Computing 28 (2): 652-673, 1998.
Ответ 3
Один из способов - использовать алгоритм Флойда-Варшалла для поиска кратчайшего пути всех пар, а затем тестирование всех промежуточных ребер - это, конечно, но, возможно, не оптимальный способ - решить эту проблему. Здесь большое объяснение http://hatemabdelghani.wordpress.com/2009/07/04/second-shortest-path/
Ответ 4
Предполагается, что вы можете повторно использовать ребра и узлы:
Прямолинейное решение делает расширение алгоритма Джикстры.
-
Вместо того, чтобы хранить для каждой node наименьшую стоимость и ее соответствующий родитель, сохраните две наименьшие затраты (и их соответствующие родители).
-
Для очереди приоритетов, чтобы хранить узлы хранения, храните пары (node, i), поэтому вы знаете, как использовать 1-й или 2-й путь во время распространения.
-
Соблюдайте осторожность во время фаз распространения, чтобы правильно обновлять значения нескольких путей.
(Возможно, мне не хватает некоторых важных деталей, но основная идея здесь...)
Ответ 5
Используйте алгоритм кратчайшего пути, чтобы найти кратчайший путь, P.
Затем вы можете рассматривать эту проблему как проблему проблема ограничения ограничений (где ограничение - это "самый короткий путь, который не является P" ) и, используйте алгоритм обратного слежения, чтобы найти кратчайший путь, который не является самым коротким путем, который вы уже нашли.
Ответ 6
В этом ответе предполагается, что вы ищете крайний непересекающийся второй самый короткий путь, что означает, что второй самый короткий путь не может использовать общие ребра с кратчайшим путем.
Напомним, что максимальный поток в сети между двумя узлами A
и B
дает вам количество пересекающих границу путей между эти два узла. Также помните, что алгоритмы, такие как Edmonds-Karp работают, отправляя поток по кратчайшему пути на каждом шаге.
Таким образом, эта проблема имеет только решение, если максимальный поток между двумя вашими узлами равен > 1, где каждое ребро имеет емкость 1. Если это так, найдите два дополнительных пути, как описано в алгоритме Эдмондса-Карпа, и второй - ваш второй самый короткий.
Смотрите эту проблему и это решение к ней ( Описание на китайском языке, я не могу перевести его, и babelfish тоже не может этого сделать, но не допущу этого. Код можно легко выполнить, хотя) для примера.
Ответ 7
Когда вы предпочитаете практическое решение для академического, вот один.
Я решил это, установив штраф на кратчайшие края пути и снова выполнив поиск.
например. кратчайший путь имеет длину 1000, штраф 10%, поэтому я ищу второй самый короткий путь с 1000 <= длина <= 1100.
В худшем случае я нахожу предыдущий самый короткий путь.
В лучшем случае я нахожу дизъюнктивный путь с одинаковой длиной.
В большинстве случаев я нахожу путь, разделяющий некоторые локально оптимальные подпуты.
Увеличение штрафа заставляет алгоритм находить альтернативные маршруты, в то время как уменьшение приводит к его толерантности.
Когда я нахожу второй самый короткий путь, мне приходится вычитать сумму штрафов на общих ребрах из вычисленной длины, чтобы получить реальную длину.
Для k-го кратчайшего пути я устанавливаю штраф для всех ребер, используемых в предыдущих k-1 кратчайших дорогах.