グラフ理論において、Yenのアルゴリズムは、非負のエッジコストを持つグラフの単一始点K最短ループなしパスを計算します。[ 1 ]このアルゴリズムは、Jin Y. Yenによって1971年に発表され、任意の最短パスアルゴリズム を使用して最適なパスを見つけ、次に最適なパスのK - 1個の偏差を見つけます。[ 2 ]
このアルゴリズムは、最初のk 最短経路を決定するという 2 つの部分に分解できます。そして、他のすべてのk最短経路を決定します。コンテナはk最短経路を保持する一方、コンテナは潜在的なk最短経路を保持します。ソースからシンクまでの最短経路については、効率的な最短経路アルゴリズムであればどれでも使用できます。
見つけるために、 どこ範囲はにアルゴリズムは、からのすべてのパスがに以前に発見された。反復処理は、すべての偏差を見つけるという2つのプロセスに分けられます。そして、最短経路を選択して。なお、この反復では、範囲はに。
最初のプロセスはさらに3つの操作に細分化できます。発見そして、容器へルートパス、は、サブパスを見つけることによって選択されます。最初のものに続くノード、 どこ範囲はにパスが見つかった場合、エッジのコストはの無限大に設定されます。次に、分岐経路、は、分岐ノードからノードまでの最短経路を計算することによって求められます。シンクへ。以前使用されていた縁の除去に分岐経路が異なることを保証する。ルートパスとスパーパスの追加は、次に、削除されたエッジ、つまりコストが無限大に設定されたエッジは、元の値に戻されます。
2番目のプロセスは、適切な経路を決定します。コンテナ内のパスを見つけることによって最も低いコストで。このパスはコンテナから削除されます。容器に挿入そして、アルゴリズムは次の反復処理へと進む。
このアルゴリズムは、 2つのノード間の最短経路を見つけるためにダイクストラ法を使用することを前提としていますが、代わりに任意の最短経路アルゴリズムを使用することも可能です。
function YenKSP(Graph, source, sink, K): // ソースからシンクまでの最短経路を決定します。 A[0] = Dijkstra(Graph, source, sink); // 潜在的な k 番目の最短経路を格納するためのセットを初期化します。 B = []; kを1から Kまで繰り返す: // 分岐ノードは、前の k 最短パスの最初のノードから最後から 2 番目のノードまでの範囲です。 iを0からsize(A[k − 1]) − 2 まで繰り返す:// スパーノードは、前の k 最短パス k − 1 から取得されます。 spurNode = A[k-1].node(i); // 前の k 最短経路の始点から分岐ノードまでのノードのシーケンス。 rootPath = A[k-1].nodes(0, i); Aの各パス pについて: rootPath == p.nodes(0, i): // 同じルート パスを共有する以前の最短パスの一部であるリンクを削除します。 Graphから p.edge(i,i + 1) を削除します。 rootPath内の各ノード rootPathNodeについて、 spurNode を除く:グラフから rootPathNodeを削除します。 // 分岐ノードからシンクまでの分岐パスを計算します。// 分岐パスが見つかったかどうかも確認することを検討します。 spurPath = Dijkstra(グラフ、spurNode、シンク); // パス全体はルートパスとスパーパスで構成されます。 totalPath = rootPath + spurPath; // 潜在的なk最短パスをヒープに追加します。if (totalPath not in B): B.append(totalPath); // グラフから削除されたエッジとノードを元に戻します。グラフに エッジを復元します。 rootPath内のノードをGraphに復元します。B が空の場合: // これは、分岐パスがない場合、または分岐パスが残っていない場合を処理します。// これは、分岐パスが既に使い果たされている場合 (A に追加されている場合)、 // または分岐パスがまったくない場合(ソース頂点とシンク頂点の両方が「行き止まり」に沿っている場合など)に発生する可能性があります。 壊す; // 潜在的なk最短経路をコスト順にソートします。 B.sort(); // 最もコストの低いパスを追加すると、k 最短パスになります。 A[k] = B[0]; // 実際には、最初の要素を削除しているので、shift を使うべきです B.pop(); Aを返す。

この例では、YenのK最短経路アルゴリズムを使用して、次の3つの経路を計算します。にダイクストラ法は、最適な経路を計算するために使用されます。にそれはコスト5で、このパスはコンテナに追加されます。そして最初のk最短経路となり、。
ノードの自身をルートパスとする分岐ノードとなり、端、は、ルートパスとコンテナ内のパスと一致するため削除されます。ダイクストラ法は分岐経路を計算するために使用される。それは費用は8です。コンテナに追加されます潜在的なk最短経路として。
ノードの分岐ノードになる端、は、ルートパスとコンテナ内のパスと一致するため削除されます。ダイクストラ法は分岐経路を計算するために使用される。それは費用は7です。コンテナに追加されます潜在的なk最短経路として。
ノードのルートパスを持つ分岐ノードとなり、端、は、ルートパスとコンテナ内のパスと一致するため削除されます。ダイクストラ法は分岐経路を計算するために使用される。それは費用は8です。コンテナに追加されます潜在的なk最短経路として。
コンテナ内の3つのパスのうち 、に選ばれるコストが7と最も低いからです。このプロセスは3番目のk最短経路まで続きます。ただし、この3回目の反復では、分岐経路が存在しないことに注意してください。そして、選択される経路はは 。
グラフのエッジを格納するために、最短経路リスト、そして潜在的な最短経路リスト、メモリ アドレスが必要です。[ 2 ]最悪の場合、グラフ内のすべてのノードはグラフ内の他のすべてのノードへのエッジを持ち、したがって住所が必要です。住所は両方のリストに必要ですそしてなぜなら、せいぜいパスは保存され、[ 2 ]各パスにはノード。
Yenのアルゴリズムの時間計算量は、分岐経路の計算に使用される最短経路アルゴリズムに依存するため、Dijkstraアルゴリズムを仮定する。Dijkstraアルゴリズムの最悪ケースの時間計算量はしかし、フィボナッチヒープを使用すると、[ 3 ]ここではグラフのエッジの数です。Yenのアルゴリズムは分岐経路を計算する際にダイクストラ法を呼び出すと、は分岐経路の長さです。縮約グラフでは、期待値はは最悪のケースは時間計算量は[ 4 ]
Yenのアルゴリズムは、ヒープを使用してデータを格納することで改善できる。、潜在的なk最短経路の集合。リストの代わりにヒープを使用すると、アルゴリズムのパフォーマンスは向上しますが、複雑さは変わりません。[ 5 ] 複雑さをわずかに軽減する 1 つの方法は、分岐経路が存在しないノードをスキップすることです。このケースは、分岐ノードからのすべての分岐経路が前の分岐経路で使用されている場合に発生します。また、コンテナの場合もっているコンテナ内のパスを基準とした、最小長のパスそうすれば、それらを取り出して容器に入れることができる。より短い経路は見つからないため。
ユージン・ローラーは、イェンのアルゴリズムに修正を加え、重複パスを計算しないという方法を提案した。元のアルゴリズムでは重複パスを計算し、重複が見つかった場合は破棄していた。[ 6 ]これらの重複パスは、ルート内のノードの分岐パスを計算することによって生じる。。 例えば、から逸脱するあるノードで. 分岐路、どこつまり、計算された値は、すでに計算されているため重複になります。反復。したがって、次のスパーパス上のノードのスパーパスのみ計算する必要がある、つまりどこ範囲はにこの操作を実行するにはノードを識別するにはレコードが必要です。から分岐しました。