Jump to content

Алгоритм Йена

В теории графов алгоритм Йена безцикловые пути с одним источником вычисляет 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-кратчайшего пути Йена, K = 3, от A до F
Yen's k-shortest path algorithm, K = 3, A to F

В примере используется алгоритм Йена K -Shortest Path для вычисления трех путей из к . Алгоритм Дейкстры используется для расчета наилучшего пути из к , что со стоимостью 5. Этот путь добавляется в контейнер и становится первым k -кратчайшим путем, .

Узел из становится ответвленным узлом с собственным корневым путем, . Край, , удаляется, поскольку он совпадает с корневым путем и путем в контейнере . Алгоритм Дейкстры используется для расчета ответвления. , что , стоимость 8. добавляется в контейнер как потенциальный k -кратчайший путь.

Узел из становится отводным узлом с . Край, , удаляется, поскольку он совпадает с корневым путем и путем в контейнере . Алгоритм Дейкстры используется для расчета ответвления. , что , стоимость 7. добавляется в контейнер как потенциальный k -кратчайший путь.

Узел из становится ответвленным узлом с корневым путем, . Край, , удаляется, поскольку он совпадает с корневым путем и путем в контейнере . Алгоритм Дейкстры используется для расчета ответвления. , что , стоимость 8. добавляется в контейнер как потенциальный k -кратчайший путь.

Из трех путей в контейнере , выбран, чтобы стать потому что он имеет наименьшую стоимость 7. Этот процесс продолжается до 3-го k -кратчайшего пути. Однако обратите внимание, что в рамках этой третьей итерации некоторые ответвления не существуют. И путь, который выбран, чтобы стать является .

Пространственная сложность

[ редактировать ]

Чтобы сохранить ребра графа, список кратчайших путей и потенциальный список кратчайших путей , требуются адреса памяти. [ 2 ] В худшем случае каждый узел графа имеет ребро к каждому другому узлу графа, таким образом адреса нужны. Только адреса нужны для обоих списков и потому что максимум только пути будут сохранены, [ 2 ] где возможно, чтобы каждый путь имел узлы.

Временная сложность

[ редактировать ]

Временная сложность алгоритма Йена зависит от алгоритма кратчайшего пути, используемого при вычислении ответвлений, поэтому предполагается алгоритм Дейкстры. Алгоритм Дейкстры имеет худшую временную сложность: , но с использованием кучи Фибоначчи это становится , [ 3 ] где — количество ребер в графе. Поскольку алгоритм Йена делает обращается к Дейкстре при вычислении ответвлений, где длина подъездных путей. На сокращенном графике ожидаемое значение является , а худший случай . Временная сложность становится . [ 4 ]

Улучшения

[ редактировать ]

Алгоритм Йена можно улучшить, используя кучу для хранения , множество потенциальных k -кратчайших путей. Использование кучи вместо списка улучшит производительность алгоритма, но не усложнит его. [ 5 ] Один из способов немного снизить сложность — пропустить узлы, в которых отсутствуют ответвления. Этот случай возникает, когда все ответвления от ответвленного узла были использованы в предыдущем . Кроме того, если контейнер имеет пути минимальной длины относительно путей в контейнере , затем их можно извлечь и вставить в контейнер поскольку более короткие пути не будут найдены.

Модификация Лоулера

[ редактировать ]

Юджин Лоулер предложил модификацию алгоритма Йена, в которой путь дубликатов не рассчитывается, в отличие от исходного алгоритма, в котором они вычисляются, а затем отбрасываются, когда обнаруживаются дубликаты. [ 6 ] Эти дублирующиеся пути возникают в результате расчета ответвлений узлов в корне . Например, отклоняется от в каком-то узле . Любой подъездной путь, где , которые будут рассчитаны, будут дубликатом, поскольку они уже были рассчитаны во время итерация. Таким образом, только ответвления для узлов, которые находились на ответвлении необходимо рассчитать, т.е. только где варьируется от к . Чтобы выполнить эту операцию для , необходима запись для идентификации узла, в котором ответвление от .

См. также

[ редактировать ]
  1. ^ Йен, Джин Ю. (1970). «Алгоритм поиска кратчайших маршрутов от всех исходных узлов до заданного пункта назначения в общих сетях» . Ежеквартальный журнал прикладной математики . 27 (4): 526–530. дои : 10.1090/qam/253822 . МР   0253822 .
  2. ^ Jump up to: а б с Йен, Джин Ю. (июль 1971 г.). «Нахождение k кратчайших безпетлевых путей в сети». Наука управления . 17 (11): 712–716. дои : 10.1287/mnsc.17.11.712 . JSTOR   2629312 .
  3. ^ Фредман, Майкл Лоуренс ; Тарьян, Роберт Э. (1984). Кучи Фибоначчи и их использование в усовершенствованных алгоритмах оптимизации сети . 25-й ежегодный симпозиум по основам информатики. ИИЭЭ . стр. 338–346. дои : 10.1109/SFCS.1984.715934 .
  4. ^ Булье, Эрик (2007). Маршрутизация путей в ячеистых оптических сетях . Чичестер, Англия: Джон Уайли и сыновья. ISBN  9780470032985 .
  5. ^ Брандер, Эндрю Уильям; Синклер, Марк К. Сравнительное исследование алгоритмов k -кратчайшего пути . Кафедра инженерии электронных систем, Университет Эссекса, 1995 г.
  6. ^ Лоулер, Э.Л. (1972). «Процедура вычисления k лучших решений задач дискретной оптимизации и ее применение к задаче о кратчайшем пути». Наука управления . 18 (7): 401–405. дои : 10.1287/mnsc.18.7.401 .
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: d5d0dffaae45840fc8423c6f85d72796__1719770220
URL1:https://arc.ask3.ru/arc/aa/d5/96/d5d0dffaae45840fc8423c6f85d72796.html
Заголовок, (Title) документа по адресу, URL1:
Yen's algorithm - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)