Grundlagen

Intraktabilität

Manche Probleme sind lösbar – aber nur in einer Zeit, die das Alter des Universums übersteigt. Was P und NP genau sind, warum ein einziges Problem namens SAT im Zentrum steht, wie man Probleme ineinander übersetzt und warum SAT-Solver trotzdem täglich Millionen Variablen schaffen.

Lesestand

Intraktabel heißt ein Problem, das zwar lösbar ist, aber nur mit einem Aufwand, der exponentiell mit der Eingabe wächst – schon bei moderater Größe praktisch unlösbar. Als „effizient“ gilt dagegen, was in polynomieller Zeit geht. Die Klasse P umfasst alle Probleme, die sich so lösen lassen; NP alle, bei denen sich eine vorgeschlagene Lösung so prüfen lässt.

Im Zentrum steht SAT: Gibt es eine Belegung von Wahrheitswerten, die eine logische Formel wahr macht? Cook und Levin bewiesen 1971, dass sich jedes NP-Problem in SAT übersetzen lässt – SAT ist NP-vollständig. Ein schneller Algorithmus für SAT wäre einer für alles in NP. Niemand kennt einen, und die meisten glauben, es gibt keinen. Trotzdem lösen moderne SAT-Solver praktische Instanzen mit Millionen Variablen – Grundlage für Chipverifikation, Paketverwaltung und Planung.

Wo die Grenze verläuft

Auf der Komplexitäts-Seite ging es um O(n) gegen O(n²). Hier geht es um eine gröbere, aber härtere Grenze: polynomiell (n, n², n³, auch n¹⁰) gegen exponentiell (2ⁿ, n!). Bei einer Milliarde Schritten pro Sekunde:

Aufwandn = 20n = 50n = 100
n³8 µs125 µs1 ms
2ⁿ1 ms13 Tage4 · 10¹³ Jahre
n!77 Jahre10⁴⁸ Jahre10¹⁴¹ Jahre

Das Universum ist etwa 1,4 · 10¹⁰ Jahre alt. Schnellere Hardware hilft bei exponentiellem Aufwand kaum: Ein tausendmal schnellerer Rechner schafft bei 2ⁿ gerade einmal zehn Elemente mehr. Deshalb gilt seit den 1960er-Jahren die Faustregel (nach Cobham und Edmonds): polynomiell heißt handhabbar, exponentiell heißt intraktabel. Ein O(n¹⁰⁰)-Algorithmus wäre zwar kaum praktisch, aber solche kommen bei natürlichen Problemen selten vor.

P und NP genauer

P

Polynomiell lösbar

Ja/Nein-Probleme, die eine Turingmaschine – und damit jeder Rechner – in polynomieller Zeit entscheidet. Kürzeste Wege, Sortieren, Primzahltest (seit 2002 bewiesen), lineare Optimierung.

NP

Polynomiell prüfbar

Ja/Nein-Probleme, bei denen es für jede Ja-Instanz einen kurzen Beleg (Zertifikat) gibt, der sich in polynomieller Zeit prüfen lässt. Der Name heißt „nichtdeterministisch polynomiell“: Eine Maschine, die richtig raten dürfte, wäre schnell.

NPC

NP-vollständig

Die schwersten Probleme in NP: Jedes andere NP-Problem lässt sich in polynomieller Zeit in sie übersetzen. SAT, Graphfärbung, Rucksack, Handlungsreisender (als Ja/Nein-Frage), Sudoku in beliebiger Größe.

Jedes Problem in P ist auch in NP – wer lösen kann, kann auch prüfen. Die offene Frage ist die Umkehrung: Ist P = NP? Wenn ja, wäre jedes Problem, dessen Lösungen man schnell prüfen kann, auch schnell lösbar. Fast alle Fachleute glauben, dass nicht – aber seit 1971 hat es niemand bewiesen. Wie sich Finden und Prüfen anfühlen, zeigt das folgende Rätsel.

SAT: Finden gegen Prüfen

Eine Formel in konjunktiver Normalform ist eine Liste von Klauseln, die alle erfüllt sein müssen; jede Klausel ist erfüllt, wenn mindestens eines ihrer Literale stimmt. ¬B heißt „B ist falsch“. Finde die Belegung, die alle 14 Klauseln erfüllt – es gibt genau eine:

