Ford Fulkerson Teoria dos Grafos.

Slides:



Advertisements
Apresentações semelhantes
Algoritmos de Caminho Mínimo em Grafos
Advertisements

Grafos eulerianos 1.
Cortes (cut-sets)‏ 1.
Grafos Orientados (digrafos)
Algoritmo de Caminho Mínimo
Árvores 2010/1 Teoria dos Grafos (INF 5037/INF2781)
CC/EC/Mestrado Teoria dos Grafos Grafos Hamiltonianos.
Árvores CC/EC/Mestrado Teoria dos Grafos ‏ 1.
2010/1 Teoria dos Grafos (INF 5037/INF2781) Grafos eulerianos.
Grafo k-conexo Seja k um inteiro positivo. Diz-se que um grafo G é k-conexo em vértices quando não existe corte de vértices de tamanho menor que k Analogamente,
2010/1 Teoria dos Grafos (INF 5037/INF2781) Grafos Hamiltonianos.
Algoritmos em Grafos (Parte 2)
Prof. M.Sc. Fábio Francisco da Costa Fontes Maio
Teoria dos Grafos – Aula 2
Teoria dos Grafos Loana Tito Nogueira.
Celso C. Ribeiro Caroline T. Rocha
Fluxo em Redes Prof. Ricardo R. Santos.
O Problema do Passeio mais Curto
Exercícios PAA- Grafos
Celso C. Ribeiro Caroline T. Rocha
CC/EC/Mestrado/UFES Teoria dos Grafos (INF 5037/INF2781) Grafos Orientados (digrafos)
Cortes (cut-sets)‏ 2010/2 Teoria dos Grafos (INF 5037/INF2781)‏ 1.
Pontes Seja (G) o número de componentes conexas de G. Uma ponte é uma aresta a tal que (G - a) > (G)
Percursos em um grafo 2010/1 Teoria dos Grafos (INF 5037/INF2781)
UFES CC/EC/Mestrado Teoria dos Grafos Árvores. UFES CC/EC/Mestrado Teoria dos Grafos Árvores Grafo Acíclico: não possui ciclos.
2010/1 Teoria dos Grafos (INF 5037/INF2781) Grafos eulerianos.
CC/EC/PPGI/UFES CC/EC/MestradoTeoria dos Grafos Algoritmo de Caminho Mínimo.
Conectividade e Separabilidade
Grafo k-conexo Seja k um inteiro positivo. Diz-se que um grafo G é k-conexo em vértices quando não existe corte de vértices de tamanho menor que k.
Análise e Síntese de Algoritmos
Grafos Grafo G = (V, E) V — conjunto de vértices
Problemas de fluxo numa rede
Fonte, Sumidouro, Capacidade e Fluxo
Teoria dos Grafos – Aula 6
Teoria dos Grafos – Aula 3 Árvores
Teoria dos Grafos Loana T. Nogueira Aula 5.
Grafos – Parte 1 Projeto e Análise de Algoritmos Aline Vasconcelos
Grafos - Definições Preliminares - Formas de Representação
Pesquisa Operacional - Profa Úrsula L. F. Ribeiro
* Este material está baseado no capítulo 4 do livro An Introduction to Distributed Algorithms, Valmir C. Barbosa, MIT Press, 1996.
Caminho Hamiltoniano ... em um grafo é o caminho que visita
O problema do emparelhamento máximo
José Garcia Vivas Miranda
Problemas de fluxo em grafos 1º semestre/2012 Prof. André Renato
Teoria dos Grafos Conectividade
Monitoria de Matemática Discreta
Fluxo Máximo e Empalhemento Algoritmos 2 – IF775
ÁRVORES Def.: Um grafo é acíclico se não possui ciclos.
Aluno: João Ferreira Orientador: Paulo Maciel Algoritmo baseado no de Ford e Fulkerson para otimizar a distribuição de energia em modelos EFM.
Grafos Planares Victor Cândido da Silva
Algoritmos de Fluxo Máximo
Algoritmo de PRIM para MST
Conexidade 1.
Msc. Daniele Carvalho Oliveira
CAMINHOS MAIS CURTOS EM GRAFOS
Algoritmos para Obtenção de Árvore Geradora Mínima
Introdução a Algoritmos em Grafos.
Mestrado em Informática
Exercícios de Fluxo em Redes
Celso C. Ribeiro Caroline T. Rocha
Grafos e Teoria da Complexidade Professor: Fabio Tirelo
FLUXOS EM REDES.
Teoria de Grafos. Tudo começou no século XVIII, na cidade medieval de Königsberg, situada no leste europeu. Königsberg é banhada pelo rio Pregel, que.
 Prof. Miguel Gabriel Prazeres de Carvalho 1. 2 Redes Sociais GPS Para o correio. Para Viajantes. Pesquisas Biológicas. Distribuição de Tarefas. Recomendações.
