09.10.2013 Aufrufe

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 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!