2014-05-15 4 views
8

Ich versuche, dieses Problem zu lösen, und ich wollte wissen, ob es bestehende Algorithmen/Lösungen gibt, um dies zu lösen.Rucksack mit mehreren Taschen und Gegenständen mit nur Gewicht

Problem:

Ich habe n Taschen und n Artikel (die entweder gleich oder verschieden Gewichte sind) in diesen Beutel zu füllen. Jeder dieser Taschen hat eine bestimmte Gewichtsgrenze und die n Gegenstände müssen so in diese Taschen gesteckt werden, dass ich den maximalen Platz in jedem dieser Taschen nutzen kann.

Die Taschen sind gleich groß. Will auch wissen, wie man mit Taschen von ungleicher Größe auch löst.

Die meisten Lösungen, die ich gelesen habe, versuchten, einen 0/1 Rucksack mit einem Gewicht und einem Wert zu lösen. Sollte ich das Gewicht und den Wert als gleich betrachten? Bin ich auf dem richtigen Weg?

Dies ist kein Hausaufgabenproblem.

+0

Sind die Taschen gleich groß? – JensG

+0

Ja, die Taschen sind gleich groß. Will auch wissen, wie man mit Taschen von ungleicher Größe auch löst. – Jony

+0

Sollte das nicht gleichbedeutend mit dem Problem sein, den Beutel 'N' mit dem Rest der nach dem Befüllen der Beutel' 1' bis 'N-1' übriggebliebenen Ware zu füllen? Ungleiche Größen sind (wahrscheinlich) schwieriger. – JensG

Antwort

8

Dies ist bekannt als the bin packing problem (die NP-hart ist).

Durch einfaches Sortieren der absteigenden Reihenfolge nach ihren Größen und dann Einfügen jedes Elements in den ersten Behälter in der Liste mit ausreichend verbleibendem Speicherplatz, erhalten wir 11/9 OPT + 6/9 Bins (wobei OPT die Anzahl der in der optimalen Lösung verwendeten Bins ist). Dies würde leicht O(n²) oder möglicherweise O(n log n) mit einer effizienten Implementierung übernehmen.

In Bezug auf optimale Lösungen gibt es keine dynamische Programmierlösung, die so bekannt ist wie für das Rucksackproblem. This resource hat eine Möglichkeit - die Grundidee ist:

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 

Der Arrayindex oben ist buchstäblich ein Satz - man denke an das als eine Karte von Einstellung auf einen Wert, eine Bitmap oder ein mehrdimensionales Array, wobei jeder Index ist entweder 1 oder 0, um anzugeben, ob wir den dieser Dimension entsprechenden Artikel einschließen oder nicht.

Die verknüpfte Ressource berücksichtigt tatsächlich mehrere Typen, die mehrmals vorkommen können - ich leitete die obige Lösung daraus ab.

Die Laufzeit wird stark von der Anzahl der Artikel abhängen, die in eine Tasche passen - es wird O(minimumBagsUsed.2maxItemsPerBag) sein.

Im Fall von 1 Beutel ist dies im Wesentlichen the subset sum problem. Dafür können Sie das Gewicht als Wert betrachten und mit einem Rucksack-Algorithmus lösen, aber das wird nicht wirklich gut für mehrere Taschen funktionieren.

Warum nicht? Betrachte Artikel 5,5,5,9,9,9 mit einer Beutelgröße von 16. Wenn Sie nur Teilmenge Summe lösen, sind Sie mit 5,5,5 in einem Beutel und 9 in einem Beutel (für insgesamt 4 Beutel), anstatt 5,9 in jedem der 3 Beutel.

Subset sum/rapsack ist bereits ein schwieriges Problem - wenn es keine optimale Lösung bietet, können Sie auch den Sortier/Greedy-Ansatz verwenden.

+2

Erwähnenswert ist, dass, obwohl exakte Lösungen im Allgemeinen schwer zu bekommen sind, eine einfache 11/9 OPT + 1 Approximation existiert (die für (1 + eps) OPT + 1 in polynomieller Zeit für konstante eps verallgemeinert werden kann) –

+0

@NiklasB . Eine Anmerkung zur Annäherung hinzugefügt. – Dukeling

+0

Danke ... gute Antwort ... Ich versuchte eine andere Lösung, wo ich den Beispielcode: http://introcs.cs.princeton.edu/java/96optimization/Knapsack.java.html und machte Gewicht und Gewinn, um gleich zu sein . Ich habe die richtigen Ergebnisse für die Fälle, die ich versuchte, aber nicht sicher, ob es wirklich mein Problem löst. – Jony