Institut für Informatik Sommersemester 2009 Praktische Informatik und Bioinformatik Prof. Dr. Ralf Zimmer Dr. Caroline Friedel, Dr. Orland Gonzalez, Lukas Windhager Übungen zur Algorithmischen Bioinformatik I Blatt 9 Abgabetermin: Dienstag, 07.07.2009, 10 ct 1. Aufgabe (Einfache Reduktionen): Um das Prinzip der Reduktion weiter einzuüben, zeigen Sie, dass folgende Probleme NP vollständig sind. Zeigen Sie dazu, dass gegebene Lösungen in polynomieller Zeit überprüft werden können und dass ein bekannt NP vollständiges Problem auf das neue Problem reduziert werden kann. D.h. insbesondere, dass eine Probleminstanz eines bekannt NP vollständigen Problems in polynomieller Zeit in eine Instanz des neuen Problems überführt werden kann. Lösungen sind hier jeweils Mengen von Mengen. Die Instanzgröße entspricht der Anzahl der gegebenen Mengen. (a) X3C (Exact Cover by 3-Sets): Eine Menge X mit |X| = 3q und eine Menge C von 3elementigen Teilmengen von X seien gegeben. Gibts es ein C 0 ⊆ C, das X exakt überdeckt? D.h gibt es eine Teilmenge C 0 von C, sodass jedes Element von X in genau einer Menge aus C 0 vorkommt? (Hinweis: 3DM ist NP vollständig.) (b) Set Packing: Eine Menge C von endlichen Mengen und eine positive Integerzahl K ≤ |C| seien gegeben. Enthält C zumindest K gegenseitig disjunkte Mengen? 2. Aufgabe (Brückensuche): Eine Kante in einem zusammenhängenden, ungerichteten Graphen heißt Brücke, wenn das Entfernen dieser Kante den Graphen in zwei Teile zerfallen läßt. Entwerfen Sie einen möglichst effizienten Algorithmus, der zu einem gegebenen Graphen alle Brücken ermittelt. Analysieren Sie die Laufzeit Ihres Algorithmus. Die Instanzgröße ist die Anzahl der Knoten im Graphen. Hinweis: Eine einfache mögliche Lösung beruht auf Spannbäumen. Eine effizientere Lösung beruht auf Tiefensuche. Hierbei sollte man besonderes Augenmerk auf die Schritte/Zeitpunkte legen,an denen man Knoten bei der Tiefensuche erstmalig erreicht. Achtung: Algorithmen, die “alle (möglichen) Pfade suchen, die Y erfüllen ” oder “alle X auf Y testen” haben oft exponentielle Laufzeit. Überprüfen Sie ihren Algorithmus daraufhin und zeigen Sie gegebenenfalls, warum in Ihrem Fall die Laufzeit doch nur polynomiell (oder niedriger) ist. 1 3. Aufgabe (Original PARTITION): Implementieren Sie den pseudo Polynomialzeit Algorithmus für das PARTITION Problem so wie in der Vorlesung angegeben. D.h. erzeugen sie eine Tabelle mit Einträgen t(i, j) : i ∈ (1, . . . , n), j ∈ (1, . . . , B2 ) mithilfe von dynamischer Programmierung. Das Programm soll TRUE zurückgeben genau dann, wenn eine Partition möglich ist. Ansonsten FALSE. Kommandozeilenparameter soll der Pfad zu einer Datei sein. Die Datei enthält pro Zeile eine positive ganze Zahl, die eines der Gewichte angibt. Testen Sie ihr Programm mit den gegebenen Beispieldateien. Die Gewichte in bigweights.txt dürften von ihrem Programm nicht partitioniert werden können. Stellen Sie die Ursache fest und geben sie eine Erklärung. Die Aussage “Weil Java eine Fehlermeldung bringt” reicht nicht aus. Hinweis: Benutzen Sie Double.parseDouble(String s), um Ausdrücke wie 10E5 als Zahl einzulesen. 4. Aufgabe (Verbesserte(?) PARTITION): Verbessern Sie Ihre Implementierung des pseudo Polynomialzeit Algorithmus derart, dass auch bigweights.txt oder ähnliche Instanzen partitioniert werden können. Möglicherweise muss nicht die vollständige t(i, j) Matrix gespeichtert werden. Testen Sie ihr Programm mit den gegebenen Beispieldateien. Die Gewichte in manyweights.txt dürften von ihrem Programm nicht partitioniert werden können. Stellen Sie die Ursache fest und geben sie eine Erklärung. Die Aussage “Weil Java eine Fehlermeldung bringt” reicht nicht aus. 2