Sechs Variablen, vierzehn Klauseln

Das ist der Kern von NP: Prüfen kostet einen Blick auf jede Klausel – das macht der Rechner in Mikrosekunden. Finden heißt im schlimmsten Fall, die 2⁶ = 64 Belegungen durchzuprobieren. Bei 100 Variablen wären es 2¹⁰⁰ ≈ 10³⁰. Das Zertifikat ist die Belegung selbst: kurz, leicht zu prüfen, schwer zu finden.

Cook und Levin: alles ist SAT

Stephen Cook (1971) und unabhängig Leonid Levin zeigten: Die Rechnung einer beliebigen nichtdeterministischen Turingmaschine lässt sich in eine SAT-Formel übersetzen – Variablen für „Feld i enthält zum Zeitpunkt t das Zeichen x“, Klauseln für die Regeln. Die Formel ist genau dann erfüllbar, wenn die Maschine „ja“ sagt. Damit war SAT das erste NP-vollständige Problem. Richard Karp zeigte 1972 für 21 weitere Probleme, dass sich SAT in sie übersetzen lässt – heute sind es tausende.

Reduktion: ein Problem in SAT übersetzen

Ein praktisches Beispiel: Lässt sich eine Landkarte so färben, dass Nachbarländer verschiedene Farben haben? Die Übersetzung in SAT ist mechanisch – eine Variable pro Land und Farbe („Frankreich ist rot“), dazu drei Arten von Klauseln: Jedes Land hat mindestens eine Farbe, höchstens eine Farbe, und Nachbarn haben nicht dieselbe. Färbe selbst oder frag den Solver:

Kartenfärbung als SAT

Klick auf ein Land wechselt seine Farbe. Die Karte ist vereinfacht: Länder als Punkte, gemeinsame Grenzen als Linien.

Genau so arbeitet man in der Praxis: Man beschreibt sein Problem – Stundenplan, Paketabhängigkeiten, Schaltkreis – als Formel und überlässt die Suche einem SAT-Solver, an dem Forscher seit Jahrzehnten feilen. Die Übersetzung ist polynomiell; die Schwierigkeit steckt allein im Lösen.

Wie SAT-Solver es trotzdem schaffen

NP-vollständig heißt: Im schlimmsten Fall ist kein schneller Algorithmus bekannt. Praktische Formeln sind aber selten der schlimmste Fall. Der Grundalgorithmus DPLL (Davis, Putnam, Logemann, Loveland, 1962) probiert nicht blind, sondern setzt eine Variable, folgert alles, was daraus zwingend folgt (Unit Propagation: hat eine Klausel nur noch ein offenes Literal, muss es wahr sein), und geht bei einem Widerspruch zurück. Moderne CDCL-Solver (seit Ende der 1990er) lernen zusätzlich aus jedem Widerspruch eine neue Klausel, die denselben Fehler künftig sofort verhindert – damit wurden Instanzen mit Millionen Variablen alltäglich.

Wie schwer eine Formel ist, hängt erstaunlich stark von einem einzigen Verhältnis ab. Bei zufälligen 3-SAT-Formeln mit 25 Variablen:

Der Phasenübergang
Klauseln pro Variable

Live berechnet: je 40 zufällige Formeln mit 25 Variablen, gelöst mit einem einfachen DPLL-Solver im Browser. Gezählt werden die Sackgassen – Widersprüche, nach denen der Solver eine Entscheidung zurücknehmen muss.

Wenige Klauseln: fast jede Belegung passt, der Solver ist sofort fertig. Viele Klauseln: Widersprüche zeigen sich schnell. Dazwischen, bei etwa 4,3 Klauseln pro Variable, liegt ein scharfer Übergang – und genau dort sind die Formeln am schwersten. (Bei so kleinen Formeln wie hier verschwimmt der Übergang etwas und die Spitze rutscht leicht nach rechts; je mehr Variablen, desto schärfer wird er.) Das zeigt: „NP-vollständig“ ist eine Aussage über die schwersten Fälle, nicht über die typischen.

