Variante del problema dello zaino


11

Come affronteresti il ​​problema dello zaino in una situazione di programmazione dinamica se ora dovessi limitare il numero di articoli nello zaino di una costante ? Questo è lo stesso problema (peso massimo di , ogni articolo ha un valore e peso ) ma è possibile aggiungere solo articoli allo zaino e ovviamente è necessario ottimizzare il valore dello zaino.pWvwp

Abbiamo bisogno di una terza dimensione o potremmo trovare un altro approccio senza di essa. Ho provato ad aggiungere semplicemente il numero di articolo nello zaino nella cella e prendendo il valore massimo alla fine con il numero di elemento <= ma non è la soluzione MIGLIORE.p


Questo è un bel esercizio di compiti a casa. Che cosa hai provato? Ti senti a tuo agio con la programmazione dinamica? (In caso contrario, forse provare alcuni esercizi per esercitarsi con esso.) Hai studiato l'algoritmo di programmazione dinamica standard per il problema dello zaino? Cerca un modo per modificare tale approccio standard. Il tuo compito principale è quello di progettare quale dovrebbe essere l'insieme dei sottoproblemi. Nell'approccio standard, un sottoproblema è caratterizzato da un parametro (legato al peso degli articoli). Potresti prendere in considerazione l'utilizzo di due parametri (quindi un set più ampio di sottoproblemi). Prova varie possibilità: cosa ottieni?
DW

Risposte:


9

Molto bella domanda!

Hai due volte ragione:

  1. La propagazione del numero di articoli nello zaino non porta a soluzioni ottimali.
  2. Una soluzione consiste nell'aggiunta di una terza dimensione. Questo è piuttosto semplice ma è necessario prendere in considerazione alcuni fatti nel farlo. Si noti tuttavia che non è l'unica alternativa

Di seguito, presumo che tu abbia familiarità con la soluzione basata sulla programmazione dinamica. In particolare, non discuterò come attraversare la tabella all'indietro per determinare la soluzione .

Concentriamoci prima sul caso tipico: il numero di articoli è illimitato . In questo caso, è sufficiente creare una tabella cui contenga il valore ottimale quando la capacità complessiva dello zaino è uguale a e vengono considerati solo i primi elementi. Da qui:T i , j i jTTi,jij

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

dove e rappresentano rispettivamente il peso e il valore dell'elemento -esimo. Se è la capacità complessiva dello zaino e ci sono in totale articoli, la soluzione ottimale è data da . Questo algoritmo è noto per essere eseguito in tempi pseudo-polinomiali e una delle sue bellezze è che considera solo quelle combinazioni che si adattano alla massima capacità.wjvjjCNTC,N

Tuttavia, questo non è sufficiente quando si aggiunge il vincolo: un numero massimo di elementi . Il motivo è che la precedente formula di ricorrenza non tiene conto delle diverse combinazioni di elementi:p

  1. Innanzitutto, se quindi modo che l' elemento -esimo viene aggiunto allo zaino nonostante il numero massimo di elementi considerati, --- in modo che tu possa violare il tuo vincolo. Bene, potresti essere tentato qui di applicare la formula precedente tenendo traccia del numero di elementi inseriti in ogni passaggio e non aggiungerne altri se il numero di elementi attualmente nello zaino supera ma,Ti,j1<(Tiwj,j1+vj)Ti,j=(Tiwj,j1+vj)jpp
  2. In secondo luogo, se quindi modo che questo elemento non venga aggiunto ma questo potrebbe essere un grosso errore nel caso in cui la soluzione ottimale consista già nel numero massimo di elementi da inserire nello zaino. Il motivo è che non stiamo confrontando correttamente: da un lato, per preservare la soluzione ottimale composta da elementi selezionati tra i precedenti ; d'altra parte, per inserire l' elemento -esimo e, inoltre, considerare il sottoinsieme migliore con elementi tra i precedenti .Ti,j1>(Tiwj,j1+vj)Ti,j=Ti,j1Ti,j1p(j1)j(p1)(j1)

