utsubo’s blog

競技プログラミングとか.

最大フロー問題(循環フロー問題)の双対をとる

はじめに

近似アルゴリズム(V.V.ヴァジラーニ)の12章に最大フロー問題とその双対問題が載っているのだが、どのように変形したらその双対問題の式が得られるのか結構悩んだ。
そこで、未来の自分のために最大フロー問題から双対問題を導出する過程をまとめておく。

最大フロー問題と双対問題

最大フロー問題についてはリンク最大フロー問題 - Wikipediaを参照。

まず、近似アルゴリズム(V.V.ヴァジラーニ)では下記のように定式化されている。
一般的な最大フロー問題に、 tから始点 sへ容量が無限大の仮想的な辺を加え、循環フロー問題として考えている。
そうすることで、 sでもフロー保存則が成り立つ.また、このとき目的関数では、仮想的な辺を流れるフロー f_{ts}を最大にすることになる.

f:id:utsubo_21:20180518230556p:plain:w600

制約式の意味は

  1. 辺を流れるフロー量が容量を超えない。
  2. フロー保存則(頂点に入ってくるフロー量より出ていく量の方が大きい)

これの双対を取ると下式になるとのこと。

f:id:utsubo_21:20180518230853p:plain:w600


実際に主問題を式変形をして、双対問題を得てみる。

双対をとる

まず、双対問題とは主(最大化)問題の上界を求める問題といえる(詳しくは後述)。
主問題の制約式の1つ目の両辺に d_{ij}、2つ目の両辺に p_iを掛ける。

f:id:utsubo_21:20180518231614p:plain:w600

(3a)と(3b)の和は、 d_{ij} p_iの設定によっては、主問題の上界となる。
この上界を d_{ij} p_iを上手く設定して最小化するのが、双対問題である。
(4) = (3a) + (3b)

f:id:utsubo_21:20180520120544p:plain:w600

上式が上界になる条件は「(4)左辺の f_{ij}の係数の和が、主問題の目的関数の f_{ij}の係数より大きい」であり、これが双対問題の制約式となる。

(4)(=(3a)+(3b))の左辺の f_{i,j}の係数について考える。

(3a)で f_{ij}は、 d_{ij}f_{ij}がある。

(3b)では、頂点 iと頂点 jについての不等式で必ず現れる(元はフロー保存則を表す式なので)。
頂点 jには、フロー f_{ij}が流れこむはずなので、 p_j f_{ij}が必ず存在し、
頂点 iには、フロー f_{ij}が出ていくはずなので、 -p_i f_{ij}がある。

よって、双対問題の制約式は、
f:id:utsubo_21:20180518233809p:plain:w300
となる。(主問題の目的関数に f_{ts} + \sum{0 f_{ij}}があると考えれば右辺はわかる。)

目的関数は(4)の右辺を最小化することであり、制約式は(5)なので整理すると、
f:id:utsubo_21:20180518234427p:plain:w600

ここで、目的関数では、 c_{ts} d_{ts}が出てくるが、
 c_{ts}は無限の容量を持つと定義したので、 d_{ts}は0以外の値を取れないことが自明にわかる。
そのため、最初に出てきた双対問題の式とこの式は一致する。

双対問題は主問題の下界(上界)を求める問題

例えば、下記の最大化問題で考える。
f:id:utsubo_21:20180520124631p:plain:w400


この問題の制約式の和を取れば、
f:id:utsubo_21:20180520130419p:plain:w300

上式の左辺は、係数の関係から最大化問題の目的関数より大きい。( x_iは非負なため)
f:id:utsubo_21:20180520130603p:plain:w250

よって、制約式の関係から、解が 20で上から抑えられることがわかった。

もう少し一般化して考え、制約式の両辺にそれぞれ非負な数 y_1,y_2を掛けた和を取る。
f:id:utsubo_21:20180520125315p:plain

 12y_1 + 8y_2が上界になるのは、 x_iの係数の関係により、下式を満たすときである。
f:id:utsubo_21:20180520125606p:plain:w150

この条件を満たした上で y_iを調整することで、 12y_1 + 8y_2を最小化すれば、上界を最適解に近づけることができる。(実際は最適解と一致する)
それが双対問題である。
f:id:utsubo_21:20180520130042p:plain:w300

あとがき

間違っているところ多そうなので突っ込み貰えると嬉しいです。
双対の取り方とその意味がやっとわかりました。
いちいちLaTeXiTで数式の画像を生成して貼って、さらにサイズ調整とか面倒だったので、LaTeXで全部書いてpdfで上げればよかったと思いました。