Алгоритм Йена
В теории графов алгоритм Йена безцикловые пути с одним источником вычисляет K -кратчайшие для графа с неотрицательной стоимостью ребра . [ 1 ] Алгоритм был опубликован Джином И. Йеном в 1971 году и использует любой алгоритм кратчайшего пути для поиска лучшего пути, а затем переходит к поиску K - 1 отклонений лучшего пути. [ 2 ]
Алгоритм
[ редактировать ]Терминология и обозначения
[ редактировать ]Обозначения | Описание |
---|---|
Размер графа, т. е. количество узлов в сети. | |
The -й узел графа, где варьируется от к . Это означает, что является исходным узлом графа, а является стоковым узлом графа. | |
Стоимость границы между и , предполагая, что и . | |
The -й кратчайший путь из к , где варьируется от к . Затем , где это второй узел -й кратчайший путь, является третьим узлом -й кратчайший путь и так далее. | |
Путь отклонения от в узле , где варьируется от к . Обратите внимание, что максимальное значение является , который является узлом непосредственно перед стоком в кратчайший путь. Это означает, что траектория отклонения не может отклоняться от заданной. кратчайший путь к мойке. Пути и идите по тому же пути до тех пор, пока -й узел, тогда ребро отличается от любого пути в , где варьируется от к . | |
Корневой путь из этого следует, что до тех пор, пока -й узел . | |
Подъездная дорога это начинается с -й узел и заканчивается у раковины. |
Описание
[ редактировать ]Алгоритм можно разбить на две части: определение первого k-кратчайшего пути , , а затем определение всех остальных k -кратчайших путей. Предполагается, что контейнер будет содержать k -кратчайший путь, тогда как контейнер будет содержать потенциальные k -кратчайшие пути. Чтобы определить , кратчайшего пути от источника к приемнику, любой эффективный алгоритм кратчайшего пути можно использовать .
Чтобы найти , где варьируется от к , алгоритм предполагает, что все пути из к были обнаружены ранее. итерацию можно разделить на два процесса: поиск всех отклонений и выбираем путь минимальной длины, чтобы стать . Обратите внимание, что в этой итерации варьируется от к .
Первый процесс можно разделить еще на три операции: выбор , находя , а затем добавив в контейнер . Корневой путь, , выбирается путем нахождения подпути в который следует за первым узлы , где варьируется от к . Затем, если путь найден, стоимость ребра из установлено на бесконечность. Дальше отрог, , находится путем вычисления кратчайшего пути от ответвления узла, узла , в раковину. Удаление ранее использованных кромок из к гарантирует, что путь отвода отличается. , добавлен корневой путь и ответвленный путь. . Затем ребра, которые были удалены, т. е. стоимость которых была установлена на бесконечность, восстанавливаются до исходных значений.
Второй процесс определяет подходящий путь для найдя путь в контейнере с наименьшей стоимостью. Этот путь удален из контейнера и вставил в контейнер , и алгоритм переходит к следующей итерации.
Псевдокод
[ редактировать ]Алгоритм предполагает, что алгоритм Дейкстры используется для поиска кратчайшего пути между двумя узлами, но вместо него можно использовать любой алгоритм кратчайшего пути.
function YenKSP(Graph, source, sink, K): // Determine the shortest path from the source to the sink. A[0] = Dijkstra(Graph, source, sink); // Initialize the set to store the potential kth shortest path. B = []; for k from 1 to K: // The spur node ranges from the first node to the next to last node in the previous k-shortest path. for i from 0 to size(A[k − 1]) − 2: // Spur node is retrieved from the previous k-shortest path, k − 1. spurNode = A[k-1].node(i); // The sequence of nodes from the source to the spur node of the previous k-shortest path. rootPath = A[k-1].nodes(0, i); for each path p in A: if rootPath == p.nodes(0, i): // Remove the links that are part of the previous shortest paths which share the same root path. remove p.edge(i,i + 1) from Graph; for each node rootPathNode in rootPath except spurNode: remove rootPathNode from Graph; // Calculate the spur path from the spur node to the sink. // Consider also checking if any spurPath found spurPath = Dijkstra(Graph, spurNode, sink); // Entire path is made up of the root path and spur path. totalPath = rootPath + spurPath; // Add the potential k-shortest path to the heap. if (totalPath not in B): B.append(totalPath); // Add back the edges and nodes that were removed from the graph. restore edges to Graph; restore nodes in rootPath to Graph; if B is empty: // This handles the case of there being no spur paths, or no spur paths left. // This could happen if the spur paths have already been exhausted (added to A), // or there are no spur paths at all - such as when both the source and sink vertices // lie along a "dead end". break; // Sort the potential k-shortest paths by cost. B.sort(); // Add the lowest cost path becomes the k-shortest path. A[k] = B[0]; // In fact we should rather use shift since we are removing the first element B.pop(); return A;
Пример
[ редактировать ]
В примере используется алгоритм Йена K -Shortest Path для вычисления трех путей из к . Алгоритм Дейкстры используется для расчета наилучшего пути из к , что со стоимостью 5. Этот путь добавляется в контейнер и становится первым k -кратчайшим путем, .
Узел из становится ответвленным узлом с собственным корневым путем, . Край, , удаляется, поскольку он совпадает с корневым путем и путем в контейнере . Алгоритм Дейкстры используется для расчета ответвления. , что , стоимость 8. добавляется в контейнер как потенциальный k -кратчайший путь.
Узел из становится отводным узлом с . Край, , удаляется, поскольку он совпадает с корневым путем и путем в контейнере . Алгоритм Дейкстры используется для расчета ответвления. , что , стоимость 7. добавляется в контейнер как потенциальный k -кратчайший путь.
Узел из становится ответвленным узлом с корневым путем, . Край, , удаляется, поскольку он совпадает с корневым путем и путем в контейнере . Алгоритм Дейкстры используется для расчета ответвления. , что , стоимость 8. добавляется в контейнер как потенциальный k -кратчайший путь.
Из трех путей в контейнере , выбран, чтобы стать потому что он имеет наименьшую стоимость 7. Этот процесс продолжается до 3-го k -кратчайшего пути. Однако обратите внимание, что в рамках этой третьей итерации некоторые ответвления не существуют. И путь, который выбран, чтобы стать является .
Функции
[ редактировать ]Пространственная сложность
[ редактировать ]Чтобы сохранить ребра графа, список кратчайших путей и потенциальный список кратчайших путей , требуются адреса памяти. [ 2 ] В худшем случае каждый узел графа имеет ребро к каждому другому узлу графа, таким образом адреса нужны. Только адреса нужны для обоих списков и потому что максимум только пути будут сохранены, [ 2 ] где возможно, чтобы каждый путь имел узлы.
Временная сложность
[ редактировать ]Временная сложность алгоритма Йена зависит от алгоритма кратчайшего пути, используемого при вычислении ответвлений, поэтому предполагается алгоритм Дейкстры. Алгоритм Дейкстры имеет худшую временную сложность: , но с использованием кучи Фибоначчи это становится , [ 3 ] где — количество ребер в графе. Поскольку алгоритм Йена делает обращается к Дейкстре при вычислении ответвлений, где длина подъездных путей. На сокращенном графике ожидаемое значение является , а худший случай . Временная сложность становится . [ 4 ]
Улучшения
[ редактировать ]Алгоритм Йена можно улучшить, используя кучу для хранения , множество потенциальных k -кратчайших путей. Использование кучи вместо списка улучшит производительность алгоритма, но не усложнит его. [ 5 ] Один из способов немного снизить сложность — пропустить узлы, в которых отсутствуют ответвления. Этот случай возникает, когда все ответвления от ответвленного узла были использованы в предыдущем . Кроме того, если контейнер имеет пути минимальной длины относительно путей в контейнере , затем их можно извлечь и вставить в контейнер поскольку более короткие пути не будут найдены.
Модификация Лоулера
[ редактировать ]Юджин Лоулер предложил модификацию алгоритма Йена, в которой путь дубликатов не рассчитывается, в отличие от исходного алгоритма, в котором они вычисляются, а затем отбрасываются, когда обнаруживаются дубликаты. [ 6 ] Эти дублирующиеся пути возникают в результате расчета ответвлений узлов в корне . Например, отклоняется от в каком-то узле . Любой подъездной путь, где , которые будут рассчитаны, будут дубликатом, поскольку они уже были рассчитаны во время итерация. Таким образом, только ответвления для узлов, которые находились на ответвлении необходимо рассчитать, т.е. только где варьируется от к . Чтобы выполнить эту операцию для , необходима запись для идентификации узла, в котором ответвление от .
См. также
[ редактировать ]- Улучшение Йена алгоритма Беллмана – Форда
Ссылки
[ редактировать ]- ^ Йен, Джин Ю. (1970). «Алгоритм поиска кратчайших маршрутов от всех исходных узлов до заданного пункта назначения в общих сетях» . Ежеквартальный журнал прикладной математики . 27 (4): 526–530. дои : 10.1090/qam/253822 . МР 0253822 .
- ^ Jump up to: а б с Йен, Джин Ю. (июль 1971 г.). «Нахождение k кратчайших безпетлевых путей в сети». Наука управления . 17 (11): 712–716. дои : 10.1287/mnsc.17.11.712 . JSTOR 2629312 .
- ^ Фредман, Майкл Лоуренс ; Тарьян, Роберт Э. (1984). Кучи Фибоначчи и их использование в усовершенствованных алгоритмах оптимизации сети . 25-й ежегодный симпозиум по основам информатики. ИИЭЭ . стр. 338–346. дои : 10.1109/SFCS.1984.715934 .
- ^ Булье, Эрик (2007). Маршрутизация путей в ячеистых оптических сетях . Чичестер, Англия: Джон Уайли и сыновья. ISBN 9780470032985 .
- ^ Брандер, Эндрю Уильям; Синклер, Марк К. Сравнительное исследование алгоритмов k -кратчайшего пути . Кафедра инженерии электронных систем, Университет Эссекса, 1995 г.
- ^ Лоулер, Э.Л. (1972). «Процедура вычисления k лучших решений задач дискретной оптимизации и ее применение к задаче о кратчайшем пути». Наука управления . 18 (7): 401–405. дои : 10.1287/mnsc.18.7.401 .