アルゴリズムグラフ理論の中心的な問題は、最短経路問題です。最短経路問題の一般化の 1 つは、単一ソース最短経路 (SSSP)問題として知られており、グラフ内のソース頂点から他のすべての頂点までの最短経路を見つけることで構成されます。この問題を解決する古典的な順次アルゴリズムには、ダイクストラのアルゴリズムなどがあります。ただし、この記事では、この問題を解決する 2 つの並列アルゴリズムを紹介します。

この問題の別のバリエーションは、全ペア最短経路 (APSP) 問題であり、これにも並列アプローチがあります:並列全ペア最短経路アルゴリズム。
問題の定義
をノードと辺を持つ有向グラフとする。を区別された頂点(「ソース」と呼ばれる)とし、 を各辺に非負の実数値の重みを割り当てる関数とする。単一ソース最短経路問題の目的は、から到達可能なすべての頂点について、 からへの最小重み経路の重みを計算することである。は で表され、 と略される。経路の重みはその辺の重みの合計である。から に到達できない場合はとする。[1]












順次最短経路アルゴリズムでは、一般的に、すべてのノードに対して暫定距離を維持する反復ラベリング法が適用されます。は常にまたはからへの何らかの経路の重みであり、したがって の上限です。暫定距離は、エッジ緩和を実行することによって改善されます。つまり、エッジに対して アルゴリズムは を設定します。[1]





すべての並列アルゴリズムでは、同時読み取りと同時書き込みを備えたPRAMモデルを想定します。
デルタステップアルゴリズム
デルタ ステッピング アルゴリズムはラベル修正アルゴリズムです。つまり、頂点の暫定距離は、アルゴリズムの最後のステップですべての暫定距離が固定されるまで、エッジ緩和によって複数回修正できます。
アルゴリズムは、それぞれがサイズ の距離範囲を表すバケットの配列に、仮の距離を持つ適格なノードを維持します。各フェーズで、アルゴリズムは最初の空でないバケットのすべてのノードを削除し、最大 の重みのすべての出力エッジを緩和します。より高い重みのエッジは、それぞれの開始ノードが確実に解決された後にのみ緩和されます。[1]パラメータ は正の実数で、「ステップ幅」または「バケット幅」とも呼ばれます。[1]

