Knapsack 0/1 Rechner (Rucksackproblem)
Rechner Rucksackproblem 0/1, fraktional und bounded: dynamische Programmierung, Greedy, Effizienzvergleich Wert/Gewicht und Rekonstruktion der Lösung.
Berechnungsfehler melden
Hilf uns zu verbessern. Beschreibe, was an der Berechnung nicht stimmt.
Ergebnis
| Voce | Valore |
|---|
Alle Details anzeigen
Ergebnis teilen
Haftungsausschluss: Diese Berechnung ist rein indikativ. Für wichtige Entscheidungen konsultieren Sie einen Fachmann.
Das Rucksackproblem
Das Rucksackproblem (knapsack) ist eines der 21 ursprünglichen NP-vollständigen Probleme von Karp (1972) und ein Eckpfeiler der kombinatorischen Optimierung. Gegeben eine Sammlung von Objekten mit Gewicht und Wert und ein Rucksack der Kapazität W, bestimme die Teilmenge mit maximalem Gesamtwert ohne Überschreitung. Hauptvarianten: 0/1 (Objekt ganz oder ausgeschlossen), fraktional (Bruchteile erlaubt), bounded (begrenzte Kopien).
Mathematische Formulierung
Maximiere Sigma v_i * x_i unter Sigma w_i * x_i <= W, mit x_i in {0,1} für 0/1, x_i in [0,1] für fraktional, x_i in {0,1,...,q_i} für bounded. Die Entscheidungsvariante ist NP-vollständig; die Optimierung ist NP-schwer. Pseudo-polynomiale O(nW) Algorithmen existieren via dynamische Programmierung.
Dynamische Programmierung
Der klassische Algorithmus baut dp[i][w] = maximaler Wert mit ersten i Objekten und Kapazität w. Rekurrenz: dp[i][w] = max(dp[i-1][w], dp[i-1][w-w_i] + v_i) falls w_i <= w. Basis dp[0][w] = 0. Optimallösung dp[n][W]; Objekte durch Backtracking. Komplexität O(nW) Zeit, reduzierbar auf O(W) Platz.
Die vier Modi
- 0/1 lösen: dynamische Programmierung mit Rekonstruktion.
- Fraktional: Greedy sortiert nach v/w absteigend.
- Bounded: binäre Zerlegung reduziert auf 0/1.
- Effizienzvergleich: Wert/Gewicht-Verhältnisse.
Greedy scheitert bei 0/1
Sortieren nach v/w absteigend löst fraktional, kann aber für 0/1 beliebig suboptimal sein. Beispiel: W=10, Objekte [(6,60), (5,50), (5,50)]. Greedy wählt das erste (Ratio 10), lässt W=4 ungenutzt: Wert 60. Optimum nimmt die letzten zwei: Wert 100.
Approximation FPTAS
Es existiert ein voll polynomielles Approximationsschema (FPTAS) für 0/1 Knapsack: für jedes epsilon>0, Algorithmus in O(n^3/epsilon) mit Wert >= (1-epsilon) * OPT. Erreicht durch Skalierung der Werte mit v_max*epsilon/n und DP über Werte.
Klassisches Beispiel
W=10, Objekte (2,3), (3,4), (4,5), (5,6). DP ergibt dp[4][10] = 13 mit Objekten 1, 2, 4 (Gewichte 2+3+5=10, Werte 3+4+6=13).
Anwendungen
- Budgetzuweisung: Projektwahl mit maximalem ROI.
- Cutting Stock: Optimierung bei Textil-, Papier-, Metallschnitt.
- Portfoliooptimierung: Titelauswahl mit Kapitalgrenze.
- Containerbeladung: See- und Luftlogistik.
- Cloud-Ressourcenzuweisung: VM-Platzierung mit RAM/CPU-Grenzen.
Geschichte des Rucksackproblems
Das Rucksackproblem (englisch knapsack) hat seinen Namen von der anschaulichen Situation, in der jemand einen Rucksack begrenzter Kapazität füllen muss, indem er aus vielen Gegenständen jene mit maximalem Gesamtwert auswählt. In der Mitte des 20. Jahrhunderts im Operations Research formalisiert, wurde es zu einem der meistuntersuchten Probleme der theoretischen Informatik. 1972 nahm Richard Karp es in seine berühmte Liste von 21 NP-vollständigen Problemen auf und besiegelte damit seine grundlegende Schwierigkeit. Das Problem spielte auch in der Kryptografie eine historische Rolle: 1978 schlugen Ralph Merkle und Martin Hellman eines der ersten Public-Key-Kryptosysteme vor, das auf dem Rucksack beruhte (das Merkle-Hellman-Knapsack). Die Idee war, die Schwierigkeit des Problems als Sicherheitsgarantie zu nutzen, doch das System wurde 1982 von Adi Shamir spektakulär gebrochen, der seine besondere Struktur ausnutzte. Seither bleibt der Rucksack ein grundlegender Prüfstein für exakte, heuristische und Approximationsalgorithmen.
Warum der Algorithmus pseudopolynomiell ist
Die dynamische Programmierung löst das 0/1-Rucksackproblem in Zeit O(n·W), wobei n die Anzahl der Gegenstände und W die Kapazität ist. Auf den ersten Blick scheint das effizient, doch es gibt ein feines Detail: W ist ein Zahlenwert, nicht die Größe der Eingabe. Zur Darstellung der Kapazität W genügen etwa log₂(W) Bit, sodass die Zeit O(n·W) exponentiell in der Länge der Eingabedaten ist. Das ist mit einem pseudopolynomiellen Algorithmus gemeint: polynomiell im Wert der Zahlen, aber exponentiell in der Anzahl der Ziffern. Deshalb ist der Rucksack schwach NP-schwer: bleiben Kapazitäten und Gewichte klein, ist die DP sehr schnell, doch mit riesigen Zahlen (Hunderte von Ziffern) wird sie unpraktikabel. Ein wirklich in der Eingabegröße polynomieller Algorithmus ist nicht bekannt, und seine Existenz käme dem Beweis von P = NP gleich.
Aktualisiert im Juli 2026
Kommentare (0)
Anmelden um zu kommentieren.
Noch keine Kommentare. Sei der Erste!