Você está na página 1de 0

Estratgia Gulosa

Tcnicas de Projeto de Algoritmos


Aula 14
Alessandro L. Koerich
Ponti f ci a Uni ver si dade Catli ca do Par an (PUCPR)
Cincia da Computao 7
o
Perodo
Engenharia de Computao 5
o
Perodo
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 2 alekoe@computer.org
Introduo
Programa do PA
Tcnicas de Projeto de
Algoritmos
Fundamentos da Anlise
da Eficincia de Algoritmos
1. Resoluo de Problemas e
Tipos de Problemas
2. Fundamentos
3. Notao Assinttica e
Classe de Eficincia
5. Anlise Emprica de
Algoritmos
6. Fora Bruta
7. Dividir & Conquistar
4. Anlise Matemtica de
Algoritmos
8. Decrementar & Conquistar
9. Transformar & Conquistar
11. Programao Dinmica
12. Estratgia Gulosa
13. Backtracking & Branch and
Bound
14. Algoritmos Aproximados
Limitaes
15. Teorema do Limite
Inferior
16. rvores de Deciso
17. Problemas P, NP e NPC
10. Compromisso Tempo-Espao
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 3 alekoe@computer.org
Aulas Anteriores
Estratgia Fora Bruta
Estratgia Dividir & Conquistar
Estratgia Reduzir & Conquistar
Estratgia Transformar & Conquistar
Estratgia Compromisso TempoEspao
Programao Dinmica
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 4 alekoe@computer.org
Plano de Aula
Introduo
Algoritmos de Prime Kruskal
Algoritmo de Dijkstra
Estratgia Gulosa
Problema da Mochila
Cdigo de Huffman
Resumo
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 5 alekoe@computer.org
Introduo
Similar a programao dinmica
Utilizada para problemas de otimizao
Idia: Quando temos uma escolha a fazer,
fazemos aquela que parea ser a melhor no
momento.
Ou seja, fazemos uma escolha tima local, na
esperana de obter uma soluo tima global.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 6 alekoe@computer.org
Introduo
Os algoritmos gulosos nem sempre levam a
uma soluo tima, mas as vezes sim. Veremos
alguns problemas para os quais eles levam.
Ento, veremos algumas caractersticas gerais
de quando os algoritmos gulosos fornecem
solues timas.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 7 alekoe@computer.org
Introduo
uma tcnica que aplicvel somente a
problemas de otimizao.
A soluo gulosa sugere construir uma soluo
atravs de uma seqncia de passos, cada um
expandindo uma soluo parcialmente
construda at o momento, at uma soluo
completa para o problema ser obtida.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 8 alekoe@computer.org
Introduo
Em cada passo e este o ponto central desta
tcnica a escolha deve ser feita:
Possvel, i.e., deve satisfazer as restries do
problema
Localmente tima, i.e., deve ser a melhor escolha
local dentre todas as escolhas disponveis naquele
passo;
Irreversvel, i.e, uma vez feita, ele no pode ser
alterada nos passos subseqentes do algoritmo.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 9 alekoe@computer.org
Introduo
Estes requisitos explicam o nome da tcnica:
em cada passo ela sugere uma escolha gulosa da
melhor alternativa disponvel na expectativa
que uma seqncia de escolhas timas locais
levem a uma soluo tima global para o
problema como um todo.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 10 alekoe@computer.org
Exemplo: Linha de Montagem
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 11 alekoe@computer.org
Algoritmo de Prim
Dados n pontos, conecte-os da maneira mais
barata possvel de modo que haja um caminho
entre cada par de pontos.
Podemos representar os pontos pelos vrtices
de um grafo e as conexes possveis pelas
arestas e os custos de conexo pelos pesos das
arestas.
A questo pode ser formulada como o problema
da rvore de amplitude mnima.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 12 alekoe@computer.org
Algoritmo de Prim
Definio: Uma rvore de amplitude de um
grafo conectado seu subgrafo acclico
conectado (i.e. uma rvore) que contm todos
os vrtices do grafo.
Uma rvore de amplitude mnima de um grafo
conectado ponderado sua rvore de amplitude
de menor peso
O peso de uma rvore definido como a soma
dos pesos de todas suas arestas.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 13 alekoe@computer.org
Algoritmo de Prim
O problema da rvore de amplitude mnima
consiste em encontrar uma rvore de amplitude
mnima para um dado grafo ponderado
conectado.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 14 alekoe@computer.org
Algoritmo de Prim
Passo 1: Escolher um vrtice arbitrrio de V
Passo 2: Em cada iterao expandimos a
rvore atual de maneira gulosa, juntando a ela o
vrtice mais prximo que ainda no
pertencer a rvore
Por vrtice mais prximo consideramos um
vrtice ainda no na rvore, conectado a um
vrtice na rvore por um vrtice de menor peso.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 15 alekoe@computer.org
Algoritmo de Prim
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 16 alekoe@computer.org
Algoritmo de Prim
A cada vrtice no conectado na rvore atual,
devemos associar a aresta mais prxima que
conecta o vrtice a um vrtice da rvore.
Atribumos duas etiquetas ao vrtice
O nome do vrtice da rvore mais prximo
A distncia (peso) da aresta correspondente
Atribumos peso aos vrtices no adjacentes
Usando estas etiquetas, a tarefa de encontrar o
prximo vrtice a ser adicionado a rvore T =
<V
T
, E
T
> torna-se simples.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 17 alekoe@computer.org
Algoritmo de Prim
Aps identificarmos o vrtice u* a ser
adicionado a rvore, devemos realizar duas
operaes:
Mover u* do conjunto VV
T
para o conjunto de
vrtices da rvore V
T
.
Para os vrtices u remanescentes em VV
T
que sejam
conectados a u* por uma aresta mais curta de a
distncia atual de u, atualizar sua etiqueta por u* e o
peso da aresta entre u* e u respectivamente.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 18 alekoe@computer.org
Algoritmo de Prim
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 19 alekoe@computer.org
Algoritmo de Prim
O algoritmo de Primsempre leva a rvore de
amplitude mnima?
Sim. Ver prova no Livro.
Eficincia?
Depende das estruturas de dados utilizadas para
representar o grafo e a fila de prioridade do conjunto
VV
T
.
Se forem uma matriz de pesos e um arranjo no
ordenado respectivamente: (|V|
2
)
Se forem uma matriz de adjacncias e um minheap:
O (|E| log |V|)
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 20 alekoe@computer.org
Algoritmo de Kruskal
Constri uma rvore de amplitude mnima como uma
seqncia crescente de subgrafos que seja sempre
acclicos mas no necessariamente conectados nos
estgios intermedirios do algoritmo.
O algoritmo comea ordenando as arestas do grafo em
ordem crescente de pesos.
Ento, comeando com o subgrafo vazio, ele varre a
lista ordenada adicionando a prxima aresta na lista do
subgrafo atual se sua incluso no cria um ciclo
fechado.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 21 alekoe@computer.org
Algoritmo de Kruskal
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 22 alekoe@computer.org
Algoritmo Kruskal
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 23 alekoe@computer.org
Algoritmo Kruskal
O algoritmo de Kruskal leva ao mesmo grafo
produzido pelo algoritmo de Prim.
Kruskal parece mais simples, porm, em cada
iterao deve ser verificado se a adio da
aresta cria ou no um ciclo fechado.
O tempo de execuo dominado pelo tempo
necessrio para ordenar os pesos das arestas:
O (|E| log |E|)
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 24 alekoe@computer.org
Algoritmo Dij kstra
Problema dos caminhos mais curtos de
origem (fonte) nica: Para um dado vrtice,
chamado fonte, em um grafo ponderado
conectado, encontrar os caminho mais curtos a
todos os outros vrtices.
Algoritmo de Dijkstra: melhor algoritmo
conhecido. Aplicvel a grafos com pesos no
negativos.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 25 alekoe@computer.org
Algoritmo Dij kstra
Encontra os caminhos mais curtos de acordo
com a distncia a uma dada fonte
Primeiro, encontra o caminho mais curso da
fonte ao vrtice mais prximo dela. Em seguida,
para o segundo vrtice mais prximo e assim
por diante.
Em geral, antes da isima iterao iniciar, o
algoritmo j encontrou os menores caminhos
para os outros i1 vrtices prximos da fonte.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 26 alekoe@computer.org
Algoritmo Dij kstra
Estes vrtices, a fonte, e as arestas dos caminhos mais
curtos formam uma subrvore T
i
.
Como todos os pesos das arestas so no negativos, o
vrtice seguinte mais prximo da fonte pode ser
encontrado dentre os vrtices adjacentes aos vrtices de
T
i
.
Para identificar o isimo vrtice mais prximo, o
algoritmo calcula, para cada vrtice candidato u, a soma
da distancia ao vrtice da rvore v mais prximo e o
comprimento d
v
do caminho mais curto da fonte v e
ento seleciona o vrtice cuja soma seja a menor.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 27 alekoe@computer.org
Algoritmo Dij kstra
Cada vrtice possui duas etiquetas:
Um valor numrico d que indica o comprimento do
caminho mais curto da fonte ao vrtice encontrado
pelo algoritmo at o momento. Quando um vrtice
for adicionado a rvore, d indica o comprimento do
caminho mais curto da fonte at o vrtice.
A outra etiqueta indica o nome do prximo ao ltimo
vrtice neste caminho, i.e., o pai do vrtice na rvore
sendo construda.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 28 alekoe@computer.org
Algoritmo Dij kstra
Com estas etiquetas, encontrar o vrtice mais
prximo u* seguinte torna-se uma tarefa
simples que consiste em encontrar o vrtice
candidato com o menor valor de d.
Aps identificado o vrtice u* a ser adicionado a
rvore, as seguintes operaes devem ser
realizadas:
Mover o vrtice u* do vrtices candidatos para o
conjunto dos vrtices da rvore.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 29 alekoe@computer.org
Algoritmo Dij kstra
Para cada vrtice candidato remanescente u que
estiver conectado a u* por uma aresta de peso w(u*,
u) tal que d
u*
+ w(u*, u) < d
u
, atualize as etiquetas de
u por u* e d
u*
+ w(u*, u) respectivamente.
A mecnica similar do algoritmo de Prim.
Porm, Dijkstra compara comprimento de
caminhos.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 30 alekoe@computer.org
Algoritmo Dij kstra
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 31 alekoe@computer.org
Algoritmo Dij kstra
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 32 alekoe@computer.org
Algoritmo Dij kstra
A eficincia do algoritmo de Dijkstra depende
das estruturas de dados usadas na
implementao da fila de prioridade e do grafo.
Similar ao algoritmo de Prim.
Se forem uma matriz de pesos e um arranjo no
ordenado respectivamente: (|V|
2
)
Se forem uma matriz de adjacncias e um minheap:
O (|E| log |V|)
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 33 alekoe@computer.org
Estratgia Gulosa
A escolha que parece a melhor no momento
aquela que ns escolhemos
O que fizemos para a seleo dos vrtices ou
arestas para os algoritmos de Prim, Kruskal e
Dijkstra?
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 34 alekoe@computer.org
Estratgia Gulosa X PD
Programao Dinmica
Faa uma escolha a cada passo
A escolha depende do conhecimento das solues
timas para os subproblemas. Resolva subproblemas
primeiro.
Resolva bottom-up.
Algoritmo Guloso
Faa uma escolha a cada passo.
Faa a escolha antes de resolver os subproblemas.
Resolva top-down.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 35 alekoe@computer.org
Exemplo: Problema da Mochila
Problema da Mochila No Fracionria
(01):
n itens.
O item i vale $v
i
e pesa w
i
quilos.
Encontre o subconjunto mais valioso de itens com
peso total W.
Temos que ou pegar ou no pegar um item. No
podemos pegar somente uma parte dele.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 36 alekoe@computer.org
Estratgia Gulosa
Problema da Mochila Fracional
Podemos pegar uma frao de um item.
Ambos possuem uma subestrutura tima.
Mas o problema da mochila fracional tem a
propriedade da escolha gulosa, e o problema da
mochila 0-1 no tem.
Para resolver o problema fracional, ordenar itens
pelo valor/peso: v
i
/w
i
.
Seja v
i
/w
i
v
i+1
/w
i+1
para todo i.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 37 alekoe@computer.org
Estratgia Gulosa
FRACTIONAL-KNAPSACK(v,w,W)
load 0
i 1
while load < W and i n
do if wi W . load
then take all of item i
else take (W . load)/wi of item i
add what was taken to load
i i + 1
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 38 alekoe@computer.org
Estratgia Gulosa
Tempo: O(n lg n) para ordenar, O(n) da em
diante.
Algoritmo guloso no funcionada para o
problema da mochila 01. Pode obter espao
vazio, que reduz o valor mdio por quilo dos
itens escolhidos.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 39 alekoe@computer.org
Estratgia Gulosa
W = 50.
Soluo gulosa:
Escolhe itens 1 e 2.
Valor = 160, peso = 30.
Tem 20 quilos de capacidade restante.
Soluo tima:
Pega itens 2 e 3.
Valor = 220, peso = 50.
Nenhuma capacidade remanescente.
120 100 60 v
i
4 5 6 v
i
/w
i
30 20 10 w
i
3 2 1 i
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 40 alekoe@computer.org
Estratgia Gulosa
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 41 alekoe@computer.org
Cdigo de Huffman
Algoritmo Guloso de Huffman
Tcnica eficiente para a compresso de dados.
Utiliza uma tabela das freqncias de
ocorrncia dos caracteres para elaborar um
modo timo de representar cada caractere
como uma cadeia binria.
Ex. Armazenar compactamente uma arquivo de
dados com 100.000 caracteres
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 42 alekoe@computer.org
Cdigo de Huffman
Representando cada caractere:
por um cdigo de comprimento fixo (3 bits)
300.000 bits
por um cdigo de comprimento varivel 224.000
bits
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 43 alekoe@computer.org
Cdigo de Huffman
Cdigos de Prefixo
Cdigos nos quais nenhuma palavra de cdigo
tambm um prefixo de alguma outra palavra de cdigo.
A codificao simples: concatenao das palavras de
cdigo que representam cada caractere do arquivo.
Ex: codificao do arquivo de 3 caracteres abc como 0 .
101 . 100 = 0101100, onde . indica concatenao.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 44 alekoe@computer.org
Cdigo de Huffman
Cdigos de Prefixo
Como nenhuma palavra de cdigo um prefixo de
qualquer outra, a palavra de cdigo que inicia um
arquivo codificado, no ambgua.
Ex: A cadeia 001011101 = ????
O processo de decodificao precisa de uma
representao conveniente para o cdigo de prefixo, de
forma que a palavra de cdigo inicial possa ser extrada
com facilidade rvore Binria
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 45 alekoe@computer.org
Cdigo de Huffman
Cdigos de Prefixo
Se C o alfabeto do qual os caracteres so obtidos e
todas as freqncias de caracteres so positivas, ento a
rvore para um cdigo de prefixo timo tem exatamente
|C| folhas, uma para cada letra do alfabeto e
exatamente |C|1 ns internos.
Dada uma rvore T, para cada caractere c no alfabeto C,
seja f(c) a freqncia de c no arquivo e seja d
T
(c) a
profundidade da folha de c na rvore (ou o
comprimento da palavra cdigo). O nmero de bits
exigidos para codificar um arquivo (ou custo da rvore)
:
.

