Ich habe den Wikipedia-Eintrag über " Liste der NP-vollständigen Probleme " gelesen und festgestellt, dass Spiele wie Super Mario, Pokemon, Tetris oder Candy Crush Saga np-vollständig sind. Wie kann ich mir die Vollständigkeit eines Spiels vorstellen? Die Antworten müssen nicht zu genau sein. Ich möchte nur einen Überblick darüber bekommen, was es bedeutet, dass Spiele np-vollständig sein können.
50
Antworten:
Es bedeutet nur, dass Sie in diesen Spielen Levels oder Rätsel erstellen können, die NP-Hard-Probleme verschlüsseln. Sie können ein Grafikfarbproblem lösen, eine zugehörige Super Mario Bros.-Ebene erstellen, und diese Ebene ist nur dann zu schlagen, wenn die Grafik dreifarbig ist.
Wenn Sie das sehen wollen spezifische Art und Weise die NP-vollständige Probleme in den Spielen übersetzt werden, empfehle ich das Papier „Classic Nintendo - Spiele sind (Rechnerisch) Hard“ . Es ist gut geschrieben und leicht zu befolgen.
Eine wichtige Einschränkung ist, dass die NP-Härte eine "offensichtliche" Verallgemeinerung der Spiele erfordert. Zum Beispiel hat Tetris normalerweise ein Brett mit fester Größe, aber der Härtenachweis erfordert, dass das Spiel beliebig große Bretter zulässt. Ein weiteres Beispiel sind Off-Screen-Feinde in Super Mario Bros: Der Beweis ist für eine Variante des Spiels, bei der sich Off-Screen-Feinde weiterbewegen, als wären sie auf dem Bildschirm, anstatt zu existieren und in ihre Ausgangsposition zurückgesetzt zu werden, wenn Mario zurückkommt .
quelle
quelle
Hier ist eine vereinfachte Erklärung von Hand:
Solche Spiele sind NP-schwer, weil das Verhalten des Spielers sehr ausdrucksstark ist. Während ein Spieler zu einem bestimmten Zeitpunkt möglicherweise nur eine begrenzte, sogar eine festgelegte Anzahl möglicher Aktionen hat, reicht dies aus, um einen Bereich von Verhaltensweisen oder Strategien zu schaffen, der in der Länge des Spiels exponentiell ist. und während Sie möglicherweise in der Lage sind, eine einfache Bedingung oder logische Formel für die Gültigkeit / den Nutzen / die Richtigkeit der Aktionen eines Spielers vor Ort bereitzustellen, erhalten Sie global einen ähnlichen Effekt wie bei einer großen kombinatorischen Schaltung oder einer k-CNF-Formel.
Hoffentlich ergibt das einen intuitiven Sinn und es läutet auch genug CS-Theorie-Glocken.
PS - Einige Spiele sind (rechnerisch) viel komplexer. Zum Beispiel sind die Brettspiele Hex , Go und Reversi PSPACE-komplett. Das liegt im Wesentlichen daran, dass die Formel, die Sie für eine Gewinnstrategie befriedigen müssen, eine Formel ist, bei der sich der Quantifizierer wiederholt: Es gibt einen Zug von Spieler 1, sodass für jeden Zug von Spieler 2 ein Zug von Spieler 1 usw. usw. vorhanden ist. Wenn alle diese Züge gespielt wurden, sind entweder einige der Züge von Spieler 2 ungültig oder wir haben einen gültigen Sequenzspieler, den 1 gewonnen hat. Bei NP-Spielen ist es in der Regel nur das Verhalten / die Strategie / die Wahl der Züge eines Spielers.
quelle
Bei Einzelspielerspielen können Sie immer die Frage stellen, ob es eine Gewinnstrategie für den Spieler gibt, und diese Frage hat häufig eine "JA" -Antwort, die in polynomieller Zeit überprüft werden kann und möglicherweise NP-vollständig ist.
Bei Spielen für zwei Spieler kann die Antwort in der Polynomzeit häufig nicht überprüft werden, da Sie zum Überprüfen, ob ein Zug für A ein Gewinnzug ist, nachweisen müssen, dass es für jede Antwort von B erneut einen Gewinnzug für A und gibt bald.
quelle
Nun, es ist sicherlich in NP, da eine mögliche Lösung nur eine begrenzte Anzahl von Eingaben ist (in jedem Eingaberahmen können Sie eine der k Schaltflächen auswählen, wir repräsentieren jede Auswahl der Schaltflächen für jeden Rahmen mit einem Buchstaben), zu der Sie gelangen der win-screen. Wir wissen, dass dieses Spiel schon einmal geschlagen wurde, also wissen wir, dass es eine Lösung gibt. Ein NTM geht über sein Band und errät auf magische Weise ein korrektes Zertifikat der Länge n. Dann simuliert es Super Mario mit der Eingabe und überprüft es. Die Verifizierung kann in Polynomialzeit erfolgen (lineare Zeit, wenn die Lösung korrekt ist, werden genau n Bilder benötigt, um zu gewinnen).
Um die NP-Vollständigkeit zu demonstrieren, könnten wir 3-SAT darauf reduzieren, indem wir einen 3-Sat-Checker mit dem Level-Generator erstellen (der durch willkürliche Codeausführung erzeugt wird https://www.youtube.com/watch?v=IOsvuEA2h4w ).
Wir haben also einen 3-SAT-CNF-Eingang, den wir zuerst auf korrekte Formatierung prüfen. Wenn es schlecht formatiert ist, übersetzen wir es einfach in einen "Sprung" -Eingang (es ist nicht möglich, Super Mario innerhalb eines Frames durch einen Sprung zu schlagen).
Wir nennen die Länge des 3-CNF-Eingangs n.
Wenn es richtig formatiert ist, übersetzen wir es in eine Reihe von Eingaben, die den 3-CNF-Checker für uns erstellen (immer der gleiche Code mit der Länge k), übersetzen die 3-CNF in eine Folge von Eingaben, die die spezifischen 3- CNF im Checker (in O (n)) und überprüft alle möglichen Lösungen mit Brute-Force. Es läuft im Leerlauf und tut nichts, wenn nach Durchlaufen aller Lösungen keine gefunden wird. Es startet das Spiel neu und verwendet eine bekannte Lösung für Super Mario, um das Spiel zu schlagen (der Code dafür hat die Länge j). Unsere Transformation ist also in O (n), also innerhalb der Polynomzeit.
Wenn der CNF schlecht formatiert ist, gewinnen wir nicht (per Definition gewinnt unsere Eingabe nicht, wenn wir nach der Ausführung keinen Frame gewonnen haben). Wenn der CNF nicht zufriedenstellend ist, gewinnen wir nicht (Sie können nicht gewinnen, indem Sie einen Frame im Level-Generator im Leerlauf laufen lassen, das haben wir in unserem Code sichergestellt). Wenn der CNF zufriedenstellend ist, findet der Checker eine Lösung, die neu gestartet wird, und gewinnt das Spiel. Damit ist die polynomielle Reduktion von 3-Sat zu Super Mario abgeschlossen und wir haben bewiesen, dass Super Mario NP-vollständig ist.
(Ich hoffe, ich habe das nicht irgendwo durcheinander gebracht. Wir haben ein Speicherproblem, wenn der 3-CNF zu lang ist, aber begrenzter Speicher wird in diesen Kontexten normalerweise ignoriert, glaube ich.)
quelle
Ich habe diese Antwort umgeschrieben, um zu versuchen, einige Kommentare zu einer früheren Version zu adressieren.
Ich gehe davon aus, dass Sie die Wikipedia-Definition für NP-Vollständigkeit gelesen haben, die sich wirklich nicht auf Spiele konzentriert. Ich werde die genaue Bedeutung der NP-Vollständigkeit und der Spieltheorie nur ein wenig verwässern und die Essenz eines NP-Complete-Spiels erläutern.
Betrachten wir ein 2-Spieler-Spiel mit alternativen Zügen, wobei es sich restriktiver im Wesentlichen um kombinatorische Spiele handelt . Grundsätzlich ist dies ein Spiel, bei dem Sie eine bestimmte Anzahl von Zügen ausführen können und einen davon auswählen müssen. Sie möchten "perfekt" spielen, was bedeutet, dass Sie niemals einen "schlechten" Zug machen würden. Von den zulässigen Zügen möchten Sie also den besten auswählen. (Natürlich hat dein Gegner das gleiche Ziel ...)
Angesichts des aktuellen Stands des Spiels möchten Sie in der Lage sein, einen "effizienten Algorithmus" zu verwenden, um den besten Zug zu berechnen. Andererseits sei angemerkt, dass ein Algorithmus, der den gesamten Spielbaum durchsuchen muss, ein "ineffizienter Algorithmus" ist.
Jetzt ist der wichtige Punkt, dass es unmöglich ist , einen effizienten Algorithmus, die Polynomzeit, zu haben, der perfekt für ein Spiel spielt, das NP-vollständig ist. Um ein NP-vollständiges Problem perfekt zu spielen, muss es per Definition durch einen ineffizienten Algorithmus gelöst werden, der in nichtpolynomieller Zeit abläuft.
Für Nim ist es möglich, einen polynomialen Zeitalgorithmus zu erstellen. Zu jedem Zeitpunkt im Spiel kann der Algorithmus berechnen, welcher Spieler einen Gewinnzug hat und welcher dieser Züge sein sollte.
Nehmen wir zum anderen das Spiel Qubic . (Sie versuchen, eine 4er-Linie in einem 3D-Raster zu erstellen. Auf einem 4x4x4-Raster ist dies also im Wesentlichen Tic-Tac-Toe.) Qubic ist NP-vollständig, daher gibt es keinen polynomiellen Zeitalgorithmus zur Berechnung der nächsten perfekten Bewegung. Die einzige Möglichkeit, um festzustellen, ob Sie einen Gewinnzug haben, besteht darin, alle möglichen Züge beider Spieler zu versuchen, um zu überprüfen, ob ein bestimmter Zug ein Gewinner oder zumindest kein Verlierer ist.
Lassen Sie uns nun Schach diskutieren , um die Bewertungsfunktion zu diskutieren, wobei einige der anderen Merkmale von Schachspielprogrammen ignoriert werden. Schach ist immer noch ein ungelöstes Spiel . Es ist nicht bekannt, ob der erste oder der zweite Spieler gewinnen soll. Es ist nicht möglich, eine Vorstandsposition zu erhalten und mit Sicherheit vorherzusagen, wer gewinnen wird. Tatsächlich hat Schach einen so großen Spielbaum, dass es einfach unmöglich ist, den gesamten Spielbaum zu durchsuchen. Sie brauchen Computer, die nicht nur 10 oder 100 Mal schneller sind, sondern Milliarden von Milliarden Mal schneller als jeder andere aktuelle Computer. (Es besteht die Hoffnung, dass Quantencomputer diesen gordischen Knoten durchschneiden könnten.)
Stellen Sie sich die Schachbewertungsfunktion so vor, dass für jeden möglichen nächsten Zug die Wahrscheinlichkeit besteht, der beste Zug zu sein. Ein Schachprogramm kombiniert Vorausschau mit der Bewertungsfunktion. Das Programm prüft daher alle möglichen zukünftigen Züge, bis es einen Punkt erreicht, an dem die Brettposition mit "gut" bewertet werden kann. Der Computer wertet auf diese Weise alle möglichen Pfade durch den Baum aus und wählt dann den Pfad mit der besten Punktzahl aus. Da die Suche nach allen bewerteten Pfaden nie zu Ende war, verwenden alle Schachprogramme letztendlich eine unvollständige Bewertungsfunktion. (Wenn Sie sich dem Ende des Spiels nähern, kann der Computer möglicherweise alle möglichen zukünftigen Züge anzeigen.) Dies bedeutet, dass das Programm möglicherweise auch dann geschlagen werden kann, wenn das Programm irgendwann eine Gewinnposition hatte.
quelle