「《ネットワーク・フロー問題》」の版間の差分

提供: ORWiki
ナビゲーションに移動 検索に移動
1行目: 1行目:
【ねっとわーくふろーもんだい (network flow problem) 】
+
'''【ねっとわーくふろーもんだい (network flow problem) 】'''
  
 ネットワーク上のモノの流れを扱う.モノは与えられた有向グラフ$<math>G=(V, A)</math>$の各枝に沿って流れ,点で分岐や合流をする.ただし,各枝$<math>a</math>$の容量$<math>c(a)</math>$を超えず,各点$<math>v</math>$から出る正味の流量が,与えられた供給量$<math>d(v)</math>$と等しくなるようにする.枝$a$を流れる量を$<math>\varphi(a)$</math>としたとき,
+
 ネットワーク上のモノの流れを扱う.モノは与えられた有向グラフ<math>G=(V, A)\, </math>の各枝に沿って流れ,点で分岐や合流をする.ただし,各枝<math>a\, </math>の容量<math>c(a)\, </math>を超えず,各点<math>v\, </math>から出る正味の流量が,与えられた供給量<math>d(v)\, </math>と等しくなるようにする.枝aを流れる量を<math>\varphi(a)\, </math>としたとき,
  
  
容量制約 <math>0 \leq \varphi(a) \leq c(a) \; \;  (a \in A)</math>$
+
'''容量制約''' <math>0 \leq \varphi(a) \leq c(a) \; \;  (a \in A)\, </math>
  
流量保存則 <math>\sum_{a \in \delta^+v} \varphi(a)-\sum_{a \in \delta^-v}
+
'''流量保存則''' <math>{\sum}_{a \in \delta^+v} \varphi(a)-{\sum}_{a \in \delta^-v}
 
\varphi(a)=d(v)
 
\varphi(a)=d(v)
\; \;  (v \in V)</math>$
+
\; \;  (v \in V)\, </math>
  
  
  
を満たす$<math>\varphi</math>$をフローといい,フローを扱った最適化問題を[[ネットワークフロー問題]]という [1] .ただし,$<math>\delta^+v$ $(\delta^-v)</math>$は点$<math>v$</math>から出る (へ入る) 枝の全体を表す.
+
を満たす<math>\varphi\, </math>をフローといい,フローを扱った最適化問題を[[ネットワークフロー問題]]という [1] .ただし,<math>\delta^+v (\delta^-v)\, </math>は点<math>v\, </math>から出る (へ入る) 枝の全体を表す.
 代表的なネットワーク・フロー問題に最大フロー問題がある.最大フロー問題とは,特別な点として入口$<math>s</math>$と出口<math>$t</math>$があり,$<math>s, t$</math>以外での供給量$<math>d(v)</math>$が0であるとき,$<math>s</math>$から入る量 (フロー値) を最大にするようなフロー (最大フロー) を求める問題であり,以下のように定式化できる.
+
 代表的なネットワーク・フロー問題に最大フロー問題がある.最大フロー問題とは,特別な点として入口<math>s\, </math>と出口<math>t\, </math>があり,<math>s, t\, </math>以外での供給量<math>d(v)\, </math>が0であるとき,<math>s\, </math>から入る量 (フロー値) を最大にするようなフロー (最大フロー) を求める問題であり,以下のように定式化できる.
  
  
<math>\begin{array}{lll}
+
:<math>\begin{array}{lll}
\mbox{maximize}  & \sum_{a \in \delta^+ s} \varphi(a)-\sum_{a \in \delta^-
+
\mbox{maximize}  & {\sum}_{a \in \delta^+ s} \varphi(a)-{\sum}_{a \in \delta^-
 
s}\varphi(a) \\
 
s}\varphi(a) \\
 
\mbox{subject to}& 0 \leq \varphi(a) \leq c(a) &  (a \in A), \\
 
\mbox{subject to}& 0 \leq \varphi(a) \leq c(a) &  (a \in A), \\
                 &  \sum_{e \in \delta^+v} \varphi(a)-\sum_{e \in \delta^-v}
+
                 &  {\sum}_{e \in \delta^+v} \varphi(a)-{\sum}_{e \in \delta^-v}
 
\varphi(a)=0 &
 
\varphi(a)=0 &
 
                 (v \in V \setminus\{s, t \}).
 
                 (v \in V \setminus\{s, t \}).
