Ausarbeitung über das 2-Sat Problem - Arbeitsbereich für ...
Ausarbeitung über das 2-Sat Problem - Arbeitsbereich für ...
Ausarbeitung über das 2-Sat Problem - Arbeitsbereich für ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>Ausarbeitung</strong> <strong>über</strong> <strong>das</strong><br />
2-<strong>Sat</strong> <strong>Problem</strong><br />
Myriam Ezzedine, 0326943<br />
Anton Ksernofontov, 0327064<br />
Jürgen Platzer, 0025360<br />
Nataliya Sokolovska, 0326991
1. Die <strong>Problem</strong>stellung<br />
Es ist ein effizienter Algorithmus, der <strong>das</strong> 2-<strong>Sat</strong> <strong>Problem</strong> löst, anzugeben. Bei diesem <strong>Problem</strong><br />
ist eine Boolesche Formel in konjunktiver Normalform gegeben, die aus Klauseln besteht, die<br />
maximal 2 Literale enthalten. Die Formel ist erfüllt, wenn aus jeder Klausel mindestens ein<br />
Literal den Wert true hat. Der zu suchende Algorithmus soll <strong>für</strong> eine solche Formel in<br />
polynomieller Zeit entscheiden, ob sie erfüllbar ist.<br />
Beispiel:<br />
F = (x1 ∨ x2) ∧ (¬x1 ∨ ¬x2)<br />
F wird als Formel bezeichnet. (x1 ∨ x2) und (¬x1 ∨ ¬x2) sind Klauseln. x1, x2, ¬x1 und ¬x2 sind<br />
Literale. Eine Formel liegt in konjunktiver Normalform vor, wenn die Literale in den<br />
Klauseln nur durch die ODER-Operation und die Klauseln der Formel nur durch den UND-<br />
Operator verbunden sind. Die Formel F heißt erfüllbar, wenn eine Variablenbelegung <strong>für</strong> x1<br />
und x2 gefunden werden kann, so <strong>das</strong>s F zu true evaluiert. F heißt unerfüllbar, wenn F mit<br />
jeder Variablenbelegung zu false evaluiert.<br />
In diesem Beispiel ist F erfüllbar, da F <strong>für</strong> eine Variablenbelegung von x1 = 0 und x2 = 1 zu<br />
true evaluiert.<br />
2. Grundlegende Definitionen<br />
Um <strong>das</strong> 2-<strong>Sat</strong> <strong>Problem</strong> zu lösen, führen wir eine Abbildung der Formel auf einen Graphen<br />
durch. Das Ziel ist es einen Algorithmus auf einem Graphen zu definieren, der <strong>das</strong> 2-<strong>Sat</strong><br />
<strong>Problem</strong> in polynomieller Zeit löst. Darum wollen wir an dieser Stelle einige grundlegende<br />
Definitionen bezüglich Graphen anführen.<br />
Ein Graph G wird definiert durch ein Paar (V, E), wobei V eine endliche Menge ist, deren<br />
Elemente (v1, ..., vn) die Knoten (engl. vertices, nodes) des Graphen G repräsentieren. Die<br />
Menge E besteht aus Paaren von Knoten. Sind diese geordnet (E ⊆ V × V), so spricht man<br />
von einem gerichteten Graphen, liegen ungeordnete Knotenpaare vor, so spricht man von<br />
einem ungerichteten Graphen. E repräsentiert die Menge der gerichteten bzw. ungerichteten<br />
Kanten (engl. edges) im Graphen G.<br />
Da wir <strong>für</strong> unseren Lösungsalgorithmus einen gerichteten Graphen benötigen, werden wir uns<br />
<strong>für</strong> die weiteren Definitionen ein Element e der Menge E als geordnetes Paar (u,v) mit u, v ∈<br />
V auffassen, wobei u als der Anfangs- und v als der Endknoten der Kante e bezeichnet wird.<br />
Die Abbildung α: E → V liefert den Anfangsknoten der Kanten zurück, während die<br />
Abbildung β: E → V die Endknoten der Kanten aus E retourniert. Ein Knoten u heißt<br />
Vorgänger eines Knoten v genau dann, wenn e = (u, v) ∈ E ist, d.h. wenn es eine gerichtete<br />
Kante von u nach v gibt. Ein Knoten v heißt Nachfolger eines Knoten u genau dann, wenn u<br />
Vorgänger von v ist. Es gibt einen Weg von einem Knoten u zu einem Knoten v genau dann,<br />
wenn es eine Folge e1, ..., en von Kanten gibt mit α( e1) = u, β( en) = v und α( ei) = β( ei-1) <strong>für</strong> i<br />
= 2,...,n. Zwei Knoten u, v liegen in derselben starken Zusammenhangskomponente genau<br />
dann, wenn es einen Weg von u zu v und einen Weg von v zu u gibt.
3. Konzept <strong>für</strong> einen Algorithmus<br />
1. Es ist ein 2-<strong>Sat</strong> <strong>Problem</strong> mit n Variablen x1, ..., xn gegeben.<br />
2. Man definiert einen Graphen G = (V, E), wobei als Knoten x1, ¬x1, ..., xn, ¬xn<br />
herangezogen werden. Es liegen also 2n Knoten im Graphen G vor.<br />
3. Die Elemente der Kantenmenge E wird folgendermaßen definiert: Enthält die<br />
Formel F des 2-<strong>Sat</strong> <strong>Problem</strong>s die Klausel (xi ∨ xj), so enthält E die Kante (¬xi, xj)<br />
und (aufgrund der Kommutativität von ∨) die Kante (¬xj, xi).<br />
4. Die Formel F des 2-<strong>Sat</strong> <strong>Problem</strong>s ist genau dann erfüllbar, wenn es kein Literal xi gibt,<br />
so <strong>das</strong>s xi und ¬xi in derselben starken Zusammenhangskomponente liegen.<br />
Beispiele:<br />
F = (x1 ∨ x2) ∧ (¬x1 ∨ ¬x2)<br />
Dies ist <strong>das</strong> Beispiel aus dem 1. Kapitel. Dabei haben wir festgestellt, <strong>das</strong>s F erfüllbar ist. Es<br />
dürfen daher x1 und ¬x1, sowie x2 und ¬x2 nicht in einer starken Zusammenhangskomponente<br />
des Graphen G, den wir nun erstellen, liegen.<br />
Um den Graphen G zu erstellen, muss man zunächst wissen, welche Knoten in dem Graphen<br />
G liegen. In unserem Beispiel sind es die Knoten: x1, x2, ¬x1 und ¬x2.<br />
Im nächsten Schritt sind die Kanten des Graphen G zu ermitteln. Hier<strong>für</strong> betrachtet man jede<br />
Klausel separat, und leitet daraus die benötigten Kanten ab. Hier<strong>für</strong> kann man folgende<br />
Merkregel anwenden: Pro Klausel werden 2 Kanten erstellt. Für die erste Kante gilt: Erstes<br />
Literal negiert nach zweites Literal. Für die zweite Kante gilt: Zweites Literal negiert nach<br />
erstem Literal.<br />
Für die Klausel (x1 ∨ x2) erhalten wir also die Kanten (¬x1, x2) und (¬x2, x1). Für die Klausel<br />
(¬x1 ∨ ¬x2) erhält man die Kanten (x1, ¬x2) und (x2, ¬x1).<br />
Der Graph G hat somit folgendes Aussehen:<br />
Abbildung 1: Graph G<br />
Man kann aus Abbildung 1 erkennen, <strong>das</strong>s kein Weg von x1 nach ¬x1 und auch kein Weg von<br />
x2 nach ¬x2 führt. Somit stehen die inversen Literale zueinander in keiner starken<br />
Zusammenhangskomponente und die Formel F wird von dem Algorithmus als erfüllbar<br />
deklariert.
In einem zweiten Beispiel sei nun die unerfüllbare Formel<br />
gegeben.<br />
D = (¬x1 ∨ x2) ∧ (x1 ∨ ¬x2) ∧ (¬x1 ∨ ¬x2) ∧ (x1 ∨ x2)<br />
Die Knotenmenge V ist wieder ident zum Graphen G aus dem ersten Beispiel. Aus den<br />
Klauseln lassen sich aber nun folgende Kanten ableiten:<br />
(x1, x2), (¬x2, ¬x1), (¬x1, ¬x2), (x2, x1), (x1, ¬x2), (x2, ¬x1), (¬x1, x2), (¬x2, x1)<br />
Der daraus resultierende Graph H ist in Abbildung 2 ersichtlich:<br />
Abbildung 2: Graph H<br />
Aus Abbildung 2 kann man einen Weg von x1 <strong>über</strong> x2 nach ¬x1 erkennen. Ebenso kann man<br />
von ¬x1 <strong>über</strong> x2 nach x1 gehen. x1 und ¬x1 liegen also in einer starken<br />
Zusammenhangskomponente. Dasselbe gilt auch <strong>für</strong> x2 und ¬x2. Der Algorithmus deklariert<br />
demnach Formel D als nicht erfüllbar.
4. Begründung <strong>für</strong> die Gültigkeit des Algorithmus<br />
Die logischen Operatoren ∨ (ODER) und ⇒ (IMPLIKATION) sind folgendermaßen definiert:<br />
∨ true false<br />
true true true<br />
false true false<br />
⇒ true false<br />
true true false<br />
false true true<br />
Somit kann man mittels einer Wahrheitstafel zeigen, <strong>das</strong>s (x ∨ y) äquivalent zu (¬x ⇒ y) und<br />
(¬y ⇒ x) ist.<br />
x y x ∨ y ¬x ⇒ y ¬x ⇒ x x ⇒ ¬x<br />
false false false false false true<br />
false true true true false true<br />
true false true true true false<br />
true true true true true false<br />
In unserem Graphen entsprechen die Kanten bijektiv den Implikationsklauseln. Gibt es also in<br />
einem Graphen einen Weg von Knoten x nach Knoten y, so bedeutet dies:<br />
x ⇒ ... ⇒ y<br />
Daraus folgt, <strong>das</strong>s wenn x mit 1 belegt wird, auch y mit 1 belegt sein muss. Existiert nun aber<br />
ein Weg von x nach ¬x und von ¬x nach x gibt, so gibt es keine Variablenbelegung, die<br />
x ⇒ ... ⇒ ¬x ⇒ ... ⇒ x<br />
erfüllt. (Aus den letzten beiden Spalten der Wahrheitstafel kann man erkennen, <strong>das</strong>s ein Weg<br />
in beide Richtungen existieren muss, damit keine Variablenbelegung gefunden werden kann,<br />
um die Formel zu erfüllen.)<br />
Der Beweis selbst erfolgt mittels Induktion. (Induktionsstart: n = 1: (x ∨ x) ∧ (¬x ∨ ¬x))
5. Beschreibung des Algorithmus<br />
Zunächst muss der Graph aus der Formel des 2-<strong>Sat</strong> <strong>Problem</strong>s erstellt werden. Dabei werden<br />
die Literale in ihrer positiven und negativen Belegung herangezogen. Existieren also n<br />
Literale, so enthält der Graph 2n Knoten. Zu der Kantenmenge E werden pro Klausel 2<br />
Kanten hinzugefügt.<br />
Anschließend wird mittels Tiefensuche (Depth-First-Search, DFS) nach den starken<br />
Zusammenhangskomponenten im Graph gesucht. Liegt ein Knoten x mit dem Knoten ¬x in<br />
derselben starken Zusammenhangskomponente, so ist die Formel unerfüllbar.<br />
Allerdings ist die Implementierung der Tiefensuche <strong>für</strong> einen gerichteten Graphen nicht so<br />
einfach wie <strong>für</strong> ungerichtete. Deshalb kann man alternativ auch <strong>für</strong> jeden "positiven" Knoten<br />
zunächst mittels Tiefensuche <strong>über</strong>prüfen, ob ein Weg zu seinem "negativen" Pendant führt. Ist<br />
dies der Fall, so wird nun mittels Tiefensuche <strong>über</strong>prüft, ob ein Weg vom "negativen" Knoten<br />
zum "positiven" führt. Ist dies der Fall, so wird der Algorithmus abgebrochen und die Formel<br />
als unerfüllbar erklärt.<br />
Wurde bereits vom "positiven" Knoten kein Weg zum "negativen" gefunden, so kann der<br />
Knoten der nächsten Variable untersucht werden. Muss auch <strong>über</strong>prüft werden, ob vom<br />
"negativen" Knoten ein Weg zum "positiven" führt, und man feststellt, <strong>das</strong>s dies nicht der Fall<br />
ist, so wird die gesamte Prozedur auf den Knoten der nächsten Variable angewandt.<br />
6. Analyse des Algorithmus<br />
Sei n die Anzahl der Literale und k die Anzahl der Klauseln, so kann der Graph in einer<br />
Adjazenznmatrix der Größe 4n² abgespeichert werden. In der Matrix werden <strong>für</strong> jede Klausel<br />
2 Eins-Einträge gesetzt. (Die Adjazenzmatrix hat somit 2k Eins-Einträge).<br />
Die Laufzeit <strong>für</strong> die Tiefensuche, um starke Zusammenhangskomponenten im Graphen zu<br />
finden, liegt in Θ (2n + 2k). Wenn man hingegen, die alternative Prozedur heranzieht, so wird<br />
im worst case <strong>für</strong> jeden positiven und jeden negativen Knoten eine Tiefensuche gestartet. Die<br />
Laufzeit da<strong>für</strong> liegt in O(2n*(2n+2k)) = O(4n² + 4nk).<br />
7. Quellen<br />
• Algorithmen zu 2-<strong>Sat</strong> und 3-<strong>Sat</strong><br />
von Hendrik Siedschlag<br />
www-info1.informatik.uni-wuerzburg.de/staff/schaefer/lehre/PPIWS0102/ergebnisse/03.pdf<br />
• Folien zu Theoretischer Informatik 2 (Informatik Lehramt)<br />
von Stefan Schirra<br />
http://isgwww.cs.uni-magdeburg.de/ag/lehre/SS2003/ThInf/slides/Ch6.pdf<br />
• Skriptum zur Vorlesung:<br />
Algorithmen und Datenstrukturen 2 (Wintersemester 2001 /2002)<br />
von Univ.-Prof. Dr. Petra Mutzel und Ass.-Prof. Dr. Günther Raidl