Você está na página 1de 24

ALGORITMOS GULOSOS

Prof. Saulo Queiroz, UTFPR-PG


Preliminares
 Seja x uma instância de “tamanho” n de uma classe de problema de otimização
 Em x é possível identificar uma ou mais sub-instâncias de tamanho menor que n
 Ex. Problema da parentização com matrizes A.B.C.D (n=4) contêm duas sub-instâncias n=3: A.B.C e
B.C.D
 Sub-estrutura ótima
 A solução ótima de uma instância de problema de tamanho n implica na solução ótima das instâncias
menores que o compõe
 Como Programação Dinâmica (PD) explora a sub-estrutura ótima do problema
 Exemplo: Parentização ótima da sequência de matrizs ABCD (n=4)
 Calcule a solução ótima de todas as (sub-)instâncias de tamanho n=3
 Dentre todas as respostas para n=3 escolha aquela que acarretará na resposta de menor custo para
n=4
 Quando o total de sub-instâncias distintas é exponencial em n, PD torna-se proibitivo (i.e. muito caro)
Algoritmos Gulosos: Introdução
 Explora uma propriedade conhecida do problema
para alcançar a solução ótima sem precisar calcular o
custo de todas as suas sub-instâncias.
 Tenta chegar à solução ótima explorando características do
problema
 Comum para problemas de otimização com sub-
estrutura ótima
 Ex.: árvore geradora mínima
Componentes de um Algoritmo Guloso
 Conjunto solução
 Mantêm sub-soluções para cada sub-instâncias da instância de problema original
 Aumenta a cada passo do algoritmo até que a instância de problema inicial dada seja
resolvida
 Ao final do algoritmo deve conter a solução do problema
 Função de seleção
 Indica o candidato mais promissor para ser adicionado ao conjunto solução em um dado
instante
 Pode não fornecer a solução ótima global (nesse caso é uma heurística)
 Apesar disso nunca re-considera uma escolha (salva tempo)
 Quando: escolha gulosa + conjunto solução corrente é ótima, então a estratégia
gulosa (EG) dará a resposta ótima para o problema!
Algoritmo genérico
 Fonte: Projeto de algoritmos, Nívio Ziviani
Árvore Geradora Mínima (AGM)
 Dados:
 Grafo conexo não dirigido G=(V,A)
 w(u,v), peso da aresta (u,v) de A

 Encontre:
 um subconjunto S de A que conecte todos os vértices de V
 w(S), i.e. soma dos pesos de cada aresta selecionada seja
mínimo
AGM via algoritmos gulosos
 Candidatos: arestas que apresentam pesos
 Função seleção
 Deve explorar alguma propriedade do problema para
conseguir AG ótima sem precisar calcular todas as
possíveis AGs para então escolher a melhor.
 Noção de "corte"
Algoritmo Guloso para AGM

 Como selecionar um arco "seguro"?


Projetando função de seleção ótima
 Todo vértice deve aparecer na AGM T
 G(V,A): Grafo instância do problema
 V’V: cj. de vértices já presentes em T
 V-V’: cj. de vértices ainda ausentes em T
 A’: cj. de arestas presentes em T
 i.e. seus dois vértices estão em T
 (V′, V − V′): Corte que “respeita” A’
 Cj. de arestas em que só um vértice está em T. Ex.: (x,y), (v,u)
 Propriedade: A aresta (u,v) de menor peso do corte deve
ser selecionada em cada iteração do algoritmo;
 Sub-estrutura ótima: Ao selecionar (u,v), obtemos a AGM para
a sub-instância G’ de G, i.e., G’=(V’  {v}, A’ {(u,v)})
Prova Propriedade para AGM
 Seja T a árvore ótima para G tal que (u,v) A’
 Suponha que uma aresta (x,y) que cruza o corte (V′, V − V′) com
peso w(x,y) seja selecionada no lugar de (u,v)
 Como T contém todos os vértices de V, v é alcançável em T por um
caminho p que passa em y.
 Seja w(T) o peso final da árvore T
 Trocar (x,y) por (u,v) em T geraria a árvore T’
 Em T’ y é calcançado pela caminho p a partir de v
 Seja w(T’) o peso de T’, então temos:
 w(T’) = w(T) – w(x,y) + w(u,v)
 w(T’) = w(T) – c, c≥0 dado que w(x,y) ≥ w(u,v)
 w(T’) ≤ w(T), logo escolher a aresta (u,v) de menor peso do corte
leva à solução ótima (ou AGM).
Algoritmo PRIM: Aspectos Básicos
 Elementos chaves do algoritmo para todo vértice v
 Seja v um elemento ainda não adicionado à AGM
 chave[v]: custo da melhor aresta atualmente conhecida pelo
