最大フロー問題(循環フロー問題)の双対をとる
はじめに
近似アルゴリズム(V.V.ヴァジラーニ)の12章に最大フロー問題とその双対問題が載っているのだが、どのように変形したらその双対問題の式が得られるのか結構悩んだ。
そこで、未来の自分のために最大フロー問題から双対問題を導出する過程をまとめておく。
最大フロー問題と双対問題
最大フロー問題についてはリンク最大フロー問題 - Wikipediaを参照。
まず、近似アルゴリズム(V.V.ヴァジラーニ)では下記のように定式化されている。
一般的な最大フロー問題に、から始点へ容量が無限大の仮想的な辺を加え、循環フロー問題として考えている。
そうすることで、でもフロー保存則が成り立つ.また、このとき目的関数では、仮想的な辺を流れるフローを最大にすることになる.
制約式の意味は
- 辺を流れるフロー量が容量を超えない。
- フロー保存則(頂点に入ってくるフロー量より出ていく量の方が大きい)
これの双対を取ると下式になるとのこと。
実際に主問題を式変形をして、双対問題を得てみる。
双対をとる
まず、双対問題とは主(最大化)問題の上界を求める問題といえる(詳しくは後述)。
主問題の制約式の1つ目の両辺に、2つ目の両辺にを掛ける。
(3a)と(3b)の和は、、の設定によっては、主問題の上界となる。
この上界を、を上手く設定して最小化するのが、双対問題である。
(4) = (3a) + (3b)
上式が上界になる条件は「(4)左辺のの係数の和が、主問題の目的関数のの係数より大きい」であり、これが双対問題の制約式となる。
(4)(=(3a)+(3b))の左辺のの係数について考える。
(3a)では、がある。
(3b)では、頂点と頂点についての不等式で必ず現れる(元はフロー保存則を表す式なので)。
頂点には、フローが流れこむはずなので、が必ず存在し、
頂点には、フローが出ていくはずなので、がある。
よって、双対問題の制約式は、
となる。(主問題の目的関数にがあると考えれば右辺はわかる。)
目的関数は(4)の右辺を最小化することであり、制約式は(5)なので整理すると、
ここで、目的関数では、が出てくるが、
は無限の容量を持つと定義したので、は0以外の値を取れないことが自明にわかる。
そのため、最初に出てきた双対問題の式とこの式は一致する。
双対問題は主問題の下界(上界)を求める問題
例えば、下記の最大化問題で考える。
この問題の制約式の和を取れば、
上式の左辺は、係数の関係から最大化問題の目的関数より大きい。(は非負なため)
よって、制約式の関係から、解がで上から抑えられることがわかった。
もう少し一般化して考え、制約式の両辺にそれぞれ非負な数を掛けた和を取る。
が上界になるのは、の係数の関係により、下式を満たすときである。
この条件を満たした上でを調整することで、を最小化すれば、上界を最適解に近づけることができる。(実際は最適解と一致する)
それが双対問題である。
あとがき
間違っているところ多そうなので突っ込み貰えると嬉しいです。
双対の取り方とその意味がやっとわかりました。
いちいちLaTeXiTで数式の画像を生成して貼って、さらにサイズ調整とか面倒だったので、LaTeXで全部書いてpdfで上げればよかったと思いました。