31
{djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

{djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Embed Size (px)

Citation preview

Page 1: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

{djcs, hcs}@cin.ufpe.br

Diêgo João Costa Santiago

Hallan Cosmo dos Santos

Page 2: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

O Problema Fluxo MáximoO que é o problema de encontrar fluxo

máximo?Uma empresa possui uma fábrica localizada na

cidade X onde são fabricados produtos que necessitam ser transportados para o centro de distribuição na cidade Y.

Dados as estradas direcionadas que ligam os pares de cidades do país, bem como o número máximo de caminhões que pode se conduzir ao longo de cada estrada. Qual é o número máximo de caminhões que a empresa pode enviar para o centro de distribuição?

Page 3: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

O Problema Fluxo MáximoDe acordo com a Teoria dos Grafos:

Dado uma rede – um grafo direcionado, em que cada aresta tem uma capacidade c associada a ele, um vértice de partida (source) e um vértice de chegada (sink). Devemos associar um valor não-negativo f , com f <= c para cada aresta, onde para cada vértice, exceto o source e o sink, a soma dos valores associados às arestas que entram deve ser igual a soma dos valores associados às arestas que o deixam. Nós chamaremos f de o fluxo ao longo da aresta. Devemos maximizar a soma dos valores associados às arestas que deixam o source, o fluxo total da rede.

Page 4: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

O Problema Fluxo MáximoA Imagem abaixo mostra uma solução ótima

para uma instância deste problema. Cada aresta apresentada com f/c .

Page 5: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Como resolver o problemaPrecisamos de duas definições básicas para

entender como resolver fluxo em redes:A rede residual

Tem o mesmo número vértices da rede original e uma ou duas arestas para cada aresta na rede original. Se o fluxo ao longo da aresta a-b é menor do que a capacidade, existe uma aresta a-b com uma capacidade igual à diferença entre a capacidade e o fluxo (capacidade residual), e se o fluxo é positivo há uma aresta b-a com a capacidade igual ao fluxo de a-b.

O caminho de aumento

Page 6: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Como resolver o problema

Page 7: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Como resolver o problema

Page 8: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Como resolver o problema

Page 9: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Como resolver o problema

Page 10: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Problema Resolvido!O exemplo sugeriu o seguinte algoritmo:

Inicie com nenhum fluxo em todas as arestas e aumente o fluxo total na rede enquanto há um aumento caminho desde o source até o sink - um caminho de aumento na rede residual.

O algoritmo (conhecido como o método Ford-Fulkerson) sempre termina: devido às capacidades e fluxos inteiros não-negativos, a cada passo obtemos um novo fluxo que está mais próximo do máximo.

Page 11: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Problema Resolvido!A função max_flow será similar a esta,

independente do método que utilizamos para encontrar caminhos de aumento:

Page 12: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Algoritmos para Caminho de AumentoO algoritmo Ford-Fulkerson descrito obtém o

resultado correto, não importa como resolvermos o sub-problema de encontrar um caminho de aumento.

No entanto, a cada novo caminho podemos aumentar o fluxo total muito pouco, daí o número de iterações do algoritmo pode ser muito grande se nos descuidarmos ao escolher qual caminho de aumento o algoritmo deve usar.

Page 13: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Algoritmos para Caminho de AumentoAgora é necessário uma implementação para

a função find_path.A primeira abordagem que me vem à mente é

a de usar uma busca em profundidade, pois ela é provavelmente a mais fácil de implementar. Infelizmente, seu desempenho é muito ruim em algumas redes, e normalmente é menos preferida em relação à que vamos mostrar a seguir.

Page 14: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Algoritmos para Caminho de AumentoA próxima idéia na simplicidade é uma usar uma

busca em largura. Sabemos que esta pesquisa normalmente retorna o

caminho mais curto em um grafo não-ponderado. Essa era a base da idéia de Edmonds-Karp.

No psedo-código a seguir, nós iremos basicamente: Encontrar o menor caminho do source ao sink e

determinar a capacidade da aresta de menor capacidade desse caminho. Então, para cada aresta, ao longo do caminho, reduzimos a capacidade dela e aumentarmos a capacidade da aresta oposta.

Page 15: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Algoritmos para Caminho de Aumento

Page 16: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Algoritmos para Caminho de Aumento

Page 17: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Algoritmos para Caminho de AumentoComo podemos ver, isto é muito fácil de

implementar.Devido ao O(E) da execução da Busca em

Largura (implementada com listas de adjacência), o pior caso do algoritmo é O (V*E²), mas, geralmente, o algoritmo roda num tempo muito melhor.

Page 18: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Problemas RelacionadosComo reconhecer problemas de fluxo

máximo? Muitas vezes eles são difíceis de detectar.

Geralmente, precisamos prestar muita atenção nas restrições quando achamos que temos uma solução baseada em fluxo máximo - que deve, pelo menos, sugerir uma solução O(N³). Se o número de vértices é grande, um outro algoritmo (como a programação dinâmica ou o guloso), pode ser mais adequado.

Page 19: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Problemas RelacionadosProblema 1:

A descrição do problema poder sugerir múltiplos sources e/ou múltiplos sinks.

Page 20: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Problemas RelacionadosProblema 1:

A descrição do problema poder sugerir múltiplos sources e/ou múltiplos sinks.

Page 21: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Problemas RelacionadosProblema 2:

E se também fosse dado o número máximo de caminhões que podem passar através de cada uma das cidades do país (exceto as cidades onde a fábrica e o centro de distribuição estão localizados)? Em outras palavras, se tivermos de lidar com a capacidade dos vértices também.

Page 22: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Problemas RelacionadosProblema 2:

E se também fosse dado o número máximo de caminhões que podem passar através de cada uma das cidades do país (exceto as cidades onde a fábrica e o centro de distribuição estão localizados)? Em outras palavras, se tivermos de lidar com a capacidade dos vértices também.

Page 23: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Problemas RelacionadosProblema 3:

E se, além das capacidades nas cidades, as estradas se tornarem não-direcionadas?

Page 24: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Problemas RelacionadosProblema 3:

E se, além das capacidades nas cidades, as estradas se tornarem não-direcionadas?

Page 25: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Emparelhamento Máximo em Grafos BipartidosEsta é uma das mais importantes aplicações

de fluxo máximo, e muitos problemas podem ser reduzidos a ela. O emparelhamento em um grafo bipartido é um conjunto de arestas tal que nenhum vértice é tocado por mais de uma aresta. Obviamente, um emparelhamento com máxima cardinalidade é um emparelhamento máximo. Para um grafo geral, este é um problema bem mais difícil de resolver.

Page 26: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Emparelhamento Máximo em Grafos BipartidosA redução para fluxo máximo é bem simples,

vamos a um exemplo:Seja o grafo bipartido: o primeiro conjunto de

vértices de empregados, enquanto o segundo contém um conjunto de trabalhos a ser feito. Existe uma aresta de um empregado para cada um dos trabalhos que podem ser atribuídos a ele.

Page 27: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Emparelhamento Máximo em Grafos BipartidosAo ver o grafo, percebemos que este

problema é semelhante a encontrar o fluxo máximo num grafo de múltiplos sources e multiplos sinks, que já resolvemos.

Page 28: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Algoritmo de Hopcroft-KarpAgora descreveremos um algoritmo mais

rápido. A sua complexidade é .

Dado um grafo bipartido não-direcionado G(X,Y), seja M um emparelhamento em G. Dizemos que um caminho simples P em G é um caminho de aumento com respeito a M se ele começa em um vértice não emparelhado em X, termina em um vértice não emparelhado em Y e suas arestas pertencem alternadamente a M e a M.

Page 29: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Algoritmo de Hopcroft-KarpAqui está ele:

Page 30: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

Algoritmo de Hopcroft-KarpProblema 1:

Precisamos de um algoritmo O(E) para encontrar um conjunto máximo de caminhos disjuntos de aumento, P1, P2, P3,...

Problema 2:Mostrar que o número máximo de iterações do

algoritmo é 2 . E concluir que o tempo de execução total do Hopcroft-karp é

Page 31: {djcs, hcs}@cin.ufpe.br Diêgo João Costa Santiago Hallan Cosmo dos Santos

ReferênciasCormen, Thomas H.; Leiserson, Charles E.;

Rivest, Ronald L.; Stein, Clifford (2001). Introduction to Algorithms, second edition, MIT Press and McGraw-Hill.

www.wikipedia.comwww.topcoder.com/tc