In modo che una prima soluzione consiste nell'aggiungere una terza dimensione. Nel tuo caso, lascia che sia la soluzione ottimale quando la capacità dello zaino è , vengono considerati solo i primi articoli e non è consentito inserire più di articoli nello zaino. Adesso,Ti,j,kijk

  • Se stai calcolando per un numero di elementi strettamente inferiore o uguale al numero di elementi che possono essere inseriti ( ), procedi come al solito ma usando lo stesso valore di :Ti,j,kjkkTi,j,k=max{Ti,j1,k,Tiwj,j1,k+vj}
  • Ora, se devi calcolare per un numero di elementi rigorosamente maggiore del numero di elementi che possono essere inseriti ( ), allora:Ti,j,kj>kTi,j,k=max{Ti,j1,k,Tiwj,j1,k1+vj}

La prima espressione dovrebbe essere chiara. Il secondo funziona poiché il -th strato della tabella tiene traccia della migliore combinazione di elementi tra i primi come richiesto sopra.(k1)T(k1)(j1)

Un'implementazione efficiente di questo algoritmo non ha bisogno di calcolare per tutti i . Si noti che le precedenti relazioni di ricorrenza riguardano il livello con e quindi è possibile alternare tra due livelli successivi (ad esempio, se si è interessati alla soluzione ottimale con si usano solo due livelli consecutivi: 0 e 1, 1 e 2, 2 e 3, 3 e 4 e il gioco è fatto). In altre parole, questo algoritmo occupa il doppio della memoria richiesta dall'approccio tradizionale basato sulla programmazione dinamica e quindi può essere ancora eseguito in tempo pseudo-polinomiale.Ti,j,kkk(k1)k=4

Tieni presente, tuttavia, che questa non è l'unica soluzione! E ce n'è un altro che potresti trovare più elegante. Nelle formule precedenti, abbiamo recuperato la soluzione ottimale che consisteva in non più di elementi tra i primi come . Tuttavia, dovrebbe essere chiaro che questo è esattamente uguale a solo usando la tabella originale !! cioè, la soluzione ottimale con non più di articoli può essere recuperata anche considerando le soluzioni ottimali con 1 articolo, 2 articoli, 3 articoli, ...(k1)(j1)Ti,j1,k1maxp=0,j1{Ti,p}k(j1)articoli ... Per far funzionare questa formulazione dovresti anche tenere traccia del numero di elementi considerati in ogni soluzione parziale in modo da avere bisogno di due numeri interi per cella. Questa occupazione di memoria comporta esattamente gli stessi requisiti di memoria dell'algoritmo mostrato sopra (usando una terza dimensione sotto forma di strati )k .

Spero che questo ti aiuti,


Ottima risposta, grazie. Sono stato in grado di superarlo prima del tuo post implementando anche una terza dimensione.
user11536

Ahi, grazie mille per aver chiuso la domanda e felice di sapere che ti è piaciuta la risposta. Per chiarire le mie idee ho anche provato un'implementazione di questo algoritmo in Python. Se sei interessato a dargli un'occhiata, fammelo sapere e lo posterò felicemente (o te lo invierò). Saluti,
Carlos Linares López il

Spiegazione incredibile del problema dello zaino multidimensionale.Tuttavia mi chiedevo se avessimo un caso simile ma con esattamente k elementi, esamineremo solo i valori restituiti dalla colonna kth della 3a dimensione.Se non ci sono valori lì, allora restituisce 0.I non sono sicuro di avere ragione perché sono ancora nuovo alla programmazione dinamica.
SteveIrwin,

@ CarlosLinaresLópez ottima risposta. Potresti condividere anche lo script Python? Forse pubblicarlo su gist.github.com?
Saad Malik,

1
Ciao @Carlos! Ho pubblicato una domanda di follow-up sull'uso della tua formula alternativa qui: Trovare gli articoli n-best in uno Zaino 0/1 . Spero comunque che ti stia godendo le vacanze!
Saad Malik,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.