\end{array}</math>
+
\end{array}\, </math>
  
  
 点の部分集合$<math>X</math>$$<math>s</math>$を含み,$<math>t</math>$を含まないとき,$<math>X</math>$$<math>s$-$t</math>$カットという.始点が$<math>X</math>$にあり終点が$<math>X</math>$にない枝の容量の和を$<math>X</math>$の容量といい,容量最小の$<math>s$-$t</math>$カットを最小カットという.任意のフローのフロー値は任意の$<math>s$-$t</math>$カットの容量よりも大きくなり得ない.この値が一致するようなフローと$<math>s$-$t</math>$カットが存在することを示したのが,[[最大フロー最小カット定理]]  [2] である.実際,ある$<math>s$-$t</math>$カットの容量に一致するフロー値をもつフローが以下の操作で得られる.
+
 点の部分集合<math>X\, </math>が<math>s\, </math>を含み,<math>t\, </math>を含まないとき,<math>X\, </math>を<math>s-t\, </math>カットという.始点が<math>X\, </math>にあり終点が<math>X\, </math>にない枝の容量の和を<math>X\, </math>の容量といい,容量最小の<math>s-t\, </math>カットを最小カットという.任意のフローのフロー値は任意の<math>s-t\, </math>カットの容量よりも大きくなり得ない.この値が一致するようなフローと<math>s-t\, </math>カットが存在することを示したのが,[[最大フロー最小カット定理]]  [2] である.実際,ある<math>s-t\, </math>カットの容量に一致するフロー値をもつフローが以下の操作で得られる.
  
 まず,任意のフロー$<math>\varphi</math>$に対し,補助ネットワーク$<math>{\mathcal N}_\varphi=(G_\varphi=(V, A_\varphi), c_\varphi)</math>$を定義する.$<math>G_\varphi</math>$は,与えられたグラフと同じ点集合$<math>V</math>$をもち,枝集合が$<math>A_\varphi=\{a \mid a \in A, \varphi(a) < c(a) \}\cup \{\bar{a} \mid a \in A, \varphi(a)>0 \}</math>$のグラフとする.ただし,$<math>\bar{a}</math>$は,枝$<math>a</math>$の向きを逆にした枝である.$<math>c_\varphi</math>$は,$<math>A_\varphi</math>$の枝に定義される残余容量であり,
+
 まず,任意のフロー<math>\varphi\, </math>に対し,補助ネットワーク<math>{\mathcal N}_\varphi=(G_\varphi=(V, A_\varphi), c_\varphi)\, </math>を定義する.<math>G_\varphi\, </math>は,与えられたグラフと同じ点集合<math>V\, </math>をもち,枝集合が<math>A_\varphi=\{a \mid a \in A, \varphi(a) < c(a) \}\cup \{\bar{a} \mid a \in A, \varphi(a)>0 \}\, </math>のグラフとする.ただし,<math>\bar{a}\, </math>は,枝<math>a\, </math>の向きを逆にした枝である.<math>c_\varphi\, </math>は,<math>A_\varphi\, </math>の枝に定義される残余容量であり,
  
  