Grafos Prof. Miguel Gabriel Prazeres de Carvalho.
Grafos e Teoria da Complexidade Professor: Fabio Tirelo
1 UNIVERSIDADE CATÓLICA DE PELOTAS Escola de Informática Programa de Pós-Graduação em Informática Mestrado em Ciência da Computação Algoritmos de Fluxo.
MODELOS DE GRAFOS. Grafos de Euler Algoritmo de Fleury Atribuído ao francês M. Fleury, que o terá publicado em Além da ligação a este algoritmo.
Algoritmo de Ford-Fulkerson
Algoritmo de Johnson Estrutura de Dados II
Transcrição da apresentação:

Ford Fulkerson Teoria dos 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 conexo, |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) 

Descrição do algoritmo FORD-FULKERSON(G,s,t) 1 for cada aresta (u,v) <- E[G] 2   do f[u,v] <- 0 3        f[v,u] <- 0 4 while existir um caminho p de s até t na rede residual Gf 5     do cf(p) <- min{cf(u,v) : (u,v) está em p} 6          for cada aresta (u,v) em p 7               do f[u,v] <- f[u,v] + cf(p) 8                   f[v,u] <- (-f[u,v])

Aplicativos para grafos - Graphviz

Aplicativos para grafos - Graphviz

Aplicativos para grafos

Aplicativos web para grafos http://www.cs.pitt.edu/~kirk/cs1501/animations/Network.html

Aplicativos web para grafos http://www.ibiblio.org/links/applets/appindex/graphtheory.html

Exemplo Animado - Passo 1

Exemplo Animado - Passo 2

Exemplo Animado - Passo 3

Exemplo Animado - Passo 4

Exemplo Animado - Passo 5

Exemplo Animado - Passo 6

Exemplo Animado - Passo 7

Exemplo Animado - Passo 8

Exemplo Animado - Passo 9

Exemplo Animado - Passo 10

Exemplo Animado - Passo 11

Exemplo Animado - Passo 12

Exemplo Animado - Passo 13

Exemplo Animado - Passo 14

Exemplo Animado - Passo 15

Exemplo Animado - Passo 16

Exemplo Animado - Passo 17

Exemplo Animado - Passo 18

Exemplo Animado - Corte 1 - 1

Exemplo Animado - Corte 1 - 2

Exemplo Animado – Corte 2

Exemplo Animado – Corte 3   Fluxo Máximo = 19 = Corte Mínimo

Complexidade do algoritmo    O algoritmo usando Busca por Profundidade tem complexidade O(E|f*|): Para encontrar o caminho na rede residual O(E) Processo de aumento do fluxo, enquanto houver um caminho aberto na rede residual, incrementa pelo menos uma unidade o fluxo até o limite do fluxo máximo O(|f*|).  O Algoritmo só funciona se todos os pesos forem inteiros. Do contrário, é possível não convergir para o valor máximo.