algoritmo e que "toca" v.
 pai[v]: vértice que forma aresta de custo chave[v] com v

Arestas ainda desconhecidas


Pai[v] v Pelo algoritmo

w(pai[v],v)=chave[v]
Algoritmo PRIM: Aspectos Básicos
 Estratégia Gulosa para selecionar uma aresta para o
conjunto solução:
 Mantenha todos os vértices v ordenados pelo seu valor
chave[v], mesmo após alterá-los durante execução
 Extraia o vértice com menor valor chave[v] e adicione-o à
AGM
 Selecione a aresta entre v seu vizinho u com menor chave[u]
 Adicione u à AGM e (v,u) pertencerá ao conjunto solução.
Exemplo
 Fonte: http://www.ic.unicamp.br/~meidanis/courses/mo417/2003s1/aulas/2003-05-16.html
Inicializa chave[] de todo v com infinito
chave[raiz]=0
Ordene todo v numa fila Q por valor de chave
Extraia v com menor chave[]
 v já faz parte da AGM
 Tenta atualizar chave[]
 de todo vizinho u de v
 bem como pai[u], (não ilustrado)

 Seleção gulosa: Menor v a ser extraído na próxima


 Iteração formará aresta escolhida
Exemplo
 Fonte: http://www.ic.unicamp.br/~meidanis/courses/mo417/2003s1/aulas/2003-05-16.html
Exemplo
 Fonte: http://www.ic.unicamp.br/~meidanis/courses/mo417/2003s1/aulas/2003-05-16.html
Exemplo
 Fonte: http://www.ic.unicamp.br/~meidanis/courses/mo417/2003s1/aulas/2003-05-16.html
Exemplo
 Fonte: http://www.ic.unicamp.br/~meidanis/courses/mo417/2003s1/aulas/2003-05-16.html
Exemplo
 Fonte: http://www.ic.unicamp.br/~meidanis/courses/mo417/2003s1/aulas/2003-05-16.html
Forneça classe assintótica de pior caso
 Algoritmo-PRIM(G,w,r)
 1 para cada v em V[G] faça
 2 chave[v] := infinito Θ(|V|)
 3 pai[v] := NULO
 4 chave[r] := 0; pai[r]:=NULL; Θ(1)
 5 Q := V[G] // CONSTRÓI FILA ?? Ω(|V|)
 6 enquanto Q != {} faça O(V)
 7 v := EXTRÁI-MIN(Q) ? O(Fextrái(|V|))
 8 para cada u em Adj[v] faça O(|A|)
 9 se u pertence a Q e w(v,u) < chave[u] então ? O(Fpesquisa(|V|))
 10 pai[u] := v
 11 chave[u] := w(v,u) ? O(Fatualiza(|V|))

Θ(V)+Θ(1)+Ω(V)+O(V){O(Fextrái(V))+O(A)x[O(Fpesquisa(V))xO(Fatualiza(|V|))]}
Implementando a fila de prioridades Q

 Para heaps binários a classe O() do Prim fica:


 O(VlogV + V.A.log(V))=O(V.A.log(V)). Certo???
Implementando a fila de prioridades Q
 Prim O(V.A.log(V)) ???
 Seria se as quantidades dos loops 6 e 8, fossem independentes. Em grafos,
vértices e arestas estão intimamente relacionados.
 V x A implicaria que uma dada aresta (u,v) está conectada a até |V| nós
quando na verdade só está a dois, u e v.
 Em todos os acessos da linha 8, cada aresta só pode ser acessada no máximo 2 vezes,
uma por u, e outra por v (ou somente 1 vez para grafos direcionais). Nenhum outro
vértice x consegue acessar (u,v).
 Assim é impossível a linha 8 ser acessada mais que 2|A|+|V|. Das quais
apenas 2|A| o teste lógico dará verdadeiro acessando as linhas 9-11.
 Das linhas 7 e 9-11 temos O(VlogV + 2*A.log(V))= O(A logV)
 Usando heaps de Fibonacci temos O(VlogV + A).
Exercício
 Liste a sequencia de arestas selecionadas pelo
algoritmo de Prim para obter a AGM do grafo
abaixo. Considere a aresta e como raiz.
Exercício
 A complexidade do algoritmo de Prim depende da
estrutura de dados para implementa a fila Q.
 Pesquise que estruturas de dados podem ser
usadas nesse sentido. Para cada uma delas,
obtenha a complexidade final do algoritmo de
Prim.
Exercícios
 Pesquise sobre o algoritmo Kruskal para obtenção
de AGM.
 Qual o paradigma usado?
 Informe que trechos do algoritmo evidenciam seu
paradigma
 Analise a complexidade de pior caso.

Você também pode gostar