<math>c_\varphi(a)=\left\{ \begin{array}{ll}
+
:<math>c_\varphi(a)=\left\{ \begin{array}{ll}
 
c(a)-\varphi(a) & (a \in A) \\ \varphi(\bar{a}) & (\bar{a} \in A)
 
c(a)-\varphi(a) & (a \in A) \\ \varphi(\bar{a}) & (\bar{a} \in A)
\end{array} \right.</math>  
+
\end{array} \right.\, </math>  
  
  
で与えられる.補助ネットワーク上の$<math>s</math>$から$<math>t</math>$への有向道を増加道という.増加道に沿ってフローの更新を繰り返し,フロー値を増加させる方法を増加道法という.任意のフローから始め,以下の手順を繰り返す.
+
で与えられる.補助ネットワーク上の<math>s\, </math>から<math>t\, </math>への有向道を増加道という.増加道に沿ってフローの更新を繰り返し,フロー値を増加させる方法を増加道法という.任意のフローから始め,以下の手順を繰り返す.
  
  
'''手順1:''' $<math>{\mathcal N}_\varphi</math>$を作成し,増加道$<math>P</math>$をみつける.増加道がなければ終了.
+
'''手順1:''' <math>{\mathcal N}_\varphi\, </math>を作成し,増加道<math>P\, </math>をみつける.増加道がなければ終了.
  
'''手順2''': $<math>\varepsilon=\min\{c_\varphi(a) \mid a</math>は<math>P</math>上の枝<math>\}</math>$を求め,$<math>P</math>$上のすべての枝$<math>a</math>$に関して,$<math>a \in A</math>$ならば,$<math>\varphi(a)</math>$$<math>\varepsilon</math>$増加し,$<math>\bar{a} \in A</math>$ならば,$<math>\varphi(a)</math>$$<math>\varepsilon</math>$減少させる.
+
'''手順2:''' <math>\varepsilon=\min\{c_\varphi(a) \mid a\, </math>は<math>P\, </math>上の枝<math>\}\, </math>を求め,<math>P\, </math>上のすべての枝<math>a\, </math>に関して,<math>a \in A\, </math>ならば,<math>\varphi(a)\, </math>を<math>\varepsilon\, </math>増加し,<math>\bar{a} \in A\, </math>ならば,<math>\varphi(a)\, </math>を<math>\varepsilon\, </math>減少させる.
  
 増加道が存在しなくなったとき,$<math>{\mathcal N}_\varphi</math>$上で$<math>s</math>$から到達可能な点集合を$<math>X</math>$とすると,$<math>X</math>$は$<math>s$-$t</math>$カットであり,その容量はフロー値と一致する.よって,増加道法が終了したときのフローが最大フローであり,$<math>X</math>$が最小カットである.
 
  
 増加道の選択を,枝数最小や,$<math>\varepsilon$</math>最小の基準で行うと,多項式時間の[[最大フローアルゴリズム]]となる.一方,流量保存則を緩和したプリフローを用い,増加道が存在しないようなプリフローを維持しながら,最大フローを求めるプッシュ・再ラベル法も効率よい最大フロー・アルゴリズムである.
+
 増加道が存在しなくなったとき,<math>{\mathcal N}_\varphi\, </math>上で<math>s\, </math>から到達可能な点集合を<math>X\, </math>とすると,<math>X\, </math>は<math>s-t\, </math>カットであり,その容量はフロー値と一致する.よって,増加道法が終了したときのフローが最大フローであり,<math>X\, </math>が最小カットである.
  
 [[最小費用フロー問題]]もネットワーク・フロー問題の一つである.各枝$<math>a</math>$のフロー1単位あたりの費用$<math>\gamma(a)</math>$が与えられているとき,総費用$<math>\sum_{a \in A}\gamma(a)\varphi(a)</math>$を最小にするフローを求める問題である.特に,すべての点で供給量$<math>d(v)=0</math>$のとき,[[循環フロー]]という.また,[[輸送問題]]も最小費用フロー問題の特殊ケースである.複数の供給地と需要地があり,各々の供給/需要量と,各供給地と需要地間の輸送費用がわかっているとき,供給/需要を満たし,輸送にかかる総費用を最小とする輸送方法とその輸送量を決定する輸送問題は,容量制約のない2部グラフ上の最小費用フロー問題である.
+
 増加道の選択を,枝数最小や,<math>\varepsilon\, </math>最小の基準で行うと,多項式時間の[[最大フローアルゴリズム]]となる.一方,流量保存則を緩和したプリフローを用い,増加道が存在しないようなプリフローを維持しながら,最大フローを求めるプッシュ・再ラベル法も効率よい最大フロー・アルゴリズムである.
 最小費用フロー・アルゴリズムも多数ある.補助ネットワーク$<math>{\mathcal N}_\varphi</math>$上の費用を
 
  
 +
 [[最小費用フロー問題]]もネットワーク・フロー問題の一つである.各枝<math>a\, </math>のフロー1単位あたりの費用<math>\gamma(a)\, </math>が与えられているとき,総費用<math>{\sum}_{a \in A}\gamma(a)\varphi(a)\, </math>を最小にするフローを求める問題である.特に,すべての点で供給量<math>d(v)=0\, </math>のとき,[[循環フロー]]という.また,[[輸送問題]]も最小費用フロー問題の特殊ケースである.複数の供給地と需要地があり,各々の供給/需要量と,各供給地と需要地間の輸送費用がわかっているとき,供給/需要を満たし,輸送にかかる総費用を最小とする輸送方法とその輸送量を決定する輸送問題は,容量制約のない2部グラフ上の最小費用フロー問題である.
 +
 最小費用フロー・アルゴリズムも多数ある.補助ネットワーク<math>{\mathcal N}_\varphi\, </math>上の費用を
  
<math>\gamma_\varphi(a)=\left\{ \begin{array}{ll}
+
 
 +
:<math>\gamma_\varphi(a)=\left\{ \begin{array}{ll}
 
\gamma(a) & (a \in A) \\ -\gamma(\bar{a}) & (\bar{a} \in A)
 
\gamma(a) & (a \in A) \\ -\gamma(\bar{a}) & (\bar{a} \in A)
 
\end{array} \right.  
 
\end{array} \right.  
</math>
+
\, </math>
  
  

2007年7月6日 (金) 16:43時点における版

【ねっとわーくふろーもんだい (network flow problem) 】

 ネットワーク上のモノの流れを扱う.モノは与えられた有向グラフの各枝に沿って流れ,点で分岐や合流をする.ただし,各枝の容量を超えず,各点から出る正味の流量が,与えられた供給量と等しくなるようにする.枝aを流れる量をとしたとき,


容量制約 

流量保存則 


を満たすをフローといい,フローを扱った最適化問題をネットワークフロー問題という [1] .ただし,は点から出る (へ入る) 枝の全体を表す.  代表的なネットワーク・フロー問題に最大フロー問題がある.最大フロー問題とは,特別な点として入口と出口があり,以外での供給量が0であるとき,から入る量 (フロー値) を最大にするようなフロー (最大フロー) を求める問題であり,以下のように定式化できる.



 点の部分集合を含み,を含まないとき,カットという.始点がにあり終点がにない枝の容量の和をの容量といい,容量最小のカットを最小カットという.任意のフローのフロー値は任意のカットの容量よりも大きくなり得ない.この値が一致するようなフローとカットが存在することを示したのが,最大フロー最小カット定理 [2] である.実際,あるカットの容量に一致するフロー値をもつフローが以下の操作で得られる.

 まず,任意のフローに対し,補助ネットワークを定義する.は,与えられたグラフと同じ点集合をもち,枝集合がのグラフとする.ただし,は,枝の向きを逆にした枝である.は,の枝に定義される残余容量であり,



で与えられる.補助ネットワーク上のからへの有向道を増加道という.増加道に沿ってフローの更新を繰り返し,フロー値を増加させる方法を増加道法という.任意のフローから始め,以下の手順を繰り返す.


手順1: を作成し,増加道をみつける.増加道がなければ終了.

手順2: 上の枝を求め,上のすべての枝に関して,ならば,増加し,ならば,減少させる.


 増加道が存在しなくなったとき,上でから到達可能な点集合をとすると,カットであり,その容量はフロー値と一致する.よって,増加道法が終了したときのフローが最大フローであり,が最小カットである.

 増加道の選択を,枝数最小や,最小の基準で行うと,多項式時間の最大フローアルゴリズムとなる.一方,流量保存則を緩和したプリフローを用い,増加道が存在しないようなプリフローを維持しながら,最大フローを求めるプッシュ・再ラベル法も効率よい最大フロー・アルゴリズムである.

 最小費用フロー問題もネットワーク・フロー問題の一つである.各枝のフロー1単位あたりの費用が与えられているとき,総費用を最小にするフローを求める問題である.特に,すべての点で供給量のとき,循環フローという.また,輸送問題も最小費用フロー問題の特殊ケースである.複数の供給地と需要地があり,各々の供給/需要量と,各供給地と需要地間の輸送費用がわかっているとき,供給/需要を満たし,輸送にかかる総費用を最小とする輸送方法とその輸送量を決定する輸送問題は,容量制約のない2部グラフ上の最小費用フロー問題である.  最小費用フロー・アルゴリズムも多数ある.補助ネットワーク上の費用を



で定義すると,フローが最小費用である必要十分条件は,その補助ネットワーク上に負の費用の閉路が存在しないことである.補助ネットワーク上の負の費用の閉路を繰り返し除去することによって最適フローを求めるのが負閉路消去法である.この他にも,点に対応する双対変数を与え,相補スラック条件を満たす枝からなるネットワーク上で最大フロー問題を繰り返し解く方法,最短路問題を繰り返し解く方法,単体法を用いたネットワーク単体法などがある.いずれの方法も強多項式時間アルゴリズムが存在する.

 最大フロー問題,最小費用フロー問題ともに,容量,供給量が整数で与えられているときには,整数値の最適フローが存在することが知られている.また,ネットワークの構造を用いた効率よいアルゴリズムがいくつか存在する.一方,1つのネットワーク上に複数品種を流す多品種フロー問題は,品種ごとに流量保存則が満たされており,かつすべての品種をあわせて容量制約が満たされている多品種フローを扱う.多くのアルゴリズムは線形計画法の手法に基づいている.整数値の多品種フローを求める問題はNP完全である.



参考文献

[1] R. K. Ahuja, T. L. Magnanti and J. B. Orlin, Network Flows: Theory, Algorithms, and Applications, Prentice Hall, 1993.

[2] L. R. Ford, Jr. and D. R. Fulkerson, Flows in Networks, Princeton University Press, 1962.