並列性は、最初の空でないバケットのすべてのノードを同時に削除し、それらの軽いエッジを単一のフェーズで緩和することによって得られます。最終距離値以外の現在のバケットからノードが削除された場合、その後のフェーズで、は最終的に に再挿入され、 の 軽いエッジは再度緩和されます。これまでに から削除されたすべてのノードから発せられる残りの重いエッジは、 finally が空のままである場合に一度だけ緩和されます。その後、アルゴリズムは次の空でないバケットを検索し、上記のように処理を進めます。[1]
![{\displaystyle B[i]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e8236d90000bb57fe514597f6f0bc9c3fd0fe31c)

![{\displaystyle B[i]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e8236d90000bb57fe514597f6f0bc9c3fd0fe31c)

![{\displaystyle B[i]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/e8236d90000bb57fe514597f6f0bc9c3fd0fe31c)
ソースノードの最大最短経路重みは と定義され、略して と表されます。[1]また、経路のサイズは、経路上のエッジの数として定義されます。



軽いエッジと重いエッジを区別します。軽いエッジの重みは最大で で 、重いエッジの重みは より大きいです。


以下は擬似コードでのデルタ ステップ アルゴリズムです。
1 foreach do
2 ; (*距離0のソースノードを挿入*)

3 while do (*A フェーズ: キューに入っているノードの一部が残ります (a)*)
4 (*最小の空でないバケツ (b)*)
5 (*バケットB[i]のノードはまだ削除されていません*)
6 while do (*新しいフェーズ (c)*)
7 (*ライトエッジのリクエストを作成(d)*)
8 (*削除されたノードを記憶する(e)*)
9 (*現在のバケットは空です*)
10 (*緩和を行うと、ノードはB[i] (f)に(再)入る可能性がある*)
11 (*ヘビーエッジのリクエストを作成(g)*)
12 (*リラクゼーションではB[i](h)は補充されません*)
13
14関数 :リクエストのセット
15 戻る
16
17手順
18 foreach do
19
20手順 ( *B の場合は w を挿入または移動する)
21 if then
22 (*もし入っているなら、古いバケットから削除*)
23 (*新しいバケットに挿入*)
24
例
グラフの例
以下は、小さなサンプル グラフのアルゴリズム実行のステップごとの説明です。ソース頂点は頂点 A で、3 に等しくなります。

アルゴリズムの開始時には、ソース頂点 A を除くすべての頂点の暫定距離は無限大です。
バケットには範囲があり、バケットには範囲があり、バケットには範囲があります。
![{\displaystyle B[0]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/bc23ef2c94969ae9044947b4eb530bbd8c05532c)
![{\displaystyle [0,2]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/120ef5837b0c64a40a2333f5aefd3c36fc458e91)
![{\displaystyle B[1]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/641f3ea4bd311b3a9789754832b0208635ae5e1a)
![{\displaystyle [3,5]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7f8aef07cb373c1c6f8d0680c046c12730a9f29d)
![{\displaystyle B[2]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2689f0df743bd51c7be8d1710bc3df6b33b02f08)
![{\displaystyle [6,8]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/7a396b079e8292163145791e6209940678c7d15e)
バケットには頂点 A が含まれます。他のすべてのバケットは空です。
![{\displaystyle B[0]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/bc23ef2c94969ae9044947b4eb530bbd8c05532c)
このアルゴリズムは、A を B、G、E に接続するエッジである、
に入射するすべてのライト エッジを緩和します。![{\displaystyle B[0]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/bc23ef2c94969ae9044947b4eb530bbd8c05532c)
頂点 B、G、E がバケット に挿入されます。はまだ空なので、 A と D を接続する重いエッジも緩和されます。
![{\displaystyle B[1]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/641f3ea4bd311b3a9789754832b0208635ae5e1a)
![{\displaystyle B[0]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/bc23ef2c94969ae9044947b4eb530bbd8c05532c)
これで、 に入射する軽いエッジが緩和されます。頂点 C はバケット に挿入されます。現在は空なので、 E と F を接続する重いエッジを緩和できます。
![{\displaystyle B[1]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/641f3ea4bd311b3a9789754832b0208635ae5e1a)
![{\displaystyle B[2]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2689f0df743bd51c7be8d1710bc3df6b33b02f08)
![{\displaystyle B[1]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/641f3ea4bd311b3a9789754832b0208635ae5e1a)
次のステップでは、バケットが検査されますが、暫定的な距離は変更されません。
![{\displaystyle B[2]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/2689f0df743bd51c7be8d1710bc3df6b33b02f08)
アルゴリズムは終了します。
ランタイム
前述のように、最大最短経路の重みです。

総重量が最大で、エッジの繰り返しがないパスを -パスと呼びます。


何らかの-パスによって接続されたすべてのノードペアの集合をと します。同様に、 を、およびがライトエッジである3つの要素の集合として定義し、 とします。










シーケンシャルデルタステップアルゴリズムは、最大で 回の操作を必要とする。単純な並列化は、時間で実行される。[1]
最大次数とに一様分布するランダムな辺の重みを持つグラフをとすると、アルゴリズムの逐次バージョンでは合計平均ケース時間が必要となり、単純な並列化では平均 かかります。[1]

![{\displaystyle [0,1]}](https://wikimedia.org/api/rest_v1/media/math/render/svg/738f7d23bb2d9642bab520020873cccbef49768d)

グラフ500
Graph 500ベンチマークの3番目の計算カーネルは、単一ソースの最短経路計算を実行します。[2] Graph 500ベンチマークのリファレンス実装では、この計算にデルタステッピングアルゴリズムを使用します。
半径ステップアルゴリズム
半径ステップアルゴリズムでは、グラフが無向であると仮定する必要があります。

アルゴリズムへの入力は、重み付けされた無向グラフ、ソース頂点、および関数 として与えられた各頂点のターゲット半径値です。[3]アルゴリズムは、ソース からの距離が増加する頂点を訪問します。各ステップ で、半径ステップは を中心とする半径を から まで増加させ、すべての頂点を環状 内に配置します。[3]






以下は疑似コードでの半径ステップアルゴリズムです。
入力: グラフ、頂点の半径、ソース ノード。
出力:からのグラフの距離。



1 ,
2 foreach do , ,
3 while do
4
5 repeat
6 foreach st do
7 foreach do
8
9 until noが更新されました




10
11
12戻る
すべての に対して、を S の近傍集合と定義します。標準的な幅優先探索またはダイクストラのアルゴリズムの実行中、フロンティアは訪問したすべての頂点の近傍集合です。[3]
半径ステップ アルゴリズムでは、サブステップの数を制限することを目的として、各ラウンドで新しいラウンド距離が決定されます。アルゴリズムは各頂点の半径を取得し、フロンティア全体で最小値を取得して1 つのステップを選択します(行 4)。






5行目から9行目では、半径が 未満の頂点がすべて確定するまでベルマンフォードサブステップを実行します。その後、 内の頂点が訪問済みセットに追加されます。[3]

例
グラフの例
以下は、小さなグラフの例に対するアルゴリズム実行のステップごとの説明です。ソース頂点は頂点 A であり、各頂点の半径は 1 です。
アルゴリズムの開始時には、ソース頂点 A を除くすべての頂点は、疑似コードで で示される無限の暫定距離を持ちます。

A のすべての隣接ノードはリラックスしており、 です。

変数は4 に等しくなるように選択され、頂点 B、E、G の隣接頂点は緩和されます。
変数は 6 に等しくなるように選択され、値は変更されません。


変数は 9 に等しくなるように選択され、値は変更されません。


アルゴリズムは終了します。
ランタイム
前処理段階の後、半径ステップアルゴリズムは仕事と 深さにおけるSSSP問題を解くことができます。さらに、前処理段階では 仕事と 深さ、または仕事と 深さが必要になります。[3]





参考文献
- ^ abcdefgh Meyer, U.; Sanders, P. (2003-10-01). 「Δ-stepping: 並列化可能な最短経路アルゴリズム」. Journal of Algorithms . 1998 European Symposium on Algorithms. 49 (1): 114–152. doi : 10.1016/S0196-6774(03)00076-2 . ISSN 0196-6774.
- ^ 「Graph 500」。2017年3月9日。
- ^ abcde Blelloch, Guy E.; Gu, Yan; Sun, Yihan; Tangwongsan, Kanat (2016). 「半径ステップを使用した並列最短パス」。第 28 回 ACM アルゴリズムとアーキテクチャの並列性に関するシンポジウムの議事録。ニューヨーク、ニューヨーク、米国: ACM プレス。pp. 443–454。doi : 10.1145 / 2935764.2935765。ISBN 978-1-4503-4210-0。