Algoritmos Gulosos em Grafos

14
Algoritmos Gulosos em Grafos Katia S. Guimarães [email protected]

description

Algoritmos Gulosos em Grafos. Katia S. Guimarães [email protected]. Algoritmo Distâncias com Pesos. Quando o grafo tem peso nas arestas, D(v, w) é a menor soma dos pesos das arestas num caminho de v a w . Note que, nessas circunstâncias, o algoritmo de busca em largura - PowerPoint PPT Presentation

Transcript of Algoritmos Gulosos em Grafos

Page 1: Algoritmos Gulosos em Grafos

Algoritmos Gulosos em Grafos

Katia S. Guimarã[email protected]

Page 2: Algoritmos Gulosos em Grafos

[email protected] 2

Algoritmo Distâncias com Pesos

Quando o grafo tem peso nas arestas,D(v, w) é a menor soma dos pesos das arestas num caminho de v a w.

Note que, nessas circunstâncias, o algoritmo de busca em largura já não resolve.

1

6 4 5

2 3

7

5 43

2

2

68

6

Page 3: Algoritmos Gulosos em Grafos

[email protected] 3

Algoritmo Distâncias com Pesos

Abordagem Algoritmo Guloso (Indução)

- Inicialmente, só é conhecida uma solução trivial, para 0 ou 1 elemento do conjunto (no caso,D(v, v)). Marcar v.

- A cada iteração, um elemento não marcado w é escolhido, baseado numa solução mínima local. w é marcado e incluído no conjunto dos elementos para os quais a solução é conhecida.

Page 4: Algoritmos Gulosos em Grafos

[email protected] 4

Algoritmo Distâncias com Pesos

Abordagem Algoritmo Guloso (Indução)

- Para todo v V faça { Desmarcar v; D[v] = }- D[s] = 0 /* Base da indução */- Enquanto vértice não marcado faça /* Passo */

Seja v o vértice não marcado com D[v] mínimo (mínima local)

Marque v; Para todo w Adj(v) faça Se D[v] + custo (v,w) < D[w]

então D[w] D[v] + custo (v,w)

Page 5: Algoritmos Gulosos em Grafos

[email protected] 5

Algoritmo Distâncias com Pesos

Dijkstra - Java Applet

Page 6: Algoritmos Gulosos em Grafos

[email protected] 6

Algoritmo Distâncias com Pesos

Abordagem Algoritmo Guloso (Indução)

- Os vértices são marcados em ordem crescente de distância com relação ao vértice s.

- É construída uma árvore, chamada Árvore de Distâncias de s,

onde aparecem apenas as arestas que constituem os menores caminhos de s a cada um dos vértices do grafo.

Page 7: Algoritmos Gulosos em Grafos

[email protected] 7

Distâncias com Pesos - Implementação

Para selecionar o mínimo D, usar um heap.

Ter o cuidado de não fazer remoção no heap quando um novo custo for associado a um vértice.

Para representar a árvore de distâncias, guardar, para cada vértice v, apenas a última aresta do caminho mínimo de s a v.

Page 8: Algoritmos Gulosos em Grafos

[email protected] 8

Inicialização - O(|V|)

Loop - O((|V| + |E|) log|V|)

Existem |V| remoções do heap (extrair o mínimo) Existem no máximo |E| atualizações (cada aresta só é analisada uma vez)

Custo Total: O((|V| + |E|) log|V|)

Algoritmo Distâncias com Pesos Complexidade

Page 9: Algoritmos Gulosos em Grafos

[email protected] 9

Árvore Geradora de Peso Mínimo

Abordagem Algoritmo Guloso (Indução)

OBJETIVO: Construir uma árvore de forma a manter o grafo conexo (há um caminho entre quaisquer dois vértices) porém a um custo mínimo.

- Inicialmente, tomamos um vértice v qualquer. Marcar v.

- A cada iteração, um elemento não marcado w é escolhido, baseado numa solução mínima local (mínimo custo de agregar um vértice à árvore corrente).

Page 10: Algoritmos Gulosos em Grafos

[email protected] 10

Algoritmo AGPM

Abordagem Algoritmo Guloso (Indução)

- Para todo v V faça { Desmarcar v; D[v] = }- D[s] = 0 /* Base da indução */- Enquanto vértice não marcado faça /* Passo */

Seja v o vértice não marcado com D[v] mínimo (mínima local)

Marque v; Para todo w Adj(v) faça Se custo (v,w) < D[w]

então D[w] custo (v,w)

Page 12: Algoritmos Gulosos em Grafos

[email protected] 12

Considerando uma implementação com Heap, temos:

Construção do heap - O(|V|)

Loop - O(|V| log|V| + |E|log|V|) = O(|E|log|V|)

Custo Total: O(|E|log|V|)

Algoritmo PRIM - Complexidade

Page 13: Algoritmos Gulosos em Grafos

[email protected] 13

Árvore Geradora de Peso MínimoAlgoritmo de Kruskal

AGPM-Kruskal(G,w)

1. A = 2. Para cada vértice v V(G) faça3. Make-Set(v)4. Ordene as arestas de E por peso (não-decresc = ND)5. Para cada aresta (u,v)E em ordem ND de peso faça6. se Find-Set(u) Find-Set(v)7. então A = A {(u,v)}8. Union(u,v) 9. retorne A

Page 14: Algoritmos Gulosos em Grafos

[email protected] 14

Considerando uma implementação de conjunto disjunto com compressão de caminhos, por exemplo:

Inicialização – O(|V|)

Ordenação de arestas – O(|E|log|E|)

Operações sobre o conjunto disjunto – O(|E|log|E|)

Custo Total: O(|E|log|E|)

Algoritmo Kruskal - Complexidade