=
C c
T
c d c f T B ) ( ) ( ) (
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 46 alekoe@computer.org
Cdigo de Huffman
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 47 alekoe@computer.org
Cdigo de Huffman
Huffman criou um algoritmo guloso que produz
um cdigo de prefixo timo chamado cdigo de
Huffman.
No pseudocdigo, C um conjunto de n
caracteres e cada caractere c C um objeto
com uma freqncia definida f [c].
O algoritmo constri de baixo para cima a
rvore T correspondente ao cdigo timo.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 48 alekoe@computer.org
Cdigo de Huffman
Comea com um conjunto de |C| folhas e
executa uma seqncia de |C|1 operaes de
intercalao para criar a rvore final.
Uma fila de prioridade mnima Q, tendo f como
chave, usada para identificar os dois objetos
menos freqentes a serem intercalados. O
resultado da intercalao um novo objeto cuja
freqncia a soma das freqncias dos 2
objetos que foram intercalados.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 49 alekoe@computer.org
Cdigo de Huffman
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 50 alekoe@computer.org
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 51 alekoe@computer.org
Comentrios Finais
A tcni ca gulosa sugere construir uma
soluo para um problema de otimizao
atravs de uma seqncia de passos,
expandindo uma soluo construda
parcialmente at o momento, at obter uma
soluo completa para o problema.
Em cada passo, a escolha feita deve ser possvel,
tima localmente e irreversvel.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 52 alekoe@computer.org
Comentrios Finais
Exemplos de algoritmos que utilizam a
Estr atgi a Gulosa:
Algoritmo de Prim: construir uma rvore de
amplitude mnima (minimum spanning tree) a
partir de um grafo ponderado.
Algoritmo de Kruskal: construir uma rvore de
amplitude mnima (minimum spanning tree) a
partir de um grafo ponderado.
Cincia/Eng. de Computao Proj. Anal. Algoritmos 2006 53 alekoe@computer.org
Comentrios Finais
Exemplos de algoritmos que utilizam a
Estr atgi a Gulosa:
Algoritmo de Dijkstra: resolve o problema do menor
caminho com fonte nica. Encontra os menores
caminhos de um dado vrtice (fonte) a todos os
outros vrtices de um grafo ponderado ou dgrafo.
rvore de Huffman: minimiza o comprimento do
caminho ponderado a partir da raiz at as folhas
contendo um conjunto prdefinido de pesos.

Você também pode gostar