Descrição das estruturas de dados consideradas As estruturas de dados consideradas para avaliação e desempenho do algoritmo de Ford-Fulkerson foram: Lista de Adjacência Árvore Hash

Hash Estrutura de dados que associa chaves de pesquisa a valores, objetivando, a partir de uma chave simples, fazer uma busca rápida e obter o valor desejado. A implementação típica busca uma função de dispersão que seja de complexidade O(1), não importando o número de registros na tabela (desconsiderando colisões). O ganho com relação a outras estruturas associativas (como um vetor simples) passa a ser maior conforme a quantidade de dados aumenta.

Funcionamento do Hash A função de dispersão é a responsável por gerar um índice a partir de determinada chave.  O ideal para a função de espalhamento é que sejam sempre fornecidos índices únicos para as chaves de entrada. A função perfeita seria a que, para quaisquer entradas A e B, sendo A diferente de B, fornecesse saídas diferentes. Quando as entradas A e B são diferentes e, passando pela função de espalhamento, geram a mesma saída, acontece o que chamamos de colisão. Na prática, funções de espalhamento perfeitas ou quase perfeitas são encontradas apenas onde a colisão é intolerável (por exemplo, nas funções de dispersão da criptografia), ou quando conhecemos previamente o conteúdo da tabela armazenada. Nas tabelas de dispersão comuns a colisão é apenas indesejável, diminuindo o desempenho do sistema.

Exemplo de Armazenamento com Hash Podemos armazenar uma lista telefônica em um vetor e criar uma função de espalhamento que funcionasse de acordo com o seguinte critério: devolver um valor distinto para cada letra inicial do nome distinta. Iniciando de 0 para a letra 'A', até 25 para a letra 'Z' Uma colisão ocorre quando dois registros recebem o mesmo índice na tabela Hash.

Fator de Carga O desempenho da maioria dos métodos de resolução de colisão não depende diretamente do 'n' número de entradas armazenadas, mas depende fortemente da carga da tabela  fator, a razão 'n' / 's' entre 'n' e o tamanho da sua matriz 's'.  Com uma boa função hash, a média de custo de pesquisa é praticamente constante como aumento do fator de carga de 0 a 0,7 (cerca de 2 / 3) mais ou menos.  Além desse ponto, a probabilidade de colisões e os custos de lidar com eles aumenta. Por outro lado, como o fator de carga se aproxima de zero, a proporção da áreas não utilizadas nos aumentos de tabela de hash, mas não há necessariamente qualquer melhoria no custo de pesquisa, resultando em desperdício de memória.

Tratamento de Colisões Endereçamento aberto A informação é armazenada na própria tabela de dispersão.  Para a estratégia linear, é utilizada uma segunda função matemática para calcular a posição em que deve ser feita a próxima prova, a função de redispersão.  Na estratégia quadrática, para reduzir o agrupamento primário, procura-se por um lugar livre através da fórmula: h + n2, em que h representa o índice da colisão e n o sequencial de busca pela nova posição.

Tratamento de Colisões Encadeamento A informação é armazenada em estruturas encadeadas fora da tabela de dispersão. Encontra-se uma posição disponível na tabela e indicamos que esta posição é a que deve ser buscada em seguida. Os mais conhecidos: O encadeamento separado em que normalmente um registro aponta para uma lista encadeada em que são armazenados os registros em conflito. A inserção na tabela requer uma busca e inserção dentro da lista encadeada; uma remoção requer atualizar os índices dentro da lista, como se faria normalmente.  Método de endereçamento aberto os registros em conflito são armazenados dentro da própria tabela. A resolução das colisões é realizada através de buscas padronizadas dentro da própria tabela. A Dispersão Dupla, forma mais complexa de implementar o endereçamento aberto, cria uma nova função de espalhamento que resolva o novo conflito.

