Você está na página 1de 13

Programação Dinâmica: O

Problema da Mochila

Aula 20

Leila Silva 1
O Problema da Mochila
NP-completo
Versão simplificada

Problema: Dados um inteiro K e um conjunto S de n itens de


diferentes tamanhos, tal que o i-ésimo item tem tamanho inteiro
ki, encontre o subconjunto de itens cuja soma dos tamanhos vale
exatamente K, ou determine que tal subconjunto não existe.

• Vamos denotar o problema por P(n,K), onde n é o número de itens


e K o tamanho da mochila.

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)

P({8}, 17) P({8},15) P({8},17) P({8},12) P({5},17) P({5},9)


P({8}, 12) P({8},10) P({8},15) P({8},10) P({5},15) P({5},7)
P({5}, 17) P({5},15) P({2},17) P({2},12) P({2},17) P({2},9)
P({5}, 9) P({5},7) P({2},9) P({2},4) P({2},12) P({2},4)

Duplicação de problemas a resolver!!!


(subproblemas de mesma cor)

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!!!

Solução iterativa mais barata

Técnica de Programação Dinâmica

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

0/1 Knapsack problem | Dynamic


Programming
https://www.youtube.com/watch?v=cJ21moQpofY

Leila Silva 13

Você também pode gostar