Sei sulla pagina 1di 6

Capı́tulo 17 - Algoritmos Gulosos (Greedy)

Profa . Dra . Maria Emilia Machado Telles Walter 1


1
Departamento de Ciência da Computacão – Universidade de Brası́lia

mia@cic.unb.br

6.1. Algoritmos Gulosos


→ Algoritmos para problemas de otimização: possuem uma sequência de passos, com
um conjunto de escolhas em cada passo.
→ Algoritmo guloso: sempre escolhe o que parece melhor naquele passo, isto
é, escolha é ótima localmente, e espera-se que esta escolha leve a uma solução ótima
globalmente.

• Algoritmo guloso não leva sempre a soluções ótimas, mas leva muitos problemas
a soluçoes ótimas.
• Problema de seleção de atividades
- Criar uma agenda dividindo recursos entre várias atividades conflitantes entre si.
- Algoritmo guloso: método simples e elegante para selecionar um conjunto de
tamanho máximo de atividades mutuamente compatı́veis.
- Supor: conjunto S = {1, 2, ..., n} de n atividades que usam um recurso. Ex-
emplo: sala de conferências, que pode ser usado para 1 atividade poe vez. Cada
atividade i tem um tempo de inı́cio si (start) e um tempo de término fi (finish),
onde si ≤ ti . Se for selecionada, a atividade i ocorre durante o intervalo [si ,
fi ). Atividades i e j são compatı́veis se os intervalos [si , fi ) e [sj , fj ) não se so-
brepõem, isto é, i e j são compatı́veis se si ≥ fj ou sj ≥ fi .
- Problema da seleção de atividades: selecionar um conjunto de tamanho máximo
de atividades mutuamente compatı́veis.

→ Algoritmo guloso: atividades de entrada ordenadas por tempo de término em


ordem crescente: f1 ≤ f2 ≤ ... ≤ fn . Se não estiverem, ordená-las em tempo O(nlgn),
com empates colocados em ordem arbitrária.
→ Entradas: arrays s e t

Algorithm GREEDY - ALGORITHM - SELECTOR (s, f)


1 n ← length[s]
2 a ← {1}
3 j←1
4 for i ← 2ton do
5 if si ≥ fj then
6 A ← A U {i}
7 j←i
8 return A

→ Correção do algoritmo:
A: armazena atividades selecionadas
j: última atividade inserida em A
Atividades selecionadas em ordem não-decrescente de tempo de término:
fi : maior tempo de término de qualquer atividade em A.
Linhas 2,3: seleciona atividade 1, inicializa A com {1} e inicializa j com 1.
Linhas: 4-7: considera cada atividade i e adiciona i a A se i for compatı́vel com as ativi-
dades já adicionadas a A.
Para verificar se i é compatı́vel com as atividades em A: basta comparar si com fj (tempo
de término da última atividade inserida em A). (∗)
Se i é compatı́vel: i é adicionado a A e j é atualizado para i (linhas 6 e 7).
→ Tempo de execução: n atividades podem ser agendadas em tempo Θ(n), se as
atividades já tiverem sido ordenadas por seus tempos de término.
→ Atividade escolhida por GREEDY - ACTIVITY - SELECTOR: sempre aquela
com o tempo de término menor, que pode ser escolhida.
→ Escolha: ”gulosa” no sentido de que ele deixa o máximo de oportunidades para
as atividades restantes, ou seja, maximiza a disponibilidade de tempo não agendado para
as outras atividades.
→ Algoritmos gulosos não produzem sempre uma solução ótima mas GREEDY
- ACTIVITY - SELECTOR sempre dá solução ótima para uma instância do Problema da
Seleção de Atividades.
Teorema: Algoritmo GREEDY - ACTIVITY - SELECTOR produz soluções de
tamanho máximo para o Problema da Seleção de Atividades.
Prova: Seja S = {1, 2, ..., n} o conjunto de atividades a serem agendadas.

• Assumimos que as atividades estão ordenadas pelo tempo de término: atividade 1


tem o menor tempo de término.
• Queremos mostrar que existe uma solução ótima que começa com uma escolha
gulosa: atividade 1.

Supor A ⊆ s é solução ótima para uma dada instância do Problema da Seleção de


Atividades, e vamos ordenar as atividades em A pelos tempos de término.
Supor que a primeira atividade é k:
a) se k = 1 ⇒ A começa com uma escolha gulosa.
b) se k 6= 1 ⇒ mostrar que existe uma outra solução ótima B para s que começa com a
escolha gulosa: atividade 1.
Seja B = (A − {k}) U {1}
f1 ≤ fk : atividades em B são disjuntas das de A.

B tem o mesmo número de atividades de A ⇒ B também é uma solução ótima ⇒


B é solução ótima para s, e contém a escolha gulosa 1 ⇒ sempre existe solução ótima que
começa com uma escolha gulosa.

• Após a escolha gulosa 1,


