SAT ist das Problem zu bestimmen, ob ein boolescher Ausdruck wahr gemacht werden kann. Zum Beispiel kann (A) durch Setzen von A = TRUE wahr gemacht werden, aber (A &&! A) kann niemals wahr sein. Es ist bekannt, dass dieses Problem NP-vollständig ist. Siehe Boolesche Zufriedenheit .
Ihre Aufgabe ist es, ein Programm für SAT zu schreiben, das in Polynomialzeit ausgeführt wird, aber möglicherweise nicht alle Fälle löst.
Für einige Beispiele könnte der Grund dafür, dass es nicht wirklich polynomisch ist, sein, dass:
- Es gibt einen Randfall, der nicht offensichtlich ist, aber eine schlechte Laufzeit hat
- Der Algorithmus kann das Problem in unerwarteten Fällen nicht lösen
- Einige Funktionen der von Ihnen verwendeten Programmiersprache haben tatsächlich eine längere Laufzeit, als Sie vernünftigerweise erwarten würden
- Ihr Code macht tatsächlich etwas völlig anderes, als es aussieht
Sie können eine beliebige Programmiersprache (oder eine Kombination von Sprachen) verwenden. Sie müssen keinen formalen Beweis für die Komplexität Ihres Algorithmus liefern, aber Sie sollten zumindest eine Erklärung liefern.
Das Hauptkriterium für die Beurteilung sollte sein, wie überzeugend der Code ist.
Dies ist ein Beliebtheitswettbewerb, daher gewinnt die bestbewertete Antwort in einer Woche.
quelle
Antworten:
C #
"Erscheint" ist nicht erforderlich. Ich kann ein Programm schreiben, das wirklich in Polynomialzeit ausgeführt wird, um SAT-Probleme zu lösen. Das ist in der Tat ganz einfach.
Genial. Bitte senden Sie mir die Millionen Dollar. Im Ernst, ich habe genau hier ein Programm, das SAT mit polynomialer Laufzeit löst.
Lassen Sie mich zunächst feststellen, dass ich eine Variation des SAT-Problems lösen werde. Ich werde zeigen, wie man ein Programm schreibt, das die einzigartige Lösung eines 3-SAT-Problems zeigt . Die Bewertung jeder Booleschen Variablen muss eindeutig sein, damit mein Solver funktioniert.
Wir beginnen mit der Deklaration einiger einfacher Hilfsmethoden und -typen:
Lassen Sie uns nun ein 3-SAT-Problem auswählen, das gelöst werden soll. Sagen wir
Lassen Sie uns das ein bisschen näher erläutern.
Wir kodieren das so:
Und wenn wir das Programm ausführen, erhalten wir eine Lösung für 3-SAT in Polynomialzeit. Tatsächlich ist die Laufzeit in der Größe des Problems linear !
quelle
Mehrsprachig (1 Byte)
Das folgende Programm, das in vielen Sprachen gültig ist, meistens funktional und esoterisch, wird die richtige Antwort für eine große Anzahl von SAT-Problemen geben und hat eine konstante Komplexität (!!!):
Erstaunlicherweise gibt das nächste Programm die richtige Antwort auf alle verbleibenden Probleme und hat dieselbe Komplexität. Sie müssen also nur das richtige Programm auswählen und haben in jedem Fall die richtige Antwort!
quelle
JavaScript
Durch die Verwendung von iteriertem Nichtdeterminismus kann SAT in Polynomialzeit gelöst werden!
Anwendungsbeispiel:
Ich bin übrigens stolz darauf, dass ich die Gelegenheit hatte, zwei der am wenigsten genutzten Funktionen von JavaScript direkt nebeneinander zu nutzen:
eval
undwith
.quelle
1000
in der for-Schleife sollte irgendwie mit der Eingabegröße skalieren (einige polynomielle Nicht-O (1) -Skalierung).Mathematica + Quantencomputing
Möglicherweise wissen Sie nicht, dass Mathematica mit einem Quantencomputer ausgestattet ist
Quantum Adiabatic Commputing codiert ein in einem Hamilton-Operator (Energieoperator) zu lösendes Problem so, dass sein Zustand der minimalen Energie ("Grundzustand") die Lösung darstellt. Die adiabatische Evolution eines Quantensystems in den Grundzustand des Hamiltonschen und die anschließende Messung liefert daher die Lösung des Problems.
Wir definieren einen Subhamilton, der
||
Teilen des Ausdrucks entspricht, mit einer geeigneten Kombination von Pauli-Operatoren für Variablen und deren NegationWo zum Ausdruck so
Das Argument sollte so aussehen
Hier ist der Code, um ein solches Argument aus dem bool-Ausdruck zu konstruieren:
Jetzt konstruieren wir einen vollständigen Hamilton-Operator, der die Subhamiltonen summiert (die Summation entspricht
&&
Teilen des Ausdrucks).Und suchen Sie nach dem niedrigsten Energiezustand
Wenn wir einen Eigenwert von Null haben, ist der Eigenvektor die Lösung
quelle
Drei Herangehensweisen beinhalten alle eine Reduktion von SAT in seine 2D-geometrische Verkehrssprache: Nicht-Programm-Logik-Rätsel. Zellen im Logikrätsel entsprechen SAT-Variablen, Nebenbedingungen zu Klauseln.
Für eine vollständige Erklärung (und um meinen Code auf Fehler zu überprüfen!) Habe ich bereits einige Informationen zu Mustern im Nicht-Programm-Lösungsbereich veröffentlicht. Siehe https://codereview.stackexchange.com/questions/43770/nonogram-puzzle-solution-space. Die Aufzählung von> 4 Milliarden Rätsellösungen und deren Codierung in eine Wahrheitstabelle zeigt fraktale Muster - Selbstähnlichkeit und insbesondere Selbstaffinität. Diese affine Redundanz zeigt eine Struktur innerhalb des Problems, die ausgenutzt werden kann, um die zur Generierung von Lösungen erforderlichen Rechenressourcen zu reduzieren. Es zeigt auch die Notwendigkeit einer chaotischen Rückkopplung in jedem erfolgreichen Algorithmus. Das Phasenübergangsverhalten hat Erklärungskraft, wenn "einfache" Instanzen entlang der groben Struktur liegen, während "harte" Instanzen eine weitere Iteration bis ins kleinste Detail erfordern, die von normalen Heuristiken völlig verborgen ist. Wenn Sie in die Ecke dieses unendlichen Bildes zoomen möchten (alle <= 4x4 Puzzle-Instanzen sind codiert), lesen Sie http://re-curse.github.io/visualizing-intractability/nonograms_zoom/nonograms.html
Methode 1. Extrapolieren Sie den Nicht-Programmlösungsraumschatten mit chaotischen Karten und maschinellem Lernen (denken Sie an Anpassungsfunktionen, die denen ähneln, die das Mandelbrot-Set generieren).
Hier ist ein visueller Induktionsnachweis. Wenn Sie diese vier Bilder von links nach rechts scannen und denken , Sie haben eine gute Idee , die fehlende 5. ... 6. zu generieren ... etc. Bilder, dann habe ich gerade programmiert Sie als mein NP Orakel für das Entscheidungsproblem der nonogram Lösung Existenz. Bitte treten Sie vor, um Ihren Preis als den leistungsstärksten Supercomputer der Welt zu beanspruchen. Ich füttere Sie hin und wieder mit Strom, während die Welt Ihnen für Ihre Rechenbeiträge dankt.
Methode 2. Verwenden Sie Fourier-Transformationen für die Boolesche Bildversion von Eingaben. FFTs liefern globale Informationen zu Häufigkeit und Position innerhalb einer Instanz. Während der Betragsteil zwischen den Eingangspaaren ähnlich sein sollte, ist ihre Phaseninformation völlig unterschiedlich - sie enthält gerichtete Information über eine Lösungsprojektion entlang einer bestimmten Achse. Wenn Sie klug genug sind, können Sie das Phasenbild der Lösung durch eine spezielle Überlagerung der Eingangsphasenbilder rekonstruieren . Dann transformieren Sie die Phase und die gemeinsame Größe invers zurück in den Zeitbereich der Lösung.
Was könnte diese Methode erklären? Es gibt viele Permutationen der Booleschen Bilder mit flexiblem Auffüllen zwischen aufeinander folgenden Läufen. Dies ermöglicht eine Zuordnung zwischen Eingabe -> Lösung, die sich um die Multiplizität kümmert, während die Eigenschaft von FFTs von bidirektionalen, eindeutigen Zuordnungen zwischen Zeitbereich <-> (Frequenz, Phase) beibehalten wird. Es bedeutet auch, dass es keine "keine Lösung" gibt. Es würde heißen, dass es in einem fortlaufenden Fall Graustufenlösungen gibt, die Sie nicht in Betracht ziehen, wenn Sie sich das Bilevel-Bild des herkömmlichen Lösen von Nonogramm-Rätseln ansehen.
Warum würdest du es nicht tun? Es ist eine schreckliche Art zu rechnen, da FFTs in der heutigen Fließkomma-Welt bei großen Instanzen sehr ungenau wären. Präzision ist ein großes Problem, und die Rekonstruktion von Bildern aus quantisierten Größen- und Phasenbildern führt in der Regel zu sehr ungefähren Lösungen, auch wenn dies für die Schwellenwerte des menschlichen Auges möglicherweise nicht visuell ist . Es ist auch sehr schwierig, dieses Überlagerungsgeschäft zu entwickeln, da die Art der Funktion, die es tatsächlich ausführt, derzeit unbekannt ist. Wäre es ein einfaches Mittelungsschema? Wahrscheinlich nicht, und es gibt keine bestimmte Suchmethode, um es zu finden, außer Intuition.
Methode 3. Suchen Sie eine zellulare Automatenregel (aus einer möglichen Anzahl von 4 Milliarden Regeltabellen für von Neumann-Regeln mit zwei Zuständen), die eine symmetrische Version des Nonogramm-Puzzles löst. Sie verwenden eine direkte Einbettung des Problems in die hier gezeigten Zellen.
Dies ist wahrscheinlich die eleganteste Methode in Bezug auf Einfachheit und gute Effekte für die Zukunft des Rechnens. Die Existenz dieser Regel ist nicht bewiesen, aber ich habe eine Vermutung, dass es existiert. Hier ist der Grund:
Nonogramme erfordern viel chaotisches Feedback im Algorithmus, um genau gelöst zu werden. Dies wird durch den Brute-Force-Code festgelegt, der mit Code Review verknüpft ist. CA ist gerade die fähigste Sprache, um chaotisches Feedback zu programmieren.
Es sieht richtig, visuell. Die Regel würde sich durch eine Einbettung entwickeln, Informationen horizontal und vertikal verbreiten, interferieren und sich dann zu einer Lösung stabilisieren, die die Anzahl der gesetzten Zellen konserviert. Diese Weiterleitungsroute folgt dem Pfad (rückwärts), an den Sie normalerweise denken, wenn Sie den Schatten eines physischen Objekts in die ursprüngliche Konfiguration projizieren. Nonogramme stammen aus einem speziellen Fall der diskreten Tomographie. Stellen Sie sich also vor, Sie sitzen gleichzeitig in zwei Computertomographen mit Kitty-Ecke. Auf diese Weise würden die Röntgenstrahlen die medizinischen Bilder erzeugen. Natürlich gibt es Grenzprobleme - die Ränder des CA-Universums können Informationen nur dann weitergeben, wenn Sie ein toroidales Universum zulassen. Dies wirft das Rätsel auch als periodisches Randwertproblem auf.
Es werden mehrere Lösungen als Übergangszustände in einem kontinuierlich oszillierenden Effekt zwischen dem Austauschen von Ausgängen als Eingängen und umgekehrt erläutert. Es werden Instanzen erläutert, die keine Lösung als Originalkonfigurationen haben, bei denen die Anzahl der gesetzten Zellen nicht erhalten bleibt. Abhängig vom tatsächlichen Ergebnis des Auffindens einer solchen Regel kann sie sogar unlösbare Instanzen mit einer engen Lösung approximieren, bei der die Zellzustände erhalten bleiben .
quelle
C ++
Hier ist eine Lösung , die garantiert in polynomialer Zeit laufen: es läuft in
O(n^k)
denenn
die Anzahl der booleans undk
ist eine Konstante Ihrer Wahl.quelle
bitfield
, vielleicht hätte ich das vorgezogenstd::vector
.rubin / gnuplot 3d oberfläche
(ooh harte Konkurrenz!) ... jedenfalls ... sagt ein Bild mehr als tausend Worte? Dies sind 3 separate Flächendiagramme, die im Gnuplot des SAT-Übergangspunkts erstellt wurden. Die (x, y) Achsen sind Klausel & Variable Anzahl und die z Höhe ist die Gesamtanzahl der rekursiven Aufrufe im Solver. Code in Ruby geschrieben. Es werden 10x10 Punkte mit jeweils 100 Abtastwerten abgetastet. es demonstriert / verwendet grundlegende Prinzipien der Statistik und ist eine Monte-Carlo-Simulation .
Es handelt sich im Grunde genommen um einen Davis Putnam- Algorithmus, der auf zufälligen Instanzen im DIMACS-Format ausgeführt wird. Dies ist die Art von Übung, die idealerweise in CS-Kursen auf der ganzen Welt durchgeführt wird, damit die Schüler die Grundlagen erlernen können, die aber fast überhaupt nicht speziell unterrichtet werden ... Vielleicht aus irgendeinem Grund, warum es so viele falsche P = NP-Beweise gibt ? Es gibt nicht einmal einen guten Wikipedia-Artikel, der das Übergangspunkt-Phänomen beschreibt (irgendwelche Nehmer?), das in der statistischen Physik ein sehr wichtiges Thema ist und auch in CS eine Schlüsselrolle spielt. [a] [b] Es gibt in CS viele Artikel über den Übergangspunkt Es scheinen jedoch nur sehr wenige Flächenplots zu zeigen! (Stattdessen werden normalerweise 2D-Slices angezeigt.)
die exponentielle Zunahme der Laufzeit ist deutlich in 1 ersichtlich st Plot. der Sattel durch die Mitte von 1 läuft st Handlung ist der Übergangspunkt. die 2 nd und 3 rd Plots zeigt das% erfüllbar Übergang.
[a] Phasenübergangsverhalten in CS ppt Toby Walsh
[b] empirische Wahrscheinlichkeit der Erfüllbarkeit von k-SAT tcs.se
[c] große Momente in empirischer / experimenteller Mathematik / (T) CS / SAT , TMachine-Blog
quelle