A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Ford Fulkerson Teoria dos Grafos.

Apresentações semelhantes


Apresentação em tema: "Ford Fulkerson Teoria dos Grafos."— Transcrição da apresentação:

1 Ford Fulkerson Teoria dos Grafos

2 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) 

3 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])

4 Aplicativos para grafos - Graphviz

5 Aplicativos para grafos - Graphviz

6 Aplicativos para grafos

7 Aplicativos web para grafos

8 Aplicativos web para grafos

9 Exemplo Animado - Passo 1

10 Exemplo Animado - Passo 2

11 Exemplo Animado - Passo 3

12 Exemplo Animado - Passo 4

13 Exemplo Animado - Passo 5

14 Exemplo Animado - Passo 6

15 Exemplo Animado - Passo 7

16 Exemplo Animado - Passo 8

17 Exemplo Animado - Passo 9

18 Exemplo Animado - Passo 10

19 Exemplo Animado - Passo 11

20 Exemplo Animado - Passo 12

21 Exemplo Animado - Passo 13

22 Exemplo Animado - Passo 14

23 Exemplo Animado - Passo 15

24 Exemplo Animado - Passo 16

25 Exemplo Animado - Passo 17

26 Exemplo Animado - Passo 18

27 Exemplo Animado - Corte 1 - 1

28 Exemplo Animado - Corte 1 - 2

29 Exemplo Animado – Corte 2

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

31 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.

32 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

33 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.

34 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.

35 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.

36 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.

37 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.

38 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.

39 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.

40 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

41 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

42 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.   

43 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>

44 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

45 Grafo Completo - Esparsidade 0%

46 Grafo Denso - Esparsidade 40%

47 Grafo esparso - Esparsidade 80%

48 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

49 Gráfico de Hash alterando nomenclatura

50 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.

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


Carregar ppt "Ford Fulkerson Teoria dos Grafos."

Apresentações semelhantes


Anúncios Google