Limitações A tabela de dispersão é uma estrutura de dados do tipo dicionário, que não permite armazenar elementos repetidos, recuperar elementos seqüencialmente (ordenação), nem recuperar o elemento antecessor e sucessor.  Para otimizar a função de dispersão é necessário conhecer a natureza da chave a ser utilizada. No pior caso, a ordem das operações pode ser O(N), caso em que todos os elementos inseridos colidirem. As tabelas de dispersão com endereçamento aberto podem necessitar de redimensionamento.

Estrutura - Árvore Árvore rubro-negra (não é flamenguista) Estrutura original foi inventada em 1972 por Rudolf Bayer   artigo de 1978 por Leonidas J. Guibas e Robert Sedgewick, onde ganhou esse nome   pode-se buscar, inserir, e remover em tempo O(log n) É uma arvore binária, que se balanceia dinâmicamente

Estrutura - Árvore Um nó é vermelho ou preto A raiz é preta. (A raiz pode sempre ser alterada de vermelho para preto, mas não sendo válido o oposto,.) Todas as folhas são nulas e são pretas Ambos os filhos de todos os nós vermelhos são pretos Todo caminho de um dado nó para qualquer de seus nós folhas descendentes contem o mesmo número de nós pretos

Estrutura - Lista Encadeada Uma lista encadeada é uma representação de uma sequência de objetos na memória do computador. Cada elemento da sequência é armazenado em uma célula da lista: o primeiro elemento na primeira célula, o segundo na segunda e assim por diante. Uma Lista Encadeada  (= linked list = lista ligada)  é uma sequência de células: cada célula contém um objeto de algum tipo e o endereço da célula seguinte.   

Explicação das implementações considerando cada estrutura de dado escolhida Java.util.Map<K,V> Java.util.HashMap<K,V> Java.util.TreeMap<K,V> ListaAdj<K,V>

Apresentação dos Resultados Estrutura de Dados Esparsidade 50 100 200 300 500 1000 HashMap 00% 0,405 4,992 55,416 177,73 856,992 8117,287 40% 0,151 1,752 20,228 31,46 293,868 2657,641 80% 0,026 0,057 0,233 5,293 29,723 259,787 TreeMap 0,421 4,727 53,617 204,947 978,932 8670,662 0,171 1,565 20,862 74,74 309,582 3052,514 0,036 0,26 1,575 8,471 36,92 344,433 HashMap Nominado 0,182 1,617 15,912 194,912 842,682 8388,098 0,078 0,785 9,531 68,13 177,902 1797,663 0,015 0,072 1,237 7,155 22,854 165,935 AMD Turion X2 2GHz 4GB Memória Windows 7

Grafo Completo - Esparsidade 0%

Grafo Denso - Esparsidade 40%

Grafo esparso - Esparsidade 80%

Resultados Densos Intel Centrino Duo 1.6Gh 2GB Memória Ram 50 100 200 300 400 500 600 700 Árvore 0,482 2,639 35,623 142,748 706,187 1185,395 2149,697 Hash 0,453 2,557 24,532 93,892 501,502 962,985 1985,005 L. Adj 0,563 2,06 41,14 152,389 457,512 749,336 1611,091 2415,765 800 900 1000 1100 1200 1300 1400 1500 Árvore 2970,248 4392,804 5648,012 7723,679 10002,078 11789,555 13919,365 18194,72 Hash 3007,014 3457,458 5325,752 7910,981 10247,536 12816,059 15540,319 L. Adj 4069,375 29321,941    Intel Centrino Duo 1.6Gh 2GB Memória Ram Ubuntu 11.04

Gráfico de Hash alterando nomenclatura

Conclusões O custo computacional para o algoritmo de Ford-Fulkerson, é muito elevado em virtude da sua complexidade, diretamente associada ao número de arcos no grafo.  Sua performance pode ser melhorada dependendo da estrutura de dados selecionada.  Um eficiente algoritmo de hash pode ampliar ainda mais esta performance.

Pesquisas Futuras Estudo aprofundado sobre a nomenclatura inferindo na agilidade de tabelas hash - java.util.HashMap