Escolar Documentos
Profissional Documentos
Cultura Documentos
Problema da Mochila
Aula 20
Leila Silva 1
O Problema da Mochila
NP-completo
Versão simplificada
Leila Silva 2
O Problema da Mochila
Problema de empacotamento, em inglês Knapsack Problem
Aplicações em diversos domínios:
Logística: otimizar o empacotamento de itens a transportar
Planejamento de Projetos: melhor escolha das tarefas a realizar,
sujeito a restrições de orçamento e tempo.
Criptografia: escolhas de chaves em sistemas de criptografia
Economia: Seleção de investimentos e portfólios que atendam um
valor estipulado, dentre outras.
Vale a leitura:
https://www.smithsonianmag.com/science-nature/why-knapsack-
problem-all-around-us-180974333/
Leila Silva 3
O Problema da Mochila
Primeira tentativa de solução
Indução Fraca
Caso base: 1 item – se k1 = K, então tem solução e é o próprio item;
caso contrário não tem solução.
H.I: O problema pode ser resolvido para n-1 itens; ou seja sei resolver
P(n-1, K).
Caso geral: resolver o problema para n itens, ou seja resolver P(n, K).
Estratégia:
Para todo i em S, reserve o i-ésimo item de S, o qual possui tamanho k ;
i
Aplique hipótese de indução nos n-1 itens restantes e obtenha a solução do
problema P(n-1,K);
Se a resposta de P(n-1, K) for sim então a solução de P(n,K) é igual à solução de
P(n-1, K) e o i-ésimo item não faz parte do subconjunto solução.
Caso contrário, não podemos aproveitar a informação da H.I para chegar à
solução para n itens. PROBLEMA!!!!
Leila Silva 4
O Problema da Mochila
Segunda tentativa de solução => Fortalecer a H.I.
Suponha que o problema da mochila pode ser resolvido para qualquer k, 0 ≤ k ≤ K
Caso base: 1 item – se k1 = K, então tem solução e é o próprio item; caso contrário
não tem solução.
H.I: O problema P(n-1, k), 0 ≤ k ≤ K pode ser resolvido.
Caso geral: resolver o problema P(n,K)
Estratégia:
Para todo i em S, reserve o i-ésimo item de S, o qual possui tamanho k ;
i
Considere então os problemas P(n-1, K) e P(n-1, K– ki). Caso K – ki < 0, então ignore o
segundo problema. Aplique hipótese de indução nestes subproblemas;
Componha a solução para P(n,K) da seguinte forma:
P(n-1, K) for sim => a solução de P(n,K) é igual à solução de P(n-1, K) e o i-ésimo item
não faz parte do subconjunto solução.
P(n-1, K) for não e P(n-1, K– ki) for sim => a solução de P(n,K) é igual à solução de
P(n-1, K – ki) acrescida do i-ésimo item, o qual possui de tamanho ki. .
P(n-1, K) for não e P(n-1, K – ki) for não => a solução de P(n,K) é não..
Leila Silva 5
O Problema da Mochila
Formulação recursiva
O código recursivo desta solução leva a resolução redundante
de problemas.
Considere o exemplo S={2,5,8} e K=13.
Leila Silva 6
O Problema da Mochila
Formulação recursiva do código leva a uma complexidade exponencial
P({2,5,8}, 17)
P({5,8}, 17) P({5,8}, 15) P({2,8}, 17) P({2,8}, 12) P({2,5}, 17) P({2,5}, 9)
Leila Silva 7
O Problema da Mochila
Observação importante: Como temos n possibilidade
de itens e K possibilidades de tamanhos de mochila,
então temos no máximo nK possibilidades de
problemas diferentes!!!
Leila Silva 8
O Problema da Mochila
algoritmo Mochila(S, n, K, M)
{- usa matriz M para guardar as soluções parciais do problema;
M[i,k].existe sinaliza se existe ou não uma solução para o
problema P(i,k); M[i,k].pertence sinaliza se o i-ésimo elemento
pertence ou não à solução de P(i,k). -}
início
M[0,0].existe := True
para j = 1 até K faça M[0,j].existe := False
para i = 1 até n faça
para j = 0 até K faça
M[i,j].existe := False
se M[i-1, j].existe
então {M[i,j].existe := True; M[i,j].pertence := False}
senão se j - S[i] >= 0
então se M[i-1,j-S[i]).existe
então {M[i,j].existe := True
M[i,j].pertence := True}
fim
Leila Silva 9
O Problema da Mochila
Complexidade:
n K
TMochila c cn( K 1) O (nK )
i 1 j 0
Dependente do valor de K
Valores grandes de K inviável => matriz gigantesca
Se K for real, impossível.
Recuperar os valores que fazem parte da solução a
partir da matriz M é um dos exercícios recomendados.
Leila Silva 10
Exercícios Recomendados
Udi Manber: Cap 5 (5.7 a 5.9, 5.16 a 5.19)
Leila Silva 11
Leitura Recomendada
Udi Manber, Cap. 5 (Seção 5.10).
Levitin, Cap. 8 (Seção 8.2) – outra variante do
mesmo problema
Leila Silva 12
Vídeos Recomendados
0/1 Knapsack Problem Using Dynamic
Programming - Tutorial & Source Code
https://www.youtube.com/watch?v=-kedQt2UmnE
Leila Silva 13