2014-05-15 12 views
8

Sto cercando di risolvere questo problema e volevo sapere se esistono algoritmi/soluzioni esistenti per risolvere questo problema.Zaino con più sacchi e articoli aventi solo peso

Problema:

ho n borse e n articoli (che sono pesi sia uguale o differente) per riempire in questi borsa. Ognuna di queste borse ha un certo limite di peso e gli articoli devono essere inseriti in questi sacchetti in modo tale da poter utilizzare il massimo spazio in ciascuna di queste borse.

Le borse sono di dimensioni uguali. Vorrà anche sapere come risolvere con borse di dimensioni disuguali.

La maggior parte delle soluzioni che ho letto stava cercando di risolvere uno zaino 0/1 con un peso e un valore. Dovrei considerare il peso e il valore come uguali? Sono sulla buona strada?

Questo non è un problema di compiti a casa.

+0

Le borse sono di uguale misura? – JensG

+0

Sì, le borse sono di dimensioni uguali. Vorrà anche sapere come risolvere con borse di dimensioni disuguali. – Jony

+0

Non dovrebbe essere uguale al problema del riempimento della busta "N" con il resto della merce lasciata dopo aver riempito le buste da "1" a "N-1"? Le dimensioni non uguali sono (probabilmente) più difficili. – JensG

risposta

8

Questo è noto come the bin packing problem (che è NP-rigido).

Semplicemente classificare l'ordine decrescente dalle loro dimensioni, e quindi inserendo ogni elemento nel primo scomparto nella lista con spazio rimanente sufficiente, otteniamo 11/9 OPT + 6/9 cassoni (dove OPT è il numero di contenitori utilizzati nella soluzione ottimale). Questo potrebbe facilmente prendere O(n²), o eventualmente O(n log n) con un'implementazione efficiente.

In termini di soluzioni ottimali, non esiste una soluzione di programmazione dinamica che sia nota anche per il problema dello zaino. This resource ha un'opzione - l'idea di base è:

D[{set}] = the minimum number of bags using each of the items in {set} 

Then: 

D[{set1}] = the minimum of all D[{set1} - {set2}] where set2 fits into 1 bag 
                and is a subset of set1 

L'indice di matrice sopra è letteralmente un set - pensare a questo come una mappa di set di valore, una bitmap o una matrice multidimensionale dove ogni indice è 1 o 0 per indicare se includiamo o meno l'elemento corrispondente a quello dimensionale.

La risorsa collegata considera effettivamente più tipi, che possono verificarsi più volte: ho ricavato la soluzione di cui sopra.

Il tempo di esecuzione dipenderà molto dal numero di articoli che possono essere contenuti in una borsa: sarà O(minimumBagsUsed.2maxItemsPerBag).

Nel caso di 1 borsa, questo è essenzialmente the subset sum problem. Per questo, è possibile considerare il peso come il valore e risolvere utilizzando un algoritmo a zaino, ma questo non funzionerà molto bene per più buste.

Perché no? Considerare gli articoli 5,5,5,9,9,9 con una dimensione di borsa di 16. Se hai appena risolto la somma dei sottoinsiemi, ti rimane 5,5,5 in un sacchetto e 9 in un sacchetto ciascuno (per un totale di 4 borse), invece di 5,9 in ognuna delle 3 borse.

La somma dei sottogruppi/zaino è già un problema difficile: se si utilizza non è in grado di darvi una soluzione ottimale, si può anche usare l'approccio di ordinamento/avidità di cui sopra.

+2

Vale la pena menzionare che sebbene le soluzioni esatte siano difficili da trovare in generale, esiste una semplice approssimazione 11/9 OPT + 1 (che può essere generalizzata a (1 + eps) OPT + 1 in tempo polinomiale per eps costante) –

+0

@NiklasB . Aggiunta una nota sull'approssimazione. – Dukeling

+0

Grazie ... buona risposta ... ho provato un'altra soluzione in cui ho usato il codice di esempio: http://introcs.cs.princeton.edu/java/96optimization/Knapsack.java.html e ho reso il peso e il profitto uguali . Ho ottenuto i risultati corretti per i casi che ho provato, ma non sono sicuro che risolva davvero il mio problema. – Jony

Problemi correlati