Teilsummenproblem - LinkFang.de





Teilsummenproblem


Das Teilsummenproblem (auch Untermengensummenproblem, engl. subset sum problem) ist ein berühmtes Problem der Informatik und des Operations Research. Es ist ein spezielles Rucksackproblem.

Problembeschreibung

Gegeben sei eine Menge von ganzen Zahlen [math]I=\{w_1,w_2,\dotsc,w_n \}[/math]. Gesucht ist eine Untermenge, deren Elementsumme maximal, aber nicht größer als eine gegebene obere Schranke [math]c[/math] ist (oft ist auch gefragt, die Schranke [math]c[/math] exakt zu erreichen).

Formal: Gesucht sind [math]x_1,\dotsc,x_n \in \{0,1\}[/math], die [math]\sum_{j=1}^n {w_j x_j} [/math] maximieren unter der Nebenbedingung [math]\sum_{j=1}^n {w_j x_j} \le c[/math].

NP-Vollständigkeit

Das Problem ist NP-vollständig und somit vermutlich nicht effizient lösbar. Es kann mit der Branch-and-Bound-Methode gelöst werden.

Der Beweis der NP-Schwere erfolgt durch eine Reduktion von 3-SAT. Für eine gegebene Klauselmenge [math]C_1 \wedge C_2 \wedge \ldots C_m [/math] mit den Variablen [math]x_1 \ldots x_n [/math] werden die Dezimalzahlen [math]w_1 \ldots w_{2n+2m}[/math] sowie die Schranke [math]c[/math] anhand einer Tabelle konstruiert. Es wird vorausgesetzt, dass keine Klauseln vorhanden sind, die [math]x_i[/math] und [math]\overline{x_i}[/math] gleichzeitig enthalten; dies ist keine Einschränkung, da eine solche Klausel immer erfüllt wäre und somit weggelassen werden kann, ohne den Sinn zu verändern.

Beispielsweise wird die Formel [math](x_1 \vee \overline{x_2} \vee x_3) \wedge (x_1 \vee x_2 \vee x_3) \wedge (\overline{x_1} \vee \overline{x_2} \vee \overline{x_3})[/math] wie folgt verarbeitet (eine Erklärung folgt nach der Tabelle).

[math]x_1[/math] [math]x_2[/math] [math]x_3[/math] [math]C_1[/math] [math]C_2[/math] [math]C_3[/math]
[math]w_1[/math] 1 0 0 1 1 0
[math]w_2[/math] 1 0 0 0 0 1
[math]w_3[/math] 0 1 0 0 1 0
[math]w_4[/math] 0 1 0 1 0 1
[math]w_5[/math] 0 0 1 1 1 0
[math]w_{6=2n}[/math] 0 0 1 0 0 1
[math]w_7[/math] 0 0 0 1 0 0
[math]w_8[/math] 0 0 0 2 0 0
[math]w_9[/math] 0 0 0 0 1 0
[math]w_{10}[/math] 0 0 0 0 2 0
[math]w_{11}[/math] 0 0 0 0 0 1
[math]w_{12=2n+2m}[/math] 0 0 0 0 0 2
[math]c[/math] 1 1 1 4 4 4
  • Die ersten 2n Zeilen sind lediglich eine Codierung der Formel selbst: [math]w_1 = 100110[/math] besagt, dass [math]x_1[/math] in den Klauseln [math]C_1[/math] und [math]C_2[/math], aber nicht [math]C_3[/math] vorkommt. [math]w_2[/math] setzt das für [math]\overline{x_1}[/math] um, [math]w_3[/math] für [math]x_2[/math], [math]w_4[/math] für [math]\overline{x_2}[/math] etc.
  • Die Zeilen [math]w_{2n+1}[/math] bis [math]w_{2n+2m}[/math] sind "Korrekturzeilen", die nur auf der Diagonalen jeweils abwechselnd den Wert 1 oder 2 haben.
  • Die Zahl [math]c[/math] besteht nur aus n Einsen und m Vieren. Dies bewirkt, dass bei Addition der Spaltenwerte, an den ersten n Stellen nur entweder [math]w_1[/math] oder [math]w_2[/math]; [math]w_3[/math] oder [math]w_4[/math] etc. ausgewählt werden kann, wodurch in der Formel [math]x_i[/math] auf true oder false gesetzt wird. Die Vieren sind so gewählt, dass zusätzlich zu den beiden Korrekturwerten, die zusammen nur 1+2=3 ergeben, noch mindestens eine der Variablen in den Klauseln vorhanden sein muss, um auf 4 zu kommen. Sind mehr Variablen verfügbar, können entsprechend Korrekturzeilen weggelassen werden.