problema: encontrar solução ótima para o Problema da Seleção de Atividades
sobre todas as atividades de s compatı́veis com a 1, isto é, se A é solução ótima
para o problema original s, então A’ = A - {1} é solução ótima para o Problema
da Seleção de Atividades s’, s’ = {i ∈ s/si ≥ f1 }. Por que ?
Se pudéssemos encontrar solução B’para s’ com mais atividades do que A’, adi-
cionando 1 a B’ levaria a uma solução B para s com mais atividades do que A:
contraria a optimalidade de A.
após cada escolha gulosa, ficamos com um problema de otimização menor da
mesma forma que o problema original (anterior).
Aplicando indução no número de escolhas feitas: escolha gulosa em cada passo
produz solução ótima.
• Propriedades de algoritmos gulosos
- Algoritmo guloso dá solução ótima para um problema fazendo uma sequência
de escolhas. Em cada decisão: escolha que aparece melhor naquele ponto é feita.
- Estratégia heurı́stica: não produz sempre uma solução ótima mas em certos ca-
sos produz (exemplo: Problema da Seleção de Atividades).
- Como saber se um algoritmo guloso vai solucionar um certo problema de otimização?
Não há formas de saber, em geral, mas existem duas caracterı́sticas que podem in-
dicar solução por algoritmos gulosos:
a) Propriedade da escolha gulosa.
b) Subestrutura ótima.

6.1.1. Propriedade da Escolha Gulosa


→ Solução ótima global pode ser obtida com escolhas gulosas ótimas localmente.
→ Neste ponto, algoritmos gulosos são diferentes de programação dinâmica.
→ P. D. : escolha é feita em cada passo, mas escolha depende de soluções para
subproblemas.
→ Algoritmos gulosos: escolha é feita em cada passo, escolha que parece mel-
hor neste passo, e então resolve subproblemas que aparecem após a escolha. Escolha
que parece melhor: pode depender de escolhas anteriores, mas não depende de escolhas
futuras nem de soluções de subproblemas.
→ P. D.: resolve subproblemas bottom-up.
→ Algoritmos gulosos: estratégia top-down: uma escolha após a outra, reduzindo,
após cada escolha, a instância do problema para uma menor.
→ Devemos provar que uma escolha gulosa, em cada passo, leva a uma solução
ótima: ponto mais difı́cil.
Em geral (como no teorema): a prova examina uma solução ótima global; mostra que
a solução pode ser modificada de tal forma que uma escolha gulosa pode ser feita no
primeiro passo; mostra que esta escolha reduz o problema para um problema menor
análogo; aplica indução para mostrar que uma escolha gulosa pode ser feita em cada
passo.
mostrar que uma escolha gulosa resulta em problemas menores similares reduz a prova
de correção a mostrar que uma solução ótima tem subestrutura ótima.

6.1.2. Subestrutura ótima


→ Problema tem subestrutura ótima: solução ótima para este problema contém nela
soluções ótimas para subproblemas.
→ Propriedade é fundamental para aplicar P. D. (programação dinâmica) e algo-
ritmos gulosos.
→ Exemplo de subestrutura ótima:
Prova do teorema: mostramos que uma solução ótima A para o Problema da Seleção de
Atividades começa com a atividade 1 conjunto de atividades A’ = A - {1} é solução ótima
para o problema da seleção de atividades S’ = {i ∈ s/si ≥ f1 }.

6.1.3. Algoritmos Gulosos e Programação Dinamica


→ Propriedade da subestrutura ótima: compartilhada por P. D. e algoritmos gulosos
podemos usar P. D. para um problema para o qual algoritmos gulosos seria suficiente ou
usar algoritmos gulosos (incorretamente) em vez de P. D..
→ Examinar duas variações de um problema de otimização: Problema da Mochila.
→ Problema da Mochila 0 - 1: um ladrão roubando uma loja encontra n itens; o i
- ésimo item custa vi centavos pesa wi gramas, vi , wi inteiros.
O ladrão quer carregar na sua mochila os itens mais valiosos, mas pesando no máximo W
gramas, para algum inteiro W. Quais os itens que ele deve levar?
Versão 0 - 1: cada item pode ou não ser levado, e o ladrão não pode levar fração do item,
nem o mesmo item mais de 1 vez.
→ Problema da Mochila fracionário: mesmo 0 - 1, mas o ladrão pode levar frações
de itens, em vez de fazer escolha binária (0 - 1) para cada item.
→ Problema da Mochila 0 - 1: escolha de barras de ouro.
Problemas da Mochila fracionário: escolha de ouro em pó.
→ Ambos os problemas: exibem a propriedade da subestrutura ótima.
Problema 0 - 1: tomar o item mais caro que pesa no máximo W gramas item j. Remover
o item j. Em seguida, o ladrão pode escolher o item mais caro dos n - 1 itens restantes,
excluindo j, que pesa no máximo W - wj .
Problema fracionário: se removermos peso w do item j, o próximo item deve ser o mais
caro pesando no máximo W - w, entre os n - 1 itens originais mais wj - w gramas do item
j.
Fracionário: estratégia gulosa.
0 - 1: P. D. (não pode ser resolvido por algoritmos gulosos).
→ Problema fracionário:
• Computar o valor por grama, vi / wi , para cada item.
• Estratégia gulosa:
- Escolher o item com maior valor por grama, e tomar o maior peso possı́vel.
- Se este item tiver sido escolhido todo, e o ladrão puder levar mais, ele leva o
maior peso possı́vel do maior valor por grama dos itens restantes.
- Assim por diante, até encher a mochila.
• Ordenar os itens por valor / peso: O(nlgn).
→ Estratégia gulosa não funciona para o problema 0 - 1:
→ Estratégia gulosa funciona para o problema fracionário:

→ Tomar o item 1 para 0 - 1 não funciona porque o ladrão não consegue encher a
mochila na sua capacidade máxima, e este espaço vazio diminui o valor / peso efetivo.
Neste caso, quando incluı́mos um item, devemos comparar a solução incluindo este item,
com uma solução que não inclui este item, antes de incluir o item.
Isto gera muitos problemas que se sobrepõem algoritmo de P. D..

Potrebbero piacerti anche