Ein vorläufiger Erfüllbarkeitsalgorithmus

8

Es wird nicht angenommen, dass die allgemeine Erfüllbarkeit (mit wenigen Ausnahmen wie Horn-Klauseln) eine algorithmische Lösung hat. Der folgende Algorithmus scheint jedoch eine Lösung für die allgemeine Erfüllbarkeit zu sein. Was genau ist der Fehler mit dem folgenden Algorithmus?

  1. Sei W eine leere Menge, die alle Variablen enthält, die notwendigerweise wahr oder falsch sein müssen.
  2. Sei L die Menge der Klauseln.
  3. Schleife durch L .
  4. Jedes Mal, wenn eine nicht bedingte Variable gefunden wird, entfernen Sie sie aus L und fügen Sie sie in W .
  5. Wenn dies eine leere UND-Implikation hinterlässt , entfernen Sie alle Variablen in dieser leeren Implikation aus L und fügen Sie sie in W .
  6. Wenn dies eine leere ODER-Implikation hinterlässt , erstellen Sie neue Instanzen des Algorithmus, wobei jede Instanz eine Variable in der Implikation behandelt (dh wenn die Implikation lautet: xVy , erstellen Sie eine Instanz, in derx in eingefügt wirdW, eine, in dery in eingefügt wird,Wund eine, in derx undy in eingefügt werdenW.
  7. Setzen Sie alle Variablen in W auf den Wert, den sie unbedingt haben müssen.
  8. Fügen Sie die Variablen in in L mit ihren geänderten Werten erneut ein und prüfen Sie, ob alle Klauseln erfüllt sind.WL
  9. Wenn die Erfüllbarkeit erfüllt ist, geben Sie , andernfalls "Nicht zufriedenstellend".L

Eine nicht bedingte Variable ist definiert als eine Variable, die notwendig ist, wahr oder falsch, z oderx .¬y

Eine leere Implikation ist definiert als eine Implikation, bei der eine Seite leer ist (z ) oder die andere Seite ist notwendigerweise wahr (z. B. t r u eaxy .trueab

Um ein intuitiveres Verständnis des Algorithmus zu erhalten, betrachten Sie die folgenden Klauseln :L

abc(i)fg(ii)f¬a(iii)fab(iv)c(v)

Der Algorithmus führt Folgendes aus:

1) Da , f , g nicht bedingte Variablen sind, fügt der Algorithmus sie in W ein . W = { c , f , g } .cfgWW={c,f,g}

2) Wenn Sie , f und g entfernen , bleiben die leeren Klauseln:cfg . Diese werden zu W hinzugefügt. W = { c , f , g , b , ¬ a } .¬a,ab,bWW={c,f,g,b,¬a}

3) Das erneute Einfügen der Variablen in führt dazu, dass die ersten Klauseln verletzt werden: a bL . Da a falsch ist, ist c falsch, was bedeutet, dass Klausel (v) verletzt wird. Der Algorithmus gibt "Nicht zufriedenstellend" zurück.abcac

Mir ist bewusst, dass der Algorithmus verwirrend erscheint. Bitte zögern Sie nicht um Klarstellung.


Aus Kommentaren geht hervor, dass kein effizienter Algorithmus für die allgemeine Erfüllbarkeit bekannt ist. Ich bin immer noch an Feedback zu meinem Algorithmus interessiert. Funktioniert es? Wie ist der Vergleich mit gängigen Algorithmen?

Gilles 'SO - hör auf böse zu sein'
quelle
17
Was lässt Sie denken, dass es keine algorithmische Lösung für die allgemeine Erfüllbarkeit gibt? Es gibt absolut Algorithmen dafür; Es ist jedoch nicht bekannt, dass einer von ihnen Polynomlaufzeiten im ungünstigsten Fall aufweist. Was Sie beschreiben, scheint ein bekannter auflösungsbasierter Erfüllbarkeitsalgorithmus zu sein.
Templatetypedef
@templatetypedef Der Wikipedia-Artikel schien darauf hinzudeuten, dass es keine Lösung gibt. Könnten Sie mich vielleicht auf den bekannten Algorithmus verweisen?
9
@Riddler In dem Wikipedia-Artikel heißt es tatsächlich: "SAT war das erste bekannte Beispiel für ein NP-vollständiges Problem. Das bedeutet kurz, dass es keinen bekannten Algorithmus gibt, der alle Instanzen von SAT effizient löst." Es gibt auch einen "Algorithmus zur Lösung von SAT". Sektion.
5
Es gibt definitiv algorithmische Lösungen für die allgemeine Erfüllbarkeit, da es Brute-Force-Lösungen gibt (den Variablen alle Kombinationen von True / False-Werten zuweisen und prüfen, ob einer der resultierenden Ausdrücke True ergibt).
2
Das Problem ist, dass Sie im schlimmsten Fall eine exponentielle Anzahl neuer Instanzen aus den leeren ORs generieren.
Elliot Gorokhovsky

Antworten:

6

Problem 1

Der Fall von soll im Hinblick auf einen „nicht bedingter Variable“ sein x (dh. , Dass ¯ x sollte nun in eingefügt W ). Wenn dies nicht der Fall ist, benötigt Ihr Algorithmus einen zusätzlichen Schritt, um darauf zu schließen. Unter der Annahme , ( x y ¯ y ) ist eine " non Bedingungsvariable ", fahren wir fort.(xyy¯)xx¯W(xyy¯)

Problem 2

HINWEIS: Dies ist ein Problem, das mir aufgefallen ist. Es kann durchaus andere Probleme geben.

Das Problem besteht darin, dass die " leere ODER-Implikation " in zwei Algorithmen aufgeteilt ist. In der aktuellen Form deckt die Aufteilung nicht alle Fälle ab. Bestimmtes:

