🎒 0/1-Rucksackproblem
Interaktive 0/1-Rucksack-Simulation: Bearbeiten Sie Gegenstände, bauen Sie die DP-Tabelle Zelle für Zelle auf, verfolgen Sie die optimale Packung zurück und vergleichen Sie sie mit der Greedy-Heuristik.
Über das 0/1-Rucksackproblem
Das 0/1-Rucksackproblem ist ein klassisches kombinatorisches Optimierungsproblem: Gegeben sind n Gegenstände mit jeweils einem Gewicht wᵢ und einem Wert vᵢ; man wählt eine Teilmenge, die den Gesamtwert maximiert, ohne eine Gewichtskapazität W zu überschreiten. Die Bezeichnung „0/1" zeigt an, dass jeder Gegenstand entweder vollständig genommen oder ganz weggelassen werden muss — eine gebrochene Auswahl ist nicht erlaubt. Das Problem ist NP-schwer, das heißt, es ist kein Algorithmus mit polynomialer Laufzeit bekannt, der alle Instanzen löst, aber der Ansatz der dynamischen Programmierung (DP) läuft in pseudopolynomialer O(nW)-Zeit und findet das exakte Optimum.
In dieser Simulation können Sie Gegenstände hinzufügen, bearbeiten oder entfernen und beobachten, wie die DP-Tabelle Zelle für Zelle gefüllt wird: Jede Zelle dp[i][w] speichert den maximal erreichbaren Wert mit den ersten i Gegenständen bei Kapazität w. Nach Fertigstellung der Tabelle verfolgt eine Rückverfolgungsphase die optimale Gegenstandsauswahl im Raster, und ein direkter Vergleich zeigt, wie sich die gierige gebrochene Heuristik von der exakten DP-Lösung unterscheidet.
Häufig gestellte Fragen
Wie lautet die Rekursionsformel für die 0/1-Rucksack-DP?
dp[i][w] = max(dp[i−1][w], dp[i−1][w − wᵢ] + vᵢ), falls wᵢ ≤ w, sonst dp[i−1][w]. Der erste Term überspringt Gegenstand i; der zweite nimmt ihn (nur möglich, wenn sein Gewicht passt). Der Basisfall ist dp[0][w] = 0 für alle w. Die endgültige Antwort ist dp[n][W].
Warum gilt das 0/1-Rucksackproblem als NP-schwer?
NP-Schwere bedeutet, dass kein Algorithmus mit polynomialer Laufzeit bekannt ist, der alle Instanzen löst. Der DP-Ansatz läuft in O(nW) Zeit, aber W selbst kann in seiner Binärdarstellung exponentiell groß sein (pseudopolynomial, nicht echt polynomial). Das Problem wurde 1972 von Karp durch Reduktion vom Teilmengensummenproblem als NP-vollständig gezeigt. In der Praxis ist die DP für moderate W (bis zu Millionen) vollkommen durchführbar.
Wie unterscheidet sich der gierige gebrochene Rucksack von der 0/1-Version?
Der gebrochene Rucksack erlaubt es, Gegenstände zu teilen; die gierige Strategie, immer den Gegenstand mit dem höchsten Wert-Gewicht-Verhältnis (vᵢ/wᵢ) zu wählen, liefert die optimale Lösung in O(n log n) Zeit. Beim 0/1-Rucksack kann dieser gierige Ansatz scheitern: Zum Beispiel wählt bei Kapazität 10 mit den Gegenständen (Gewicht 6, Wert 6), (Gewicht 5, Wert 5) und (Gewicht 5, Wert 5) die Verhältnis-Gier Gegenstand 1 für Wert 6, aber die Wahl der Gegenstände 2 und 3 ergibt Wert 10.
Wie ermittelt man die optimalen Gegenstände nach dem Füllen der DP-Tabelle?
Ausgehend von Zelle dp[n][W] vergleicht man sie mit dp[n−1][W]. Unterscheiden sie sich, wurde Gegenstand n einbezogen; sein Gewicht wird von W abgezogen, und man geht zu Zeile n−1. Sind sie gleich, wurde Gegenstand n ausgeschlossen; man geht zu dp[n−1][W]. Dies wird bis Zeile 0 wiederholt. Dieser Rückverfolgungsschritt läuft in O(n) Zeit.
Kann die Platzkomplexität unter O(nW) reduziert werden?
Ja. Da dp[i][w] nur von Zeile i−1 abhängt, können zwei 1D-Arrays der Länge W+1 (aktuelle und vorherige Zeile) verwendet werden, was den Speicherbedarf auf O(W) reduziert. Iteriert man w in einem einzigen 1D-Array von W abwärts bis wᵢ, lässt sich O(W) Speicher in-place erreichen, ohne vorherige Zeilen zu speichern, wobei die Rückverfolgung dann eine Neuberechnung oder das Speichern von Zeilendifferenzen erfordert.
Was ist der Branch-and-Bound-Ansatz beim Rucksackproblem?
Branch-and-Bound durchsucht den exponentiellen Suchbaum der Einschluss-/Ausschluss-Entscheidungen, schneidet aber Teilbäume ab, deren obere Schranke (üblicherweise die gebrochene Relaxation) die aktuell beste Lösung nicht übertreffen kann. Für viele praktische Instanzen ist dies deutlich schneller als DP, wenn W riesig, aber n klein ist. Es ist die Grundlage kommerzieller Solver für ganzzahlige Programmierung wie Gurobi und CPLEX.
Gibt es Näherungsalgorithmen für das Rucksackproblem?
Ja. Ein Fully Polynomial-Time Approximation Scheme (FPTAS) erzeugt eine Lösung innerhalb des Faktors (1 − ε) des Optimums in O(n²/ε) Zeit, indem Gegenstandswerte skaliert und gerundet werden. Dies macht die DP-Tabelle für große W klein genug, während nahezu optimale Ergebnisse garantiert werden, und ist ein Meilenstein der Approximationstheorie.
Was sind praktische Anwendungen des Rucksackproblems?
Anwendungen umfassen Frachtbeladung (Maximierung des Umsatzes unter Berücksichtigung von Flugzeuggewichtsgrenzen), Ressourcenzuweisung (Zuweisung von CPU/Speicher an konkurrierende Aufgaben), Portfolioauswahl (Maximierung der Rendite unter einem Budget), Kryptografie (frühe rucksackbasierte Public-Key-Verfahren von Merkle-Hellman, heute gebrochen) und Compiler-Registerzuweisung.
Wie unterscheidet sich die Mehrfach-Rucksack-Variante?
Beim Mehrfach-Rucksackproblem gibt es m Rucksäcke mit jeweils eigener Kapazität, und Gegenstände müssen höchstens einem Rucksack zugewiesen werden. Dies verallgemeinert das Bin-Packing und ist strikt schwieriger; optimale Lösungen erfordern ganzzahlige lineare Programmierung oder Heuristiken wie First-Fit-Decreasing. Es tritt in der Logistik, beim Cloud-VM-Bin-Packing und bei Zuschnittproblemen auf.
Was ist das unbeschränkte Rucksackproblem?
Bei der unbeschränkten Variante kann jeder Gegenstand beliebig oft gewählt werden (unbegrenzter Vorrat). Die Rekursion ändert sich zu dp[w] = Maximum über alle i, bei denen wᵢ ≤ w ist, von (dp[w − wᵢ] + vᵢ), unter Verwendung eines einzigen 1D-Arrays, das vorwärts von w = 1 bis W durchlaufen wird. Dies modelliert Szenarien wie Münzwechsel oder das Zerschneiden eines Stabes in Stücke zur Gewinnmaximierung.
Maximieren Sie den Wert, ohne die Kapazität zu überschreiten. Beobachten Sie, wie die dynamische Programmierung die DP-Tabelle Zelle für Zelle mit der Nehmen-vs.-Überspringen-Rekursion füllt, und verfolgen Sie dann zurück, um die optimale Gegenstandsmenge zu ermitteln — und sehen Sie, warum Greedy scheitern kann.
3D · Three.js / WebGL-Renderer · 60 FPS-Ziel · läuft vollständig clientseitig, keine Installation nötig