Problema de Fluxo Máximo The Maximum Flow Problem Fernando Nogueira Fluxo Máximo 1
O Problema de Fluxo Máximo (The Maximum Flow Problem) Considere uma rede direcionada (dígrafo) conectada, com 2 nós especiais denominados Origem e Destino e ainda, associado a cada arco, uma distância não-negativa. O objetivo é encontrar o fluxo máximo na rede. Exemplos de Aplicações: 1)Maximizar o fluxo de uma rede de distribuição (suprimentos) de uma companhia a partir de suas fábricas (fornecedores) para os seus (suas) clientes (fábricas). 2)Maximizar o fluxo de óleo (água) através de um sistema de oleodutos (aquedutos). 3)Maximizar o fluxo de veículos através de uma rede de transporte. Fernando Nogueira Fluxo Máximo 2
Exemplo Maximizar o número de viagens para a rede do Parque Seervada de O para T, onde os valores dos arcos representam o fluxo máximo de cada arco. Uma solução viável é enviar 7 bondes, sendo: 5 usando a rota O B E T 1 usando a rota O B C E T e 1 usando a rota O B C E D T Fernando Nogueira Fluxo Máximo 3
A solução anterior é viável, porém não é a ótima. Uma vez que o Problema de Fluxo Máximo em uma Rede pode ser formulado como um Problema de Programação Linear, o algoritmo Simplex pode ser utilizado para obtenção da solução ótima. Entretanto, existe um algoritmo mais eficiente para a solução deste problema denominado Algoritmo do Caminho de Aumento (Augmenting Path Algorithm). O algoritmo do Caminho de Aumento é baseado em dois conceitos intuitivos: uma Rede Residual e um Caminho de Aumento (propriamente dito). Fernando Nogueira Fluxo Máximo 4
Rede Residual Os valores dos arcos da rede da esquerda representam as capacidades máximas e seus respectivos fluxos (capacidade, fluxo). Os valores dos arcos da rede da direita representam os resíduos, ou seja, a diferença entre a capacidade e o fluxo do arco. Fernando Nogueira Fluxo Máximo 5
Caminho de Aumento Um Caminho de Aumento é um caminho orientado (os arcos possuem sentidos) a partir da origem para o destino na Rede Residual tal que todo arco sobre este caminho possui resíduo estritamente positivo. O mínimo destes resíduos é chamado de Capacidade Residual do Caminho de Aumento, uma vez que este representa a quantidade de fluxo que pode viavelmente ser adicionado ao caminho todo. O caminho: O C E D T é um Caminho de Aumento com Capacidade Residual 1 (menor resíduo neste caminho). Fernando Nogueira Fluxo Máximo 6
Existem algumas versões do Algoritmo do Caminho de Aumento. A mais conhecida é o Algoritmo de Ford-Fulkerson. Algoritmo de Ford-Fulkerson s = origem, t = destino, P = caminho, f = fluxo total, f ij = fluxo do arco i para o arco j, c ij = capacidade de fluxo do arco i para o arco j. 1. Designar um fluxo inicial f ij (por exemplo, f ij = 0, para todos os arcos). Compute f. 2. Rotular o nó 1 (s) por. Marque os outros vértices como nãorotulados. Fernando Nogueira Fluxo Máximo 7
3. Encontrar um nó rotulado i que não tenha sido scanned. Scan i como: Para todo nó adjacente não-rotulado j, se c ij > f ij, computar ij = c ij f ij e 1j = min (, ) i > 1 e rotular j como um rótulo para frente (i +, j ); j ou se f ji >0, computar j = min ( i,f ji ) e rotular j como um para trás (i -, j ); Se não existir nenhum j, então SAI f. Pare. (f é o fluxo máximo). Fernando Nogueira Fluxo Máximo 8 rótulo 4. Repita o passo 3 até o nó destino (t) ser alcançado (isto fornece um fluxo sobre um Caminho de Aumento) Se é impossível alcançar o destino, então SAI f. Pare (f é o fluxo máximo). i ij se se i = 1
5. Determine o caminho P usando os rótulos. 6. Aumente o fluxo existente em P por t. Faça f = f + t. 7. Remover os rótulos dos nós 2, 3,..., t. Volte para o passo 3. Obs: dever-se utilizar BFS (Breadth First Search) que foi sugerido para ser utilizado neste algoritmo por Edmonds & Karp em 1972. A técnica BFS, neste algoritmo, consiste em, antes de scannear um nó i, scannear todos os nós que foram rotulados antes de i. O próximo exemplo mostra a execução deste algoritmo para o problema de maximizar o fluxo de bondes nas rodovias do Parque Seervada. O fluxo inicial adotado foi zero. Fernando Nogueira Fluxo Máximo 9
1. Fluxo inicial f = 0 2. Rotular O por. Marcar A, B, C, D, E, T não-rotulado. 3. Scan O Computar OA = 5-0 = 5. A = 5. Rotular A por (O +, 5). Computar OB = 7-0 = 7. B = 7. Rotular B por (O +, 7). Computar OC = 4-0 = 4. C = 4. Rotular C por (O +, 4). Fernando Nogueira Fluxo Máximo 10
4. Scan B Computar BD = 4-0 = 4. D = min( B, BD ) = 4. Rotular D por (B +, 4). Computar BE = 5-0 = 5. E = min( B, BE ) = 5. Rotular E por (B +, 5). Fernando Nogueira Fluxo Máximo 11
Scan D Computar DT = 9-0 = 9. T = min( D, DT ) = 4. Rotular T por (D +, 4). 5. Caminho: O B D T é um Caminho de Aumento. 6. T = 4. Aumentando o fluxo de T resulta em: f OB = f BD = f DT = 0 + 4 = 4. Outros fluxos continuam sem mudanças. Fluxo total f = 4. 7. Remover todos os rótulos sobre os vértices A,B,C,D,E,T e voltar para o passo 3. Fernando Nogueira Fluxo Máximo 12
3. Scan O Computar OA = 5-0 = 5. A = 5. Rotular A por (O +, 5). Computar OB = 7-4 = 3. B = 3. Rotular B por (O +, 3). Computar OC = 4-0 = 4. C = 4. Rotular C por (O +, 4). Fernando Nogueira Fluxo Máximo 13
4. Scan B Computar BD = saturado (não computar). Computar BE = 5-0 = 5. E = min( B, BE ) = 3. Rotular E por (B +, 3). Fernando Nogueira Fluxo Máximo 14
Scan E Computar ED = 1-0 = 1. D = min( E, ED ) = 1. Rotular D por (E +, 1). Computar ET = 6-0 = 6. T = min( E, ET ) = 3. Rotular T por (E +, 3). 5. Caminho: O B E T é um Caminho de Aumento. 6. T = 3. Aumentando o fluxo de T resulta em: f OB = 4 + 3 = 7, f BE = 0 + 3 = 3, f ET = 0 + 3 = 3. Outros fluxos continuam sem mudanças. Fluxo total f = 4 + 3 = 7. 7. Remover todos os rótulos sobre os vértices A,B,C,D,E,T e voltar para o passo 3. Fernando Nogueira Fluxo Máximo 15
3. Scan O Computar OA = 5-0 = 5. A = 5. Rotular A por (O +, 5). Computar OB = saturado (não computar) Computar OC = 4-0 = 4. C = 4. Rotular C por (O +, 4). Fernando Nogueira Fluxo Máximo 16
4. Scan A Computar AD = 3-0 = 3. D = min( A, AD ) = 3. Rotular D por (A +, 3). Computar AB = 1-0 = 1. B = min( A, AB ) = 1. Rotular B por (A +, 1). Fernando Nogueira Fluxo Máximo 17
Scan D Computar DT = 9-4 = 5. T = min( D, DT ) = 3. Rotular T por (D +, 3). Computar E = min( D, f ED ) = 1. Rotular E por (D -, 1). 5. Caminho: O A D T é um Caminho de Aumento. 6. T = 3. Aumentando o fluxo de T resulta em: f OA = 0 + 3 = 3, f AD = 0 + 3 = 3, f DT = 4 + 3 = 7. Outros fluxos continuam sem mudanças. Fluxo total f = 7 + 3 = 10. 7. Remover todos os rótulos sobre os vértices A,B,C,D,E,T e voltar para o passo 3. Fernando Nogueira Fluxo Máximo 18
3. Scan O Computar OA = 5-3 = 2. A = 2. Rotular A por (O +, 2). Computar OB = saturado (não computar) Computar OC = 4-0 = 4. C = 4. Rotular C por (O +, 4). Fernando Nogueira Fluxo Máximo 19
4. Scan A Computar AD = saturado (não computar). Computar AB = 1-0 = 1. B = min( A, AB ) = 1. Rotular B por (A +, 1). Fernando Nogueira Fluxo Máximo 20
Scan B Computar BE = 5-3 = 2. E = min( B, BE ) = 1. Rotular E por (B +, 1). Computar BD = saturado (não computar). Fernando Nogueira Fluxo Máximo 21
Scan E Computar ED = 1-0 = 1. D = min( E, ED ) = 1. Rotular D por (E +, 1). Computar ET = 6-3 = 3. T = min( E, ET ) = 1. Rotular T por (E +, 1). Fernando Nogueira Fluxo Máximo 22
5. Caminho: O A B E T é um Caminho de Aumento. 6. T = 1. Aumentando o fluxo de T resulta em: f OA = 3 + 1 = 4, f AB = 0 + 1 = 1, f BE = 3 + 1 = 4, f ET = 3 + 1 = 4. Outros fluxos continuam sem mudanças. Fluxo total f = 10 + 1 = 11. 7. Remover todos os rótulos sobre os vértices A,B,C,D,E,T e voltar para o passo 3. Fernando Nogueira Fluxo Máximo 23
3. Scan O Computar OA = 5-4 = 1. A = 1. Rotular A por (O +,1). Computar OB = saturado (não computar) Computar OC = 4-0 = 4. C = 4. Rotular C por (O +, 4). Fernando Nogueira Fluxo Máximo 24
4. Scan A Computar AD = saturado (não computar). Computar AB = saturado (não computar). Fernando Nogueira Fluxo Máximo 25
Scan C Computar CE = 4-0 = 4. E = min( C, CE ) = 4. Rotular E por (C +, 4). Computar B = min( C, f BC ) = 2. Rotular B por (C -, 2). Fernando Nogueira Fluxo Máximo 26
Scan E Computar ED = 1-0 = 1. D = min( E, ED ) = 1. Rotular D por (E +, 1). Computar ET = 6-4 = 2. T = min( E, ET ) = 2. Rotular T por (E +, 2). Fernando Nogueira Fluxo Máximo 27
5. Caminho: O C E T é um Caminho de Aumento. 6. T = 2. Aumentando o fluxo de T resulta em: f OC = 0 + 2 = 2, f CE = 0 + 2 = 2, f ET = 4 + 2 = 6. Outros fluxos continuam sem mudanças. Fluxo total f = 11 + 2 = 13. 7. Remover todos os rótulos sobre os vértices A,B,C,D,E,T e voltar para o passo 3. Fernando Nogueira Fluxo Máximo 28
3. Scan O Computar OA = 5-4 = 1. A = 1. Rotular A por (O +,1). Computar OB = saturado (não computar) Computar OC = 4-2 = 2. C = 2. Rotular C por (O +, 2). Fernando Nogueira Fluxo Máximo 29
4. Scan A Computar AD = saturado (não computar). Computar AB = saturado (não computar). Fernando Nogueira Fluxo Máximo 30
Scan C Computar CE = 4-2 = 2. E = min( C, CE ) = 2. Rotular E por (C +, 2). Computar B = min( C, f BC ) = 2. Rotular B por (C -, 2). Fernando Nogueira Fluxo Máximo 31
Scan E Computar ED = 1-0 = 1. D = min( E, ED ) = 1. Rotular D por (E +, 1). Computar ET = saturado (não computar). Fernando Nogueira Fluxo Máximo 32
Scan D Computar DT = 9-7 = 2. T = min( D, DT ) = 1. Rotular T por (D +, 1). Fernando Nogueira Fluxo Máximo 33
5. Caminho: O C E D T é um Caminho de Aumento. 6. T = 1. Aumentando o fluxo de T resulta em: f OC = 2 + 1 = 3, f CE = 2 + 1 = 3, f ED = 0 + 1 = 1, f DT = 7 + 1 = 8. Outros fluxos continuam sem mudanças. Fluxo total f = 12 + 1 = 14. 7. Remover todos os rótulos sobre os vértices A,B,C,D,E,T e voltar para o passo 3. Fernando Nogueira Fluxo Máximo 34
A priori, deveríamos retornar ao passo 3, porém todos os arcos que chegam em D estão saturados (não há como enviar mais nada para D) e portanto, não é possível enviar mais nada para T a partir de D. Uma vez que o arco que chega em T, a partir de E, também está saturado, não é possível melhorar a solução. Portanto, a solução acima é ótima. Fernando Nogueira Fluxo Máximo 35
A figura abaixo representa a solução ótima apenas com os fluxos (sem as capacidades). Fernando Nogueira Fluxo Máximo 36