# NP-Vollständigkeit

In der Informatik bezeichnet man ein Problem als NP-vollständig (vollständig für die Klasse der Probleme, die sich nichtdeterministisch in Polynomialzeit lösen lassen), wenn es zu den schwierigsten Problemen in der Klasse NP gehört, also sowohl in NP liegt als auch NP-schwer ist. Dies bedeutet umgangssprachlich, dass es sich vermutlich nicht effizient lösen lässt.
Formal wird NP-Vollständigkeit nur für Entscheidungsprobleme definiert (mögliche Lösungen nur „ja“ oder „nein“), während man bei anderen Problemtypen von NP-Äquivalenz spricht (etwa bei Suchproblemen oder Optimierungsproblemen). Umgangssprachlich wird diese Unterscheidung jedoch oft nicht vollzogen, so dass man ganz allgemein von „NP-vollständigen Problemen“ spricht, unabhängig davon, ob ein Entscheidungsproblem vorliegt oder nicht. Dies ist möglich, da verschiedene Problemtypen ineinander überführbar (aufeinander reduzierbar) sind.
Ein Entscheidungsproblem ist NP-vollständig, wenn es
* in der Komplexitätsklasse NP liegt: Ein deterministisch arbeitender Rechner benötigt nur polynomiell viel Zeit, um zu entscheiden, ob eine vorgeschlagene Lösung eines zugehörigen Suchproblems tatsächlich eine Lösung ist, und
* zu den NP-schweren Problemen gehört: Alle anderen Probleme, deren Lösungen deterministisch in polynomieller Zeit überprüft werden können, können auf das Problem derart zurückgeführt werden, dass diese Rückführung auf einem deterministischen Rechner höchstens polynomielle Zeit in Anspruch nimmt. Man spricht von einer Polynomialzeitreduktion.
Die Klasse aller NP-vollständigen Probleme wird mit NP-C (complete) bezeichnet. Die Eigenschaften dieser und anderer Klassen werden in der Komplexitätstheorie erforscht, einem Teilgebiet der theoretischen Informatik.
NP-vollständige Probleme lassen sich vermutlich nicht effizient lösen, da ihre Lösung auf realen Rechnern viel Zeit in Anspruch nimmt. In der Praxis wirkt sich dies nicht in jedem Fall negativ aus, das heißt, es gibt für viele NP-vollständige Probleme Lösungsverfahren, anhand derer sie für in der Praxis auftretende Größenordnungen in akzeptabler Zeit lösbar sind.
Viele in der Praxis auftauchende und wichtige Probleme sind NP-vollständig, was NP-Vollständigkeit zu einem zentralen Begriff der Informatik macht. Weiter verstärkt wird diese Bedeutung durch das sogenannte P-NP-Problem:
* Für kein NP-vollständiges Problem konnte bisher nachgewiesen werden, dass es in polynomieller Zeit lösbar wäre.
* Falls nur ein einziges dieser Probleme in polynomieller Zeit lösbar wäre, dann wäre jedes Problem in NP in polynomieller Zeit lösbar, was große Bedeutung für die Praxis haben könnte (jedoch nicht notwendigerweise haben muss).
Seit der Einführung der NP-Vollständigkeit durch Cook wurde die Vollständigkeit zu einem allgemeinen Konzept für beliebige Komplexitätsklassen ausgebaut.

## Geschichte

Der Begriff der NP-Vollständigkeit wurde 1971 von Stephen A. Cook in seinem heute so genannten Satz von Cook eingeführt. Darin zeigte er, dass das Erfüllbarkeitsproblem der Aussagenlogik NP-vollständig ist. Heute existieren deutlich einfachere konstruktive Nachweise für die Existenz solcher Probleme, allerdings sind die dafür verwendeten Sprachen sehr künstlich. Cooks Verdienst besteht also auch darin, für eine besonders interessante Sprache diesen Nachweis erbracht zu haben.
Aufbauend auf der Arbeit von Cook konnte Richard Karp im Jahre 1972 eine weitere bahnbrechende Arbeit vorlegen, die der Theorie der NP-Vollständigkeit zu noch größerer Popularität verhalf. Karps Verdienst besteht darin, die Technik der Polynomialzeitreduktion konsequent genutzt zu haben, um für weitere 21 populäre Probleme die NP-Vollständigkeit nachzuweisen.

## Definition

Ein Problem (genauer: ein Entscheidungsproblem) L heißt NP-vollständig genau dann, wenn:
* L in der Klasse NP liegt, das heißt $L\in {\rm {NP}}$ und
* L NP-schwer ist, das heißt $\forall L'\in {\rm {NP}}:L'\preceq _{p}L$.
Letztere Bedingung bedeutet, dass jedes Problem in NP durch eine Polynomialzeitreduktion auf L reduziert werden kann.

