Processing math: 100%

2017年8月22日火曜日

高速な全点対最短経路アルゴリズム

1. 全点対最短経路問題の計算量の外観


 グラフ G が与えられたときに全点対最短経路(APSP : all pair shortest paths)を求めたいときがあります. そんなときはほとんどの人がワーシャル・フロイド法または各点ダイクストラなどを使うかと思います. しかしこれらのアルゴリズムは頂点数 n に対して最悪 O(n^3) 時間かかってしまうので, n=1000くらいでもちょっと厳しい感じがあります.

 実は辺重み付きグラフのAPSPの計算量には多くの歴史があり、ワーシャルフロイド法以降様々なアルゴリズムが提案されてきました.


APSPのアルゴリズムの歴史

 しかし、任意の \epsilon>0 に対して O(n^{3-\epsilon}) 時間でAPSPを解くアルゴリズムはこれまで知られていません. なので現在ではそのようなアルゴリズムは存在しないのではないかと予想されています. ちなみにSETHの仮定の下で計算量の下界が示されている問題が多くありますが, APSPのこの下界をSETHの仮定の下で示すのは難しいだろう, という根拠が2016年にCarmosino, Gao, Impagliazzoらによって示されました.


2. 重み無しグラフの全点対最短経路


 以上のことから, 辺重み付きグラフのAPSPをO(n^{2.99})で解くのは絶望的であると言えます. では, 辺重み無しグラフのAPSPについてはどうなのでしょうか?以降は「グラフ」は辺重み無しグラフを指すこととします.

 頂点数n, 辺数mのグラフのAPSPは各頂点から幅優先探索を行うことによって O(nm) 時間で解くことができます. したがってグラフが密で, m=\Omega(n^2) であるならば計算時間は O(n^3) だけかかってしまいます. 

 結論から言うと辺重み無しグラフのAPSPはmに依存せず O(n^{\omega}\log n) 時間で解くアルゴリズムが存在します. そのアルゴリズムは[Seidel, 1992]で初めて与えられました. 非常にシンプルなので, 本記事ではこのアルゴリズムについて解説します.


3. Seidel のアルゴリズム



 前提として入力として与えられるグラフGは連結であるとします. したがってその直径は高々nです. 更に, 入力においてGは隣接行列として与えられるとします. そしてアルゴリズムの出力は距離行列Dとします. ただしD_{ij}=ij間の最短経路長と定義します.

 グラフ G に対し, 任意の辺uv,vw \in E(G) に対して 新たな辺uwGに追加して得られるグラフを\tilde{G} と定めます. 気持ちとしては\tilde{G} は「全ての長さ2のパスに対してその端点を結ぶ」ことを出来るだけ行って得られるグラフです.


追加した辺を赤く塗っています. 三角形がめちゃくちゃ増えます.


AGの隣接行列とします. すると\tilde{G}の隣接行列\tilde{A}



になります (i\neq jに対しA^2ij成分はij間の長さ2のパスの本数を表すからです). したがって, A^2O(n^{\omega})時間で計算することで\tilde{A}が計算できるので, \tilde{G}を得ることが出来ます. 

 この\tilde{G}に対して再帰によってAPSPの距離行列\tilde{D}を得ます. \tilde{G}の直径はGの直径の半分くらいになっているので, 再帰を繰り返した結果, 最終的にはGの直径が1(=完全グラフ)となり, この時は(再帰のベーシックケースとして)出力Dは非対角成分が全て1の行列となります. 更に, 再帰の深さは\log nくらいです. というのもGの直径が高々nで, 一回の再帰で直径が半分くらいになるからです.

 さて, 再帰の出力\tilde{D}を使ってGの距離行列Dを得ましょう. 下図のように, \tilde{G}ij間の最短経路を考えます. 明らかに, 元のグラフGにおけるij間の最短経路長d_{ij}が奇数であれば, \tilde{G}におけるij間の最短経路長\tilde{d}_{ij}に対して d_{ij} = 2\tilde{d}_{ij}-1 が成り立ちます (下図(a)参照. \tilde{G}では長さ2のパスを1ホップで通過出来るので, 出来るだけ新しい辺を利用した方が経路長が短くなる). 一方で\tilde{d}_{ij}が偶数であれば, d_{ij}=2\tilde{d}_{ij}が成り立ちます (下図(b)). 以上より, d_{ij}のパリティが分かれば\tilde{d}_{ij}を用いてd_{ij}を復元できます.



