Berechenbarkeit und Komplexität
Eine Entwicklerin wünscht sich ein Werkzeug, das jedes Programm daraufhin prüft, ob es in eine Endlosschleife gerät. Ein Lieferdienst will für 50 Kunden die kürzeste Tour und lässt den Rechner alle Reihenfolgen durchprobieren.
Das erste Vorhaben ist grundsätzlich unmöglich, das zweite praktisch nicht zu schaffen. Das sind zwei verschiedene Grenzen: Was lässt sich überhaupt berechnen? Und was lässt sich mit vertretbarem Aufwand berechnen?
Algorithmusbegriff und Turingmaschine
Ein Algorithmus ist eine endlich beschriebene, eindeutige Vorschrift aus ausführbaren Einzelschritten, die für jede Eingabe nach endlich vielen Schritten ein Ergebnis liefert. „Ausführbar“ ist dabei noch ungenau. Zur Präzisierung nutzt man ein einfaches Rechenmodell, die Turingmaschine (Alan Turing, 1936). Sie hat eine endliche Steuerung mit Zuständen, ein beidseitig unbegrenztes Band aus Feldern, die je ein Zeichen oder das Leerzeichen □ tragen, und einen Schreib-Lese-Kopf. In jedem Schritt hängt alles vom Zustand und dem Zeichen unter dem Kopf ab: Die Maschine schreibt ein Zeichen, bewegt den Kopf nach links (L), nach rechts (R) oder gar nicht (N) und wechselt den Zustand. Sie hält, wenn sie den Endzustand „halt“ erreicht.
Eine Turingmaschine addiert 1
Eine Turingmaschine addiert 1
Auf dem Band steht eine Binärzahl, der Kopf steht auf ihrem ersten Zeichen. Die Maschine soll 1 addieren.
| Zustand | liest | schreibt | Kopf | neuer Zustand |
|---|---|---|---|---|
| q0 | 0 | 0 | R | q0 |
| q0 | 1 | 1 | R | q0 |
| q0 | □ | □ | L | q1 |
| q1 | 1 | 0 | L | q1 |
| q1 | 0 | 1 | N | halt |
| q1 | □ | 1 | N | halt |
Was steht nach dem Lauf auf dem Band, wenn am Anfang 1011 steht?
In q0 läuft der Kopf über 1, 0, 1, 1 bis zum ersten □ und geht dann nach links auf die letzte Ziffer. In q1 wird jede 1 zu 0 (Übertrag) und der Kopf geht weiter nach links. Die letzte 1 wird 0, die vorletzte 1 wird 0, dann steht der Kopf auf der 0 an zweiter Stelle. Sie wird zu 1, und die Maschine hält. Auf dem Band steht 1100. Das stimmt: 1011 ist 11 und 1100 ist 12.
Registermaschine und Church-Turing-These
Die Registermaschine aus der Rechnerarchitektur (Register mit Zahlen, Befehle zum Laden, Rechnen und Springen) ist ein zweites Modell. Man kann zeigen: Jede Registermaschine lässt sich durch eine Turingmaschine nachbilden und umgekehrt. Beide berechnen dieselben Funktionen.
Die Church-Turing-These (Alonzo Church, Alan Turing) besagt: Jede im anschaulichen Sinn berechenbare Funktion lässt sich von einer Turingmaschine berechnen. Sie ist eine These und kein Satz, denn „anschaulich berechenbar“ ist kein mathematischer Begriff, man kann sie nicht beweisen. Für sie spricht, dass alle vorgeschlagenen Modelle (Registermaschine, Programmiersprachen mit unbegrenztem Speicher und weitere) dieselben Funktionen berechnen und kein Gegenbeispiel bekannt ist.
Entscheidbarkeit
Ein Entscheidungsproblem hat als Antwort ja oder nein, zum Beispiel: Ist n eine Primzahl? Es ist entscheidbar, wenn es einen Algorithmus gibt, der für jede Eingabe nach endlich vielen Schritten die richtige Antwort liefert. Sonst ist es unentscheidbar. Das Halteproblem fragt: Hält das Programm P bei der Eingabe x nach endlich vielen Schritten an?
Das Halteproblem ist unentscheidbar
Es gibt keinen Algorithmus, der für jedes Programm P und jede Eingabe x immer richtig sagt, ob P bei x hält. Läuft ein Programm P bei x tatsächlich irgendwann zu Ende, merkt man das beim Ausführen. Nur das „hält nie“ lässt sich nicht allgemein feststellen.
Laufzeitaufwand: polynomiell und exponentiell
Der Laufzeitaufwand zählt die Schritte eines Algorithmus in Abhängigkeit von der Eingabegröße n (O-Notation). Er heißt polynomiell, wenn er höchstens für ein festes k wächst, und exponentiell, wenn er wie wächst. Die Tabelle zeigt die Schrittzahl, dazu die Dauer bei angenommenen Schritten pro Sekunde:
| n | |||
|---|---|---|---|
| 10 | 100 | 1000 | 1024 |
| 30 | 900 | 27000 | etwa , etwa 1 Sekunde |
| 50 | 2500 | 125000 | etwa , etwa 13 Tage |
Ein tausendmal schnellerer Rechner hilft bei kaum: Er schafft nur etwa 10 weitere Elemente, denn .
Die Klassen P und NP, SAT, Handlungsreisender, Rucksackproblem
P ist die Klasse der Entscheidungsprobleme, die ein Algorithmus in polynomieller Zeit löst. NP ist die Klasse der Entscheidungsprobleme, bei denen sich eine vorgeschlagene Lösung in polynomieller Zeit überprüfen lässt. Es gilt . Ob gilt, ist ungeklärt. Die NP-vollständigen Probleme sind die schwersten in NP: Hätte eines einen polynomiellen Algorithmus, hätten ihn alle in NP. Keiner ist bekannt, vermutet wird .
- SAT: Gibt es für eine aussagenlogische Formel eine Belegung der Variablen, die sie wahr macht? Die Formel wird mit a = wahr, b = falsch, c = wahr wahr. Eine Belegung zu prüfen ist schnell, es gibt aber Belegungen. SAT ist NP-vollständig.
- Handlungsreisender: Gesucht ist die kürzeste Rundreise durch n Städte, die jede genau einmal besucht und zum Start zurückkehrt. Bei gleichen Wegen in beiden Richtungen gibt es Rundreisen, bei 10 Städten 181440.
- Rucksackproblem: Gegenstände haben Gewicht und Wert, der Rucksack hat eine Tragfähigkeit. Gesucht ist die Auswahl mit dem höchsten Wert. Bei n Gegenständen gibt es Auswahlen.
Auch die Entscheidungsfassungen der beiden letzten Probleme sind NP-vollständig: „Gibt es eine Rundreise höchstens dieser Länge?“ und „Gibt es eine Auswahl mindestens dieses Wertes?“.
Brute-Force, Greedy und Näherungslösungen
Brute-Force probiert alle Möglichkeiten durch. Das Ergebnis ist optimal, der Aufwand bei den Problemen oben aber exponentiell. Ein Greedy-Verfahren baut die Lösung Schritt für Schritt auf und nimmt jeweils, was im Moment am besten aussieht, ohne es zurückzunehmen. Es ist schnell, liefert aber nicht immer das Optimum. (Bei den kürzesten Wegen nach Dijkstra und den Spannbäumen nach Prim liefert es dagegen das Optimum.) Eine Näherungslösung ist eine Lösung, die nicht unbedingt optimal ist, aber in vertretbarer Zeit gefunden wird. Beim Handlungsreisenden geht man etwa stets zur nächsten noch nicht besuchten Stadt.
Rucksack: Brute-Force gegen Greedy
Rucksack: Brute-Force gegen Greedy
Die Tragfähigkeit beträgt 10 kg. A wiegt 6 kg und hat den Wert 30, B wiegt 5 kg und hat den Wert 24, C wiegt 5 kg und hat den Wert 24. Bestimme die beste Auswahl mit Brute-Force und mit dem Greedy-Verfahren „höchster Wert je Kilogramm zuerst“.
Brute-Force: Bei drei Gegenständen gibt es Auswahlen. Ohne Gegenstand ist der Wert 0. A allein hat 30, B allein 24, C allein 24. A und B (11 kg), A und C (11 kg) und alle drei (16 kg) sind zu schwer. B und C wiegen zusammen 10 kg und haben den Wert 48. Das Optimum ist also 48.
Greedy: Der Wert je Kilogramm ist bei A 5, bei B und C je 4,8. Greedy nimmt zuerst A (6 kg). Dann passt weder B noch C (6 + 5 = 11 kg). Der Wert ist 30, nur 62,5 % des Optimums. Greedy ist schneller, hier aber nicht optimal.
Unentscheidbar heißt: noch nicht gelöst
Unentscheidbar heißt: noch nicht gelöst
„Mit schnelleren Rechnern wird man das Halteproblem irgendwann lösen.“
Unentscheidbar ist bewiesen: Kein Algorithmus löst das Problem, auf keinem Rechner. Die Geschwindigkeit spielt keine Rolle.
NP heißt nicht polynomiell
NP heißt nicht polynomiell
„NP-Probleme sind unlösbar, weil sie nicht polynomiell sind.“
NP steht für „nichtdeterministisch polynomiell“. NP-Probleme sind lösbar, etwa durch Brute-Force. Vermutlich gibt es nur keinen schnellen, also polynomiellen Algorithmus. Probleme in P gehören auch zu NP.
Zusammenfassung
Eine Turingmaschine (Zustände, Band, Schreib-Lese-Kopf) präzisiert den Algorithmusbegriff. Registermaschinen sind gleich mächtig.
Die Church-Turing-These: Alles anschaulich Berechenbare ist turingberechenbar. Sie ist eine These und lässt sich nicht beweisen.
Das Halteproblem ist unentscheidbar. Der Beweis führt die Annahme eines Entscheiders durch ein Programm, das sich selbst widerspricht, zum Widerspruch.
Polynomieller Aufwand ist handhabbar, exponentieller wächst so schnell, dass schnellere Rechner kaum helfen.
P: in polynomieller Zeit lösbar. NP: Lösungen in polynomieller Zeit prüfbar. Ob gilt, ist offen.
SAT, Handlungsreisender und Rucksackproblem sind NP-vollständig. Für keines kennt man ein exaktes Verfahren mit polynomiellem Aufwand.
Brute-Force ist exakt, aber teuer. Greedy ist schnell, aber nicht immer optimal. Näherungslösungen tauschen Genauigkeit gegen Zeit.
Übungen
Die Turingmaschine „addiere 1“ aus dem Beispiel startet auf dem Wort 111. Was steht nach dem Halt auf dem Band?
Welche Aussage über Greedy-Verfahren stimmt?
Ein Algorithmus braucht bei der Eingabegröße n genau Schritte. Wie oft so viele Schritte braucht er bei n = 25 im Vergleich zu n = 20?
Wie viele verschiedene Rundreisen gibt es bei 6 Städten, wenn Hin- und Rückrichtung als dieselbe Rundreise zählen?
Warum kann es kein Programm geben, das für jedes Programm und jede Eingabe richtig entscheidet, ob es hält?
Erkläre am Beispiel SAT den Unterschied zwischen „eine Lösung finden“ und „eine Lösung prüfen“. Warum gehört SAT zu NP?