Алгоритм Эппштейна и алгоритм Йена для k кратчайших путей
Я пытаюсь понять, как именно работают эти алгоритмы, но я не смог найти простого объяснения. Я был бы очень признателен, если бы кто-то мог предоставить или указать мне описание этих алгоритмов, которое легче понять, чем описание в оригинальных статьях. Благодарю.
1 ответ
Прежде всего, позвольте мне предоставить вам ссылки на газеты, о которых вы говорили.
Статья Эппштейна: Д. Эппштейн, "Нахождение k кратчайших путей", SIAM J. Comput., Vol. 28, нет. 2, с.652–673, февраль 1999 г.
Статья Йена: JY Йен, "Нахождение K кратчайших циклов без петель в сети", Management Science, vol. 17, нет. 11, с. 712–716, 1971.
Вот мое объяснение алгоритма Йена:
Алгоритм Йена использует два списка, то есть список A (постоянные кратчайшие пути от источника к месту назначения - в хронологическом порядке) и список B (предварительные / возможные кратчайшие пути). Сначала вы должны найти 1-й кратчайший путь от источника к месту назначения с помощью любого подходящего алгоритма кратчайшего пути (например, Дейкстры). Затем Йен использует идею о том, что k-е кратчайшие пути могут иметь общие ребра и подпуть (путь от источника к любым промежуточным узлам в пределах маршрута) от (k-1)-го кратчайшего пути. Затем вы должны выбрать (k-1) кратчайший путь и сделать каждый узел на маршруте недоступным по очереди, т. Е. Стереть определенный край, который идет к узлу в пределах маршрута. Когда узел недоступен, найдите кратчайший путь от предыдущего узла к месту назначения. Затем у вас есть новый маршрут, который создается путем добавления общего подпути (от источника к предыдущему узлу недоступного узла) и добавления нового кратчайшего пути от предыдущего узла к месту назначения. Этот маршрут затем добавляется в список B, при условии, что он не появлялся в списке A или списке B ранее. После повторения этого для всех узлов в маршруте, вы должны найти кратчайший маршрут в списке B и переместить его в список A. Вам просто нужно повторить этот процесс для количества Ks, которые у вас есть.
Этот алгоритм имеет вычислительную сложность O(kn^3). Пожалуйста, прочитайте статью для более подробной информации.
Алгоритм выглядит следующим образом:
G = Adjacent Matrix of the Network
Initialize:
A_1 = shortest-path from source to destination
Glocal ← Local copy of G
for k = 2 → K do
for i = 1 → [len(A_(k−1) ) − 1] do
Current Node ← A_(k−1) [i]
Ri ← Sub-path (root) from source till current node in A_(k−1)
for j = 1 → k − 1 do
Rj ← Sub-path (root) from source till current node in A_j
if Ri == Rj then
Next Node ← Aj [i+1]
Glocal(Current Node, Next Node) ← infinity
Current Node ← unreachable
end if
end for
Si ← Shortest-path from current node till destination
Bi ← Ri + Si
end for
A_k ← Shortest-path amongst all paths in B
Restore original graph: Glocal ← Local copy of G
end for
К сожалению, я не использовал метод Эппштейна, поскольку алгоритм Йена был оптимальным для моей задачи.
Надеюсь это поможет. Приветствия.
=====
Редактировать:
Пожалуйста, посмотрите на запись в Википедии. Это хороший пример.
=====
Редактировать:
Я нашел несколько реализаций в C. Ссылки следующие:
Реализация Eppstein и график загрузки для Eppstein.
Если вам интересно, есть ленивая версия Eppstein. Ссылка следующая:
Ленивый Эппштейн, Хименес и Марзал
=====
Редактировать:
Просто еще одна ссылка. Этот содержит несколько реализаций (C / C++).
=====
Редактировать:
Я нашел хорошее объяснение алгоритма Эппштейна.