Die Webseiten der Fachschaft Informatik am ERG Saalfeld
Das Rucksackproblem als Beispiel für "praktisch nicht berechenbar"
Die im Folgenden angegebene Darstellung des Rucksackproblems wurde von den Seiten von "inf-schule.de" übernommen und
an das Layout dieser Seiten angepasst. Diese Seite steht deshalb wie die Seiten des Originals unter der Lizenz CC BY-SA 4.0.
Ein Rucksack voller Geschenke
Franziska ist die Gewinnerin bei der neuen Fernsehshow "Knapsack".
Als Gewinn erhält sie einen Rucksack, in den sie weitere Gegenstände aus einer vorgegebenen
Auswahl einpacken kann.
Es gibt allerdings einen kleinen Haken. Der Rucksack wird nach dem Einpacken der Gegenstände
gewogen. Überschreitet das Gesamtgewicht die maximales Traglast von 15 kg, gibt es keinen Gewinn.
Das Rucksackproblem
Das Rucksackproblem lässt sich allgemein wie folgt formulieren:
Gegeben sind n Gegenstände mit ihren Gewichten und Werten. Gegeben ist zusätzlich ein Grenzgewicht, das die maximale Traglast des Rucksacks beschreibt. Gesucht ist eine Kombination von Gegenständen,
so dass das Grenzgewicht nicht überschritten wird und der Gesamtwert der Gegenstände möglichst hoch ist.
Formal lässt das Rucksackproblem so formulieren:
Gegeben sind n Zahlenpaare (g0, w0), ..., (gn-1, wn-1) (die Gewicht und Wert von n Gegenständen beschreiben). Gegeben ist zusätzlich eine Grenzzahl G (die die maximale Traglast des Rucksacks beschreibt). Alle diese Zahlen sind beliebige (positive) Dezimalzahlen.
Gesucht ist eine 0-1-Folge x0, ..., xn-1
(die die Auswahl der Gegenstände beschreibt: 0 - nicht einpacken; 1 - einpacken),
so dass
x0*g0 + ... + xn-1*gn-1 <= G
gilt und
x0*w0 + ... + xn-1*wn-1
maximal ist.
Ein einfacher Lösungsalgorithmus
Kombinationen ausprobieren
Eine - zugegebenermaßen - wenig elegante Lösung des Rucksackproblems besteht darin, alle möglichen Kombinationen von Gegenständen zu betrachten
und die zugehörigen Gesamtgewichte und Gesamtwerte zu berechnen und aus all den ermittelten Zahlenwerten die gesuchte Kombination zu bestimmen.
Ein Algorithmus zum Lösungsverfahren
Ein Algorithmus zur oben beschriebenen Idee lässt sich leicht formulieren, z.B. so:
Übergabe:
erzeuge eine erste kombination, z.B. '00000000'
maxKombination = kombination
maxWert = Gesamtwert von kombination
SOLANGE noch nicht alle Kombinationen durchlaufen sind:
erzeuge eine neue kombination
WENN der Gesamtwert von kombination > maxWert und
das Gesamtgewicht von kombination <= grenzgewichtRucksack:
maxKombination = kombination
maxWert = Gesamtwert von kombination
Rückgabe: (maxKombination, maxWert, Gesamtgewicht von maxKombination)
Eine Implementierung zum Algorithmus
Zur Implementierung müssen u.a. alle möglichen Kombinationen erzeugt werden. Wir gehen dabei so vor:
Eine Kombination wird durch eine 0-1-Zeichenkette beschrieben, die für jeden Gegenstand festlegt, ob er eingepackt wird ('1') oder nicht ('0'). So beschreibt z.B. die Zeichenkette '0010000000' eine Situation,
in der nur der Gegenstand mit der Nummer 2 ausgewählt wird (beachte: wie fangen bei 0 an zu zählen).
Bei n Gegenständen gibt es 2n mögliche Kombinationen bzw. 0-1-Zeichenketten. Wir erzeugen diese systematisch, indem wir die Zahlen 0..2n-1 durchlaufen und aus den Dualdarstellungen dieser Zahlen die 0-1-Bitmuster generieren.
Auf der als Quelle angegebenen Seite ist ein (noch zu ergänzendes) Demoprogramm in Python angegeben, dass alle möglichen Kombinationen sowie deren Gesamtwert und Gesamtgewicht bestimmt.
Komplexitätsbetrachtungen
Komplexität des Algorithmus
Eine naive Beschreibung der Komplexität des oben gezeigten Algorithmus geht von folgenden Annahmen aus:
Die Problemgröße wird durch die Anzahl n der Gegenstände festgelegt.
Als Kostenmaß wählen wir die Anzahl der zu untersuchenden Kombinationen.
Es ergibt sich dann die Kostenfunktion K(n) = 2n.
Diese Kostenfunktion ist eine Exponentialfunktion. Der Algorithmus hat demnach eine exponentielle Komplexität.
Komplexität des Problems
Ob das Rucksackproblem selbst eine exponentielle Komplexität hat, ist hierdurch noch nicht erwiesen.
Es könnte Algorithmen geben, die das Problem viel schneller - z.B. mit polynomialer Komplexität - lösen.
Tatsächlich gibt es einen Algorithmus, der das Rucksackproblem viel effizienter als der oben gezeigte Algorithmus bearbeiten.
Er beruht auf der Idee, dass man das Problem,
einen Rucksack bei n Gegenständen optimal zu packen, auf das Problem, einen Rucksack bei n-1 Gegenständen optimal zu packen, reduzieren kann.
Analysiert man die Komplexität dieses Algorithmen, so erweist sich die oben vorgenommene "naive" Problembeschreibung als
inadäquat. Man muss die Größe und Verarbeitung der insgesamt 2n+1 zu verarbeitenden Ausgangszahlen differenzierter betrachten. Insbesondere muss man berücksichtigen, dass sinnvollerweise die Rucksackkapazität mit wachsender Anzahl von Gegenständen auch wachsen sollte.
Es erweist sich dann, dass bei diesem Algorithmus trotz großer Verbesserungen dennoch eine exponentielle Komplexität vorliegt.
Alle bis heute entwickelten Algorithmen zur Lösung des Rucksackproblems haben eine exponentielle Komplexität. Es ist kein Algorithmus bekannt, der das Rucksackproblem mit polynomialem Zeitaufwand löst. Vieles spricht dafür, dass das Rucksackproblem
nicht zur Klasse der Probleme mit polynomialer Komplexität gehört. Eine endgültige Klärung dieser Komplexitätsfrage ist noch nicht gelungen.
Aufgaben
- In der Abbildung oben stehen 10 Gegenstände zur Auswahl. Wie viele verschiedene Kombinationen von Gegenständen gibt es? Zu den Kombinationen sollen auch solche Fälle wie "keinen Gegenstand einpacken" und "alle Gegenstände einpacken" zählen.
- Angenommen, es wären 11 bzw. 12 Gegenstände zur Auswahl, wie viele Kombinationen von Gegenständen gibt es dann?
- Bei diesen angegebenen Algorithmus wird auf dieser Seite von einem "naiven" Algorithmus geschrieben - warum? (anders formuliert: was ist dabei nicht gut?)
- Um das Problem besser in den Griff zu bekommen, wird "dynamische Programmierung" angegeben. Was versteht man darunter?
- Das Rucksack-Problem gehört in die Kategorie "NP-schwer". Was versteht man darunter?
Weblinks
- Rucksackproblem
- Ein Rucksack voller Geschenke + Das Rucksackproblem
- Kombinationen ausprobieren + Ein Algorithmus zum Lösungsverfahren + Eine Implementierung zum Algorithmus
- Komplexität des Algorithmus + Komplexität des Problems
- Rucksackproblem (Tino Hempel)
- Rucksackproblem (Wikipedia)
- Rucksackproblem (Robert Sedgewick)
- Verfahren zur Lösung von 0-1-RucksackProblemen - Theorie und Implementierung
- Rucksackproblem als dynamische Programmierung
- Das Rucksack-Problem (Folien - Uni Bremen)
zurück
© ERG Saalfeld - Hans-Dietrich Kirmse 14.04.2019
|