Was, wenn P = NP wäre?

Die Folgen wären enorm. Viele Optimierungsprobleme in Logistik, Planung und Chipdesign würden handhabbar, mathematische Beweise ließen sich womöglich automatisch finden. Gleichzeitig hinge die heutige Kryptografie am seidenen Faden: Sie beruht darauf, dass sich Schlüssel schwer finden, aber leicht prüfen lassen. Bemerkenswert dabei: Das Faktorisieren großer Zahlen, auf dem RSA beruht, liegt zwar in NP, gilt aber nicht als NP-vollständig – es könnte leichter sein als SAT. Quantencomputer könnten es mit Shors Algorithmus effizient lösen; für NP-vollständige Probleme ist dagegen kein solcher Durchbruch bekannt.

Für Entwickler übersetzt

Mit SAT4J gibt es einen ausgereiften SAT-Solver in reinem Java – er steckt unter anderem in Eclipse, wo er die Abhängigkeiten von Plugins auflöst. Variablen sind Zahlen ab 1, eine negative Zahl bedeutet „nicht“:

// (A ∨ ¬B) ∧ (B ∨ C) ∧ (¬A ∨ ¬C)  – A=1, B=2, C=3
ISolver solver = SolverFactory.newDefault();
solver.newVar(3);
solver.addClause(new VecInt(new int[] { 1, -2 }));
solver.addClause(new VecInt(new int[] { 2,  3 }));
solver.addClause(new VecInt(new int[] { -1, -3 }));

if (solver.isSatisfiable()) {
    int[] belegung = solver.model();   // z. B. [1, 2, -3]: A wahr, B wahr, C falsch
}
// Ausnahmen (ContradictionException, TimeoutException) hier weggelassen

// Kartenfärbung: Variable für "Land l hat Farbe f"
int var(int land, int farbe) { return land * FARBEN + farbe + 1; }
for (int[] kante : nachbarn)
    for (int f = 0; f < FARBEN; f++)
        solver.addClause(new VecInt(new int[] { -var(kante[0], f), -var(kante[1], f) }));
WerkzeugWofür
SAT4JSAT und verwandte Probleme in reinem Java, etwa Abhängigkeiten auflösen
Google OR-Tools (CP-SAT)Constraint-Solver mit Java-Schnittstelle: Schichtpläne, Tourenplanung, Zuordnungen – intern auf SAT-Technik aufgebaut
Timefold SolverPlanungsprobleme in Java (Nachfolger von OptaPlanner) – sucht mit Heuristiken gute statt beweisbar optimale Lösungen
Z3SMT-Solver (SAT plus Arithmetik und Datenstrukturen) mit Java-Anbindung – Grundlage vieler Werkzeuge zur Programmverifikation

Die praktische Lehre: Wer merkt, dass sein Problem NP-vollständig ist, schreibt keinen eigenen Suchalgorithmus, sondern übersetzt es für einen Solver – und setzt ein Zeitlimit, denn eine Garantie gibt es nicht.

Häufige Irrtümer

„NP heißt ‚nicht polynomiell‘.“ – Es heißt „nichtdeterministisch polynomiell“. Alle Probleme in P gehören auch zu NP.
„NP-vollständig heißt: in der Praxis unlösbar.“ – Es heißt: im schlimmsten Fall kein schneller Algorithmus bekannt. SAT-Solver lösen täglich riesige praktische Instanzen.
„Quantencomputer lösen NP-vollständige Probleme.“ – Dafür ist kein effizienter Quantenalgorithmus bekannt. Die bekannte allgemeine Beschleunigung (Grover) ist nur quadratisch – aus 2n wird 2n/2.
„RSA ist sicher, weil Faktorisieren NP-vollständig ist.“ – Das ist nicht bekannt und gilt als unwahrscheinlich. RSA beruht darauf, dass niemand einen schnellen klassischen Algorithmus kennt.
„Intraktabel und unentscheidbar ist dasselbe.“ – Intraktable Probleme sind lösbar, nur zu langsam. Unentscheidbare (G4) sind mit keinem Aufwand allgemein lösbar.

Verwandte Begriffe