Problema dello zaino

Da testwiki.
Versione del 12 mag 2024 alle 15:56 di imported>Simone Biancolilla (Collegamenti esterni: Aggiunto il template "Collegamenti esterni")
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)
Vai alla navigazione Vai alla ricerca

Template:NN

In questo caso, la soluzione è di mettere nello zaino tre libri gialli e tre grigi

Il problema dello zaino, o Template:Inglese, è un problema di ottimizzazione combinatoria posto nel modo seguente.

Sia dato uno zaino che possa sopportare un determinato peso e siano dati N oggetti, ognuno dei quali caratterizzato da un peso e un valore. Il problema si propone di scegliere quali di questi oggetti mettere nello zaino per ottenere il maggiore valore senza eccedere il peso sostenibile dallo zaino stesso.

Introduzione

Il problema espresso in maniera più formale diventa:

  • ognuno degli N oggetti possiede un peso wi e un valore ci;
  • si indica con W il peso massimo sopportabile dallo zaino;
  • la possibilità che un oggetto venga inserito o meno nello zaino è espressa dalle variabili intere xi.

La funzione obiettivo da massimizzare è:

Z=i=1Ncixi.

I vincoli:

i=1NwixiW.

In base al tipo di variabili xi si ha poi la distinzione in:

  • problema dello zaino 0-1
xi={0,1}i=1,,N,
ogni oggetto può esserci o non esserci senza ripetizioni (abbiamo un solo esemplare di ciascun oggetto);
  • problema dello zaino con limiti
xibii=1,,N,
ogni oggetto può apparire nello zaino al massimo bi volte (abbiamo b1 esemplari dell'oggetto 1, b2 esemplari dell'oggetto 2 e così via);
  • problema dello zaino senza limiti
xii=1,,N,
ogni oggetto può apparire nello zaino un numero arbitrario di volte.

Il problema dello zaino è risolto spesso usando la programmazione dinamica, anche se è noto che questo metodo ha un tempo di risoluzione non lineare per questo genere di problema. Il problema generale dello zaino è un problema NP-difficile e questo ha indirizzato la ricerca verso il problema Subset-sum come base per il sistema di crittografia a chiave pubblica, come Merkle-Hellman. Questi tentativi usavano tipicamente alcuni gruppi oltre agli interi. Merkle-Hellman e altri algoritmi simili vennero presto abbandonati poiché i sottoproblemi di somma che producevano erano risolvibili da algoritmi lineari.

La versione decisionale di questo problema è NP-completa e infatti è uno dei 21 problemi NP-completi di Karp.

Il problema dello zaino, nella versione di ottimizzazione, è di fondamentale importanza in quanto può essere risolto in maniera soddisfacente in molti casi di comune applicazione; infatti per questo problema sono disponibili buone euristiche e buoni rilassamenti. Un algoritmo di enumerazione implicita, ad esempio Branch and bound, normalmente non impiega molto tempo per risolverlo.

Soluzione problema dello zaino senza limiti

Viene descritta di seguito la soluzione per il problema dello zaino senza limiti.

Si indichino con c1,,cN i guadagni offerti dagli oggetti, e con w1,,wN i pesi di ogni oggetto. Si desidera massimizzare il guadagno complessivo mantenendo il peso complessivo minore o uguale al peso massimo consentito W (vincolo). Si indichi con A(k) il valore massimo di guadagno che si può ottenere rispettando il vincolo che il peso complessivo sia minore o uguale a k. Ovviamente kW e A(W) è la soluzione del problema.

Si definiscono gli A(k) ricorsivamente come di seguito:

  • A(0)=0;
  • A(k)=max{cj+A(kwj)|wjk}.

avendo considerato zero il massimo dell'insieme vuoto. Se si tabulano i risultati a partire da A(0) fino a A(W) si ottiene la soluzione. Dato che il calcolo di ogni A(k) implica l'esame di N oggetti, tutti calcolati in precedenza, e visto che ci sono W valori di A(k) da calcolare, il tempo impiegato per trovare la soluzione è O(NW).

Ciò non contraddice il fatto che il problema dello zaino sia NP-completo, dato che W, al contrario di N, non è polinomiale rispetto alla lunghezza dell'input del problema. Questa lunghezza è proporzionale al numero di bit in W, e non a W stesso.

Soluzione problema dello zaino 0-1

Si indichino con wi il peso dell'i-esimo oggetto e con ci il suo valore. Si vuole massimizzare il valore totale rispettando il vincolo che il peso totale sia minore o uguale al peso massimo consentito W. Definiamo A(i,j) come il massimo valore che può essere trasportato con uno zaino di capacità jW avendo a disposizione solo i primi i oggetti.

Si può definire A(i,j) ricorsivamente come segue:

  • A(0,j)=0,
  • A(i,0)=0,
  • A(i,j)=A(i1,j) se wi>j,
  • A(i,j)=max{A(i1,j),A(i1,jwi)+ci} se wij.

Si può trovare la soluzione calcolando A(n,W). Per farlo in modo efficiente si può usare una tabella che memorizzi i calcoli fatti precedentemente. Questa soluzione impiegherà quindi un tempo proporzionale a O(nW) e uno spazio anch'esso proporzionale a O(nW), anche se con alcune piccole modifiche si può ridurre lo spazio utilizzato a O(W).

Algoritmo Greedy

Martello e Toth (1990) hanno utilizzato un'euristica greedy per risolvere il problema dello zaino. La loro versione ordina gli oggetti in base al loro costo unitario, vale a dire ciwi e li esamina in ordine decrescente. L'oggetto corrente viene inserito se e solo se il suo peso non supera la capacità residua corrente.

Questi algoritmi sono euristici, quindi non garantiscono di trovare la soluzione ottima, ma sono in grado di fornire una "buona" soluzione in tempo ragionevole; spesso questo tipo di algoritmi viene utilizzato in approcci di enumerazione implicita come gli algoritmi Branch and bound.

Rilassamento continuo

Si dimostra che il rilassamento continuo del problema dello zaino è equivalente all'euristica CUD quando si permettono valori in [0,1] delle variabili xi, in particolare una sola variabile avrà valore non binario. In questo modo euristica e rilassamento possono essere risolti simultaneamente in maniera efficiente.

Bibliografia

Collegamenti esterni

Template:Portale