포드-펄커슨 알고리즘
Ford–Fulkerson algorithmFord-Fulkerson 방식 또는 Ford-Fulkerson 알고리즘(FFA)은 플로우네트워크의 최대 플로우를 계산하는 그리디 알고리즘입니다.잔차 그래프에서 증강 경로를 찾는 방법이 완전히 지정되지[1] 않았거나 실행 [2]시간이 다른 여러 구현에서 지정되었기 때문에 알고리즘 대신 방법이라고 부르기도 합니다.1956년 L. R. 포드 주니어와 D.에 의해 출판되었다. 풀커슨[3]포드-펄커슨(Ford-Fulkerson)이란 이름은 포드-펄커슨(Ford-Fulkerson) 방법을 완전히 정의한 에드먼즈-카프 알고리즘에도 자주 사용됩니다.
알고리즘의 배후에 있는 아이디어는 다음과 같습니다.송신원(시작 노드)에서 싱크(엔드 노드)로의 패스가 존재하는 한, 패스의 모든 엣지에 사용 가능한 캐퍼시티가 존재하는 한, 패스의 1개를 따라서 플로우를 송신합니다.그리고 다른 길을 찾는 거죠사용 가능한 용량을 가진 경로를 증강 경로라고 합니다.
알고리즘.
( ,) { G ( , ) 、 u ~ v 까지의 각 엣지에 대해 c( ,) { c ( ,v )、 ( ,v ) { f ( ,v ) } 를 f ( f ( 、 v ) 로 .소스로부터 싱크 t로의 최대 플로우를 구하려고 합니다.알고리즘의 각 스텝 후에, 다음과 같이 유지됩니다.
용량 제약 가장자리를 따라 흐르는 흐름은 용량을 초과할 수 없습니다. 스큐 대칭 u에서 v로의 순 흐름은 v에서u로의 순 흐름의 반대여야 합니다(예 참조). 흐름 보존 플로우를 「생산」하는 송신원과 플로우를 「소비」하는 싱크를 제외하고, 노드에의 순플로우는 제로입니다. 값(f) 에서 나오는 흐름은 t에 도달하는 흐름과 같아야 합니다.
즉, 알고리즘의 각 라운드 후에 네트워크를 통과하는 플로우가 정규 플로우입니다.나머지 f {{f}(V, 는 - f v { style , vc(u, vf( v) 및 no flow를 가진 네트워크라고 정의합니다.통보서, 그것은 v에서 절대로 당신이 흐르는 잔여 네트워크 하지만 기존의 네트워크에 골이 있는데, 만일 f(u, v)을이 허용된다 일어날 수 있어;0{\displaystyle f(u,v)>0}c(v마))0{\displaystyle c(v,u)=0} 다음c f(v마))c(v마)− f(v마))f(u, v)>0{\displaystyle c_{f}(v,u)=c(v,u).-f(v,u)= 입니다.
포드-펄커슨 알고리즘
- 흐름 c, 소스 노드 s 및 싱크 노드t의 네트워크 G ( V , E ) { G= ( 입력 지정
- 출력 s에서 t까지의 최대값 흐름 f를 계산합니다.
- (u , ) { f , ) \ } (u, ) \ , ) }
- f { G { , g from p \ displaystyle ( v) >{ c { } ( v )p {\ p \ , )\ :
- f ( ) { (u ,): ( , v) p}{ c_)=\ p 를 찾습니다.
- 각엣지(, )p \ \ p }
- (u , ) ( ,) + ( f (u,)\ f ( , )+_ {} (경로를 따라 흐름 전송)
- ( , ) ( ,) - ( f ( , )\ f ( , )- (플로우는 나중에 "확장"될 수 있습니다)
- "←"는 할당을 나타냅니다.예를 들어 "가장 큰 ← 항목"은 가장 큰 값의 값이 항목 값으로 변경됨을 의미합니다.
- "return"은 알고리즘을 종료하고 다음 값을 출력합니다.
스텝 2의 경로는 예를 들어 폭 우선 검색(BFS이나 깊이 우선 검색(G f ( f을 사용하여 수 있습니다.전자를 사용하는 경우 알고리즘은 Edmonds-Karp라고 불립니다.
스텝 2에서 패스를 찾을 수 없는 경우,는 나머지 네트워크 내의 t에 도달할 수 없습니다.S가 잔류 네트워크 내의 가 도달 가능한 노드 세트인 경우, S에서 V의 나머지 부분까지의 원래 에지 네트워크의 총 용량은 s에서 t까지의 총 흐름과 동일하며, 다른 한편으로 이러한 모든 흐름의 상한으로 작용합니다.이것은 우리가 발견한 흐름이 최대라는 것을 증명한다.Max-flow Min-cut 정리를 참조하십시오.
G ( V,) { G ( , ) } 에 복수의 소스 및 싱크가 있는 경우는, 다음과 같이 동작합니다. { ta { T = \ { t \ { } } } 、 { s }、 { S= \ { \ mid s text { a } }} ( ( ( 、 ( 、 (( ( ( ( 、 an an an an an an an an an an an an an an an an an an an an an an an an an an an c ( s ) ( s , ) 、 ( c ( { *, s )d _ { s } \ ; ( d _ { s } \ { s , ) ( e ) s S 、 s , s , s , s , s t \ t\ T}~ ( , t ( t d t , ) c ( , , t)(c( , t^ { * * )t } \ )다음으로 Ford-Fulkerson 알고리즘을 적용합니다.
또한 노드 u의 capacity 이 인 경우 이 노드는 2개의 t{out( in t t) {로 대체됩니다 t ) d { c ( u{ \ { , u _ { \ } } =_ {} 。다음으로 Ford-Fulkerson 알고리즘을 적용합니다.
복잡성
그래프에서 이미 확립된 흐름에 흐름 증강 경로를 추가하면 그래프에서 흐름 증강 경로를 더 이상 찾을 수 없을 때 최대 흐름에 도달합니다.단, 이 상황에 도달하는 것은 확실치 않기 때문에 알고리즘이 종료되었을 경우 정답이 되는 것이 보증할 수 있는 최선의 방법입니다.알고리즘이 영속적으로 실행되는 경우 흐름은 최대 흐름으로 수렴되지 않을 수 있습니다.단, 이 상황은 비합리적인 [4]흐름값에서만 발생합니다.용량이 정수인 경우 Ford-Fulkerson의 런타임은 O f { O큰 O 표기 참조)로 제한됩니다. 서E(\E)는 그래프의 에지 f(\ f는 그래프의 최대 흐름입니다.이는 각 증강 경로가 O시간 에 되고 f(\f 상한을 하여 흐름량이 1(\1)증가하기 때문입니다.
Ford-Fulkerson 알고리즘의 변형과 최대 흐름값과는 무관한 런타임은 Edmonds-Karp 알고리즘입니다.이알고리즘은O 2)\ O^{2 시간으로 됩니다.
적분 예
다음으로 4개의 노드(A\A\ D와 싱크 D\ D를 가진 흐름네트워크에서의 Ford-Fulkerson의 첫 번째 예를 나타냅니다.다음 예시는 알고리즘의 최악의 동작을 나타내고 있습니다.각 단계에서 네트워크를 통해 전송되는 은 11)뿐입니다.대신 너비 우선 검색을 사용할 경우 두 단계만 수행하면 됩니다.
| 경로. | 용량. | 결과 흐름 네트워크 |
|---|---|---|
| 초기 흐름 네트워크 | ||
| 1998년 이후... | ||
| 최종 흐름 네트워크 | ||
A A 를 찾을 때 C C에서B(\ B로의 플로우가 "푸시백"되는 것에 주의해 주십시오.
종료되지 않는 예
에 표시된 플로우 네트워크(소스 s s t t 용량 1},(\ (\displaystyle e_{3}))를 1(\1 r(- ) /(\ r로 . {5 및 1) 및 기타 모든 에지의 용량( M 2 M2 {\ r은 r -r {\ r}= 로 선택되었습니다.서 p 1 { , ,, v, , t { } = \ {}, { {v}, { {2}, {v}, {2}, {\}, {\dis}에 따라 증강 경로를 사용합니다. ({2}=\{ 3 { , ({}=\{
| 걸음 | 경로 증가 | 송신 플로우 | 잔존 용량 | ||
|---|---|---|---|---|---|
| 0 | |||||
| 1 | |||||
| 2 | |||||
| 3 | |||||
| 4 | |||||
| 5 | |||||
스텝 1 이후와 스텝5 이후 스타일 스타일 스타일 의 잔존 용량은 각각 r + r 0 0의 형태입니다. n n 즉, 증강 경로 p1({ }}) ({displaystyle 3}})을 무한히 사용할 수 있습니다.스텝 5 이후의 네트워크에서의 총 은 1+ ( + 2 + ( ^ { } + ( ^ { } + 3 + r \ { } 1 = 3 + 2 r \ sumfty { 1 } =, s 에 M 흐름 s 에따라 1 흐름, v2 1 단위 흐름 및 에M 흐름에는 의 흐름이 있음을 유의하십시오 입니다.따라서 알고리즘은 종료되지 않으며 흐름은 최대 [5]흐름으로 수렴되지 않습니다.
유클리드 알고리즘에 기초한 또 하나의 비종단적인 예는 Backman & Huynh(2018)에 의해 제시되고 있습니다.이 예에서는 E에서의 Ford-Fulkerson 알고리즘의 최악의 이 순서수 번호의 G(VE)\{ G, \{\style 임을 알 수 있습니다.( E
Edmonds-Karp 알고리즘의 Python 구현
수입품 수집품 학급 그래프: ''' 이 클래스는 다음을 사용하여 방향 그래프를 나타냅니다. 인접 매트릭스 표현 ''' 방어하다 __init__(자신, 그래프): 자신.그래프 = 그래프 잔차 그래프 자신.배를 젓다 = 렌(그래프) 방어하다 bfs(자신, s, t, 부모): ''' 경로가 있는 경우 true를 반환합니다. source 's'를 지정하면 잔차 그래프에 't'가 싱크됩니다. 또한 경로를 저장하기 위해 parent []를 채웁니다. ''' # 모든 정점을 방문하지 않은 것으로 표시 방문했다 = [거짓의] * 자신.배를 젓다 # BFS용 큐 작성 큐잉 = 수집품.디큐() # 소스 노드를 방문한 것으로 표시하고 큐잉합니다. 큐잉.추가하다(s) 방문했다[s] = 진실의 # 표준 BFS 루프 하는 동안에 큐잉: u = 큐잉.움직이다() # 큐 제거된 정점 u의 모든 인접 정점을 가져옵니다. # 인접을 방문하지 않은 경우 표시 # 방문 후 큐잉 위해서 인드, 값 에 열거하다(자신.그래프[u]): 한다면 (방문했다[인드] == 거짓의) 그리고. (값 > 0): 큐잉.추가하다(인드) 방문했다[인드] = 진실의 부모[인드] = u # 소스부터 시작하여 BFS의 싱크대에 도달한 경우 반환 # true, 그렇지 않으면 false 돌아가다 방문했다[t] # 지정된 그래프에서 s에서 t로의 최대 흐름을 반환합니다. 방어하다 edmonds_karp(자신, 원천, 가라앉다): # 이 어레이는 BFS로 채워져 경로를 저장합니다. 부모 = [-1] * 자신.배를 젓다 max_flow = 0 # 처음에는 흐름이 없습니다. # 소스로부터 싱크까지의 경로가 있는 동안 플로우를 증가시킨다. 하는 동안에 자신.bfs(원천, 가라앉다, 부모): # 가장자리를 따라 최소 잔존 용량을 찾습니다. BFS에 의해 채워진 패스 수.또는 최대 흐름 찾기라고 할 수 있습니다. # 발견된 경로를 통해 path_flow = 흘러가다("Inf") s = 가라앉다 하는 동안에 s != 원천: path_flow = 분(path_flow, 자신.그래프[부모[s]][s]) s = 부모[s] # 전체 흐름에 경로 흐름 추가 max_flow += path_flow # 가장자리 및 역방향 가장자리 잔존 용량 업데이트 # 길을 따라 v = 가라앉다 하는 동안에 v != 원천: u = 부모[v] 자신.그래프[u][v] -= path_flow 자신.그래프[v][u] += path_flow v = 부모[v] 돌아가다 max_flow 「 」를 참조해 주세요.
메모들
- ^ Laung-Terng Wang, Yao-Wen Chang, Kwang-Ting (Tim) Cheng (2009). Electronic Design Automation: Synthesis, Verification, and Test. Morgan Kaufmann. pp. 204. ISBN 978-0080922003.
{{cite book}}: CS1 maint: 여러 이름: 작성자 목록(링크) - ^ Thomas H. Cormen; Charles E. Leiserson; Ronald L. Rivest; Clifford Stein (2009). Introduction to Algorithms. MIT Press. pp. 714. ISBN 978-0262258104.
- ^ Ford, L. R.; Fulkerson, D. R. (1956). "Maximal flow through a network" (PDF). Canadian Journal of Mathematics. 8: 399–404. doi:10.4153/CJM-1956-045-5.
- ^ "Ford-Fulkerson Max Flow Labeling Algorithm". 1998. CiteSeerX 10.1.1.295.9049.
- ^ Zwick, Uri (21 August 1995). "The smallest networks on which the Ford–Fulkerson maximum flow procedure may fail to terminate". Theoretical Computer Science. 148 (1): 165–170. doi:10.1016/0304-3975(95)00022-O.
레퍼런스
- Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2001). "Section 26.2: The Ford–Fulkerson method". Introduction to Algorithms (Second ed.). MIT Press and McGraw–Hill. pp. 651–664. ISBN 0-262-03293-7.
- George T. Heineman; Gary Pollice; Stanley Selkow (2008). "Chapter 8:Network Flow Algorithms". Algorithms in a Nutshell. Oreilly Media. pp. 226–250. ISBN 978-0-596-51624-6.
- Jon Kleinberg; Éva Tardos (2006). "Chapter 7:Extensions to the Maximum-Flow Problem". Algorithm Design. Pearson Education. pp. 378–384. ISBN 0-321-29535-8.
- Samuel Gutekunst (2009). ENGRI 1101. Cornell University.
- Backman, Spencer; Huynh, Tony (2018). "Transfinite Ford–Fulkerson on a finite network". Computability. 7 (4): 341–347. arXiv:1504.04363. doi:10.3233/COM-180082. S2CID 15497138.
외부 링크
Wikimedia Commons의 Ford-Fulkerson 알고리즘 관련 매체