元の最短経路長のパリティが分かれば復元できる.

 ここで, \tilde{G}上で ① ij間に(a)の図のような最短経路が存在する場合, d_{ij}=2\tilde{d}_{ij}-1となります. 一方で ② そのような最短経路が存在しない場合(つまり任意のij間の最短経路が(b)のように赤い辺のみで構成されている場合), d_{ij}=2\tilde{d}_{ij}となることに注意します. つまりd_{ij}を復元するためには①と②の場合を判別する必要があります.

 そのために行列X:=\tilde{D}Aを考えます. これは行列積なのでO(n^{\omega})時間で計算できます. 行列積の定義よりX_{ij}

X_{ij}=\sum_{k=1}^n \tilde{d}_{ik}\cdot A_{kj} = \sum_{k \in N(j)} \tilde{d}_{ik}

となります. ここでN(k)Gにおけるkの隣接点の集合, \tilde{d}_{ik}\tilde{G}におけるik間の最短経路長です. 

 ②を仮定します. すると任意のk\in N(j)に対し, \tilde{d}_{ik} \geq \tilde{d}_{ij} が成り立ちます (そうでないとすると, \tilde{G}上のik間の最短経路に辺kjを足したものがij間の最短経路になりますが, それは②に反するからです. 下図参照).

②で考えるケース. どのk\in N(j)\tilde{G}上のij間の最短経路上に含まれていない.


したがって

\sum_{k \in N(j)} \tilde{d}_{ik} \geq \tilde{d}_{ij}\cdot \mathrm{deg}(j).

となります. ここで\mathrm{deg}(j)=|N(j)|は頂点jGにおける次数です.

 次に①について考えます. この時はあるk\in N(j)に対してkを含むような\tilde{G}上のij間最短経路が存在します (下図).



 このkに対して \tilde{d}_{ik} = \tilde{d}_{ij}-1 が成り立ちます. 更に他のk'\in N(j) に対しても \tilde{d}_{ik'} \leq \tilde{d}_{ik}+1 = \tilde{d}_{ij}が成り立ちます (kk'間は\tilde{G}の辺で繋がっています. 下図参照).

したがって

\sum_{k \in N(j)} \tilde{d}_{ik} < \tilde{d}_{ij}\cdot \mathrm{deg}(j).

が成り立ちます.


以上より, 
\iff X_{ij}=\sum_{k \in N(j)} \tilde{d}_{ik} < \tilde{d}_{ij}\cdot \mathrm{deg}(j).
\iff X_{ij}=\sum_{k \in N(j)} \tilde{d}_{ik} \geq \tilde{d}_{ij}\cdot \mathrm{deg}(j).
が成り立つので, 



としてd_{ij}を求めることが出来ます. これでめでたく出力すべきD=(d_{ij})を構成することが出来ました.

 アルゴリズム全体の流れとしては
  1. Gの直径が1ならば自明な解を出力.
  2. そうでないときは, A^2を計算することで\tilde{A}を計算し, 再帰に投げることで\tilde{D}を得る.
  3. X=\tilde{D}Aを計算し, X\tilde{D}を用いて各ijに対してd_{ij}を計算する.
  4. D=(d_{ij})を出力.
という感じになります. まず再帰の深さはO(\log n)で, ステップ2, 3においては行列積を計算しているので計算時間はO(n^{\omega})となり, ステップ4ではO(n^2)かかるので, 全体の計算時間はO(n^{\omega}\log n)となります.


4. まとめ


 辺に重みがある場合と無い場合でAPSPの計算量には大きなギャップがあります. 辺重み付きグラフではO(n^{2.99})では解けなさそうである一方, そうでないグラフに対してはO(n^{\omega}\log n)=O(n^{2.38})時間で解くアルゴリズムが知られています. もちろん辺重みが無いスパースなグラフに対しては依然として幅優先探索を用いたO(nm)の方が高速ですが, 密な場合はSeidel のアルゴリズムの方が高速であると言えます.
 では, 重み付きグラフに対してO(n^{2.99})時間でAPSPを計算するアルゴリズムは存在するのでしょうか?これはP\neq NPほどではないですが, 計算量理論においてかなりホットな話題なので, みなさんもぜひ挑戦してみてください.

0 件のコメント:

コメントを投稿

講義資料をNotionで書いてみた

 プログラミング応用という名前の講義を受け持っており, そこで組合せ最適化のベーシックな話題とそのPythonでの実装を教えているのですが, 資料をNotionで書いてみました. 講義資料をNotionで公開しているのでアルゴリズムの基礎とかNP困難性とかを勉強したい人はどう...