Variante do problema da mochila


11

Como você abordaria o problema da mochila em uma situação de programação dinâmica se agora precisa limitar o número de itens na mochila por um constante ? Esse é o mesmo problema (peso máximo de , cada item tem um valor peso ), mas você só pode adicionar item (s) à mochila e, obviamente, precisa otimizar o valor da mochila.W v w ppWvwp

Precisamos de uma terceira dimensão ou poderíamos encontrar uma outra abordagem sem ela. Tentei simplesmente adicionar o número de item na mochila na célula e pegar o valor máximo no final com o número de item <= mas não é a melhor solução.p


Este é um bom exercício de lição de casa. O que você tentou? Você se sente à vontade para fazer programação dinâmica? (Se não, talvez tente alguns exercícios para praticar com ele.) Você estudou o algoritmo de programação dinâmica padrão para o problema da mochila? Procure uma maneira de modificar essa abordagem padrão. Sua principal tarefa é projetar qual deve ser o conjunto de subproblemas. Na abordagem padrão, um subproblema é caracterizado por um parâmetro (um limite no peso dos itens). Você pode considerar o uso de dois parâmetros (para um conjunto maior de subproblemas). Experimente várias possibilidades - o que você ganha?
DW

Respostas:


9

Muito boa pergunta!

Você está duas vezes certo:

  1. Propagar o número de itens na mochila não leva a soluções ideais.
  2. Uma solução consiste em adicionar uma terceira dimensão. Isso é bastante simples, mas é necessário levar em consideração alguns fatos ao fazê-lo. Note, no entanto, que não é a única alternativa

A seguir, presumo que você esteja familiarizado com a solução baseada em programação dinâmica. Em particular, não discutirei como reverter a tabela para determinar a solução .

Vamos primeiro focar no caso típico: o número de itens é irrestrito . Nesse caso, você apenas cria uma tabela que T i , j contém o valor ideal quando a capacidade geral da mochila é igual a ie apenas os primeiros itens j são considerados. Daqui:TTi,jij

Ti,j=max{Ti,j1,Tiwj,j1+vj}

onde e representam o peso e o valor do ésimo item, respectivamente. Se é a capacidade geral da sua mochila e há um total de itens, a solução ideal é dada por . Sabe-se que esse algoritmo é executado em tempo pseudo-polinomial e uma de suas belezas é que ele considera apenas as combinações que atendem à capacidade máxima.v j j C N T C , NwjvjjCNTC,N

No entanto, isso não é suficiente ao adicionar sua restrição: um número máximo de itens . O motivo é que a fórmula de recorrência anterior não leva em conta diferentes combinações de itens:p

  1. Primeiro, se então para que o ésimo item é adicionado à mochila, apesar do número máximo de itens considerados, --- para que você possa estar violando sua restrição. Bem, você pode ser tentado aqui a aplicar a fórmula anterior, acompanhando o número de itens inseridos em cada etapa e não adicionar outros se o número de itens atualmente na mochila exceder , mas,t i , j = ( T i - w j , j - 1 + v j ) j p pTi,j1<(Tiwj,j1+vj)Ti,j=(Tiwj,j1+vj)jpp
  2. Segundo, se então para que este item não seja adicionado, mas isso pode ser um grande erro, caso a solução ideal já consista no número máximo de itens a serem inseridos na mochila. O motivo é que não estamos comparando adequadamente: por um lado, preservar a solução ótima que consiste em itens selecionados entre os anteriores ; por outro lado, para inserir o ésimo item e, adicionalmente, considere o melhor subconjunto com itens entre os itens anteriores .T i , j = T i , j - 1 T i , j - 1 p ( j - 1 ) j ( p - 1 ) ( j - 1 )Ti,j1>(Tiwj,j1+vj)Ti,j=Ti,j1Ti,j1p(j1)j(p1)(j1)

De modo que uma primeira solução consiste em adicionar uma terceira dimensão. No seu caso, seja a solução ideal quando a capacidade da mochila for , apenas os primeiros itens são considerados e não é permitido colocar mais de itens na mochila. Agora, i j kTi,j,kijk

  • Se você estiver calculando para um número de itens estritamente menor ou igual ao número de itens que podem ser inseridos ( ), continue como de costume, mas usando o mesmo valor de :Ti,j,kjkkTi,j,k=max{Ti,j1,k,Tiwj,j1,k+vj}
  • Agora, se você precisar calcular para um número de itens estritamente maior que o número de itens que podem ser inseridos ( ), então:Ti,j,kj>kTi,j,k=max{Ti,j1,k,Tiwj,j1,k1+vj}

A primeira expressão deve estar clara. O segundo funciona desde que a camada -ésima da tabela acompanha a melhor combinação de itens entre os primeiros conforme exigido acima.(k1)T(k1)(j1)

Uma implementação eficiente desse algoritmo não precisa calcular para todos os . Observe que os relacionamentos de recorrência anteriores relacionam a camada com e, portanto, é possível alternar entre duas camadas sucessivas (por exemplo, se você estiver interessado na solução ideal com basta usar duas camadas consecutivas: 0 e 1, 1 e 2, 2 e 3, 3 e 4 e pronto). Em outras palavras, esse algoritmo ocupa o dobro da memória exigida pela abordagem tradicional com base na programação dinâmica e, portanto, ainda pode ser executado em tempo pseudo-polinomial. k k ( k - 1 ) k = 4Ti,j,kkk(k1)k=4

Esteja ciente, no entanto, de que esta não é a única solução! E há outro que você pode achar mais elegante. Nas fórmulas anteriores, recuperamos a solução ótima que consistia em não mais que itens entre os primeiros como . No entanto, deve ficar claro que isso é exatamente igual a apenas usando a tabela original !! ou seja, a solução ideal com não mais que itens também pode ser recuperada considerando-se as soluções ótimas com 1 item, 2 itens, 3 itens, ...( j - 1 ) T i , j - 1 , k - 1 max p = 0 , j - 1 { T i , p } k ( j - 1 ) k(k1)(j1)Ti,j1,k1maxp=0,j1{Ti,p}k(j1)itens ... Para que essa formulação funcione, você também deve acompanhar o número de itens considerados em cada solução parcial, para precisar de dois números inteiros por célula. Essa ocupação de memória resulta exatamente nos mesmos requisitos de memória do algoritmo mostrado acima (usando uma terceira dimensão na forma de camadas )k .

Espero que isto ajude,


Ótima resposta, obrigado. Consegui passar por isso antes da sua postagem, implementando também uma terceira dimensão.
precisa saber é o seguinte

Ai, muito obrigado por encerrar a pergunta e feliz em saber que você gostou da resposta. Para esclarecer minhas idéias, tentei também uma implementação desse algoritmo em Python. Se você estiver interessado em dar uma olhada, entre em contato e eu ficarei feliz em publicá-lo (ou enviá-lo a você). Cheers,
Carlos Linares López

No entanto, é importante ressaltar que, para que o processo seja realizado com sucesso, é necessário que o cliente tenha uma boa noção do que é o processo de compra e venda de um imóvel, o que deve ser feito por um profissional especializado e que tenha a certeza de que o imóvel está em boas condições. não tenho certeza se estou certo, porque ainda sou novo na programação dinâmica.
Steve Irwin

@ CarlosLinaresLópez ótima resposta. Você poderia compartilhar o script python também? Talvez postá-lo em gist.github.com?
Saad Malik

1
Olá @Carlos! Publiquei uma pergunta de acompanhamento para usar sua fórmula alternativa aqui: Encontrar os melhores itens em uma mochila 0/1 . Enfim, espero que você esteja curtindo suas férias!
Saad Malik
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.