700 likes | 854 Views
Análise e Síntese de Algoritmos. Fluxos Máximos em Grafos CLRS, Cap. 26. Contexto. Algoritmos elementares em grafos ( CLR, Cap. 22 ) Árvores abrangentes de menor custo ( CLR, Cap. 23 ) Caminhos mais curtos com fonte única ( CLR, Cap. 24 )
E N D
Análise e Síntese de Algoritmos Fluxos Máximos em Grafos CLRS, Cap. 26
Contexto • Algoritmos elementares em grafos (CLR, Cap. 22) • Árvores abrangentes de menor custo (CLR, Cap. 23) • Caminhos mais curtos com fonte única (CLR, Cap. 24) • Caminhos mais curtos entre todos os pares (CLR, Cap. 25) • Fluxos máximos em grafos (CLR, Cap. 26) Análise e Síntese de Algoritmos
Resumo • Fluxos Máximos em Grafos • Motivação • Definições & Propriedades • Método de Ford-Fulkerson • Teorema do Fluxo Máximo Corte Mínimo • Análise do algoritmo genérico • Algoritmo de Edmonds-Karp • Análise do algoritmo de Edmonds-Karp • Emparelhamento Bipartido Máximo • Algoritmos baseados em Pré-Fluxos • Fluxos de Custo Mínimo Análise e Síntese de Algoritmos
Um Problema: fornecer água a Lisboa • Pretende-se determinar qual o volume de água máximo (por segundo), que é possível fazer chegar a Lisboa a partir da Barragem do Castelo do Bode • Existe uma rede de condutas de água que permitem o envio da água do Castelo do Bode para Lisboa • Cada conduta apresenta uma capacidade limite, de metros cúbicos por segundo • Encontrar um algoritmo eficiente para resolver este problema Análise e Síntese de Algoritmos
Fluxos Máximos em Grafos • Dado um grafo dirigido G=(V, E): • Com um vértice fonte s e um vértice destino t • Em que cada arco (u,v) é caracterizado por uma capacidade não negativa c(u,v) • A capacidade de cada arco (u,v) indica o valor limite de “fluxo” que é possível enviar de u para v através do arco (u,v) • Pretende-se calcular o valor máximo de “fluxo” que é possível enviar do vértice fonte s para o vértice destino t, respeitando as restrições de capacidade dos arcos • Exemplo Análise e Síntese de Algoritmos
Fluxo Máximo em Grafos Aplicações • Envio de materiais em rede de transportes • Petróleo ou gás • Água • Electricidade • Bytes • … Análise e Síntese de Algoritmos
Fluxo Máximo em Grafos Aplicações • Para redes de fluxo com múltiplas fontes e/ou destinos • Definir super-fonte que liga a todas as fontes • Definir super-destino ao qual ligam todos os destinos • Capacidades infinitas entre super-fonte e fontes, e entre destinos e super-destino Análise e Síntese de Algoritmos
Fluxo Máximo em Grafos Definições • Uma rede de fluxo G = (V, E) é um grafo dirigido em que cada arco (u,v) tem capacidade c(u, v) 0 • Se (u,v) E, então c(u,v) = 0 • Dois vértices especiais: fonte s e destino t • Todos os vértices de G num caminho de s para t • Grafo ligado, |E| |V| - 1 • Um fluxo G = (V, E) é uma função f : V V R tal que: • f(u, v) c(u, v) para u, v V (restrição de capacidade) • f(u, v) = - f(v, u) para u, v V (simetria) • para u V - { s, t }: (conservação de fluxo) Análise e Síntese de Algoritmos
u 4/10 5/10 s t 1/5 5/10 6/10 v Fluxo Máximo em Grafos Definições • Valor de um fluxo: • Problema do Fluxo Máximo: • Dada rede de fluxo G com fonte s e destino t, calcular o fluxo de valor máximo de s para t • Exemplo: Valor do fluxo: 10 Fluxo máximo: 20 Análise e Síntese de Algoritmos
Fluxo Máximo em Grafos Propriedades • Dados conjuntos de vértices X e Y: • Rede de fluxo G = (V, E); f fluxo em G; X, Y, Z V: • f(X,X) = 0 (cancelamento de termos) • f(X,Y) = -f(Y,X) • Se X Y = : • f(X Y,Z) = f(X,Z) + f(Y,Z) (expansão do somatório) • f(Z,X Y) = f(Z,X) + f(Z,Y) (expansão do somatório) Análise e Síntese de Algoritmos
Método de Ford-Fulkerson • Definições: • Perspectiva • Redes residuais • Caminhos de aumento • Cortes em redes de fluxo • Teorema do Fluxo Máximo Corte Mínimo • Método de Ford-Fulkerson • Algoritmo • Complexidade • Problemas de convergência Análise e Síntese de Algoritmos
Método Genérico Ford-Fulkerson-Method(G,s,t) inicializar fluxo f a 0 while existe caminho de aumento p aumentar fluxo f utilizando p return f Análise e Síntese de Algoritmos
Redes Residuais • Dado G = (V, E), um fluxo f, e u,v V • capacidade residual de (u,v): • Fluxo líquido adicional que é possível enviar de u para v • cf(u,v) = c(u,v) - f(u,v) • rede residual de G: • Gf = (V, Ef), onde Ef = { (u,v) V V : cf(u,v) > 0 } • Cada arco (residual) de Gf permite apenas fluxo líquido positivo • Exemplo Análise e Síntese de Algoritmos
Redes Residuais (Cont.) • G = (V, E), f um fluxo, Gf rede residual; f’ fluxo em Gf • Fluxo de soma f + f’ definido para cada par u,v V: (f + f’)(u,v) = f(u,v) + f’(u,v) • Fluxo de soma é um fluxo com valor |f + f’| = |f| + |f’| • Propriedades de um fluxo são verificadas: restrição de capacidade, simetria e conservação de fluxo • Obs: f’ é definido em Gf e é um fluxo • Cálculo do valor de fluxo: Análise e Síntese de Algoritmos
Caminhos de Aumento • Dado G = (V, E) e um fluxo f • caminho de aumento p: • caminho simples de s para t na rede residual Gf • capacidade residual de p: • cf(p) = min { cf(u,v) : (u,v) em p } • cf(p) permite definir fluxo fp em Gf, |fp| = cf(p) > 0 • f’ = f + fp é um fluxo em G, com valor |f’| = |f| + |fp| > |f| • Exemplos Análise e Síntese de Algoritmos
Recapitular • Fluxos Máximos em Grafos • Definições • Capacidades (dos arcos) • Fluxos • Capacidades residuais • Redes residuais • Caminhos de aumento • Para aumento de fluxo • Método de Ford-Fulkerson Análise e Síntese de Algoritmos
A Seguir • Fluxos Máximos em Grafos • Teorema do fluxo máximo corte mínimo • Método de Ford-Fulkerson • Análise do algoritmo genérico • Algoritmo de Edmonds-Karp Análise e Síntese de Algoritmos
Algoritmo de Ford-Fulkerson Básico Ford-Fulkerson(G,s,t) foreach (u,v) E[G] f[u,v] = 0 f[v,u] = 0 while existe caminho de aumento p na rede residual Gf calcular cf(p) foreach (u,v) p f[u,v] = f[u,v] + cf(p)// Incrementar valor do fluxo f[v,u] = - f[u,v] Análise e Síntese de Algoritmos
Cortes em Redes de Fluxo • Um corte (S, T) de G = (V, E) é uma partição de V em S e T = V - S, tal que s S e t T • fluxo líquido do corte (S, T): • capacidade do corte (S, T): • Se G = (V, E) com fluxo f, então o fluxo líquido através de um corte (S, T) é f(S,T) = |f| • T = V - S; f(S,TS) = f(S,T) + f(S,S); f(S,T) = f(S,V) - f(S,S) • f(S,T) = f(S,V) - f(S,S) = f(S,V) = f(s,V) + f(S - s,V) = f(s,V) = |f| • Obs: para u S - s, f(u, V) = 0 Análise e Síntese de Algoritmos
S T Cortes em Redes de Fluxo (Cont.) • Qualquer valor de fluxo é limitado superiormente pela capacidade de qualquer corte de G • (S,T) qualquer corte, e f um fluxo: Análise e Síntese de Algoritmos
Fluxo Máximo Corte Mínimo • Seja G = (V, E), com fonte s e destino t, e um fluxo f. Então as proposições seguintes são equivalentes: 1. f é um fluxo máximo em G 2. A rede residual G não contém caminhos de aumento 3. |f| = c(S,T) para um corte (S,T) de G • 1. 2. • Admitir que f é fluxo máximo em G mas que Gf tem caminho de aumento • Então é possível definir um novo fluxo f + fp com valor |f| + |fp| > |f|; uma contradição Análise e Síntese de Algoritmos
Fluxo Máximo Corte Mínimo (Cont.) • 2. 3. • Gfsem caminhos de aumento • S = { v V : existe caminho de s para v em Gf }; T = V - S; s S e t T • Com u S e v T, temos f(u,v) = c(u,v), pelo que • |f| = f(S,T) = c(S,T) • 3. 1. • Dado que |f| c(S,T), para qualquer corte (S,T) de G • Como |f| = c(S,T) (definido acima), então f é fluxo máximo Análise e Síntese de Algoritmos
u 1000000 1000000 u 1000000 1000000 s t 1 s t 1000000 1000000 1 v 1000000 1000000 v Análise do Algoritmo Básico • Número de aumentos de fluxo pode ser elevado • Fluxo máximo = 2000000 • No pior caso: número de caminhos de aumento é 2000000 caminho de aumento com capacidade residual = 1 rede de fluxo Análise e Síntese de Algoritmos
Análise de Algoritmo Básico (Cont.) • Para valoresracionais das capacidades • Converter todas as capacidades para valores inteiros • Número de caminhos de aumento limitado por valor máximo do fluxo |f*| • Complexidade: O(E |f*|) • Por exemplo: DFS para encontrar caminho de aumento • Para valores irracionais das capacidades • Algoritmo básico pode não terminar • Algoritmo básico pode convergir para valor incorrecto • Exemplo Análise e Síntese de Algoritmos
Algoritmo de Edmonds-Karp • Escolher caminho de aumento mais curto no número de arcos • Utilizar BFS em Gf para identificar caminho mais curto • Complexidade: O(V E2) • Exemplos Análise e Síntese de Algoritmos
Recapitular • Fluxos Máximos em Grafos • Definições • Método de Ford-Fulkerson • Teorema do fluxo máximo corte mínimo • Análise do algoritmo genérico de Ford-Fulkerson • Algoritmo de Edmonds-Karp Análise e Síntese de Algoritmos
A Seguir • Fluxos Máximos em Grafos • Algoritmo de Edmonds-Karp • Análise da complexidade • Método de Ford-Fulkerson • Análise do algoritmo genérico com valores irracionais • Complexidade do algoritmo • Convergência para valor correcto Análise e Síntese de Algoritmos
Algoritmo de Edmonds-Karp — Análise • Definições: • f(s,v): distância mais curta de s para v na rede residual Gf • f’(s,v): distância mais curta de s para v na rede residual Gf’ • Sequência de acontecimentos considerada: • f Gf BFS p f’ Gf’ BFS p’ • Resultados: • f(s,v) cresce monotonicamente com cada aumento de fluxo • Número de aumentos de fluxo é O(V E) • Tempo de execução é O(V E2) • O(E) devido a BFS & aumento de fluxo a cada passo Análise e Síntese de Algoritmos
Algoritmo de Edmonds-Karp — Análise • f(s,v) cresce monotonicamente com cada aumento de fluxo • Prova por contradição • Após aumento de fluxo (de f para f’) existe v V tal que distância do caminho mais curto diminui • f’(s,v) < f(s,v) • Sem perda de generalidade, admitir f’(s,v) < f’(s,u) para qualquer vértice u tal que f’(s,u) < f(s,u) • i.e. escolher vértice v com a menor distância entre todos os vértices que não verificam a propriedade de f(s,v) crescer monotonicamente • equivalente a: f’(s,u) < f’(s,v) implica que f(s,u) f’(s,u) Análise e Síntese de Algoritmos
Algoritmo de Edmonds-Karp — Análise • Seja p’ um caminho mais curto em Gf’, de s para v e com arco de u para v • f’(s,u) = f’(s,v) - 1 (p’ é caminho mais curto em Gf’) • E, por hipótese, f(s,u) f’(s,u) • Analisar fluxo f de u para v antes de aumento de fluxo • Se f[u,v] < c[u,v]: • f(s,v) f(s,u) + 1 f’(s,u) + 1 = f’(s,v) • o que contradiz hipótese inicial ! • Caso contrário f[u,v] = c(u,v): • (u,v) Ef • caminho p em Gf (escolhido para obter Gf’) contém arco (v,u) • f(s,u) = f(s,v) + 1 • f(s,v) = f(s,u) - 1 f’(s,u) - 1 = f’(s,v) - 2 < f’(s,v) • o que também contradiz hipótese inicial ! Análise e Síntese de Algoritmos
Algoritmo de Edmonds-Karp — Análise • Número de aumentos de fluxo é O(V E) • arco (u,v) na rede residual Gf é crítico se capacidade residual de p é igual à capacidade residual do arco • arco crítico desaparece após aumento de fluxo • Quantas vezes pode arco (u,v) ser arco crítico? • Como caminhos de aumento são caminhos mais curtos, f(s,v) = f(s,u) + 1 • (u,v) só volta à rede residual após arco (v,u) aparecer em caminho de aumento (com fluxo f’) • Como, f’(s,u) = f’(s,v) + 1 • Dado que, f(s,v) f’(s,v) (resultado anterior) • Obtem-se, f’(s,u) = f’(s,v) + 1 f(s,v) + 1 = f(s,u) + 2 Análise e Síntese de Algoritmos
Algoritmo de Edmonds-Karp — Análise • Distância de s a u aumenta pelo menos de duas unidades entre cada par de vezes que (u,v) é crítico • No limite, distância de s a u é não superior a |V| - 2 • Pelo que arco (u,v) pode ser crítico O(V) vezes • Existem O(E) pares de vértices • Na execução do algoritmo de Edmonds-Karp o número total de vezes que arcos podem ser críticos é O(V E) • Como cada caminho de aumento tem um arco crítico • Existem O(V E) caminhos de aumento • Complexidade de Edmonds-Karp é O(V E2) • Complexidade de BFS é O(V+E) = O(E) • Aumento de fluxo em O(V+E) = O(E) (dado V = O(E)) Análise e Síntese de Algoritmos
Recapitular • Fluxos Máximos em Grafos • Método de Ford-Fulkerson • Análise do algoritmo genérico • Complexidade (valores inteiros): O(E |f*|) • Com valores irracionais pode não terminar • Algoritmo de Edmonds-Karp • Análise da complexidade O(V E2) Análise e Síntese de Algoritmos
A Seguir • Fluxos Máximos em Grafos • Emparelhamento Bipartido Máximo Análise e Síntese de Algoritmos
Emparelhamento Bipartido Máximo • G = (V, E) não dirigido • Emparelhamento: • M E, tal que para qualquer vértice v em V não mais do que um arco em M é incidente em v • Emparelhamento Máximo: • Emparelhamento cardinalidade máxima (na dimensão de M) • Grafo Bipartido: • Grafo pode ser dividido em V = L R, em que L e R são disjuntos e em que todos os arcos de E estão entre L e R • Emparelhamento Bipartido Máximo: • Emparelhamento máximo em que G é bipartido Análise e Síntese de Algoritmos
Emparelhamento Bipartido Máximo • Construir G’: • V’ = V {s, t} • Atribuir capacidade unitária a cada arco de E’ • Emparelhamento bipartido máximo em G equivale a encontrar fluxo máximo em G’ • Exemplo Análise e Síntese de Algoritmos
Emparelhamento Bipartido Máximo • Dados G e G’: 1. Se M é um emparelhamento em G, existe um fluxo f de valor inteiro em G’, com |f| = |M| 2. Se |f| é um fluxo de valor inteiro em G’, existe um emparelhamento M em G, com |f| = |M| • Seja M um emparelhamento, e (u,v) M. • Definir f utilizando arcos de M, f(s,u) = f(u,v) = f(v,t) = 1. • Para restantes arcos (u,v) E’, f(u,v) = 0 • Os caminhos s u v t para todo o (u,v) M são disjuntos em termos dos vértices, com excepção de s e t • Como existem |M| caminhos, cada um com uma contribuição de uma unidade de fluxo para o fluxo total f, |f| = |M| Análise e Síntese de Algoritmos
Emparelhamento Bipartido Máximo • Se todas as capacidades têm valor inteiro, então para fluxo máximo f, |f| é inteiro • Indução no número de iterações do algoritmo genérico de Ford-Fulkerson • Emparelhamento bipartido máximo |M| em G corresponde a |f|, em que f é o fluxo máximo de G’ • Se |M| é emparelhamento máximo em G, e |f| não é máximo em G’, então existe f’ que é máximo • f’é inteiro, |f’| > |f| • e f’ corresponde a emparelhamento |M’|, com |M’| > |M|; contradição • … Análise e Síntese de Algoritmos
Emparelhamento Bipartido Máximo • A aplicação do algoritmo genérico de Ford-Fulkerson tem complexidade O(E |f*|) • Emparelhamento bipartido máximo é não superior a min(L,R) = O(V) e tem valor inteiro • i.e., no caso do emparelhamento máximo, |f*| = O(V) • Complexidade de identificação do emparelhamento bipartido máximo é O(V E) Análise e Síntese de Algoritmos
Recapitular • Fluxos Máximos em Grafos • Definições e Propriedades • Método de Ford-Fulkerson • Algoritmo de Edmonds-Karp • Emparelhamento Bipartido Máximo Análise e Síntese de Algoritmos
A Seguir • Fluxos Máximos em Grafos • Algoritmos de Pré-Fluxo (push-relabel) • Correcção do algoritmo genérico • Análise do algoritmo genérico • Algoritmo Relabel-To-Front • Análise do algoritmo Relabel-To-Front Análise e Síntese de Algoritmos
Fluxo Máximo Utilizando Pré-Fluxos • Motivação & Intuição • Operações Básicas • Algoritmo Genérico • Correcção do Método • Análise do Método Análise e Síntese de Algoritmos
Pré-Fluxos — Intuição • Operação mais localizada do que Ford-Fulkerson • Não identificar caminhos de aumento • Propriedade da conservação de fluxo não é mantida durante execução do algoritmo • Cada vértice u contém reservatório de fluxo • Representa excesso de fluxo e(u) • Começar por enviar todo o fluxo possível de s para vértices adjacentes • Noção de altura de cada vértice, que evolui com aplicação do algoritmo • Envio de fluxo só de vértices mais altos para vértices mais baixos • Fazer subir altura de vértices em caso de necessidade de envio de fluxo Análise e Síntese de Algoritmos
Pré-Fluxos — Definições • Pré-Fluxo: f : V V R • Verifica restrições de capacidade, simetria e f(V, u) 0 para vértices u V - { s } • Não verifica necessariamente conservação de fluxo • Excesso de fluxo: e(u) = f(V, u) • u V - { s, t } transborda se e(u) > 0 • Uma função h : V N é uma função de alturas se h(s) = |V|, h(t) = 0, e h(u) h(v) + 1 para todo o arco residual (u,v) Ef • Função de alturas permite estabelecer condições para ser possível enviar fluxo de u para v Análise e Síntese de Algoritmos
Pré-Fluxos — Operações Básicas Enviar fluxo de u para v: Push(u,v) df(u,v) = min(e[u], cf[u,v]) f[u,v] = f[u,v] + df(u,v) f[v,u] = - f[u,v] e[u] = e[u] - df(u,v) e[v] = e[v] + df(u,v) Aplica-se quando u transborda, cf[u,v] > 0, e h[u] = h[v] + 1 Subir altura de u: Aplica-se quando u transborda, e (u,v) Ef implica h[u] h[v] Relabel(u) h[u] = 1 + min{h[v] : (u,v) Ef} Análise e Síntese de Algoritmos
Pré-Fluxos — Operações Básicas • Operação de envio de fluxo de u para v, Push(u, v): • Saturating push: arco (u, v) fica saturado após aplicação da operação Push (i.e. f(u,v) = c(u,v)) • Caso contrário: Nonsaturating push • OBS: Após um Push(u, v) nonsaturating, u deixa de transbordar Análise e Síntese de Algoritmos
Pré-Fluxos — Operações Básicas Initialize-Prefow(G, s) foreach v V[G] h[u] = 0 e[u] = 0 foreach (u,v) E[G] f[u,v] = 0 f[v,u] = 0 h[s] =|V[G]| foreach u Adj[s] f[s,u] = c(s,u) f[u,s] = -c(s,u) e[u] = c(s,u) Análise e Síntese de Algoritmos
Pré-Fluxos — Algoritmo Genérico • Exemplo Generic-Push-Relabel(G) Initialize-Preflow(G, s) while existe operação de Push ou Relabel aplicável seleccionar e executar operação de Push ou Relabel return f Análise e Síntese de Algoritmos
Pré-Fluxos — Correcção do Método • G = (V, E), rede de fluxo com fonte s e destino t, f um pré-fluxo, e h uma função de alturas para f. Se vértice u transborda, então u pode ser sujeito a uma operação de Relabel ou de Push • h é função de alturas, pelo que h(u) h(v) + 1 • Se operação de Push não aplicável a u, então para qualquer arco residual (u, v), h(u) < h(v) + 1, pelo que h(u) h(v) • Assim, operação de Relabel pode ser aplicada a u Análise e Síntese de Algoritmos
Pré-Fluxos — Correcção do Método • h[u] nunca decresce; se operação de Relabel é aplicada, h[u] aumenta de pelo menos 1 unidade • Valor de h[u] apenas alterado em Relabel • Aplicar Relabel se, para todo o (u, v) Ef, h[u] h[v] • h[u] < 1 + min { h[v] : (u,v) Ef } • Pelo que valor de h[u] aumenta (de pelo menos 1 unidade) após Relabel Análise e Síntese de Algoritmos