Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% acharam este documento útil (0 voto)
71 visualizações6 páginas

GULOSOS

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1/ 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..

Você também pode gostar