Besitzt nun die boolesche Formel eine erfüllende Belegung, so nehmen wir falls [math]x_i[/math]=true die Zahl [math]w_{2i-1}[/math] auf; falls [math]x_i[/math]=false die Zahl [math]w_{2i}[/math]. Damit sind schon die Einsen in [math]c[/math] korrekt. Da alle Klauseln erfüllt sind, ist in den gerade hinzugefügten Zahlen in jeder Klausel mindestens eine erfüllte Variable vorhanden, somit sind die Spaltensummen im rechten Teil schon mindestens 1 und höchstens 3. Nun muss man nur noch die Korrekturvariablen geeignet wählen um auf 4 zu kommen. Mit der konstruierten Menge ist es so möglich, genau [math]c[/math] zu erreichen, wenn die Formel erfüllbar ist.

Wenn nun [math]c[/math] genau erreicht werden kann, so muss die Teilmenge der [math]w_i[/math] zunächst jeweils genau ein [math]w_1[/math] oder [math]w_2[/math]; [math]w_3[/math] oder [math]w_4[/math] etc. enthalten, weil sonst die Einsen in [math]c[/math] nicht erfüllt wären. Somit ist gewährleistet, dass eine Variable tatsächlich true oder false (und nicht keins oder beides) ist. Durch diese Auswahl der Teilmenge muss dann auch jede Klausel erfüllt sein, denn wenn in einer Klausel keine Variable durch die Belegung erfüllt wäre, so würde die Addition nicht die notwendige Vier in [math]c[/math] ergeben. Daher ist die boolesche Formel insgesamt erfüllbar.

Literatur

  • Soma, Nei Y. Toth, Paolo: An exact algorithm for the subset sum problem. European Journal of Operational Research 136 S. 57-66
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, und Clifford Stein. Algorithmen - Eine Einführung., Oldenbourg-Verlag, 2004. ISBN 3-486-27515-1. Seiten 1017ff.

Kategorien: Komplexitätstheorie | Optimierung

Quelle: Wikipedia - http://de.wikipedia.org/wiki/Teilsummenproblem (Vollständige Liste der Autoren des Textes [Versionsgeschichte])    Lizenz: CC-by-sa-3.0

Änderungen: Alle Bilder mit den meisten Bildunterschriften wurden entfernt. Ebenso alle zu nicht-existierenden Artikeln/Kategorien gehenden internen Wikipedia-Links (Bsp. Portal-Links, Redlinks, Bearbeiten-Links). Entfernung von Navigationsframes, Geo & Normdaten, Mediadateien, gesprochene Versionen, z.T. ID&Class-Namen, Style von Div-Containern, Metadaten, Vorlagen, wie lesenwerte Artikel. Ansonsten sind keine Inhaltsänderungen vorgenommen worden. Weiterhin kann es durch die maschinelle Bearbeitung des Inhalts zu Fehlern gerade in der Darstellung kommen. Darum würden wir jeden Besucher unserer Seite darum bitten uns diese Fehler über den Support mittels einer Nachricht mit Link zu melden. Vielen Dank!

Stand der Informationen: August 201& - Wichtiger Hinweis: Da die Inhalte maschinell von Wikipedia übernommen wurden, ist eine manuelle Überprüfung nicht möglich. Somit garantiert LinkFang.de nicht die Richtigkeit und Aktualität der übernommenen Inhalte. Sollten die Informationen mittlerweile fehlerhaft sein, bitten wir Sie darum uns per Support oder E-Mail zu kontaktieren. Wir werden uns dann innerhalb von spätestens 10 Tagen um Ihr Anliegen kümmern. Auch ohne Anliegen erfolgt mindestens alle drei Monate ein Update der gesamten Inhalte.