DAA - mochila 0-1

Neste tutorial, discutimos anteriormente o problema da mochila fracionária usando a abordagem Greedy. Mostramos que a abordagem Greedy oferece uma solução ótima para a mochila fracionária. No entanto, este capítulo cobrirá 0-1 problema da mochila e sua análise.

Na mochila 0-1, os itens não podem ser quebrados, o que significa que o ladrão deve pegar o item inteiro ou deixá-lo. Esta é a razão por trás de chamá-lo como 0-1 Knapsack.

Portanto, no caso de 0-1 mochila, o valor de xi pode ser qualquer um 0 ou 1, onde outras restrições permanecem as mesmas.

0-1 A mochila não pode ser resolvida pela abordagem gananciosa. A abordagem gananciosa não garante uma solução ideal. Em muitos casos, a abordagem Greedy pode fornecer uma solução ótima.

Os exemplos a seguir estabelecerão nossa declaração.

Exemplo 1

Vamos considerar que a capacidade da mochila é W = 25 e os itens são os mostrados na tabela a seguir.

Item UMA B C D
Lucro 24 18 18 10
Peso 24 10 10 7

Sem considerar o lucro por unidade de peso (pi/wi), se aplicarmos a abordagem Greedy para resolver este problema, primeiro item Aserá selecionado como contribuirá max i lucro mãe entre todos os elementos.

Depois de selecionar o item A, nenhum outro item será selecionado. Portanto, para este determinado conjunto de itens, o lucro total é24. Considerando que a solução ideal pode ser alcançada selecionando itens,B e C, onde o lucro total é 18 + 18 = 36.

Exemplo-2

Em vez de selecionar os itens com base no benefício geral, neste exemplo, os itens são selecionados com base na proporção p i / w i . Vamos considerar que a capacidade da mochila é W = 60 e os itens são os mostrados na tabela a seguir.

Item UMA B C
Preço 100 280 120
Peso 10 40 20
Razão 10 7 6

Usando a abordagem Greedy, primeiro item Aé selecionado. Então, o próximo itemBé escolhido. Portanto, o lucro total é100 + 280 = 380. No entanto, a solução ideal desta instância pode ser alcançada selecionando itens,B e C, onde o lucro total é 280 + 120 = 400.

Portanto, pode-se concluir que a abordagem Greedy pode não fornecer uma solução ótima.

Para resolver 0-1 Knapsack, abordagem de Programação Dinâmica é necessária.

Declaração do Problema

Um ladrão está roubando uma loja e pode transportar um máximo i peso mal deWem sua mochila. temn itens e peso de ith item é wi e o lucro de selecionar este item é pi. Quais itens o ladrão deve levar?

Abordagem de programação dinâmica

Deixei i ser o item de maior número em uma solução ideal S para Wdólares. EntãoS' = S - {i} é uma solução ótima para W - wi dólares e o valor da solução S é Vi mais o valor do subproblema.

Podemos expressar esse fato na seguinte fórmula: definir c[i, w] ser a solução para itens 1,2, … , ie o máximo i peso mamãw.

O algoritmo usa as seguintes entradas

  • O max i peso mamãW

  • O número de itens n

  • As duas sequências v = <v1, v2, …, vn> e w = <w1, w2, …, wn>

Dynamic-0-1-knapsack (v, w, n, W) 
for w = 0 to W do 
   c[0, w] = 0 
for i = 1 to n do 
   c[i, 0] = 0 
   for w = 1 to W do 
      if wi ≤ w then 
         if vi + c[i-1, w-wi] then 
            c[i, w] = vi + c[i-1, w-wi] 
         else c[i, w] = c[i-1, w] 
      else 
         c[i, w] = c[i-1, w]

O conjunto de itens a serem levados pode ser deduzido da tabela, começando em c[n, w] e rastreando para trás de onde os valores ideais vieram.

Se c [i, w] = c [i-1, w] , então o itemi não faz parte da solução, e continuamos rastreando com c[i-1, w]. Caso contrário, itemi é parte da solução e continuamos rastreando com c[i-1, w-W].

Análise

Esse algoritmo leva θ ( n , w ) vezes, pois a tabela c tem ( n + 1). ( W + 1) entradas, onde cada entrada requer θ (1) tempo para ser computada.