## Nachweis der NP-Vollständigkeit

Der Nachweis der ersten Eigenschaft für ein gegebenes Problem ist in aller Regel einfach. Man „rät“ eine Lösung und zeigt, dass man in Polynomialzeit verifizieren kann, ob die Lösung wirklich zutrifft. Im Raten der (korrekten) Lösung findet sich der Nichtdeterminismus wieder.
Der Nachweis der zweiten Eigenschaft, die man für sich allein mit NP-schwer (oder durch falsche Rückübersetzung aus englisch 'NP-hard' mit NP-hart) bezeichnet, ist schwieriger, insbesondere wenn es darum geht, eine Aussage für beliebige Probleme in NP zu zeigen. Daher nimmt man gewöhnlich ein ähnliches Problem, für das die NP-Vollständigkeit schon bekannt ist, und reduziert es auf dasjenige Problem, für das die Eigenschaft der NP-Schwere gezeigt werden soll. Aus der Transitivität von Polynomialzeitreduktionen folgt dann, dass alle anderen Probleme aus NP ebenfalls auf das betrachtete Problem reduzierbar sind.
Die obige Definition erfordert streng genommen einen Existenzbeweis. Es ist nicht sofort ersichtlich, dass derartige Probleme überhaupt existieren. Es lässt sich aber leicht ein solches Problem konstruieren.
Allerdings ist ein derart konstruiertes Problem kaum praxisrelevant. Cook konnte jedoch zeigen, dass das Erfüllbarkeitsproblem der Aussagenlogik NP-vollständig ist, und hat damit für ein praxisrelevantes Problem den Nachweis geführt. Dieser Beweis konnte im Gegensatz zu anderen Problemen natürlich noch nicht wie oben dargestellt über die Transitivität von Polynomialzeitreduktionen geführt werden und musste direkt erfolgen.

## NP-Äquivalenz

NP-Vollständigkeit ist nur für Entscheidungsprobleme definiert, also für solche Probleme, die sich auf das Wortproblem einer formalen Sprache zurückführen lassen, für die als Antwort also nur entweder Ja oder Nein in Frage kommt. Für Optimierungsprobleme und Suchprobleme gibt es die Bezeichnung der NP-Äquivalenz.

## Approximation

Probleme, die in NP liegen, lassen sich weiter in ihrer Komplexität unterteilen, je nachdem, wie gut sie sich approximativ lösen lassen. Das Graphen-Färbungsproblem ist beispielsweise nur sehr schlecht approximierbar, während sich andere Probleme beliebig gut mittels so genannter Approximationsschemata approximieren lassen.

## Starke NP-Vollständigkeit

Ein NP-vollständiges Problem heißt stark NP-vollständig, falls es auch dann noch NP-vollständig ist, wenn man es auf solche Eingabeinstanzen beschränkt, die nur solche Zahlen (als numerische Parameter) enthalten, deren Größe im Verhältnis zur Eingabelänge polynomiell beschränkt ist (solch ein Problem ist stets wieder in NP). Oder anders ausgedrückt: Wenn man das Problem so modifiziert, dass alle numerischen Parameter im Unärsystem in der Eingabe stehen, bleibt es NP-vollständig. Für stark NP-vollständige Probleme gibt es unter der Annahme NP ungleich P keine pseudopolynomiellen Algorithmen. Dies sind Algorithmen, deren Laufzeit polynomiell ist, wenn die Größe aller in der Eingabe vorkommenden Zahlen polynomiell in der Eingabelänge beschränkt ist.
Ein Beispiel für ein Problem, für das ein pseudopolynomieller Algorithmus existiert, ist das Rucksackproblem. Durch Algorithmen, die auf dem Prinzip der dynamischen Programmierung basieren, kann eine Laufzeit, die mit ${\mathcal {O}}(n^{2}\cdot V)$ beschränkt ist, erreicht werden. Die Rechenzeit ist somit polynomiell, falls die Zahl $V$ (die Schranke für den maximal erlaubten Nutzwert) im Verhältnis zur Eingabelänge $n$ nur polynomiell groß ist. Solche NP-vollständigen Probleme, mit einem pseudopolynomiellen Algorithmus, werden auch schwach NP-vollständig genannt.

## Quellen

* ↑ Siehe Seite 157 in dem Buch "Algorithmics for hard problems: introduction to combinatorial optimization, randomization, approximation, and heuristics" von Juraj Hromkovič, Veröffentlicht von Springer Verlag, 2001, ISBN 3519004445, ISBN 9783540668602.
* ↑ Leslie Hall: Computational Complexity. Abgerufen am 10. Dezember 2012.