Sie beginnen mit , dann wird c entfernt und wir haben eine leere ODER-Implikation von ( x [ ] y ) . Sie schlagen vor, es jetzt in zwei neue Probleme aufzuteilen und jedes zu lösen. eine mit x = T y = T und einem , wo y = T . Dies deckt jedoch nicht alle Fälle ab. Was ist mit dem Fall, wenn x = F y = F.(xcy)c(x[]y)x=Ty=Ty=Tx=Fy=F. Ihr Algorithmus berücksichtigt jedoch niemals die Möglichkeit, dass falsch ist.y

Ich denke, Sie können dies möglicherweise beheben, indem Sie die beiden neuen Probleme als eins mit und eins mit ¯ x formulieren .yx¯

Problem 3

Was passiert, wenn Sie eine Reihe von Klauseln im Formular haben:

(abc)

oder

(abc)

Nachdem Sie alles reduziert haben, bleiben diese Klauseln erhalten, und Sie können ihre Erfüllbarkeit nicht einfach testen.

Analyse

Hinweis : Diese "O" -Notation, usw. wird als Big O-Notation bezeichnet . Ω ( s o m e t h i n g ) heißt Big-Omega.O(something)Ω(something)

Angenommen, der Algorithmus funktioniert im Allgemeinen, würde er in der Zeit von schlimmsten Fall ausgeführt, wobei m die Anzahl der Variablen ist. Der Grund ist, dass jede Aufteilung des Problems in Probleme ähnlicher Größe bedeutet, dass der Algorithmus in exponentieller Zeit ausgeführt wird. Sehen Sie sich zur Veranschaulichung dieses Konzepts das folgende Bild eines vollständigen Binärbaums an (Bild von hier ):Ω(2m)m

Diagramm des vollständigen Binärbaums

Stellen Sie sich nun vor, das ursprüngliche Problem ist der Knoten oben. Wir haben das Problem auf der zweiten Ebene in zwei Probleme aufgeteilt, aber sie haben eine ähnliche Größe (wir entfernen nur eine Variable, oder y, aus der leeren ODER-Implikation , sodass wir immer noch viele leere ODER-Implikationen haben , die jeweils zu erledigen sind Niveau). Möglicherweise müssen wir das Problem O ( m ) mal aufteilen , um m Variablen loszuwerden . Dies bedeutet, dass wir uns mit einem Baum mit m Ebenen befassen müssen . Ein Baum mit m Ebenen hat 2 m BlattknotenxyO(m)mmm2m (Knoten unten). Dies wird als Exponentialzeit bezeichnet und ist informell etwas mit allen bekannten booleschen Erfüllbarkeitsalgorithmen vergleichbar. Aber auch Brute Force: Es gibt mögliche Zuordnungen der Variablen. Mit Brute Force können Sie also jede Zuordnung erraten und die Erfüllbarkeit mit ähnlicher Leistung überprüfen!2m

Realz Slaw
quelle
Ich denke du meinst ? Ω(.)
Raphael
ΩO(2m)
Ω(2m)
O(.)Ω(.)Ω(2m)Θ(m)Ω(m)
-5

Bevor Sie das Gefühl haben, einen "neuen" SAT-Algorithmus zu haben, lesen Sie bitte den Standard- / klassischen Backtracking- / Suchalgorithmus in der Literatur für das Problem aus dem Jahr 1962, den Davis-Putnam-Logemann-Loveland-Algorithmus . Die meisten Backtracking- / rekursiven Algorithmen für das Problem werden wahrscheinlich diesem Algorithmus etwas ähnlich sehen, obwohl es eine Weile dauern kann, bis diese Äquivalenz nachgewiesen ist.

Eine ernsthafte Analyse würde das Benchmarking Ihres Algorithmus mit Beispielen (oder zufälligen Instanzen) gegenüber DPLL beinhalten.

Daher ist es hilfreich, nur zusammenzufassen, wie sich Ihr Algorithmus davon unterscheidet. Ohne Ihren Code zu überprüfen, sind die Chancen:

  • Der Algorithmus hat einen Fehler. entweder falsch positive oder negative Ergebnisse zurückgeben (dh der Algorithmus gibt "Formel ist erfüllbar" zurück, wenn dies nicht der Fall ist, oder umgekehrt). Dies kann normalerweise durch sehr gründliches Testen einer großen Anzahl zufällig generierter Formeln und Überprüfen mit einem anderen bekannten korrekten Algorithmus / einer anderen Implementierung, z. B. DPLL, erreicht werden.
  • Ihr Algorithmus ist nicht so gut wie DPLL.
  • Wenn es so gut wie DPLL oder "besser" ist, liegt dies im Allgemeinen an Verzweigungs- und Variablenauswahlheuristiken / -strategien und der Verteilung der zu testenden Instanzen.

Der Algorithmus kann von einem intelligenten Studenten leicht verstanden werden, scheint jedoch auf der Ebene der Studenten oder in Lehrbüchern für Studenten selten gelehrt zu werden oder wird möglicherweise nicht einmal häufig referenziert, was möglicherweise zu einer falschen Ansicht oder dem falschen Eindruck führt, dass grundlegende SAT-Algorithmen nicht gut verstanden werden usw.

Ebenfalls kürzlich bin ich auf diese "Live" -Seite namens ToughSat von Yuen und Bebel gestoßen, um Hard-Instanzen für das Benchmarking zu generieren, einige basierend auf Factoring [eine der klassischen Methoden zur Generierung von SAT-Hard-Instanzen]. Es gibt andere, z. B. DIMACs , die Archive harter Instanzen speichern, obwohl sie möglicherweise nicht mehr online sind.

vzn
quelle