Ford-Fulkerson法(最大流量増加法)によるアルゴリズムの時間計算量と解の収束性についての図説
#CTODO あとで図を追加する。 したappbird.icon 目的
主に整数容量のときの時間計算量の証明の部分の行間を対象とする。
https://gyazo.com/a7301a0e9e737ad2b8d0c815ecabf364
将来の自分や他の人がこの行間に詰まった際の手助けとなるよう、できる限り図説する。 制約
ただし、その書籍独自の言葉であるように見えた場合は別途定義を付記している。
事前定義
$ f: E \to \R^+: $ Gにおけるフロー(変数) 図中の$ \Rightarrowは概念の依存を表す。 $ A \Leftarrow Bは「$ Aがあってはじめて$ Bを考えられる」という意味
要するに、$ G_fはどの方向に後どれだけ流せるかということを示している。
逆辺は一部の流量を減らす方向に調節
https://gyazo.com/108c028f0b88f704fb3d9e5638d08dd5
注 辺$ eの残余容量とは、$ c(e) - f(e)のことである。 (2)
もし$ pが存在すれば
その$ pに沿って$ fのフローを増加させ、$ fを更新する 存在しなければ
$ f_i: $ \mathcal{A}の$ i回目の反復終了時における変数$ fの値 $ 0回目は$ \mathcal{A}が一度も実行されていない状態を指す。
Fig.2 アルゴリズム$ \mathcal{A}の動作
https://gyazo.com/63043e9dc8685740527d02e8c635993b
主張
$ \lim_{n \to \infin} |f_n| = |f^*|
異なった値に収束する恐れがある。
$ \mathcal{A}の反復回数は$ \mathrm{O}(m\log(Um))となる。 https://gyazo.com/268998baa97fd93cf7bc24189d7e8ee9
証明
/icons/pass.icon補題1. 最大流量$ f^*が既知のとき、高々$ |E|回の反復によって、$ fの値を$ f^*にできる。 Fig.4 $ f^*が既知の時のフロー増加について 訂正: 図中の$ \mathcal{A}を$ \mathcal{A'}に読み替える。
ここで扱うアルゴリズムでは$ \mathcal{A}のように最大流量増加法をとっていない。 また、「$ fに最も近い辺」の$ fを$ f^*に修正
https://gyazo.com/b69eb533aa238998e2e76b486360a5e1
各反復で
$ f^*と比べて埋まりきっていないが、$ f^*に最も近い流量を持つ辺を含むパスを選んでいく すると、各反復で必ずいずれかの辺が最大の流量を取り始める。 /icons/notepad.icon付記
最大流量$ f^*が既知であるという前提に立っていることに注意
/icons/pass.icon補題2. 最大流量増加法によってパスを選ぶと、必ず$ i回目の$ \mathcal{A}の反復においてフロー$ fが$ \frac{|f^*| - |f_i|}{|E|}以上増加する。 $ f^*が未知であることに留意する。
https://gyazo.com/cafbf1d3ed3d852bdccc656a8cbfcab1
(行間)
$ Pの要素は、補題1より高々$ |E|個である。 $ Pのパスによって増加するフローの合計値は$ |f^*| - |f_i|である。 (1) よって、フロー増加量の平均$ \overline{p_\Delta}は、$ \frac{|f^*| - |f_i|}{|E|}以上である。 $ \frac{|f^*| - |f_i|}{|E|} \leq \overline{p_\Delta}
すると$ pは、$ \overline{p_\Delta} \leq p_\Deltaなるフロー増加量$ p_\Deltaを実現する よって、$ \frac{|f^*| - |f_i|}{|E|} \leq p_\Delta
/icons/pass.icon補題3. 最大流量増加法に従ってパスを取ると、$ n回目の$ \mathcal{A}の反復に際して以下が満たされる。 (行間)
$ |f^*| - |f_n| \leq (1 - \frac{1}{m})^{n}(|f^*| - |f_0|)
Fig.6 $ \mathcal{A}の反復によって縮まる誤差 https://gyazo.com/ed9a41cd728efd5e812500d4dc0bde8d
ただし、$ m := |E|
$ i回目の$ \mathcal{A}の反復に関して、補題2より以下が満たされる。($ iは非負整数) $ \frac{|f^*| - |f_{i}|}{m} \leq |f_{i+1}| - |f_{i}|
これを変形すると、以下の不等式を得る。これは$ \mathcal{A}一回あたりの誤差減少量の上界を示す。
$ |f^*| + \frac{(|f^*| - |f_{i}|)}{m} \leq |f^*| + |f_{i+1}| - |f_{i-1}|
$ |f^*| - |f_{i+1}| \leq |f^*| - \frac{|f^*|}m + \frac{|f_{i}|}m - |f_{i}|
$ |f^*| - |f_{i+1}| \leq (1 - \frac1m)(|f^*| - |f_{i}|)
以下の不等式の両辺はいずれも正であるから、これらを掛け合わせると題意の不等式を得る。
$ |f^*| - |f_{1}| \leq (1 - \frac1m)(|f^*| - |f_{0}|)
$ |f^*| - |f_{2}| \leq (1 - \frac1m)(|f^*| - |f_{1}|)
$ \vdots
$ |f^*| - |f_{n}| \leq (1 - \frac1m)(|f^*| - |f_{n-1}|)
よって、
$ |f^*| - |f_n| \leq (1-\frac1m)^n(|f^*| - |f_0|)
/icons/notepad.icon付記
/icons/pass.icon系4. $ 0 \leq |f^*| - |f_n| \leq \frac{1}{2^{n/m}}(|f^*| - |f_0|)
https://gyazo.com/6e997691997d5cb69764fcd407ed4312
ここで次の関係に注意する。
$ (1 - \frac{1}{m})^{m} \leq \frac1e \leq \frac12
すなわち$ (1 - \frac{1}{m})^{n} \leq \frac{1}{2^{n/m}}
このことから、以下を得る。
$ |f^*| - |f_n| \leq (1 - \frac{1}{m})^{n}(|f^*| - |f_0|) \leq \frac{1}{2^{n/m}}(|f^*| - |f_0|)
また、$ f^*の最大性により、任意のフロー$ fに対して$ |f| \leq |f^*|が成立するため、
$ 0 \leq |f^*| - |f_n|
/icons/pass.icon定理5. 解の収束性 右辺$ \lim_{n \to \infin} \frac{1}{2^{n/m}}(|f^*| - |f_0|) = +0に基づいて $ \lim_{n \to \infin} ( |f^*| - |f_n| ) = +0
i.e. $ \lim_{n \to \infin} |f_n| = |f^*|
/icons/notepad.icon付記
実際の収束速度はどうやって調べると良いのだろう...? https://gyazo.com/a7301a0e9e737ad2b8d0c815ecabf364
(2) (定理5.に関連して、)アルゴリズムの誤差上界は$ \mathcal{A}を繰り返すうちに$ 1に到達する。 (行間)
数列$ a_n := \frac{1}{2^{n/m}}(|f^*| - |f_0|) > 0はステップ数$ nに対して狭義単調減少数列である。 よって、必ず$ a_Nが$ 1を下回るステップ数($ N)が存在する。
/icons/notepad.icon付記
$ \exist N\in\N; \forall n\in\N; N \leq n \Rightarrow |a_n - 0| = a_n < 1
$ |f^*| - |f_N| \leq a_N < 1になるとき、(1)より$ |f^*| - |f_N| = 0である。
これは、真値がもとまりアルゴリズムの目的が達成されたことを意味する。 /icons/notepad.icon付記
(ただし、この許容誤差がアンダーフロー(__DBL_EPSILON__)しないように気を付ける必要はある。念の為。) /icons/pass.icon定理7. 整数容量の時の$ \mathcal{A}の反復回数は$ \mathrm{O}(|E|\log(U|E|))に従う。 https://gyazo.com/ae05ba455d9043ceb03a3c552b6cb43d
(1) 任意のフロー$ fに対し、$ |f^*| - |f| \leq |f^*| \leq Umである。
(行間; 簡単である)
任意のフローに対して、$ |f| \leq \sum_{e\in E}f(e) \leq \sum_{e\in E} c(e) ましてや、最大流量$ Uに関してその最大性により$ c(e) \leq Uなのだから、以下を得る。 $ |f| \leq \sum_{e\in E} c(e) \leq \sum_{e\in E} U = U|E| = Um
よって、$ |f^*| \leq Um
$ |f|が非負整数より$ |f^*| - |f|\leq Umも得る。 (2) 誤差の上界$ a_nが$ a_n < 1となる$ nがどこに存在するかを知る。 $ nに対する停止十分条件: $ \frac{1}{2^{n/m}}(|f^*| - |f_0|) < 1
実際のアルゴリズムはこの条件を満たす$ nよりももっと早く停止している場合がある。
この条件を変形していく
$ \frac{1}{2^{n/m}}(|f^*| - |f_0|) < 1
$ m\log(|f^*| - |f_0|) < n.... (2-1)
よって、$ a_n < 1を満たす$ nは$ m\log(|f^*| - |f_0|)以上の自然数全てである。 ただし、今回求める$ |f^*| - |f_0|のうち、$ |f^*|は一般に不明である。
ここで、(1)より以下のようになる。
$ m\log(|f^*| - |f_0|) \leq m\log(Um)
このことから、以下を満たすような$ n'もまた$ a_n < 1を満たすことがわかる。
$ m\log(Um) < n'.... (2-2)
(2-1)から(2-2)の変形は同値変形ではなく、あくまで十分条件になっている。 (2-2)ならば(2-1); 必要性を失って変形している。 (2-1)に比べて(2-2)の方が、$ nの範囲が$ +\infin方向へ狭まっていることに留意する(Fig.9を参照) 以上より、$ m\log Um < nを満たす$ n全ては、$ a_n < 1を満たす。
よって、$ a_n < 1となるような$ n としては、少なくとも $ n = \mathrm{ceil}(m\log Um)以上にある。
よって、$ n = \mathrm{O}(m\log Um)
これが$ \mathcal{A}の高々必要な反復回数である。... (2) /icons/notepad.icon付記
そのため、ここで求まった$ nはあくまで上限の値という意味しか持たない。 $ \mathcal{A}は、$ n = O(m\log{Um})に従う反復回数を要する。 /icons/notepad.icon付記
なので正確には$ O(|E|^2\log|V|\log(U|E|))
$ |E|は$ O(|V|^2)なので、確かに$ O(|V|^2\log|V|)が$ O(|V|^2)に減るのはお得
□
参考文献
/icons/notepad.icon余談
ただし実用上あまり早くはないらしい...?
(授業で聞いただけなので詳細は不明)
定理7(2)が教科書だと1行で済まされているのでビックリした。
必要性と十分性を正しく理解していないと理解できないのでは...? 何か遠回りしてしまっているのだろうか?
人生で初めてアルゴリズムを文字で置いた。使うかな〜と思っていたけど意外と結構使った。
アルゴリズムの証明にまた一つ強くなった気はする
絶対これテストに出ないやつなのにやりこんでしまった...appbird.icon
図を用意するのにかかったのはおおよそ1時間15分。テストが終わった後に図を書いた。