05 - Heurísticas¶
A atividade prática de hoje consiste em implementar heurísticas para a solução do problema da Mochila binária.
Resumo do problema¶
Dados N
objetos e uma mochila que comporta até W
quilos, cada um com peso w_i e valor v_i, selecionar objetos com o maior valor possível que caibam dentro da mochila.
Entrada:
N W
w1 v1
....
wN vN
Saída:
W V opt
o1 ... oT
W
- peso dos objetos selecionadosV
- valor dos objetos selecionadosopt
0
se for usada uma heurística ou busca local1
se a solução for ótimo global
oi
são os índices (em ordem crescente) dos objetos selecionados
Tip
Arquivos para verificar a corretude das suas implementações estão disponíveis nesta pasta. Eles estão nomeados como in-*.txt
, mais-caro-out-*.txt
e mais-leve-out-*.txt
.
Mais caro primeiro¶
A ideia desta heurística é não deixar nenhum objeto valioso para trás! Por isso vamos ser ganaciosos e pegar primeiro os objetos mais caros! Se um objeto valioso não couber passamos para os mais baratos e prosseguimos até examinar todos objetos.
Question
Escreva abaixo um algoritmo em pseudo-código para implementar a heurística descrita acima.
Resposta
ids = // vetor inicializado com ids[i] = i
ordene os vetores ids, v e w de acordo com o vetor de valores v
peso = 0
valor = 0
resposta = //vetor inicializado com 0
T = 0 // número de objetos selecionados
para i=1..N
se peso + w[i] < W então
resposta[T] = ids[i]
peso += w[i]
valor += v[i]
T += 1
print peso, valor, 0
print resposta[0 .. T]
Question
Qual é a complexidade computacional deste algoritmo? Ele é a melhor implementação possível?
Resposta
Se o algoritmo descrito em sua resposta anterior envolver ordenação, então ele tem complexidade \mathcal{O}(n\log n) e é o melhor possível sim (você consegue explicar por que?). Se você fez um loop duplo que procura pelo maior a cada iteração então seu algoritmo é \mathcal{O}(n^2).
Example
Agora que temos um algoritmo, crie uma implementação do programa acima.
Dicas:
- C++ já possui um algoritmo de ordenação implementado no cabeçalho
<algorithm>
. Use-o. - Busque por ordenação indireta para entender como ordenar os três vetores ao mesmo tempo.
- Pode ser conveniente organizar os dados usando
struct
.
Mais leve primeiro¶
Vamos testar uma abordagem oposta: quantidade agora é o foco. Por isso vamos ser práticos e pegar o maior número de objetos possível! Começaremos agora pelos objetos mais leves e vamos torcer para que a quantidade grande de objetos selecionados resulte em uma mochila com alto valor.
Question
Compare esta heurística com a da seção anterior levando em conta o algoritmo em pseudo-código e sua complexidade computacional.
Question
Quais partes do programa da heurística anterior podem ser aproveitadas para implementar a descrita acima?
Example
Implemente agora a heurística do mais leve. Chame seu programa de mais_leve
, mantendo também o código do anterior.
Analisando nossas heurísticas¶
Question
Crie uma entrada em que a heurística do mais valioso seja muito melhor que a do mais leve. Escreva abaixo as saídas de cada programa.
Question
Crie uma entrada em que a heurística do mais leve seja muito melhor que a do mais valioso. Escreva abaixo as saídas de cada programa.
Question
Com base nas suas respostas acima, em quais situações a heurística do mais valioso é melhor?
Question
Com base nas suas respostas acima, em quais situações a heurística do mais leve é melhor?