Seminar und Proseminar - WS 2007/2008 Perlen der Theoretischen Informatik Friedhelm Meyer auf der Heide Kontakt Friedhelm Meyer auf der Heide Universität Paderborn Institut für Informatik und Heinz Nixdorf Institut Fürstenallee 11 33102 Paderborn email: [email protected] Vorwort In diesem Seminar/Proseminar soll anhand einer Reihe ausgewählter Aufsätze und LehrbuchAbschnitte die Schönheit von Problemlösungen aus dem Bereich der Theoretischen Informatik demonstriert werden und gezeigt werden, dass die Beschäftigung mit raffinierten Beweistechniken, eleganten Argumenten und überraschenden Konstruktionen höchst vergnüglich ist. Inspiriert wird dieses Seminar durch das Buch "Perlen der Theoretischen Informatik", BI Wissenschaftsverlag 1995, von Uwe Schöning (Unibibliothek 41TVA2403, 60TVA2411) , in dem er eine Sammlung von Ergebnissen vorstellt, die seiner Meinung nach Highlights der Theoretischen Informatik darstellen. Natürlich wird die Themenauswahl unseres Seminars durch den Geschmack der Themensteller und ihrer Arbeitsgebiete geprägt sein. Aufbau des Seminars/Proseminars Ziel des Seminars ist die Aufbereitung aktueller Forschungsarbeiten. Zur Auswahl stehen die unten aufgeführten Arbeiten. Die Veranstaltung besteht aus einem Seminar und einem Proseminar, d.h. entweder erwirbt man einen Seminarschein oder einen Proseminarschein. Jedes Thema wird als Pärchen vergeben, das aus einem Proseminarvortrag und einem Seminarvortrag besteht. Der Proseminarvortrag stellt die Grundlagen für den dazugehörigen Seminarvortrag bereit. Teilnehmerinnen und Teilnehmer des Seminars Thema: Cell to Cell Visibility in PVS Systemen Seminar: Andre Gärtner Betreuung: Ralf Petring Seminar: Markus Heberling Betreuung: Morteza Monemizahdeh Thema: Dynamische Hashingverfahren Seminar: Marco Müller Betreuung: Mario Mense Thema: Peer to Peer Netzwerke Proseminar: Andreas Vogelsang Seminar: Marc Borowski Betreuung: Peter Mahlmann Thema: Wegeberechnung für Roboter in 2D-Umgebungen Proseminar: Michael Kionka Seminar: Benjamin Eikel Betreuung: Matthias Fischer Thema: Kinetische Datenstrukturen Proseminar: Peter Kling Seminar: Sabine Naewe Betreuung: Bastian Degener Thema: Geometrische Spanner Proseminar: Jasmin Kovac-Engelmeier Seminar: Philipp Wissneth Betreuung: Christiane Lammersen Thema: Clustering Proseminar: Holger Bürger Thema: Dynamische Steinerbäume Proseminar: Linda Röhrkohl Seminar: Holger Hagedorn Betreuung: Jan Mehler Thema: Globale Sichtbarkeit in 3D Szenen Proseminar: Michael Kruse Seminar: David Schmelter Betreuung: Claudius Jähn Inhaltsverzeichnis Teil I Proseminar Wegberechnung für Punktroboter mittels Trapezierung Michael Kionka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Der Einsatz von Bereichsbäumen zur Beantwortung von orthogonalen Bereichsanfragen Jasmin Kovač-Engelmeier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 „A Simple Linear Time (1+ε)-Approximation Algorithm for k-Means Clustering in Any Dimensions“ für k = 2 Holger Bürger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 Skalierbare Peer-to-Peer-Netzwerke Andreas Vogelsang . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Eine Einführung in kinetische Datenstrukturen Peter Kling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie Linda Röhrkohl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Aspektgraphen und Verdeckung Michael Kruse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Teil II Seminar Cell to Cell Visibility in PVS Systemen André Gärtner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 Hohe Verfügbarkeit in skalierbaren verteilten Hashingdateien mit Mirroring Marco Müller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen in 2D-Umgebungen Benjamin Eikel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 XII Inhaltsverzeichnis Konstruktion von geometrischen Spannern mit geringem Durchmesser Philipp Wissneth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 Ein einfacher, linearer (1+) - Approximationsalgorithmus für das k-Means Clustering Problem Markus Heberling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 Peer-to-Peer Netzwerke: Skip-Graph Marc Borowski . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 Kinetische Datenstrukturen für zweidimensionale Probleme Sabine Naewe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 Dynamische Steinerbäume Holger Hagedorn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 Approximationen und Alternativen für Aspektgraphen David Schmelter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 Teil I Proseminar Wegberechnung für Punktroboter mittels Trapezierung Michael Kionka Universität Paderborn [email protected] Zusammenfassung. Das Wegberechnungsproblem für Roboter ist ein aktuelles Thema in der algorithmischen Geometrie und Robotik und hat über die Jahre bereits viel Beachtung in der Forschung erfahren. Mit dieser Ausarbeitung soll ein erster Einblick in das insgesamt sehr komplexe Thema gegeben werden. Untersuchungsgegenstand ist ein Punktroboter, der sich translatorisch in einer statischen, vorher bekannten 2D-Umgebung zwischen polygonen Hindernissen kollisionsfrei bewegen soll. Die vorgestellte Lösung beruht auf dem Verfahren der Trapezierung. Es wird gezeigt, dass für den Punktroboter Wegberechnungen zwischen zwei Positionen in O(n) Zeit, wobei n die Gesamtanzahl der Kanten der Hindernisse bezeichnet, möglich sind. Hierfür sind einmalige Vorberechnungen für den Raum nötig, die erwartete Zeit O(n log n) benötigen. 1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2 Raumdefinitionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3 Trapezierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.1 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 9 4 Wegberechnung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 4.1 initiale Berechnungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 4.2 Pfadberechnung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 5 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 5.1 Bewertung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 5.2 Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1 Einleitung Die Bedeutung von Robotern nimmt in der heutigen Zeit immer mehr zu. Neben den rein technischen bzw. mechanischen Anforderungen, stellen sich auch Anforderungen an die verwendete Steuerungslogik. Ein wesentlicher Punkt ist hierbei die Bewegungsplanung. Roboter müssen sich sicher bewegen können ohne durch Kollision mit anderen Objekten Schaden zu nehmen. Die Ausarbeitung setzt an diesem Punkt an. Die gestellten Fragen sind hierbei konkret: • Existiert für den Roboter ein kollisionsfreier Weg zwischen zwei Punkten 4 Michael Kionka • Falls ja, wie lautet dieser Weg Das hierfür betrachtete Szenario sieht wie folgt aus: Gegeben ist ein so genannter Punktroboter. Dies bedeutet, dass der Roboter keine Ausdehnung besitzt, sondern nur als Punkt dargestellt wird. Diese Einschränkung ist zwar nicht realistisch, dient aber dazu, die Betrachtung nicht unnötig kompliziert zu machen. Auf die grundlegenden Vorgehensweisen hat sie keinen Einfluss. Dieser Punktroboter kann sich nur translatorisch bewegen. Dies bedeutet, dass er sich nicht drehen kann bzw. seine Orientierung nicht ändern kann. Bei Punktrobotern ist die Unterscheidung der Bewegungsarten zunächst unerheblich für die Wegberechnung, sie ist aber von Bedeutung bei einer möglichen Erweiterung auf konvexe Roboter. Weiterhin ist ein 2-dimensionaler Raum gegeben. In ihm befinden sich disjunkte, polygone Hindernisse. Diese Hindernisse sind ausschließlich statisch und zu Beginn der Berechnungen bekannt. Die Umgebung des Roboters wird sich also im betrachteten Zeitraum nicht verändern. Die Aufgabe besteht nun darin, für den Punktroboter Wege zwischen beliebigen Punkten zu berechnen und auszugeben, falls diese Wege existieren. Der Fokus liegt hierbei ausschließlich auf dem Finden von existenten Wegen, nicht jedoch auf dem Angeben von kürzesten Wegen. In dieser Ausarbeitung wird angenommen, dass es für einen Roboter erlaubt ist, ein Hindernis zu berühren. Es ist aber sicherlich nicht verkehrt, allgemein ein zu nahes Vorbeifahren an einem Hindernis zu vermeiden, um mögliche Fehler in einer Robotersteuerung abzufangen. Um dieses zu Erreichen, könnte man zu Beginn alle Hindernisse minimal vergrößern. Die Berechnungen der vorgestellten Lösung lassen sich in zwei Teile aufteilen. Zunächst werden einige Vorberechnungen für den Raum stattfinden, die die eigentlichen Wegberechnungen vereinfachen sollen. Anschließend können, aufbauend auf den Ergebnissen, beliebig viele Weganfragen bearbeitet werden. Aus dieser grundsätzlichen Lösungstruktur ergibt sich, dass sie insbesondere dann sinnvoll ist, wenn die zu Beginn gegebene Raumumgebung für möglichst viele Anfragen bestehen bleibt. In diesem Fall lohnen sich die initialen Vorberechnungen. Diese Ausarbeitung orientiert sich dabei inhaltlich an den Kapiteln 6 und 13 in [1]. Die verwendeten Abbildungen sind ebenfalls an die dort verwendeten Abbildungen angelehnt. Bei dem Buch handelt es sich um eine Zusammenstellung verschiedener Themen der algorithmischen Geometrie. Die zu Grunde liegenden Arbeiten stammen von Mulmuley [2] und Seidel[3] im Bereich des Trapezierungs-Verfahrens. Die Ideen zur free space - Berechnung basieren auf den Arbeiten von Kedem et al.[4][5]. Im nächsten Kapitel werden zunächst einige grundlegende Begriffe geklärt. Hierbei wird die Einschränkung auf Punktroboter kurz aufgehoben, da einige wichtige Begriffe im Umfeld der Roboter-Wegberechnung nicht unerwähnt bleiben sollen, aber an Punktrobotern nicht sinnvoll erklärt werden können. Wegberechnung für Punktroboter mittels Trapezierung 5 2 Raumdefinitionen Zunächst geht es darum, festzulegen, wie die Position des Roboters im Raum beschrieben werden kann und wie der Raum an sich dargestellt wird. Im Folgenden sei R der Roboter, der sich in seiner Umgebung, die wir work space nennen werden, bewegt. In dieser Umgebung befindet sich weiterhin eine Menge von Hindernissen H= {P 1 , . . . , P t }. Um die aktuelle Position des Roboters beschreiben zu können, führen wir den Begriff des Referenzpunktes eines Roboters ein. Dies ist ein festgelegter Punkt, der sinnvoller-, aber nicht notwendigerweise, innerhalb des Roboterpolygons liegt. Wir beschreiben ihn mit R(x,y), wobei x und y die Koordinaten im 2–dimensionalen Raum darstellen. Der Referenzpunkt liegt für R(0,0) per Definition im Ursprung. Um nun die aktuelle Roboterposition darstellen zu können, geben wir für die momentane Position des Roboters, die derzeitigen Koordinaten seines Referenzpunktes an. Allgemein hängt die Anzahl der Parameter, die nötig sind, um die Platzierung eines Roboters im Raum eindeutig angeben zu können, von der Anzahl seiner Freiheitsgrade ab. In diesem Fall kann der Roboter sich in zwei Dimensionen translatorisch bewegen, daher ergibt sich die benötigte Anzahl von zwei Parametern. Würde sich der Roboter zum Beispiel im 3–dimensionalen Raum translatorisch bewegen können, so wären drei Parameter nötig. Allgemein wird pro Freiheitsgrad des Roboters ein weiterer Parameter benötigt. Im work space wird die tatsächliche Form des Roboters dargestellt. Da in dieser Ausarbeitung nur Punktroboter betrachtet werden, stellt dies hier kein Problem dar. Allgemein ist diese Darstellung für Berechnungen jedoch nicht sinnvoll. Für die Berechnungen definiert man daher als Repräsentation den sogenannten configuration space, kurz C(R), in dem der Roboter nur noch als Punkt (sein Referenzpunkt) dargestellt wird. Ein Punkt im configuration space entspricht also einer Platzierung des Roboters im work space und umgekehrt. Den configuration space müssen wir genauer definieren. Da wir in unserem Raum Hindernisse haben, sind nicht alle Positionierungen des Roboters im configuration space erlaubt. Genauer formuliert sind die Positionierungen nicht erlaubt, bei denen der Roboter ein Hindernis schneidet. Diese bezeichnen wir als forbidden (configuration) space, kurz, C f orb (R, H). Den verbleibenden Raum, der gültige Positionierungen beschreibt, nennen wir free (configuration) space, kurz, C f ree (R, H). Bei Punktrobotern entsprechen sich der work space und der configuration space.1 Weiterhin stellen die Hindernisse im work space genau den forbidden space des configuration space dar. Allgemein haben Roboter jedoch eine Ausdehnung, die im configuration space verloren geht. Um die reale Situation im allgemeinen Fall dennoch korrekt darzustellen, müssen somit die Hindernisse angepasst werden. Sie müssen entsprechend der Form des Roboters vergrößert werden. Veranschaulicht beschrieben ergeben sich die neuen Formen, indem man mit dem Referenzpunkt des Roboters die Kanten der Hindernisse entlang fährt und den dabei überstrichenen Bereich dem jeweiligen Hindernis als zusätzliche Ausdehnung zuordnet. Die so entstandenen vergrößerten Hindernisse bezeichnet man als configuration-space 1 unter der sinnvollen Annahme, dass der Referenzpunkt des Roboters dem Punkt des Roboters entspricht 6 Michael Kionka obstacle oder kurz C-obstacle. Abbildung 1 zeigt ein Beispiel hierfür. Auf die entsprechende Berechnung wird in der Ausarbeitung auf Grund des Fokus auf Punktroboter verzichtet. work space configuration space Referenzpunkt Cobstacle Abb. 1. work space und configuration space 3 Trapezierung In diesem Kapitel soll eine Datenstruktur vorgestellt werden, die uns später helfen wird eine Repräsentation des free space zu erstellen. Bei dieser Datenstruktur handelt es sich um die sogenannte Trapezierung. Die Trapezierung des free space wird uns folgende Vorteile bieten. Zum einen werden wir den free space in kleinere, trapezförmige und damit konvexe Flächen aufgeteilt haben, in denen der Roboter sich sicher von einem beliebigen zu einem anderen beliebigen Punkt mit einer geradlinigen Bewegung bewegen kann, ohne gegen ein Hindernis zu stoßen. Zum anderen werden wir durch den Trapezierungs-Algorithmus eine Suchstruktur erzeugt bekommen, mit der wir leicht die Start- und Zielposition der Roboterbewegungen in der Repräsentation finden können. 3.1 Grundlagen Für eine Trapezierung gehen wir als Eingabe von einer Menge S von n sich nicht schneidenden Liniensegmenten aus, die eine Fläche in kleinere, polygone Flächen trennt. Bei uns wird diese Trennung später zwischen free space und forbidden space bestehen. Mittels der Trapezierung werden die polygonen Flächen dann in trapezförmige, konvexe Flächen aufgeteilt. Normallage In dieser Ausarbeitung werden zwei Vereinfachungen angenommen, die die Behandlung erleichtern. Eine Erweiterung auf den allgemeinen Fall kann in [1] in Kapitel 6.3 nachgelesen werden. Wegberechnung für Punktroboter mittels Trapezierung 7 Zunächst wird um die Liniensegmente eine umgebene Hülle konstruiert, um die am Rand liegenden Flächen zu beschränken. Dies geschieht in Form eines achsen-parallelen Rechtecks, welches die gesamte betrachtete Fläche einschließt. Die zweite Einschränkung stellt sich schwerwiegender, weil weniger realistisch, dar. Es wird angenommen, dass keine zwei verschiedenen Endpunkte von Liniensegmenten die gleiche x-Koordinate haben. Hieraus ergibt sich die wenig realistische Folgerung, dass es keine vertikalen Liniensegmente geben darf. Weiterhin ist es unwahrscheinlich, dass es allgemein keine Endpunkte von verschiedenen Segmenten gibt, die auf Grund einer eingeschränkten Genauigkeit, die gleiche x-Koordinate besitzen. Zusammengefasst bezeichnen wir eine solche Menge S von n sich nicht schneidenden Liniensegmenten, die von einer umgebenen Hülle umschlossen sind und für die gilt, dass keine zwei verschiedenen Endpunkte die gleiche x-Koordinate haben, als Menge von Liniensegmenten in Normallage. Struktur einer Trapezierung Die Trapezierung einer entsprechenden Eingabemenge entsteht, indem von den beiden Endpunkten eines jeden Liniensegmentes jeweils eine vertikale Linie nach oben und nach unten erzeugt wird, die bis zum Berührpunkt mit einem anderen Segment oder dem äußeren Rechteck verläuft. Diese Linien bezeichnen wir als obere bzw. untere vertikale Erweiterung des entsprechenden Endpunktes. Abbildung 2 zeigt beispielhaft eine solche Trapezierung. Abb. 2. Beispiel für eine Trapezierung Nicht-vertikale Seiten von so entstandenen Trapezen können nur aus Segmenten und den beiden horizontalen Seiten des äußeren Rechtecks bestehen. Wir bezeichnen das Segment bzw. die Seite des Rechtecks, die ein Trapez ∆ von oben bzw. unten begrenzt als top(∆) bzw. bottom(∆). Auf Grund der angenommenen Normallage können vertikale Seiten von Trapezen nur vertikale Erweiterungen von Segmentendpunkten oder eine der beiden vertikalen Ränder 8 Michael Kionka des Rechtecks sein. Insgesamt sind für die linke und die rechte Seite eines Trapezes jeweils fünf verschiedene Fälle möglich. Für die linke Seite sehen sie wie folgt aus: (1)Die linke Seite entartet zu einem Punkt, der der gemeinsame Endpunkt von top(∆) und bottom(∆) ist. (2)Es ist die untere vertikale Erweiterung des linken Endpunktes von top(∆), die bis zum Berühren von bottom(∆) verläuft. (3)Es ist die obere vertikale Erweiterung des linken Endpunktes von bottom(∆), die bis zum Berühren von top(∆) verläuft. (4)Es ist die obere und untere vertikale Erweiterung eines rechten Endpunktes eines weiteren Segmentes, bis sie top(∆) bzw. bottom(∆) berühren. (5)Es ist die linke Ecke des äußeren Rechtecks. Dieser Fall beschreibt die Situation für das am weitesten links liegende Trapez der Trapezierung. Die Fälle gelten entsprechend angepasst für die rechte Seite eines Trapezes. Die interessanten Fälle ((1)-(4)) sind in Abbildung 3 dargestellt. top(Δ) leftp(Δ) leftp(Δ) top(Δ) top(Δ) top(Δ) leftp(Δ) bottom(Δ) (1) bottom(Δ) (2) bottom(Δ) leftp(Δ) (3) bottom(Δ) (4) Abb. 3. Vier mögliche Entstehungen für die linke Seite eines Trapezes Wie man sieht, gilt für alle Trapeze, abgesehen vom am weitesten links liegenden, dass die linke Seite des Trapezes durch den linken Endpunkt von top(∆) bzw. bottom(∆) oder durch den rechten Endpunkt eines weiteren Segmentes definiert wird. Diesen Punkt bezeichnen wir im Folgenden mit lef tp(∆). Für das am weitesten links liegende Trapez definieren wir, dass der Punkt lef tp(∆) der unteren linken Ecke des Rechtecks entspricht. Entsprechende Definitionen gelten auch für die rechte Seite des Trapezes, wo der entsprechende Punkt mit rightp(∆) bezeichnet wird. Für die spätere Verwendung soll bereits hier festgehalten werden, dass ein Trapez ∆ durch top(∆), bottom(∆), lef tp(∆) und rightp(∆) eindeutig festgelegt ist. Lemma 1. Die Anzahl der enthaltenen Trapeze in der Trapezierung T (S) für eine Menge S von n Liniensegmenten und damit die Komplexität der Trapezierung ist O(n). Beweis. Es folgt ein direkter Beweis mittels lef tp(∆). Jedes Trapez hat einen solchen Punkt lef tp(∆), wobei dieser der Endpunkt einer der n Segmente oder die linke, untere Ecke des umschließenden Rechtecks ist. Betrachtet man die vorgestellten fünf Fälle für die linke Seite eines Trapezes, so ergibt sich folgendes: Die linke untere Ecke des Rechtecks entspricht Wegberechnung für Punktroboter mittels Trapezierung 9 lef tp(∆) für genau ein Trapez. Ein rechter Endpunkt eines Segmentes entspricht lef tp(∆) maximal für ein Trapez. Ein linker Endpunkt eines Segmentes entspricht lef tp(∆) für maximal zwei Trapeze. (Ein Punkt in der Fläche kann die Rolle von lef tp(∆) für mehrere Trapeze spielen, da Endpunkte von Segmenten sich überdecken können. Wenn man Fall a) aber genauer betrachtet, so kann lef tp(∆), angenommen als Endpunkt eines der Segmente, die Rolle lef tp(∆) nur für das über und das unter dem Segment liegende Trapez und damit für maximal zwei Trapeze annehmen.) Die Anzahl an Trapezen beträgt also maximal 3n + 1. t u 3.2 Algorithmus Für die Berechnung einer Trapezierung gibt es verschiedene algorithmische Ansätze. Im Folgenden wird ein randomisierter inkrementeller Algorithmus in seiner grundsätzlichen Vorgehensweise beschrieben. Genauere Details hierzu finden sich in [1] in Kapitel 6.2. Für die Eingabe der Liniensegmente wird als Datenstruktur eine doppelt-verkettete Liste gewählt. Die Idee des Algorithmus ist es, zunächst von einem einzigen Trapez (dem umschließenden Rechteck) auszugehen und dann schrittweise durch Hinzufügen der einzelnen Segmente eine Trapezierung aufzubauen. Parallel hierzu wird eine Suchstruktur erzeugt, mit deren Hilfe für einen beliebigen Punkt q leicht ermittelt werden kann, in welchem Trapez er liegt. Der Aufbau dieser Datenstrukturen soll nun etwas genauer beschrieben werden: In der Trapezierungs-Datenstruktur werden Datensätze für alle Segmente und ihre Endpunkte gespeichert. Weiterhin gibt es Datensätze für die Trapeze, wobei diese nicht das Trapez an sich, sondern Verweise auf top(∆), bottom(∆), lef tp(∆) und rightp(∆) speichern. Wie oben beschrieben, reichen diese aus, um ein Trapez eindeutig zu definieren und damit, um mit ihnen die genauen Kanten und Ecken des Trapezes zu bestimmen. Dieses ist in konstanter Zeit möglich. Für die einzelnen Trapeze werden außerdem Verweise auf die rechten und linken Nachbartrapeze gespeichert, so dass die Trapeze insgesamt netzartig verbunden sind. Die Suchstruktur ist als Graph aufgebaut, der aus inneren Knoten und Blattknoten besteht. Für jedes Trapez gibt es genau einen diesem entsprechenden Blattknoten. Die inneren Knoten bestehen noch einmal aus zwei verschiedenen Knotentypen (x-Knoten, y-Knoten), die jeweils Entscheidungsknoten darstellen und genau zwei Ausgangskanten besitzen. Die x-Knoten speichern jeweils Endpunkte von Segmenten, die y-Knoten die Segmente an sich. Beim Durchlaufen des Graphen auf der Suche nach dem Trapez, in dem sich q befindet, stellen sich an den Entscheidungsknoten dann folgende Fragen, die über die anschließend gewählte Ausgangskante entscheiden: Beim x-Knoten geht es darum, ob der Punkt q auf der rechten oder linken Seite einer durch den Segmentendpunkt, der im Knoten gespeichert ist, gezeichneten Linie liegt. Beim y-Knoten entscheidet sich der weitere Weg dadurch, ob der Punkt q oberhalb oder unterhalb des im Knoten gespeicherten Segmentes liegt. Schließlich sind die Trapezierung und die Suchstruktur noch miteinander verlinkt. Die Verlinkung besteht in beidseitigen Verweisen vom Datensatz eines Trapezes in der einen Datenstruktur zum Datensatz des gleichen Trapezes in der anderen Datenstruktur. Der Algorithmus sieht formal wie folgt aus: 10 Michael Kionka Algorithmus 1 Trapezierung Eingabe: Menge S von n sich nicht schneidenden Liniensegmenten Ausgabe: Trapezierung T (S) und Suchstruktur D für T (S) 1: Bestimme ein Rechteck, in dem alle Liniensegmente von S liegen 2: Initialisiere Trapezierung T und Suchstruktur D 3: Bestimme eine zufällige Permutation s1 , . . . , sn der Elemente von S 4: for i = 1 . . . n do 5: Finde ∆0 , ∆1 , . . . , ∆k der Trapeze in T , die von si geschnitten werden 6: Entferne ∆0 , ∆1 , . . . , ∆k aus T und ersetze sie durch die durch die Einfügung von si entstandenen Trapeze 7: Entferne die Blätter für ∆0 , ∆1 , . . . , ∆k aus D, erzeuge neue Blätter für die neuen Trapeze und füge sie korrekt in D ein Die Korrektheit des Algorithmus erfolgt auf dieser Abstraktionsebene direkt aus seiner Schleifeninvariante, die wie folgt lautet: Sei S i definiert als S i := {s1 , s2 , . . . , si }, wobei i die Schleifenvariable meint. Dann ist T eine korrekte Trapezierung für S i und D ist eine gültige Suchstruktur für T . Die Laufzeit werden wir erst später angeben, da sie sich direkt aus den folgenden Untersuchungen ergeben wird. Die am Ende erhaltene Trapezierung ist immer gleich, unabhängig von der in Schritt 3 erzeugten Permutation der Liniensegmente. Die Komplexität der Suchstruktur und die Laufzeit einer Suche auf dieser sind jedoch abhängig von der erzeugten Permutation der Segmente. Da der Algorithmus intern auch mit der Suchstruktur arbeitet (siehe [1], Seite 130), hängt auch seine Laufzeit von der Permutation ab. Im worst-case hat die Datenstruktur quadratische Größe und eine lineare Suchzeit2 . Allerdings gibt es auch Permutationen, bei denen sich deutlich bessere Werte ergeben. Interessant sind somit die erwartete 3 Komplexität, die erwartete Suchzeit und daraus folgend die erwartete Ausführungszeit des Algorithmus, die im Folgenden bestimmt werden sollen. Theorem 1. Berechne Algorithmus Trapezierung eine Trapezierung für eine Menge S von n Liniensegmenten in Normallage und eine zugehörige Suchstruktur. Die erwartete Laufzeit für eine Suchanfrage für einen beliebigen Punkt q beträgt dann O(log n). Beweis. Sei q der Punkt, für den eine Suchanfrage ausgeführt werden soll, beliebig aber fest. Die Ausführungszeit für eine solche Anfrage ist linear bezogen auf die Länge des zugehörigen Pfades im Suchgraphen. Die maximale Länge des Pfades entspricht der Tiefe von D. Da die Tiefe von D in jedem Iterationsschritt um maximal 3 zunimmt (siehe [1], Seite 131–133), ist 3n eine obere Schranke für die Suchanfrage für q. Man betrachte nun aber die erwartete Suchzeit. Untersucht man den Suchpfad von q, so wurde jeder der Knoten auf diesem Pfad in einem Iterationsschritt des Algorithmus erzeugt. Bezeichne Xi , 1 ≤ i ≤ n, die Anzahl an Knoten auf dem Pfad, die in Iterationsschritt i hinzugefügt wurden. Da S und q als fest angenommen sind, ist Xi eine Zufallsvariable, welche 2 3 Begründung wird in den folgenden Beweisen gegeben der Durchschnitt, der sich über alle n! möglichen Permutationen ergibt Wegberechnung für Punktroboter mittels Trapezierung 11 nur von der zufälligen Einfügereihenfolge der Segmente abhängt. Die erwartete Pfadlänge kann nun wie folgt angegeben werden: n n X X E[ Xi ] = E[Xi ] i=1 i=1 Da in einem Iterationsschritt die Tiefe des Suchgraphen um maximal 3 zunimmt, wird auch der Suchpfad für q maximal um 3 länger, also gilt Xi ≤ 3. Bezeichnet Pi die Wahrscheinlichkeit, dass es einen in Iteration i erzeugten Knoten auf dem Suchpfad von q gibt, so folgt: E[Xi ] ≤ 3Pi Um Pi nach oben zu beschränken, hilft folgende Beobachtung: Ein Knoten wurde genau dann in Iteration i zum Suchpfad von q hinzugefügt, wenn ∆q (S i−1 ), das Trapez, welches q in T (S i−1 ) enthält, nicht das gleiche ist, wie ∆q (S i ). Formal geschrieben: Pi = P r[∆q (Si ) 6= ∆q (Si−1 )] Wenn ∆q (S i ) und ∆q (S i−1 ) nicht identisch sind, muss ∆q (S i ) in Iteration i entstanden sein. Alle Trapeze ∆, die in Iteration i entstanden sind, grenzen an das in dieser Iteration eingefügte Segment si ; entweder top(∆) oder bottom(∆) ist si , oder lef tp(∆) oder rightp(∆) sind ein Endpunkt von si . Man betrachte nun eine beliebige, aber feste Menge S i ⊂ S. Die Trapezierung T (S i ) und damit insbesondere ∆q (S i ) ist allein als Funktion von S definiert. ∆q (S i ) hängt also nicht von der Reihenfolge ab, in der die Segmente von S i eingefügt wurden. Um die Wahrscheinlichkeit, dass sich das q enthaltene Trapez durch Einfügen von si geändert hat, nach oben zu beschränken, benutzt man die Technik der Rückwärtsanalyse: Betrachte T (S i ) und untersuche die Wahrscheinlichkeit, dass ∆q (S i ) aus der Trapezierung verschwindet, wenn Segment si entfernt wird. ∆q (S i ) verschwindet nur genau dann aus der Trapezierung, wenn top(∆q (S i )), bottom(∆q (S i )), lef tp(∆q (S i )) oder rightp(∆q (S i )) durch das Entfernen von si verschwinden (siehe oben). Man untersuche jetzt die Wahrscheinlichkeit, dass top(∆q (S i )) verschwindet. Da alle Segmente von S i in zufälliger Reihenfolge eingefügt wurden, ist für jedes Element die Wahrscheinlichkeit gleich hoch si zu sein. Also ist die Wahrscheinlichkeit, dass si = top(∆q (S i )) gilt, 1/i. 4 Entsprechendes gilt für bottom(∆q (S i )). Es kann mehrere Segmente geben, die als Endpunkt den Punkt lef tp(∆q (S i )) haben. Daher kann die Wahrscheinlichkeit, dass si eines dieser Segmente ist, groß sein. Allerdings verschwindet lef tp(∆q (S i )) nur, wenn si das einzige Segment von S i ist, welches lef tp(∆q (S i )) als Endpunkt besitzt. Dementsprechend ist auch für lef tp(∆q (S i )) die Wahrscheinlichkeit maximal 1/i, dass er verschwindet. Gleiches gilt für rightp(∆q (S i )). Zusammenfassend ergibt sich somit: Pi = P r[∆q (Si ) 6= ∆q (Si−1 )] = P r[∆q (Si ) ∈ / T (Si−1 )] ≤ 4/i Für die erwartete Laufzeit der Suchanfrage folgt abschließend: n n n n X X X X 1 12 = 12 = 12Hn E[ Xi ] ≤ 3Pi ≤ i i i=1 4 i=1 i=1 i=1 Falls top(∆q (S i )) die obere Kante des äußeren Rechtecks ist, ist die Wahrscheinlichkeit 0. 12 Michael Kionka Hn entspricht hierbei der n-ten Harmonischen Zahl, die wie folgt definiert ist: Hn := 1 1 1 1 + + + ... + 1 2 3 n Für n > 1 gilt: ln n < Hn < ln n + 1 Somit ergibt sich für eine Suchanfrage für einen beliebigen Punkt q die erwartete Laufzeit O(log n). t u Theorem 2. Berechne Algorithmus Trapezierung eine Trapezierung für eine Menge S von n Liniensegmenten in Normallage und eine zugehörige Suchstruktur. Die erwartete Größe der Suchstruktur D beträgt dann O(n). Beweis. Es genügt die Anzahl von Knoten in D anzugeben, um die Größe der Suchstruktur zu beschränken. Die Blätter von D gehören alle zu genau einem Trapez der Trapezierung und jedes Trapez besitzt genau ein Blatt in D, so dass die Anzahl der Blätter der Anzahl der Trapeze entspricht, welche durch O(n) beschränkt ist (siehe Lemma 1). Für die Gesamtzahl von Knoten ergibt sich somit: O(n) + n X (Anzahl innerer Knoten, die in Iteration i erzeugt wurden) i=1 Sei ki die Anzahl an Trapezen, die in Iteration i neu erzeugt wurden. ki entspricht somit der Anzahl der neuen Blätter in D. Die Anzahl neuer innerer Knoten entspricht genau ki − 1 (siehe [1], Seite 131–133). Eine einfache obere Schranke für die worst-case Größe der Suchstruktur ergibt sich aus der Tatsache, dass offensichtlich nicht mehr Trapeze in Iteration i neu erzeugt werden können, als insgesamt in der Trapezierung T (S i ) vorhanden sind. Dies entspricht O(i). Somit folgt für die obere Schranke: O(n) + n X O(i) = O(n2 ) i=1 Aber nun zurück zum eigentlichen Beweis. Für die erwartete Größe gilt zunächst n n X X O(n) + E[ (ki − 1)] = O(n) + E[ki ] i=1 i=1 Es muss also noch E[ki ] beschränkt werden. Man betrachte eine feste Menge S i ⊂ S. Für ein Trapez ∆ ∈ T (S i ) und ein Segment s ∈S i , sei 1, f alls ∆ aus T (Si ) verschwindet, wenn s aus Si entf ernt wurde δ(∆, s) := 0, sonst Im Beweis zu Theorem 1 zeigte sich, dass es maximal 4 Segmente gibt, die zum Verschwinden eines Trapezes führen können. Es folgt also X X δ(∆, s) ≤ 4|T (Si )| = O(i) s∈Si ∆∈T (Si ) Wegberechnung für Punktroboter mittels Trapezierung 13 Für ki gilt nun zusätzlich, dass es die Anzahl Trapeze in T (S i ) angibt, die verschwinden, wenn Segment si entfernt wird. Da si ein zufälliges Element aus S i ist, kann der Durchschnitt über alle s ∈S i für E[ki ] herangezogen werden: E[ki ] = 1X i X δ(∆, s) ≤ s∈Si ∆∈T (Si ) O(i) = O(1) i Die erwartete Anzahl von neuen Trapezen in jeder Iteration des Algorithmus ist also O(1). Insgesamt folgt somit eine erwartete Größe der Suchstruktur von O(n). t u Es fehlt nun noch eine Laufzeitbeschränkung für den eigentlichen Algorithmus. Theorem 3. Algorithmus Trapezierung berechnet eine Trapezierung T (S) für eine Menge S von n Liniensegmenten in Normallage und eine Suchstruktur D für T (S) in O(n log n) erwarteter Zeit. Beweis. Die Permutation der Elemente von S benötigt O(n) Zeit (siehe [1], Kapitel 4, Seite 78). Für eine Ausführung des Schleifenrumpfes, was dem Einfügen eines Segmentes entspricht, ergibt sich Folgendes: Das Suchen der betroffenen Trapeze in Schritt 5 benötigt unter Zurhilfenahme der Suchstruktur von T (S i−1 ) O(log i) Zeit (siehe [1], Seite 130f.), wobei i den i-ten Schleifendurchlauf bzw. das i-te eingefügte Segment meint. Das Aktualisieren der Trapezierung und der Suchstruktur benötigt O(ki ) Zeit (siehe [1], Seite 131–133). Mit der im Beweis zu Theorem 2 erhaltenen Grenze für ki ergibt sich somit insgesamt O(n) + n X {O(log i) + O(E[ki ])} = O(n log n) i=1 für die Laufzeit von Algorithmus Trapezierung. t u 4 Wegberechnung In diesem Kapitel wird beschrieben wie die Wegberechnung im Detail abläuft. Sie lässt sich in zwei Teilbereiche unterscheiden, die in zwei Unterkapiteln dargestellt werden. Zunächst muss aus den bekannten Informationen über den Bewegungsraum eine Repräsentation eben dessen konstruiert werden, deren Datenmenge nicht zu komplex wird, die aber gleichzeitig später eine schnelle Wegfindung ermöglicht. Dies geschieht vor der eigentlichen Wegberechnung. In einem zweiten Schritt kann nun jedes mal, wenn ein neuer Weg berechnet werden soll, auf die bereits erstellte Repräsentation zurückgegriffen werden und auf dieser der WegfindungsAlgorithmus ausgeführt werden. 4.1 initiale Berechnungen In diesem Unterkapitel sollen Datenstrukturen konstruiert werden, die eine schnelle Wegfindung ermöglichen. Hierfür werden wir zunächst eine Repräsentation für den free space angeben. 14 Michael Kionka Berechnung des Free Space Um die Handhabung angenehmer zu machen, begrenzen wir den Bewegungsraum des Roboters durch ein ausreichend großes Rechteck B, in dessen Innerem die Hindernisse liegen und in dem sich der Roboter bewegen wird. Den Bereich außerhalb des Rechtecks interpretieren wir als großes Hindernis. Durch diese Raumbeschränkung begrenzen wir den Bewegungsfreiraum des Roboters jedoch nicht stärker als in realen Situationen, da auch dort irgendwann natürliche Grenzen gegeben sind, so dass die Ergebnisse unserer Berechnungen nicht verfälscht sind. Der free space besteht Stnun aus dem Inneren des Rechtecks ohne die Hindernisse. Formal geschrieben: C f ree = B\ i=1 P i Unsere Repräsentation berechnen wir unter Verwendung der im letzten Kapitel vorgestellten Technik der Trapezierung. Die Eingabe besteht aus der Menge der disjunkten, polygonen Hindernisse, genauer gesagt aus Polygonzügen, die jeweils die Kanten eines dieser Hindernisse beschreiben. Die Segmente im Trapezierungs-Algorithmus stellen dementsprechend die Kanten der Hindernisse dar. Als Datenstruktur wird eine doppelt-verkettete Liste für die Kanten verwendet. Die Berechnung sieht algorithmisch dann wie folgt aus: Algorithmus 2 BerechneFreeSpace Eingabe: H= {P 1 , . . . , P t } als Menge von disjunkten Polygonen Ausgabe: Trapezierung von C f ree (R,H) inklusive Suchstruktur D für Punktroboter R 1: Sei E die Menge von Kanten der Polygone in H 2: Berechne Trapezierung T (E) und Suchstruktur D mittels Trapezierung(E) 3: Entferne die Trapeze, die innerhalb der Polygone liegen, aus T (E) und D 4: Ausgabe der resultierenden Trapezierung und Suchstruktur Schritt 3, also das Entfernen der Trapeze, die innerhalb der Hindernisse liegen, kann dabei wie folgt realisiert werden: Nach der Trapezierung ist für jedes Trapez bekannt, durch welche Kante es von oben begrenzt wird (top(∆)) und zu welchem Polygon/Hindernis diese Kante gehört. Um nun zu entscheiden, ob das entsprechende Trapez entfernt werden muss, reicht es aus zu testen, ob die Kante das Hindernis von oben oder von unten begrenzt. Wird ein Trapez gefunden, das innerhalb eines Hindernisses liegt, so werden seine Daten aus der Trapezierung entfernt. Weiterhin wird das Trapez in der Suchstruktur als nicht vorhanden markiert, damit bei einer Punktsuche festgestellt werden kann, dass der entsprechende Punkt im forbidden space liegt. Abbildung 4 zeigt noch einmal die sich nach Schritt 2 und 3 ergebenden Trapezierungen. Es folgt eine Analyse der Laufzeit des Algorithmus: Sei n die Anzahl an Segmenten/Hinderniskanten. Die Trapezierung benötigt dann O(n log n) erwartete Zeit. Der Test, ob ein Trapez innerhalb eines Hindernisses liegt, benötigt nur konstante Zeit, da die Kanten der Hindernisse in der Reihenfolge ihres Vorkommens entlang der Hindernisgrenze sortiert sind, so dass bekannt ist, auf welcher Seite der Kanten der Hindernisinnenraum liegt. Die erhaltenen Datenstrukturen, also die Trapezierung T (C f ree ) und die Suchstruktur D haben nach Lemma 1 und Theorem 2 beide eine Komplexität von O(n). Wegberechnung für Punktroboter mittels Trapezierung 15 Abb. 4. Trapezierungen von BerechneFreeSpace vor und nach Schritt 3 Damit ergibt sich folgendes Lemma: Lemma 2. Sei R ein Punktroboter. Sei H eine Menge von disjunkten, polygonen Hindernissen, wobei n die Gesamtanzahl ihrer Kanten ist. R bewegt sich zwischen diesen Hindernissen. Die Trapezierung des free space benötigt dann O(n log n) erwartete Zeit. Die erhaltenen Datenstrukturen haben eine Komplexität von O(n). Wegkarte Um die Wegberechnung zu vereinfachen, konstruieren wir uns eine weitere Datenstruktur. Wenn sich sowohl Start- als auch Zielposition im gleichen Trapez befinden, besteht der Weg aus einer einfachen direkten Bewegung von der Start- zur Zielposition. Auf Grund unserer vorherigen Definitionen ist garantiert, dass sich auf diesem Weg kein Hindernis befindet. Viel häufiger wird es aber vorkommen, dass Start- und Zielposition in unterschiedlichen Trapezen liegen. Um die Wegberechnung in diesem Fall zu vereinfachen, erzeugen wir uns einen Graph als Wegkarte, die uns Wege beschreibt, auf denen wir uns leicht zwischen verschiedenen Trapezen bewegen können. Hierbei nutzen wir aus, dass zwei benachbarte Trapeze immer eine gemeinsame vertikale Kante besitzen, die durch eine vertikale Erweiterung eines Segmentendpunktes entstanden ist. Die Knoten des Graphen wählen wir nun wie folgt. Wir nehmen zum einen den Mittelpunkt jeden Trapezes und zum anderen jeweils die Mitte jeder vertikalen Erweiterung als Knoten. Die Kanten legen wir jeweils von jedem Trapezmittelpunkt zu den Mittelpunkten der begrenzenden vertikalen Erweiterungen. Auf diese Weise entsteht jeweils ein Weg von der Mitte eines Trapezes zu den Mitten der angrenzenden Trapeze über die zwischen ihnen liegende vertikale Begrenzung, der aus zwei translatorischen Bewegungen besteht. Eine Veranschaulichung der Wegkarte ist in Abbildung 5 gegeben. Die Konstruktion dieser Wegkarte aus den in der Trapezierung enthaltenen Informationen ist in Zeit O(n) möglich. Für die Komplexität der Wegkarte gilt: Der Graph besitzt einen Knoten pro Trapez und jeweils einen Knoten für jede vertikale Erweiterung. Sowohl die Anzahl an vertikalen Erweiterungen als auch die Anzahl an Tra- 16 Michael Kionka pezen ist linear bezogen auf die Gesamtanzahl der Ecken der Hindernisse. Diese wiederum ist linear bezogen auf die Anzahl der Kanten der Hindernisse. Die Anzahl an Kanten im Graph ist ebenfalls linear, da er planar ist. Dies folgt aus dem eulerschen Polyedersatz. Insgesamt folgt also, dass die Komplexität der Wegkarte durch O(n) beschränkt ist. ziel vziel start pziel vstart pstart Abb. 5. Wegkarte und Wegkomponenten des vollständigen Weges 4.2 Pfadberechnung In diesem Unterkapitel wird der eigentliche Wegberechnungs-Algorithmus vorgestellt. Durch die initialen Berechnungen besitzen wir eine Trapezierung des free space (inklusive Suchstruktur) und eine auf dieser aufsetzende Wegkarte. Ziel ist es nun mit Hilfe dieser Datenstrukturen einen Weg von einem Startpunkt pstart zu einem Zielpunkt pziel zu finden und, falls dieser existiert, diesen zu berechnen und auszugeben. Liegen pstart und pziel im gleichen Trapez, ergibt sich der Weg wie beschrieben als direkte Bewegung zwischen ihnen. Ansonsten lässt sich ein existierender Weg aus drei Teilen zusammensetzen; dabei bezeichne vstart und vziel die Knoten im Wegkartengraphen, die in der Mitte von ∆start und ∆ziel liegen: Wegberechnung für Punktroboter mittels Trapezierung 17 1. Eine direkte Bewegung von pstart zum Wegkartenknoten vstart in der Mitte von ∆start . 2. Eine Bewegung entlang der Wegkarte von vstart zu vziel . (Berechnung über Breitensuche im Wegkartengraphen möglich) 3. Eine direkte Bewegung vom Wegkartenknoten vziel in der Mitte von ∆ziel zu pziel . Falls kein Weg zwischen pstart und pziel existiert, so gibt es hierfür zwei mögliche Gründe: • Einer der Punkte pstart und pziel liegt nicht im free, sondern im forbidden space. • Beide Punkte liegen zwar im free space, aber zwischen ihnen liegt nicht umgehbarer forbidden space. Der vollständige Algorithmus sieht dann wie folgt aus: Algorithmus 3 BerechnePfad Eingabe: Trapezierung T (C f ree ) mit Suchstruktur D, Wegkarte G road , Positionen pstart , pziel Ausgabe: Weg von pstart zu pziel , falls einer existiert, sonst entsprechend negative Meldung 1: Finde ∆start und ∆ziel 2: if ∆start oder ∆ziel nicht existent then 3: Ausgabe, dass pstart oder pziel in C f orb liegen 4: else 5: Sei vstart der Wegknoten in der Mitte von ∆start 6: Sei vziel der Wegknoten in der Mitte von ∆ziel 7: Berechne den Weg in G road von vstart zu vziel mittels Breitensuche 8: if es existiert kein Weg then 9: Ausgabe, dass kein solcher Weg existiert 10: else 11: Ausgabe des Weges pstart 7→ vstart vziel 7→ pziel Beweis. Um die Korrektheit des Algorithmus zu beweisen, müssen zwei Dinge gezeigt werden. • Jeder Weg, der ausgegeben wird, ist kollisionsfrei. • Wenn ein kollisionsfreier Weg existiert, wird er auch gefunden. zu 1. Ausgegebene Wege befinden sich immer innerhalb von Trapezen. Da aber alle Trapeze zum C f ree gehören, der nach Definition kollisionsfreie Positionen angibt, muss ein ausgegebener Weg kollisionsfrei sein. zu 2. Angenommen, es gibt einen kollisionsfreien Weg von pstart nach pziel . Damit müssen pstart und pziel in Trapezen des free space liegen. Es muss also noch gezeigt werden, dass es einen Weg von vstart nach vziel in G road gibt. Dieser Weg muss eine Folge von Trapezen schneiden. Bezeichne die Folge von Trapezen mit ∆1 , ∆2 , . . . , ∆k , wobei nach Definition ∆1 = ∆start und ∆k = ∆ziel gilt. Sei vi der Knoten von G road , der in der Mitte von ∆i liegt. Wenn der Weg von ∆i nach ∆i+1 geht, dann müssen die beiden Trapeze Nachbarn sein und sich damit eine vertikale Erweiterung teilen. Aber G road ist so konstruiert, dass die Knoten solcher Trapeze über den Knoten ihrer gemeinsamen Grenze verbunden sind. Also gibt es einen Weg in G road von vi nach vi+1 . Daraus folgt, dass es auch einen Weg von v1 nach vk bzw. vstart nach vziel gibt. Einen solchen Weg findet eine Breitensuche, die auf G road ausgeführt wird. t u Nachdem die Korrektheit des Algorithmus nachgewiesen ist, folgt nun eine Analyse seiner Laufzeit: 18 Michael Kionka Das Suchen der Trapeze in Schritt 1 kann mittels der Suchstruktur erfolgen, die während der Trapezierung des free space erzeugt wird. Es benötigt somit O(log n) erwartete Zeit und maximal O(n) Zeit. Das Berechnen eines Weges in Graphen mittels Breitensuche benötigt lineare Zeit bezogen auf die Größe des Graphen. Wie gezeigt ist die Größe des Graphen durch O(n) beschränkt. Somit benötigt die Breitensuche O(n) Zeit. Die benötigte Zeit zur Ausgabe des Weges ist begrenzt durch die maximale Anzahl an Kanten auf dem Weg, welche O(n) ist. Insgesamt benötigt der Algorithmus also eine Laufzeit von O(n). Unsere Untersuchungen lassen sich in einem abschließenden Theorem zusammenfassen. Theorem 4. Sei R ein Punktroboter. Sei H eine Menge von disjunkten, polygonen Hindernissen, wobei n die Gesamtanzahl ihrer Kanten ist. R bewegt sich zwischen diesen Hindernissen. H lässt sich in erwarteter Zeit von O(n log n) so aufbereiten, dass ein kollisionsfreier Weg zwischen Start- und Zielposition für R in O(n) berechnet werden kann, falls er existiert. Die erzeugten Datenstrukturen haben dabei eine Komplexität von O(n). 5 Zusammenfassung 5.1 Bewertung Die in dieser Ausarbeitung vorgestellte Methode der Wegberechnung für einen Roboter mittels Trapezierung liefert wie gezeigt zulässige Wege, wenn sie existieren. Sie garantiert jedoch keine kürzesten Wege. Genauer gesagt wird sie auf Grund ihrer Herangehensweise fast nie kürzeste Wege liefern. Dies ist bereits in der in Abbildung 5 dargestellten Situation erkennbar. Für ein extremeres Beispiel kann man als Start- und Zielpunkt die beiden unteren Ecken wählen. Es ergibt sich ein unnötig komplizierter Weg, wie in Abbildung 6 veranschaulicht ist. Aus diesem Grund muss man die Vorgehensweise als nicht realitäts-tauglich einstufen. Niemand wird akzeptieren, dass ein Roboter Zick-Zack-Linien fährt, obwohl eine geradlinige Bewegung möglich wäre. Bei den Zick-Zack-Bewegungen handelt es sich um ein ansatzbedingtes Problem, welches sich daher mit diesem Ansatz kaum vermeiden lassen wird. Eine gewisse Verbesserung ist jedoch auch beim gezeigten Ansatz noch möglich. Die Wegfindung in der Wegkarte G road beruht auf Breitensuche. Daher wird bei mehreren zulässigen Wegen, derjenige Weg gewählt, der die wenigsten Knoten besitzt. Dies ist jedoch nicht zwingend sinnvoll, da nicht von gleichen Entfernungen zwischen den einzelnen Knoten ausgegangen werden kann. Deutlich besser wäre es daher, für jede Kante im Graphen ein Kantengewicht anzugeben, das die jeweilige Länge beschreibt und dann einen kosten-optimierenden Algorithmus anzuwenden. 5.2 Ausblick Soll das Problem von einem Punktroboter, wie hier betrachtet, auf konvexe Roboter erweitert werden, so können die vorgestellten Algorithmen weitgehend beibehalten werden. Da sich nun aber der work space und der configuration space unterscheiden, gestaltet sich die Wegberechnung für Punktroboter mittels Trapezierung 19 ziel start vziel vstart pziel pstart Abb. 6. Beispiel für eine schlechte Wegberechnung Berechnung des free space aufwändiger. Die Berechnung benötigt nun O(n log2 n) erwartete Zeit, wobei die Komplexität des free space weiterhin linear bleibt. Auch die eigentliche Wegberechnungszeit beträgt weiterhin O(n). Die Berechnung und die Schranken werden in [1] in Kapitel 13.3 und 13.4 vorgestellt und bewiesen. Mit einem verbesserten Algorithmus kann die free space-Berechnungszeit jedoch auch wieder auf O(n log n) gesenkt werden. Sollen auch Rotationsbewegungen erlaubt sein, so gestalten sich die Berechnungen wiederum komplizierter. Eine mögliche Erweiterung hierfür wird in Kapitel 13.5 in [1] beschrieben. Neben dem hier vorgestellten Verfahren mittels Trapezierung, existieren weitere Verfahren, die insbesondere auch optimale Lösungen garantieren. Ein Beispiel für ein solches Verfahren unter Verwendung so genannter gerahmter quadtrees, wird im Seminarbeitrag vorgestellt. Literaturverzeichnis 1. de Berg M, van Kreveld M, Overmars M, Schwarzkopf O (2000) Computational Geometry, Algorithms and applications, 2nd Edition Springer, Berlin Heidelberg New York 2. Mulmuley K (1990) A fast planar partition algorithm. In: Journal of Symbolic Computation 10:253–280 3. Seidel R (1991) A simple and fast incremental randomized algorithm for computing trapezoidal decompositions and for triangulating polygons. Comput. Geom. Theory Appl. 1:51–64 20 Michael Kionka 4. Kedem K, Livne R, Pach J, Sharir M (1986) On the union of Jordan regions and collision-free translational motion amidst polygonal obstacles. Discrete Comput. Geom. 1:59–71 5. Kedem K, Sharir M (1985) An efficient algorithm for planning collision-free translational motion of a convex polygonal object in 2-dimensional space amidst polygonal obstacles. In: Proc. 1st Annu. ACM Sympos. Comput. Geom. 75–80 Der Einsatz von Bereichsbäumen zur Beantwortung von orthogonalen Bereichsanfragen Jasmin Kovač-Engelmeier Universität Paderborn Zusammenfassung. Unter einer orthogonalen Bereichsanfrage versteht man die Suche nach den Punkten einer gegebenen Punktmenge in einem d-dimensionalen Raum, die in einem achsenparallelen definierten Bereich liegen. Ein mögliches Anwendungsgebiet für orthogonale Bereichsanfragen ist die Realisierung von Datenbankanfragen. So wird jede Tabellenspalte als eine Dimension interpretiert, und jede Tabellenzeile als ein Punkt in dem entsprechenden d-dimensionalen Raum. Für die 1-dimensionale Bereichssuche kann auf die Datenstruktur eines binären balancierten Suchbaums zurückgegriffen werden. Im Fall der 2-dimensionalen oder auch mehrdimensionalen Bereichssuche bieten sich Bereichsbäume als eine Datenstruktur an. Wie diese Datenstrukturen genutzt werden können, um orthogonale Bereichsanfragen zu unterstützen, wird in der vorliegenden Arbeit erörtert. 1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2 Orthogonale Bereichsanfragen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3 1-dimensionale Bereichssuche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 4 Bereichsbäume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 5 Mehrdimensionale Bereichsbäume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 6 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 1 Einleitung Das Problem, orthogonale Bereichsanfragen effizient zu beanworten, spielt nicht nur innerhalb der Geometrie eine wichtige Rolle. So kann diese Fragestellung z.B. konkret auf Datenbankanfragen übertragen werden, wenn jeder Datensatz als ein Punkt in einer Ebene bzw. in einem mehrdimensionalen Raum interpretiert wird. Aus einer Menge von Datenstrukturen, die das Beantworten von orthogonalen Bereichsanfragen unterstützen können, fiel im Rahmen der vorliegenden Proseminararbeit die Wahl auf Bereichsbäume1 . In dem folgenden Kapitel wird zunächst der Begriff einer orthogonalen Bereichsanfrage anhand eines Anwendungsbeispiels näher erläutert. Es gilt dann in den darauffolgenden Kapiteln ausführlich zu beschreiben, wie binäre balancierte Suchbäume die 1-dimensionale 1 Die folgenden Ausführungen orientieren sich primär an [1]. 22 Jasmin Kovač-Engelmeier Bereichssuche und schließlich Bereichsbäume die 2- bzw. mehrdimensionale Bereichssuche unterstützen können. 2 Orthogonale Bereichsanfragen Auf den ersten Blick scheint es fraglich, ob und wie die Geometrie für Datenbankanfragen genutzt werden kann. Wenn nun aber jede der n Spalten einer Datenbank als eine Dimension und jede Zeile als ein Punkt in einem entsprechenden d-dimensionalen Raum interpretiert wird, so kann die Suche nach einem Datenbankeintrag durch die Suche nach dem korrespondierenden Punkt im d-dimensionalen Raum simuliert werden. Ein anschauliches Beispiel aus der Praxis ist die Mitarbeiterliste, welche von der Personalabteilung eines Unternehmens erstellt wird. In der Datenbank ist von jedem Mitarbeiter der Name, die Adresse, das Geburtsdatum, das Gehalt usw. gespeichert. Aus welchen Gründen auch immer kann es nun notwendig sein, dass eine Auswertung über alle Mitarbeiter, die zwischen 1950 und 1955 geboren sind und die zugleich zwischen Euro 3.000,und Euro 4.000,- pro Monat verdienen, erstellt werden soll. Diese Anfrage kann nun auch geometrisch interpretiert werden. Dies erfolgt, indem jeder Mitarbeiter als ein Punkt in der Ebene dargestellt wird. Die erste Koordinate spiegelt dann das Geburtsdatum wieder, und die zweite Koordinate das monatliche Einkommen. Das Geburtsdatum wird in dem vorliegenden Beispiel nach der folgenden Regel umgewandelt: 10.000 × Geburtsjahr + 100 × Monat + Tag. So erhält man zum Beispiel für das Geburtsdatum 02.01.1954 den Wert 19.540.102. Für die oben genannte Anfrage bedeutet dies, dass alle Punkte gesucht werden, deren erste Koordinate zwischen den Werten 19.500.000 und 19.559.999 liegt, und deren zweite Koordinate sich zwischen den Werten 3.000 und 4.000 befindet. Wenn man dies nun in ein Koordinatensystem überträgt, so wird deutlich, dass die Punkte, die gesucht werden, in dem achsenparallelen Rechteck liegen, das durch die Eckpunkte (19.500.000, 3.000) und (19.559.999, 4.000) definiert wird (vgl. Abbildung 12 ). Eine solche Anfrage kann selbstverständlich noch um weitere Attribute ergänzt werden wie z.B. die Anzahl der Kinder eines Mitarbeiters. D.h. es werden in dem Beispiel nun alle Mitarbeiter gesucht, die zwischen 1950 und 1955 geboren worden sind, monatlich zwischen Euro 3.000,- und Euro 4.000,- verdienen und zusätzlich zwei bis vier Kinder haben. Die Anzahl der Kinder wird demnach durch die dritte Koordinate eines jeden Punktes repräsentiert. Somit handelt es sich um eine Suche im dreidimensionalen Raum. Im Rahmen der Anfrage sind alle Punkte zu ermitteln, die in dem achsenparalleln Quader [19.500.000 : 19.559.999] × [2.000 : 4.000] × [2 : 4] liegen (siehe Abbildung 23 ). Anhand der beiden vorgestellten Beispiele lässt sich zusammenfassen, dass die Datensätze einer Datenbank sich als Punkte in einem d-dimensionalen Raum darstellen lassen. Die Suche nach den auf eine Anfrage zutreffenden Datenbankeinträge wird durch die Suche nach der Punktmenge ersetzt, die in dem d-dimensionalen und achsenparallel begrenzten Bereich 2 3 Die Abbildung ist entnommen aus [1]. Die Abbildung ist entnommen aus [1]. Bereichsbäume Gehalt Karl Schmidt Geburtsdatum: 19. August 1954 Gehalt: € 3.678,‐ 4.000 3.000 Geburtsdatum 19.500.000 19.559.999 Abb. 1. Geometrische Interpretation einer Datenbankanfrage Gehalt 4.000 3.000 Kinder 4 2 Geburtsdatum 19.500.000 19.559.999 Abb. 2. Geometrische Interpretation einer Datenbankanfrage in einem 3-dimensionalen Raum 23 24 Jasmin Kovač-Engelmeier liegt. Das Ermitteln dieser Punktmenge wird als orthogonale4 Bereichsanfrage bezeichnet. Im Folgenden werden Datenstrukturen vorgestellt, die orthogonale Bereichsanfragen unterstützen. Zunächst wird auf eine Datenstruktur für die 1-dimensionale Bereichssuche eingegangen, um von dieser Datenstruktur die Vorgehensweise für 2- und mehrdimensionale Bereichsanfragen abzuleiten. 3 1-dimensionale Bereichssuche Im Fall der Bereichssuche in einem 1-dimensionalen Raum besteht die betrachtete Punktmenge aus reellen Zahlen. Bei einer Anfrage werden dann die Punkte gesucht, die in einem 1-dimensionalen Rechteck liegen, d.h. also in einem Intervall [x : x0 ]. Sei nun P := {p1 , p2 , . . . , pn } die Menge der Punkte auf einer Zahlengeraden. Die Durchführung der 1-dimensionalen Bereichssuche kann nun mithilfe eines balancierten binären Suchbaums τ erfolgen. In den Blättern von τ werden alle Punkte von P gespeichert. In den inneren Knoten von τ sind die sogenannten Splittwerte gespeichert. Sie übernehmen im Suchbaum sozusagen die Rolle von Wegweisern. Der Splittwert eines inneren Knotens v wird mit xv bezeichnet. Charakteristisch für einen Suchbaum ist, dass alle Werte, die im linken Teilbaum von v gespeichert sind, kleiner als oder gleich xv sind. Analog sind alle Werte, die sich im rechten Teilbaum von v befinden, größer als xv . Zum Ermitteln der Punkte, die in dem Intervall [x : x0 ] liegen, wird in τ eine Suche nach x und x0 durchgeführt. Mit µ und µ0 werden die Blätter bezeichnet, bei denen jeweils die Suche nach x und x0 in τ endet. Man kann somit sagen, dass die Punkte, die in dem Intervall [x : x0 ] liegen, in den Blättern zwischen µ und µ0 gespeichert sind. Zusätzlich ist zu prüfen, ob auch die Werte von µ und µ0 in diesem Intervall liegen. Ein gutes Anschauungsbeispiel liefert die Abbildung 35 , in welcher die 1-dimensionale Bereichsanfrage in einem binären Suchbaum dargestellt ist. Es sollen in dem Beispiel alle Punkte ermittelt werden, die in dem Intervall [18 : 77] liegen. Mithilfe der Abbildung lässt sich schnell intuitiv die Lösung ermitteln. So liegen in der Ergebnismenge alle Punkte, die in den dunkelgrau markierten Blättern gespeichert sind, plus der Punkt, der in dem Blatt µ gespeichert ist. Wie lässt sich nun diese eher intuitive Vorgehensweise, die zwischen µ und µ0 liegenden Blätter, welche die gesuchten Punkte beinhalten, zu ermitteln, in einen Algorithmus fassen? Beim Betrachten des abgebildeten Suchbaums fällt auf, dass die gesuchten Blätter zu Teilbäumen gehören, die sich zwischen µ und µ0 befinden, und deren Wurzeln auf den Suchpfaden von x und x0 liegen. Um diese Blätter zu finden, ist es zunächst notwendig, den letzten gemeinsamen Knoten vsplit zu ermitteln, bei dem sich die Suchpfade von x und x0 voneinander trennen. Das Ermitteln von vsplit wird mittels der folgenden Prozedur FindeSplittknoten durchgeführt. Mit LK(v) und RK(v) werden jeweils das linke und rechte Kind eines Knotens v bezeichnet. 4 5 Der Begriff orthogonal kommt aus dem Griechischen, und bedeutet soviel wie rechtwinklig oder rechteckig (vgl. [2]). Die Abbildung ist entnommen aus [1]. Bereichsbäume 25 49 23 80 37 10 3 3 19 10 19 30 23 30 89 62 49 37 μ 70 59 59 62 70 89 80 100 100 105 μ' Abb. 3. Beispiel einer 1-dimensionalen Bereichssuche in einem binären balancierten Suchbaum FindeSplittknoten(τ, x, x0 ) Eingabe: Baum τ und die Werte x und x0 mit x ≤ x0 . Ausgabe: Knoten v, bei dem die Wege zu x und x0 starten, oder das Blatt, wo beide Wege enden. 1. v ← root(τ ) 2. while v ist kein Blatt and (x0 ≤ xv or x > xv ) 3. do if x0 ≤ xv 4. then v ← LK(v) 5. else v ← RK(v) 6. return v Die Eingabeparameter für die Prozedur sind τ, x und x0 . Beginnend bei der Wurzel des Baums τ , wird schrittweise jeder Knoten, der im Rahmen der Prozedur besucht wird, dahingehend geprüft, ob er ein Blatt ist, und ob sein Wert innerhalb des Intervalls [x : x0 ] liegt. Solange dies nicht eintrifft, wird für den Fall, dass der Wert des betrachteten Knotens größer als x0 - sozusagen die rechte Grenze des Intervalls - ist, das linke Kind des betrachteten Knotens v als nächstes untersucht. Für den anderen Fall, d.h. dass der Wert des aktuell betrachteten Knotens v kleiner als x - die linke Grenze des vorgegebenen Intervalls - ist, wird als nächstes das rechte Kind des Knotens v untersucht. Sobald es sich bei dem betrachteten Knoten v um ein Blatt handelt, oder der in ihm gespeicherte Wert in dem Intervall [x : x0 ] liegt, wird v als Splittknoten ausgegeben. Der somit ermittelte Splittknoten wird nun zum Ausgangspunkt für den Suchpfad von x. Bei jedem Knoten, der im Rahmen des Suchpfades besucht wird, wird überprüft, ob der Wert x im linken oder im rechten Teilbaum zu suchen ist. D.h. es wird ein Vergleich zwischen x und dem Wert, der in v gespeichert ist, durchgeführt. Führt der Suchpfad im linken Teilbaum weiter, so werden alle Blätter des rechten Teilbaums ausgegeben, da dieser 26 Jasmin Kovač-Engelmeier Teilbaum zwischen den Suchpfaden von x und x0 liegt. Analog wird der Suchpfad von x0 durchlaufen, jedoch mit dem Unterschied, dass, wenn der Suchpfad im rechten Teilbaum eines Knotens weiterverläuft, die Blätter des linken Teilbaums auszugeben sind. Wie bereits eingangs erwähnt, sind zusätzlich noch die beiden Blätter µ und µ0 darauf zu prüfen, ob die in ihnen gespeicherten Werte ebenfalls in dem Intervall [x : x0 ] liegen. Falls dies der Fall ist, sind auch sie entsprechend auszugeben. Es folgt nun noch der entsprechende Algorithmus, welcher wiederum die Prozedur BerichteTeilbaum enthält. Mittels dieser Prozedur werden die Werte ausgegeben, die in den Blättern der Teilbäume gespeichert sind, deren Wurzeln auf einem der beiden Suchpfade liegen. Aufgrund der Tatsache, dass die Anzahl der inneren Knoten eines binären Suchbaumes kleiner als die Anzahl seiner Blätter ist, ist die Zeit, die diese Prozedur benötigt, linear zur Anzahl der zu berichtenden Punkte. Algorithmus 1DBereichsanfrage(τ, [x : x0 ]) Eingabe: ein binärer Suchbaum τ und ein Intervall [x : x0 ] Ausgabe: alle Punkte, die in τ gespeichert sind und in dem Intervall [x : x0 ] liegen. 1. vsplit ← F indeSplittknoten(τ, x, x0 ) 2. if vsplit ist ein Blatt 3. then überprüfe, ob der Punkt, der in vsplit gespeichert ist, auszugeben ist. 4. else (*Folge dem Weg zu x und gib die Punkte der Teilbäume aus, die rechts vom Suchpfad liegen.*) 5. v ← LK(vsplit ) 6. while v ist kein Blatt 7. do if x ≤ xv 8. then BerichteTeilbaum(RK(v)) 9. v ← LK(v) 10. else v ← RK(v) 11. Überprüfe, ob der Punkt, der in dem Blatt v gespeichert ist, ausgegeben werden muss. 12. Folge analog dem Suchpfad von x0 . Gib alle Punkte der Teilbäume aus, die links von dem Suchpfad liegen, und überprüfe, ob der Punkt, der in dem Blatt gespeichert ist, wo der Suchpfad endet, ausgegeben werden muss. Der vorgestellte Algorithmus scheint soweit die gesuchte Ergebnismenge zu liefern. Jedoch ist seine Korrektheit noch im Folgenden formal zu zeigen. Lemma 1. Der Algorithmus 1DBereichsanfrage gibt genau die Punkte aus, die in dem angegebenen Intervall liegen. Der folgende Beweis erstreckt sich über zwei Teile. Zunächst ist zu zeigen, dass jeder Punkt p, der durch den Algorithmus ausgegeben wird, in dem angegebenen Intervall liegt. Falls p in einem der beiden Blätter gespeichert ist, wo jeweils die Suchpfade von x und x0 enden, dann wird explizit durch den Algorithmus überprüft, ob p in dem vorgegebenen Intervall liegt, und ob p dementsprechend auszugeben ist. Andernfalls wird p infolge des Aufrufs von BerichteTeilbaum ausgegeben. Angenommen dieser Aufruf findet während Bereichsbäume 27 des Durchlaufens des Suchpfades von x statt. So sei v ein Knoten auf diesem Suchpfad, so dass p infolge des Aufrufs von BerichteTeilbaum(RK(v)) ausgegeben wird. Da v und folglich auch RK(v) in dem linken Teilbaum von vsplit liegen, gilt p ≤ xvsplit . Aus der Tatsache, dass der Suchpfad von x0 rechts von xsplit abzweigt, folgt auch, dass p < x0 gilt. Des Weiteren steht fest, dass der Suchpfad von x links von v weiterverläuft. Da p im rechten Teilbaum von v liegt, impliziert dies, dass x < p gilt. Daraus lässt sich insgesamt schließen, dass p ∈ [x : x0 ]. Der Beweis, dass p auch in dem Intervall liegt, wenn der Suchpfad von x0 durchlaufen wird, erfolgt symmetrisch. In einem weiteren Schritt ist nun noch zu zeigen, dass auch tatsächlich alle Punkte vom Algorithmus ausgegeben werden, die in dem vorgegebenen Intervall liegen. Zu diesem Zweck wird angenommen, dass µ das Blatt ist, in welchem p gespeichert ist. Zusätzlich sei v der kleinste Vorfahr von µ, der im Rahmen des Algorithmus besucht wird. Es wird behauptet, dass v = µ ist. Dies impliziert, dass p ausgegeben wird. Zur Erzeugung eines Widerspruchs wird nun angenommen, dass v 6= µ ist. Geht man von dieser Annahme aus, dann kann v kein Knoten sein, der infolge eines Aufrufs der Prozedur BerichteTeilbaum besucht wird, da alle Nachfolger dieses Knotens besucht werden. Somit kann v nur auf dem Suchpfad von x, auf dem Suchpfad von x0 oder auf beiden liegen. Im Folgenden wird lediglich der letztgenannte Fall näher betrachtet, da sich alle drei Fälle ähnlich gestalten. Es wird angenommen, dass µ im linken Teilbaum von v angesiedelt ist. Der Suchpfad von x wird jedoch im rechten Teilbaum von v fortgesetzt. Andernfalls wäre v nicht der kleinste Vorfahr, der im Rahmen des Algorithmus besucht wird. Dies hat zur Folge, dass p < x ist. Für den analogen Fall, dass der Suchpfad von x0 im linken Teilbaum von v weiterverläuft, gilt p > x0 , da gemäss der getroffenen Annahmen µ im rechten Teilbaum von v liegt. In beiden Fällen führt die Behauptung, dass p in dem angegebenen Intervall liegt, zu einem Widerspruch. Folglich ist bewiesen, dass der betrachtete Algorithmus alle Punkte ausgibt, die in dem vorgegebenen Intervall liegen. Der Speicherplatz, der für einen balancierten binären Suchbaum benötigt wird, beträgt O(n). Des Weiteren wurde eingangs vorausgesetzt, dass der verwendete binäre Suchbaum balanciert ist. Und balancierte Suchbäume garantieren eine Höhe von O(log n) (siehe [3]). Infolgedessen kann der Baum in einer Zeit von O(n log n) erzeugt werden. Die Suchzeit beträgt im schlimmsten Fall Θ(n). Dies tritt ein, wenn sich alle Punkte des Baums in dem angefragten Intervall befinden. Um jedoch so eine Suchzeit zu erhalten, würde es auch ausreichen, einfach die Punkte mit dem Intervall zu vergleichen. Die zuvor beschriebene Datenstruktur müsste dann erst gar nicht verwendet werden. Diese Suchzeit lässt sich aber auch nicht vermeiden, wenn alle Punkte, die in dem Baum gespeichert sind, am Ende ausgegeben werden müssen, weil sie allesamt im Intervall liegen. Abgesehen vom schlimmsten Fall, lässt sich jedoch eine Verbesserung der Suchzeit erreichen, wenn nicht nur die reine Anzahl n der Punkte aus P berücksichtigt wird, sondern auch die Anzahl der auszugebenden Punkte. Letztgenannte wird im weiteren Verlauf mit k bezeichnet. Aus der Tatsache, dass die Zeit, die für einen Aufruf von BerichteTeilbaum benötigt wird, linear zur Anzahl der aus dem Teilbaum auszugebenden Punkte ist, folgt, dass der Zeitaufwand, der insgesamt für die Aufrufe von BerichteTeilbaum aufgebracht werden muss, O(k) beträgt. Alle restlichen Knoten, die noch in dem Baum τ besucht werden, liegen entweder auf dem Suchpfad von x oder auf dem von x0 . Diese Suchpfade haben die Länge O(log n), da - wie eingangs voraus- 28 Jasmin Kovač-Engelmeier gesetzt - der binäre Suchbaum τ balanciert ist. Dadurch wird eine Baumhöhe von O(log n) garantiert. Für jeden Knoten, der auf dem Suchpfad besucht wird, fällt ein Zeitaufwand von O(1) an. Demnach beträgt der Gesamtaufwand für diese Knoten O(log n). So erhält man einen gesamten Suchaufwand von O(log n + k). Das folgende Theorem fasst noch einmal die wichtigsten Ergebnisse aus diesem Abschnitt zusammen. Theorem 1. Sei P eine Menge von n Punkten in einem 1-dimensionalen Raum. Die Menge P kann in einem balancierten binären Suchbaum gespeichert werden. Dafür wird O(n) Speicherplatz und O(n log n) Konstruktionszeit benötigt. Die in einem angefragten Intervall liegenden Punkte können dann in O(k + log n) Zeit ausgegeben werden, wobei k für die Anzahl der auszugebenen Punkte steht. Eine 1-dimensionale Bereichsanfrage kann also mithilfe eines balancierten binären Suchbaums durchgeführt werden. Es stellt sich nun die Frage, ob dieses Wissen genutzt werden kann, um Bereichsanfragen in einem 2-dimensionalen Raum bewerkstelligen zu können. Dementsprechend beschäftigt sich das folgende Kapitel ausführlich mit Bereichsbäumen. Diese Datenstruktur unterstützt das Durchführen von 2-dimensionalen Bereichsanfragen. 4 Bereichsbäume Allgemein lassen sich Bereichsbäume als eine Datenstruktur beschreiben, mittels derer n Punkte einer Menge P gespeichert werden können, um anschließend auf ihnen orthogonale Bereichsanfragen durchführen zu können. Im Grunde wurden Bereichsbäume bereits im vorherigen Kapitel vorgestellt, denn ein balancierter binärer Suchbaum ist nichts anderes als ein 1-dimensionaler Bereichsbaum. Jedoch wie sieht dann der Aufbau eines Bereichsbaums für 2-dimensionale Bereichsanfragen aus? Bevor diese Frage beantwortet wird, gilt es einige Vorüberlegungen anzustellen. Zunächst wird angenommen, dass P eine Menge von n Punkten in einem 2-dimensionalen Raum ist. Die Position jedes Punktes dieser Menge wird durch zwei Werte bestimmt: die xund die y-Koordinate. Im Rahmen der 1-dimensionalen Bereichsanfrage wurden die Punkte ermittelt, die innerhalb eines vorgegebenen Intervalls [x : x0 ] lagen. Bei der 2-dimensionalen Bereichsanfrage sind wiederum die Punkte zu ermitteln, die in dem achsenparallelen Rechteck liegen, welches durch [x : x0 ] × [y : y 0 ] bestimmt wird. Im Grunde besteht die 2dimensionale Bereichsanfrage aus zwei 1-dimensionalen Bereichsanfragen. So erfolgt im ersten Schritt die Ermittlung der Punkte aus P , deren x-Koordinate jeweils in dem Intervall [x : x0 ] liegt. Es liegt somit eine 1-dimensionale Bereichsanfrage vor, die bereits aus dem vorherigen Kapitel bekannt ist. D.h. es wird zunächst der Splitknoten vsplit ermittelt, bei dem sich die Suchpfade von x und x0 trennen. Mit dem linken Kind von vsplit beginnend, wird der restliche Suchpfad von x durchlaufen. Bei jedem Knoten wird überprüft, wo der Suchpfad weiterverläuft. Falls der Suchpfad im linken Teilbaum eines Knotens fortgesetzt wird, werden alle Punkte, die im rechten Teilbaum von v gespeichert sind, ausgegeben. Der gleiche Vorgang wird für den restlichen Suchpfad von x0 wiederholt, wobei die Punkte des linken Teilbaum eines Knotens ausgegeben werden, falls der Suchpfad im rechten Teilbaum von v fortgesetzt wird. Die Blätter µ und µ0 - bei denen die Suchpfade von x und x0 jeweils enden - werden explizit dahingehend geprüft, ob die in ihnen gespeicherten Punkte in dem Bereichsbäume 29 vorgegebenen Intervall liegen. Infolgedessen werden O(log n) Teilbäume ausgewählt, die genau die Punkte aus P enthalten, deren x-Koordinate in dem x-Intervall des Anfragebereichs liegt. In diesem Zusammenhang soll der Begriff der kanonischen Teilmenge eingeführt werden. Die kanonische Teilmenge eines Knotens v, welche wiederum mit P (v) bezeichnet wird, ist die Teilmenge der Punkte, die in den Blättern eines Teilbaums gespeichert sind. Die Wurzel dieses Teilbaums ist der Knoten v. So ist zum Beispiel die kanonische Teilmenge der Wurzel eines Baums die gesamte Punktmenge P . Wiederum die kanonische Teilmenge eines Blattes ist einfach der Punkt, der in dem Blatt gespeichert ist. Infolgedessen kann die Teilmenge der Punkte aus P , deren x-Koordinate in dem angefragten Bereich liegt, als eine disjunkte Vereinigung von O(log n) kanonischen Teilmengen P (v) der Knoten v - d.h. den Wurzeln der ausgewählten Teilbäume - bezeichnet werden. Genaugenommen sind von dieser Teilmenge von P auch nur die Punkte von Interesse, deren y-Koordinate gleichzeitig in dem Intervall [y : y 0 ] liegt. Wie bereits angedeutet, handelt es sich dabei um die zweite 1-dimensionale Bereichsanfrage. Diese kann ebenfalls mithilfe eines binären Suchbaums durchgeführt werden, der auf den y-Koordinaten der Punkte aus P beruht. Es gilt nun diese beiden 1-dimensionalen Bereichsanfragen zu vereinen. Es ergibt sich daraus die folgende Datenstruktur. Der Hauptbaum ist ein balancierter binärer Suchbaum τ , der die x-Koordinaten der Punkte aus P beinhaltet. Für jeden inneren Knoten und jedes Blatt v von τ werden die kanonischen Teilmengen P (v) in einem weiteren balancierten binären Suchbaum τverbund (v) gespeichert. Dieser beinhaltet wiederum die y-Koordinaten der Punkte aus P . Von einem Knoten v führt ein Zeiger zur Wurzel des Baums τverbund (v), welcher als verbundene Struktur von v bezeichnet wird (siehe Abbildung 46 ). Die soeben grob beschriebene Datenstruktur wird Bereichsbaum genannt. Generell heißen solche Datenstrukturen, bei denen Zeiger von den Knoten zu den verbundenen Strukturen führen, auch Multi-Level -Datenstrukturen. Der Hauptbaum τ wird dann als FirstLevel -Baum bezeichnet, und die verbundenen Strukturen als Second-Level -Bäume. So stellt sich nun die Frage, wie ein solcher Bereichsbaum konstruiert wird. Es sei eine Punktmenge P := {p1 , . . . , pn } gegeben, die nach der x-Koordinate sortiert ist. Der folgende rekursive Algorithmus Erzeuge2DBereichsbaum liefert dann die Wurzel eines 2-dimensionalen Bereichsbaums. Bezüglich der vorgegebenen Punktmenge wird an dieser Stelle vereinfachend angenommen, dass es keine zwei Punkte gibt, welche die gleichen Koordinaten haben. Es ist zu betonen, dass in den Blättern der verbundenen Struktur nicht lediglich die y-Koordinaten der Punkte gespeichert werden, sondern es werden die Punkte selbst in den Blättern gespeichert. Das bedeutet, dass beim Durchsuchen der verbundenen Struktur am Ende auch tatsächlich die Punkte ausgegeben werden. Es gilt nun den Speicherplatz, den diese Datenstruktur benötigt, zu ermitteln. Lemma 2. Ein Bereichsbaum, der n Punkte im Rahmen einer 2-dimensionalen Bereichsanfrage enthält, benötigt O(n log n) Speicherplatz. 6 Die Abbildung ist entnommen aus [1]. 30 Jasmin Kovač-Engelmeier τ τverbund(v) P(v) P(v) Abb. 4. Der Aufbau eines 2-dimensionalen Bereichsbaumes Algorithmus Erzeuge2DBereichsbaum(P ) Eingabe: eine Punktmenge P in der 2-dimensionalen Ebene Ausgabe: die Wurzel eines 2-dimensionalen Bereichsbaums 1. Konstruiere die verbundene Struktur: erzeuge einen binären Suchbaum τverbund mit der Punktmenge Py , die sich aus den y-Koordinaten der Punkte aus P ergibt. Speichere in den Blättern des Baums τverbund nicht einfach nur die jeweiligen y-Koordinaten, sondern die Punkte selbst. 2. if P aus nur einem Punkt besteht 3. then erzeuge ein Blatt v, das diesen Punkt speichert, und mache τverbund zur verbundenen Struktur von v 4. else teile P in zwei Teilmengen auf: die Teilmenge Plinks enthält die Punkte, deren x-Koordinate kleiner gleich xmitte - der mittleren x-Koordinate - ist, und die Teilmenge Prechts enthält die Punkte aus P , deren x-Koordinate größer als xmitte ist. 5. vlinks ← Erzeuge2DBereichsbaum(Plinks ) 6. vrechts ← Erzeuge2DBereichsbaum(Prechts ) 7. Erzeuge einen Knoten v, der xmitte speichert, mache vlinks zum linken Kind von v, vrechts zum rechten Kind von v und τverbund zur verbundenen Struktur von v. 8. return v Bereichsbäume 31 Der Beweis dieses Satzes sieht folgendermaßen aus. Ein Punkt p aus der Menge P wird ausschließlich in der verbundenen Struktur der Knoten in τ gespeichert, die auf dem Weg zu dem Blatt liegen, welches letztendlich p enthält. Somit lässt sich sagen, dass für alle Knoten einer bestimmten Tiefe in τ gilt, dass p in genau einer verbundenen Struktur gespeichert ist. Aus der Tatsache, dass 1-dimensionale Bereichsbäume linearen Speicherplatz benötigen, lässt sich schliessen, dass für die verbundenen Strukturen aller Knoten von τ zusammen O(n) Speicherplatz benötigt wird. Wie bereits gezeigt, ist die Tiefe von τ O(log n). Demnach beträgt der Gesamtspeicherplatz, der benötigt wird, O(n log n). Der vorgestellte Algorithmus Erzeuge2DBereichsbaum(P ) erreicht nicht unbedingt die optimale Zeit von O(n log n), um einen Bereichsbaum zu erzeugen. Es wird nun aber angenommen, dass eine unsortierte Menge von n Schlüsseln vorliegt. Um für diese Menge nun einen binären Suchbaum zu erzeugen, wird eine Konstruktionszeit von O(n log n) benötigt. Dies bedeutet, dass für das Erzeugen einer verbundenen Struktur - so wie es in der Zeile 1 des genannten Algorithmus der Fall ist - ein Zeitbedarf von O(n log n) anfällt. Dies kann jedoch verbessert werden, indem die Punkte von Py bezüglich der y-Koordinate vorsortiert werden. Die Folge ist, dass der binäre Suchbaum von unten nach oben in linearer Zeit aufgebaut werden kann. Aufgrunddessen wird für den Konstruktionsalgorithmus die Punktmenge in zwei Listen verwaltet: d.h. in einer Liste werden die Punkte nach der xKoordinate sortiert, und in der anderen nach der y-Koordinate. Demzufolge ist die Zeit, die für einen Knoten im Hauptbaum τ benötigt wird, linear zur Größe seiner kanonischen Teilmengen. Dies führt wiederum zu dem Schluß, dass die Gesamtkonstruktionszeit der Menge des benötigten Speichplatzes entspricht: O(n log n). Die Tatsache, dass das Vorsortieren in einer Zeit O(n log n) realisiert werden kann, führt ebenfalls zur Gesamtkonstruktionszeit von O(n log n). Im Laufe des folgenden Algorithmus werden zunächst die O(log n) kanonischen Teilmengen ausgewählt, die zusammen die Punkte enthalten, deren x-Koordinate in dem Intervall [x : x0 ] liegt. Dies wird mithilfe des 1-dimensionalen Anfragealgorithmus durchgeführt. Von diesen Teilmengen ausgehend, werden anschließend die Punkte ausgegeben, deren yKoordinate in dem Intervall [y : y 0 ] liegt. D.h. es wird der 1-dimensionale Anfragealgorithmus auf die verbundenen Strukturen angewendet, welche die jeweiligen kanonischen Teilmengen enthalten. Im Prinzip kann man sagen, dass der Algorithmus 2DBereichsanfrage dem 1-dimensionalen Anfragealgorithmus 1DBereichsanfrage gleicht. Die beiden Algorithmen unterscheiden sich dadurch, dass bei der 2-dimensionalen Bereichsanfrage nicht BerichteTeilbaum aufgerufen wird, sondern 1DBereichsanfrage. Es stellt sich erneut die Frage nach der Laufzeit des Algorithmus. Lemma 3. Für eine orthogonale Anfrage in einem Bereichsbaum, der n Punkte beinhaltet, wird O(log2 n+k) Zeit benötigt. In diesem Kontext steht k für die Anzahl der auszugebenden Punkte. Lässt sich diese Aussage auch beweisen? Bei jedem Knoten im Hauptbaum τ wird für die Entscheidung, wo der Suchpfad nun weiterverläuft, eine konstante Zeit benötigt. Möglicherweise ist es notwendig, in diesem Rahmen den Algorithmus 1DBereichsanfrage auszu- 32 Jasmin Kovač-Engelmeier Algorithmus 2DBereichsanfrage(τ, [x : x0 ], [y : y 0 ]) Eingabe: ein 2-dimensionaler Bereichsbaum τ und ein Bereich [x : x0 ]x[y : y 0 ]. Ausgabe: alle Punkte von τ , die in dem Bereich liegen. 1. vsplit ← F indeSplitknoten(τ, x, x0 ) 2. if vsplit ist ein Blatt 3. then Überprüfe, ob der Punkt, der in vsplit gespeichert ist, ausgegeben werden muss. 4. else (*Folge dem Weg zu x und rufe 1DBereichsanfrage für die Teilbäume auf, die rechts von dem Weg liegen.*) 5. v ← LK(vsplit ) 6. while v ist kein Blatt 7. do if x ≤ xv 8. then 1DBereichsanfrage(τverbund (RK(v)), [y : y 0 ]) 9. v ← LK(v) 10. else v ← RK(v) 11. Überprüfe, ob der Punkte, der in v gespeichert ist, ausgegeben werden muss. 12. Analog folge dem Weg von RK(vsplit ) bis x0 , rufe 1DBereichsanfrage mit dem Intervall für die Teilbäume auf, die links des Weges liegen, auf und überprüfe, ob der Punkt, der in dem Blatt am Ende des Pfades gespeichert ist, ausgegeben werden muss. führen. Infolge des Theorems 1 ist bekannt, dass für diesen rekursiven Aufruf O(log n + kv ) Zeit benötigt wird, wobei kv für die Anzahl der Punkte steht, die im Rahmen dieses Aufrufs P ausgegeben werden. Dies führt zur Gesamtzeit O(log n + kv ). Diese Summe reicht über v P alle Knoten, die innerhalb des Hauptbaums τ besucht werden. Die Summe kv ist gleich v k - der Gesamtanzahl aller Knoten, die ausgegeben werden. Und wie bereis zuvor erwähnt, weisen die Suchpfade von xPund x0 in dem Hauptbaum τ jeweils die Länge O(log n) auf. P Daraus folgt O(logn) = O(log 2 n) und wiederum Lemma 3. v v Das folgende Theorem fasst noch einmal die Ergebnisse dieses Kapitels zusammen. Theorem 2. Sei P die Menge von n Punkten in einer Ebene. Dann benötigt ein Bereichsbaum für P O(n log n) Speicherplatz und eine Konstruktionszeit von O(n log n). Eine orthogonale Anfrage bezüglich einer bestimmten Teilmenge von P kann dann in O(log2 n + k) Zeit beantwortet werden, wobei mit k die Anzahl der auszugebenden Punkte bezeichnet wird. Von der Konstruktion 2-dimensionaler Bereichsbäume ausgehend, soll im folgenden Kapitel eine allgemeine Vorgehensweise für den Aufbau von mehrdimensionalen Bereichsbäumen vorgestellt werden. 5 Mehrdimensionale Bereichsbäume Im Rahmen mehrdimensionaler Bereichsbäume sei P die Menge von Punkten in einem ddimensionalen Raum. Im ersten Schritt wird ein balancierter binärer Suchbaum konstruiert, der von den Punkten jeweils die erste Koordinate enthält. In diesem First level -Baum - dem Hauptbaum - enthält die kanonische Teilmenge P (v) eines Knotens v die Punkte, die in Bereichsbäume 33 den Blättern des Teilbaums von v gespeichert sind. Für jeden Knoten v wird eine verbundene Struktur τverbund (v) konstruiert. Dieser Second Level -Baum τverbund (v) ist folglich ein (d − 1)-dimensionaler Suchbaum für die Punkte in P (v). Diese Punkte bestehen dann also aus den (d − 1)-letzten Koordinaten. Auf die gleiche Weise - wie zuvor beschrieben - wird dieser (d − 1)-dimensionale Suchbaum rekursiv konstruiert. D.h. es wird ein balancierter binärer Suchbaum auf Basis der ursprünglich zweiten Koordinate der Punkte gebildet. Jeder Knoten verweist mit einem Zeiger auf einen (d − 2)-dimensionalen Bereichsbaum, welcher die auf die (d − 2)-letzten Koordinaten beruhenden Punkte aus dem Teilbaum des jeweiligen Knotens beinhaltet. Die Rekursion endet, wenn nur noch die Punkte übrig bleiben, die ausschließlich die letzte Koordinate repräsentieren. Diese Punkte werden dann in einem balancierten binären Suchbaum gespeichert (vgl. Abbildung 57 ). Abb. 5. Der Aufbau eines mehrdimensionalen Bereichsbaumes Diese Vorgehensweise ähnelt der, die bereits für den 2-dimensionalen Fall vorgestellt worden ist. D.h. der First Level -Baum dient dazu, O(log n) Knoten zu ermitteln, deren kanonische Teilmengen zusammen die Punkte beinhalten, deren erste Koordinate jeweils in dem vorgegebenen Bereich liegt. Diese kanonischen Teilmengen werden erneut betrachtet, wenn eine Bereichsanfrage auf den entsprechenden Second Level -Strukturen durchgeführt wird. In jeder Second Level -Struktur werden nun O(log n) kanonische Teilmengen ausgewählt. Daraus folgt, dass es insgesamt O(log2 n) solcher Teilmengen in den Second Level -Strukturen gibt. Sie beinhalten demnach alle Punkte, deren erste und zweite Koordinate in dem definierten Bereich liegen. Im darauffolgenden Schritt werden die Third Level -Strukturen betrachtet, welche die kanonischen Teilmengen beinhalten, bei denen die dritte Koordinate in dem vorgegebenen Bereich liegt. Diese Vorgehensweise wird so lange rekursiv wiederholt, bis 7 Die Abbildung ist entnommen aus [1]. 34 Jasmin Kovač-Engelmeier die 1-dimensionalen Bäume erreicht werden, in welchen die Punkte gespeichert sind, deren letzte Koordinate in dem definierten Bereich liegt. Diese Punkte werden dann schließlich als Ergebnismenge ausgegeben. Soweit es den benötigten Speicherplatz und das Laufzeitverhalten betrifft, so kann Folgendes festgehalten werden. Theorem 3. Sei P eine Menge von n Punkten in einem d-dimensionalen Raum, wobei d ≥ 2 gilt. Ein Bereichsbaum benötigt dann für P O(n log(d−1) n) Speicherplatz und O(n log(d−1) n) Konstruktionszeit. Somit können die Punkte aus P , die in einem orthogonalen Anfragebereich liegen, in O(logd n + k) Zeit ausgegeben werden. So bezeichnet k die Anzahl der auszugebenden Punkte. Für den Beweis dieser Aussagen wird angenommen, dass Td (n) für die Zeit steht, die für das Konstruieren eines Suchbaums auf Basis einer Menge von n Punkten in einem d-dimensionalen Raum benötigt wird. Laut Theorem 2 gilt T2 (n) = O(n log n). Das Konstruieren eines d-dimensionalen Bereichsbaums basiert letztendlich auf dem Erzeugen eines balancierten binären Suchbaums, wofür O(n log n) Zeit benötigt wird, und das Bilden der verbundenen Strukturen. In dem First Level -Baum wird jeder Punkt in genau einer verbundenen Struktur gespeichert. Um alle verbundenen Strukuren zu erzeugen, wird O(Td−1 (n)) Zeit benötigt. Folglich ergibt sich die Gesamtkonstruktionszeit Td (n) = O(n log n) + O(log n) · Td−1 (n). Wie bereits gezeigt, gilt T2 (n) = O(n log n). Somit lässt sich die Rekursionsgleichung lösen und man erhält O(n logd−1 n). Die Ermittlung des Speicherbedarfs erfolgt analog. Es stellt sich nun die Frage nach der Zeit - im weiteren Verlauf mit Qd (n) bezeichnet -, die benötigt wird, um in einem d-dimensionalen Bereichsbaum eine Anfrage auf n Punkten durchzuführen. Zum einen ist es notwendig, eine Suche in dem First Level -Baum auszuführen, wofür ein Zeitbedarf von O(log n) anfällt. Des Weiteren ist eine logarithmische Anzahl von (d − 1)-dimensionalen Bereichsbäumen zu durchsuchen. Somit folgt Qd (n) = O(log n) + O(log n) · Qd−1 (n). Wie bereits gezeigt, gilt Q2 (n) = O(log2 n). Folglich lässt sich auch diese Rekursionsgleichung lösen und man erhält Qd (n) = O(logd n). An dieser Stelle fehlt nur noch die Zeit, die benötigt wird, um die ermittelten Punkte auszugeben. Diese ist auf O(k) beschränkt. 6 Fazit Es wurde gezeigt, dass ein 1-dimensionaler Bereichsbaum im Grunde ein gewöhnlicher binärer balancierter Suchbaum ist, der wiederum O(n) Speicherplatz und O(n log n) Konstruktionszeit für das Speichern von n Punkten einer Punktmenge benötigt. Im „Worst case“ beträgt die Suchzeit Θ(n). Dieser Fall tritt ein, wenn alle Punkte in dem vorgegebenen Intervall liegen. Generell lässt sich aber die Suchzeit verbessern, indem man die tatsächlich auszugebene Punktmenge k in Betracht zieht. Dann erhält man eine Suchzeit von O(k + log n). Bereichsbäume 35 Soweit es 2-dimensionale Bereichsbäume betrifft, so wurde im Verlauf der Ausführungen festgestellt, dass für diese O(n log n) Speicherplatz und eine Konstruktionszeit von O(n log n) benötigt wird. Bei der Ermittlung der Suchzeit wurde auch in diesem Fall die tatsächlich auszugebene Punktmenge k berücksichtigt, so dass sich eine orthogonale Bereichsanfrage dann in einer Zeit von O(log2 n + k) beantworten lässt. Auf diesen Fall aufbauend, wurde zuletzt noch die Arbeitsweise von mehrdimensionalen Bereichsbäumen skizziert, welche eine Konstruktionszeit von O(n logd−1 n) und O(n logd−1 n) Speicherplatz benötigen. Eine orthogonale Bereichsanfrage kann dann in O(logd n + k) beantwortet werden. Diese Suchzeit in einem mehrdimensionalen Bereichsbaum kann noch mithilfe von Fractional Cascading auf O(logd−1 n + k) reduziert werden, indem der jeweils höchstdimensionale assoziierte Baum als Array gespeichert wird. Literaturverzeichnis 1. Mark de Berg and Mark van Kreveld and Mark Overmars and Otfried Schwarzkopf (1997) Computational Geometry: Algorithms and Applications. Springer-Verlag, Berlin Heidelberg, Seite 95-116 2. Der Brockhaus in einem Band (2000). 9. Auflage. Brockhaus, Mannheim, Seite 667 3. Thomas H. Cormen and Charles E. Leiserson and Ronald L. Rivest and Clifford Stein (2001) Introduction to Algorithms. 2. Auflage. MIT Press, Cambridge, Massachusetts u.a., Seite 265-268 4. Rolf Klein (2005) Algorithmische Geometrie, 2. Auflage. Springer-Verlag, Berlin Heidelberg, Seite 107110, 135-140 „A Simple Linear Time (1+ε)-Approximation Algorithm for k-Means Clustering in Any Dimensions“ für k = 2 Holger Bürger Universität Paderborn Zusammenfassung. Diese Arbeit befasst sich mit dem Thema Clustering mit maximal 2 Schwerpunkten. Zu Grunde liegt das Paper „A Simple Linear Time (1+ε)-Approximation Algorithm for k-Means Clustering in Any Dimensions“ [14] 1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 1.1 Verwandte Themen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 1.2 Die Leistung von Kumar und anderen[14] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 2 Hauptteil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 2.1 Eigenschaften des 1-means Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.2 Ein Linearzeit-Algorithmus für das 2-means Clustering . . . . . . . . . . . . . . . . . . . . . . . 43 3 Schluß . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 1 Einleitung Im Rahmen meines Proseminars „Perlen der Theoretischen Informatik“ beschäftige ich mich laut Seminarbeschreibung mit der Schönheit von Problemlösungen aus dem Bereich der Theoretischen Informatik, mit raffinierten Beweistechniken, eleganten Argumenten und überraschenden Konstruktionen auf höchst vergnügliche Art und Weise und im Speziellen mit dem Thema Clustering. Dieses ist im Folgenden verschriftlicht. Laut Paper[14] ist das Problem des Clustering einer Gruppe von gleichen Datenobjekten eines der am meisten studierten in der Informatik. Clustering findet eine breite Anwendung, zum Beispiel bei „data mining“, Informationsbeschaffung, Bildverarbeitung, Internetsuche[5, 8, 10]. Clustering kommt original aus dem Englischen und ist mittlerweile ein deutsches Wort. Das Synonym „Gruppenbildung“ läßt mehr auf die Bedeutung schließen. So wird beim „data mining“ unter anderem versucht Gruppen in einem Datenbestand zu bilden, um Daten in sinnvolle Teilmengen aufzuspalten. Sinnvoll kann hier bedeuten, Kommunikationswege (beim Datenzugriff) zu verkürzen. Ein Beispiel in der Bildbearbeitung könnte die Vektorisierung eines Pixelbildes sein, dabei muss man unter anderem naheliegende Punkte zusammenfassen. Es wurde ausgesagt, dass bei dieser Vielfalt von Anwendungsformen es unterschiedliche Definitionen[9, 4] gibt. Die Meisten von diesen sollen mit der Definition eines Abstandes 38 Holger Bürger zwischen zwei Punkten beginnen und dann Cluster formen mit der Eigenschaft, dass zwei nahe gelegene Punkte zu einem Cluster zugeordnet werden. Eine weitere Aussage ist, dass meistens ein Zusammenhang zwischen Clustering und geometrischen Sachverhalten existiert, so dass Datenobjekte als Punkte in einem mehrdimensionalen Raum angesehen werden können. Unter diesen Rahmenbedingungen soll es nahe liegen, die Distanz zwischen diesen Punkten als euklidischen Abstand anzusehen. Als eine der meistgebrauchten Definitionen des Clustering wird das k-means Clustering Problem angesehen. Bei einer gegebenen Menge von Punkten P wird versucht eine Menge K zu finden, bei der k Schwerpunkte so zugeordnet werden, dass X d(p, K)2 (1) p∈P minimiert ist. Die Punkte in K können gewöhnliche Punkte im euklidischen Raum sein und mit d(p, K) ist der Abstand zwischen p und seinem am nächsten gelegenen Schwerpunkt gemeint. Die Punkte, welche dem gleichen Schwerpunkt zugeordnet werden, bilden einen Cluster. Das k-means Problem ist NP-hart, auch für k = 2. Des Weiteren soll es noch als gebräuchliche Defintion des Clusterings das k-median Problem geben. Dieses sei auf die gleiche Art und Weise definiert, außer dass folgende Formel zugrunde liegt. X d(p, K) p∈P Zur Erinnerung: Ein Median war der Wert in der Mitte einer Stichprobe („in der Mitte liegend“). Man beachte jedoch, dass hier nicht durch die Anzahl der Elemente geteilt wird. Der Unterschied der Formeln ist ungefähr der gleiche wie zwischen arithmetischem Mittel (Durchschnitt) und Varianz. Vorteil der Quadrierung von Elementen ist die stärkere Sichtbarkeit von Abweichungen. Zumindest ist es ebenfalls das Ziel die maximale Distanz zu minimieren(siehe [1, 2, 3, 11, 13] und beinhaltete Referenzen). Es ist jedoch zu beachten, dass die Distanzberechnung zwischen Punkten, welche hierbei gebraucht wird keine Metrik ist. Somit sei das Lösen des k-means Problems nicht schwerer als das des k-median Problems. Dies wird in dem Paper[14] bewiesen. Zur Erinnerung: Laut Taschenbuch der Mathematik [6],von Bronstein und anderen, ist eine Metrik eine mathematische Funktion, die je zwei Elementen eines Raums einen nicht negativen reellen Wert zuordnet, der als Abstand der beiden Elemente voneinander aufgefasst werden kann. Sei X eine beliebige Menge. Eine Abbildung d : X × X → R heißt Metrik, wenn für beliebige Elemente x, y und z von X die folgenden axiomatischen Bedingungen erfüllt sind: 1. 2. 3. 4. d (x, x) = 0 (identische Punkte haben Abstand 0), d (x, y) = 0 ⇒ x = y(nichtidentische Punkte haben nicht Abstand 0), d (x, y) = d(y, x) (Symmetrie), d (x, y) ≤ d(x, z) + d(z, y) (Dreiecksungleichung). (1+ε)-Approximation Algorithm for 2-Means Clustering 39 Die Dreiecksungleichung (4) besagt, dass der Abstand entlang dem direkten Weg, also entlang der kürzesten Verbindung zwischen zwei Punkten gemessen wird. Ein Umweg über einen dritten Punkt kann nicht kürzer als der direkte Weg sein. Dies gilt hier nicht. Die Aussagen des Papers [14] sind weiterhin, dass eine Menge Forschung betrieben wurde, um das k-means Problem exakt zu lösen(siehe [12] und enthaltene Referenzen). Jedoch selbst die besten Algorithmen brauchen Ω(nd ) Zeit. Bei der Suche nach konstanten (1+ε) Approximationsalgorithmen wurden neulich auch Fehler gemacht, indem „mapping subjective features“ von Punkten im euklidischen Raum benutzt wurden, wobei ε eine gewöhnliche kleine Konstante sein kann. Dies führte zu Algorithmen mit einer stark verbesserten Laufzeit, doch das „mapping“ bzw. Abbilden war fehlerhaft. In diesem Paper [14] wurde der erste echte Linearzeit (1+ε)-Approximationsalgorithmus für das k-means Clustering vorgestellt, wobei diese Proseminar-Arbeit nur Sachverhalte bis zum 2-means Clustering beschreibt und ε und k als Konstante betrachtet werden. Weiteres ist in der Seminararbeit von Markus Heberling zu finden, welcher sich weitergehend mit dem k-means Clustering beschäftigt. Es folgt die Beschäftigung mit bzw. Darstellung von den zugrundeliegenden Sachverhalten, welche sukzessive zum Beweis des „... Simple Linear Time (1+ε)-Approximation Algorithm for k-Means Clustering in Any Dimensions“ für k = 2 führt. 1.1 Verwandte Themen Kumar und andere [14] stellten fest, dass der schnellste exakte Algorithmus für das kmeans clustering Problem von Inaba und anderen[12] eingebracht wurde. Diese berücksichtigten, dass die Anzahl der Voronoi Partitionen von k Punkten in Rd O(nkd ) ist und so das optimale k-means clustering exakt in O(nkd+1 ) Zeit berechnet werden könnte. Inaba und andere haben ebenfalls einen randomisierten (1+ε)-Approximationsalgorithmus für das 2-means clustering Problem mit Laufzeit von O(n/εd ) entwickelt. Matousek[15] soll einen deterministischen (1+ε)-Approximationsalgorithmus für das k-means Problem 2 in Laufzeit von O(nε−2k d log k n) entwickelt haben, Bâdoiu und andere [3] einen (1+ε)O(1) Approximationsalgorithmus für das k-median Problem mit Laufzeit O(2(k/ε) dO(1) nlog O(k) n). Letzterer soll erweitert werden können zu einem (1+ε)-Approximationsalgorithmus für das k-means Problem mit gleicher Laufzeit. W. F. de la Vega und andere [7] sollen einen (1+ε)Approximationsalgorithmus für das k-means Problem erarbeitet haben, welcher gut auf Punkte im hoch dimensionalen Raum anzuwenden sei. Die Laufzeit sei O(g(k, ε)nlog k n) wobei g(k, ε) = exp[(k 3 /ε8 )(ln(k/ε)lnk)] sein soll. Ebenfalls sollen kürzlich Har-Peled und andere[11] einen (1+ε)-Approximationsalgorithmus für das k-means Problem veröffentlich haben, mit einer Laufzeit von O(n + k k+2 ε−(2d+1)k log k+1 nlog k 1ε ). Dieser sei jedoch ziemlich kompliziert und soll sich auf Ergebnisse der algorithmischen Geometrie stützen. Das Wort „exponentiell„ wurde dabei mit der Zahl der Dimension in Verbindung gebracht, so dass dies nur für geringere Dimensionen anwendbar sei. 1.2 Die Leistung von Kumar und anderen[14] Ein (1+ε)-Approximationsalgorithmus für das k-means Problem wird präsentiert. k und ε werden als Konstanten betrachtet. Die Laufzeit soll besser im Vergleich zu allen vorher bekannten Algorithmen für dieses Problem sein. Der Algorithmus von Har-Peled und Mazumdar[11] sei, trotz linear in n, nicht linear bezogen auf die Eingabegröße des Problems, 40 Holger Bürger es sei dn (für n Punkte und d Dimensionen). Der Algorithmus ist daher nur für kleinere Dimensionen besser geeignet und zwar für d = Ω(logn). Der hier vorgestellte Algorithmus sei viel schneller. Selbst die Verwendung des Johnson-Lindenstraus Lemmas mache die Laufzeit nicht vergleichbar, da es seinen eigenen Overhead haben soll. Viele der neueren Algorithmen verwenden Techniken, wie “exponential grid„ oder “scaling„ , welche ihren eigenen Overhead haben sollen. Beispielsweise Normalisierung in Verbindung mit minimaler Distanz zwischen Punkten verursache extra Kosten in Höhe von Ω(n) pro Punkt, abhängig von dem verwendeten Rechenmodell. In [3] sollen die Autoren Techniken für das Runden verwendet haben, basierend auf Approximation für den optimalen Wert des k-Schwerpunktes ohne die Kosten für diesen Prozess zu berücksichtigen. Die in dem jetzigen Algorithmus eingebettete Technik habe keinen solchen Overhead. Das 2-means clustering Problem hat auch schon in der Vergangenheit Forschungsinteresse geweckt. Der Algorithmus von Amit Kumar und anderen [14] stellt einen (1+ε)Approximationsalgorithmus für das 2-means clustering Problem mit konstanter WahrscheinO(1) lichkeit in O(2(1/ε) dn) dar. Dies sei, laut Kumar und anderen, der erste (im Exponenten) dimensionsunabhängige Algorithmus für das Problem, welcher in linearer Zeit zur Eingabegröße abläuft. Die Basisidee des Algorithmus sei sehr einfach. Begonnen wird, wie bei Inaba und anderen [12], mit der Betrachtung einer Menge von Punkten, wobei ihr Schwerpunkt durch Stichproben der Größe O(k) sehr gut approximiert werden kann. Es werden alle Teilmengen mit dieser konstanten Größe ausprobiert und deren Schwerpunkte bestimmt. Das bedeutet, dass man eine konstante Anzahl von Punkten dem größten Cluster zuordnet, bevor man kleineren Clustern Punkte zuordnet - dies sei die Vorgehensweise. Das heisst wiederum, dass der Algorithmus einen hohen konstanten Rechenaufwand produziert, aber im Sinne des O-Kalküls immernoch “simpel„ wirkt. Der Algorithmus des Papers soll, in Anlehnung an dem von Bâdoiu und anderen [3], sehr einfach wirken. Beide beginnen mit der Zufallsauswahl von Punkten, jedoch muss der Algorithmus von Bâdoiu und anderen die Größe des kleineren Clusters raten und den Abstand zwischen diesen. Dies verursacht einen Faktor für die Laufzeit von O(log k n). Der Algorithmus von Kumar und anderen [14] vermeidet dies komplett - dies macht ihn so wesentlich einfacher. 2 Hauptteil Von Kumar und anderen wird definiert, dass P eine Menge von n Punkten im euklidischen Raum Rd sei. Weiterhin sei eine Menge von k Punkten K gegeben, welche als Schwerpunkte bezeichnet werden. Definiert werden die k-means Kosten von P in Beziehung zu K, ∆(P, K), als ∆(P, K) = X d(p, K)2 , p∈P wobei d(p, K) die Distanz zwischen p und dem nächsten Punkt zu p in K beschreibt. Das k-means Problem versucht eine Menge K von Größe k zu finden, so dass ∆(P, K) minimiert ist. Sei ∆k (P ) die Bezeichnung für die Kosten der optimalen Lösung für das kmeans Problem in Beziehung zu P . Sollte K eine einelementige Menge sein y, wird ∆(P, K) durch ∆(P, y) ersetzt. Sollte P eine einelementige Menge sein, geschieht dies analog. (1+ε)-Approximation Algorithm for 2-Means Clustering 41 Definition 1. Wenn ∆k−1 (P ) ≥ (1 + 32ε)∆k (P ), ist die Menge von Punkten P (k, ε)irreduzibel, sonst ist sie (k, ε)-reduzibel. Reduzierbarkeit impliziert hauptsächlich, dass nicht die optimale k-means Lösung gesucht wird, sondern die (k − 1)-means Lösung. Dies soll nahe an der vorherigen Lösung liegen. Nun werden die Eigenschaften des 1-means Problems betrachtet. 2.1 Eigenschaften des 1-means Problems P Definition 2. Für eine Menge von Punkten P wird der Schwerpunkt c(P ) von P als definiert. p∈P p |P | Für jeden Punkt in x ∈ Rd gilt: ∆(P, x) = ∆(P, c(P )) + |P | · ∆(c(P ), x). (2) D.h. Abstand zwischen einer Menge P und einem Punkt x ist definiert als die Summe vom Abstand der Menge P zu seinem Schwerpunkt c(P ) und dem Produkt aus der Anzahl der Elemente von P und dem Abstand zwischen x und dem Schwerpunkt c(P ) von P . Im Paper wird nun Folgendes festgestellt: Ein Fakt ist, dass jede optimale Lösung für das 1-means Problem unter Einbeziehung der Menge von Punkten P als Eingabe, c(P ) als Schwerpunkt wählt. Es soll eine weitere wichtige Eigenschaft für jede optimale Lösung des k-means Problems gefolgert werden können. Angenommen eine optimale Lösung des k-means Problems unter Einbeziehung der Eingabe P sei gegeben. Sei K = {x1 , . . . , xk } eine Menge von Schwerpunkten, welche durch diese Lösung konstruiert wurde. K verursacht eine Partitionierung der Menge von Punkten P in k Cluster, nämlich P1 , . . . , Pk . Pi ist die Menge von Punkten für welche der nächste Punkt in K xi ist. In anderen Worten, die Cluster korrespondieren mit den Punkten in den Voronoi-Regionen in Rd in Beziehung zu K. Der gerade genannte Fakt impliziert nun, dass für alle i xi der Schwerpunkt von Pi sein muss. Diese Feststellung scheint trivial. Kumar und andere sagen aus, dass das Interesse in schnellen Algorithmen der Berechnung guter Approximationen für das k-means Problem gilt. Der Fall k = 1 wird zuerst berücksichtigt. Inaba und andere [12] zeigten, dass der Schwerpunkt einer kleinen zufälligen Stichprobe von Punkten aus P eine gute Approximation für c(P ) sein kann. Lemma 1. [12] Sei T eine Menge von m Punkten, erhalten durch die zufällige, unabhängige, gleichmäßige Auswahl von m Punkten aus einer Menge von Punkten P . Dann gilt für jedes δ > 0, 1 ∆(T, c(T )) < 1 + ∆1 (P ) δm mit einer geringsten Wahrscheinlichkeit von 1 − δ. Den Sachverhalt des Lemmas 1 aus [12] haben Kumar und andere als Voraussetzung benutzt. Falls m mit der Eigenschaft 2ε gewählt wird, erhält man mit einer minimalen Wahrscheinlichkeit von 1/2 eine gute (1 + ε)-Approximation für ∆1 (P ), aufgrund der Wahl des Zentrums von T gleichzeitg als Schwerpunkt für T und damit der approximierten 1-means Lösung für P . Also erhält man durch Auswahl einer konstanten Größe schnell eine, im Sinne von 42 Holger Bürger Kumar und anderen, gute Approximation für die optimale 1-means Lösung. Würde man δ sehr viel kleiner wählen, würde zwar die Wahrscheinlichkeit größer werden, aber damit auch die Ungenauigkeit. Letzterem könnte man wiederum nur durch die Auswahl von mehr Punkten entgegenwirken. Daraufhin wird angenommen P 0 sei eine Teilmenge von P und man möchte eine gute Approximation für das optimale 1-means Problem für die Menge P 0 finden. Lemma 1 folgend, würde man von P 0 Punkte zur Berechnung auswählen. Ein Problem sei aber, dass P 0 nicht explizit gegeben ist. Das folgende, ebenfalls aus dem Paper stammende Lemma 2 sagt aus, wenn die Größe von P 0 nahe der Größe von P ist, kann man eine leicht größere Anzahl von Punkten aus P auswählen und hofft, dass diese Zufallsauswahl genug Punkte von P 0 enthält. In dem Paper werden jedoch vorerst folgende Sachverhalte weiter formalisiert. Sei P eine Menge von Punkten und P 0 eine Teilmenge von P , mit der Eigenschaft, dass |P 0 | ≥ β|P |, wobei β eine Konstante zwischen 0 und 1 ist. Angenommen man bestimmt eine 4 Auswahl S von P mit der Größe βε . Nun betrachtet man alle möglichen Teilmengen von S, 2 0 genannt S , mit der Größe ε . |P 0 | ≥ β · |P | ⇒ |P 0 | |P | ≥β Dann stelle man sich folgende Verhältnisgleichung vor: 4 |P | verhält sich zu βε , wie |P 0 | zu x. Dies ergibt dann: |P 0 | |P | = x 4 βε Will man nun x ausrechnen, erhält man: 4 βε · |P 0 | |P | = 4 βε ·β = 4 ε 0 | 4 Dabei wurde gleich |P |P | durch β ersetzt und man erhielt letztendlich ε . Ziel war es, die 1-means Lösung für P 0 zu finden. Wir haben aber nur die Menge P gegeben und wissen, das durch eine zufällige, unabhängige, gleichmäßige Stichprobenauswahl nach Lemma 1 die Lösung approximiert werden kann. Also haben wir durch eine Stichprobenauswahl von P 4 mit der Größe βε sogar eine größere Stichprobe für die unbekannte Teilmenge P 0 ( 4ε anstatt 2 ε ) zur Verfügung, um das Problem zu lösen. Für jede dieser Teilmengen S 0 berechnet man nun den Schwerpunkt c(S 0 ) und betrachtet es als potenzielles Zentrum für die 1-means Probleminstanz von P 0 . Anders ausgedrückt, man betrachtet ∆(P 0 , c(S 0 )) für alle Teilmengen S 0 . Das folgende Lemma soll zeigen, dass eine dieser Teilmengen eine Approximation für eine optimale 1-means Lösung für P 0 ergibt, welche genau genug ist. Lemma 2. (Superset Sampling Lemma) Das Folgende gilt mit konstanter Wahrscheinlichkeit: minS 0 :S 0 ⊂S,|S 0 |= 2 ∆(P 0 , c(S 0 )) ≤ (1 + ε)∆1 (P 0 ) ε Beweis. Mit konstanter Wahrscheinlichkeit enthält S mindestens folgt aus Lemma 1. u t 2 ε Punkte von P 0 . Der Rest (1+ε)-Approximation Algorithm for 2-Means Clustering 43 Es wird die Standardnotation B(p, r) benutzt, um die offene Kugel mit Radius r um einen Punkt p zu beschreiben. Es wird angenommen, dass für den Eingabeparameter ε, welcher im Faktor der Approximation enthalten ist, gilt: 0 < ε ≤ 1. 2.2 Ein Linearzeit-Algorithmus für das 2-means Clustering Theorem 1. Gegeben sei eine Menge von n Punkten P im Rd . Es existiert ein Algorithmus, welcher eine (1 + ε)-Approximation für die optimale 2-means Lösung der Menge P mit O(1) konstanter Wahrscheinlichkeit berechnet. Seine Laufzeit beträgt O(21/ε) dn). Man beachte, dass das ε im Bruch des Exponenten der Laufzeit, wie weiter oben beschrieben, zwischen 0 und 1 liegt. Das bedeutet der Bruch ist gross, die Laufzeit damit lang, aber sie ist linear zur Eingabe. Kumar und andere beweisen dies wie folgt: Beweis. Sei α = ε/64. Es kann angenommen werden, das P (2, α)-irreduzibel ist. Aufgrund eines Widerspruchbeweises nimmt man an, dass P (2, α)-reduzibel ist. Dann ist, aufgrund von Definition 1, ∆1 (P ) ≤ (1 + ε/2)∆2 (P ). Man kann eine Lösung für das 1-means Problem für P bekommen, in dem man den Schwerpunkt von P in O(nd ) Zeit ausrechnet, also den Durchschnitt der Koordinaten pro Dimension. Die Kosten für dieses Problem sind höchstens (1 + ε/2)∆2 (P ). So hätte man das Theorem gezeigt, wenn P (2, α)-reduzibel wäre. Angenommen es gäbe eine optimale 2-means Lösung für P . Seien c1 und c2 die beiden Zentren dieser Lösung. Seien P1 die Punkte, welche näher an c1 als an c2 und P2 die Punkte, welche näher an c2 als an c1 sind. So ist c1 der Schwerpunkt von P1 und c2 der Schwerpunkt von P2 . Ohne Beschränkung der Allgemeinheit kann angenommen werden, dass |P1 | ≥ |P2 |. Da |P1 | ≥ |P |/2, impliziert Lemma 2, dass wenn man eine Stichprobe S der Größe O( 1ε ) aus der Menge P nimmt und betrachtet die Menge der Schwerpunkte aller Teilmengen von S der Größe 2ε , dann hat mindestens einer dieser Schwerpunkte, genannt c01 , die Eigenschaft ∆(P1 , c01 ) ≤ (1 + α)∆(P1 , c1 ). Da dieser Algorithmus [14] alle Teilmengen von S durchläuft, kann angenommen werden, dass solch ein Punkt c01 gefunden wurde. Sei t die Distanz zwischen c1 und c2 , also d(c1 , c2 ) = t. Lemma 3. d(c1 , c01 ) ≤ t/4 Beweis. Aufgrund eines Widerspruchbeweises wird angenommen, dass d(c1 , c01 ) > t/4 ist. Gleichung 2 impliziert ∆(P1 , c01 ) − ∆(P1 , c1 ) = |P1 |∆(c1 , c01 ) ≥ t2 |P1 | 16 . Bemerkung: x aus Gleichung 2 ist hier c01 und ∆(P1 , c1 ) wurde von der Gleichung sub2 |P | 1 entsteht aus Gleichung 1, so ist ∆(c1 , c01 ) = d(c1 , c01 )2 und dies ist wiederum trahiert. t 16 t2 t2 laut Annahme ≥ (t/4)2 = 16 . ∆(c1 , c01 ) wurde also im rechten Teil durch 16 substituiert. Man weiss ebenfalls, dass die linke Seite höchstens α∆(P1 , c1 ) beträgt. Daraus ergibt sich t2 |P1 | ≤ 16α∆(P1 , c1 ). Gleichung 2 nochmal angewendet ergibt weiterhin 44 Holger Bürger ∆(P1 , c2 ) = ∆(P1 , c1 ) + t2 |P1 | ≤ (1 + 16α)∆(P1 , c1 ). Daher ist ∆(P, c2 ) ≤ (1 + 16α)∆(P1 , c1 ) + ∆(P2 , c2 ) ≤ (1 + 16α)∆2 (P ). Dies widerspricht dem Fakt, das P (2, α)-irreduzibel ist. u t Nun wird die Kugel B(c01 , t/4) betrachtet. Das vorhergehende Lemma impliziert, dass sich diese Kugel in der Kugel B(c1 , t/2) mit 0 t/4 c1 c’1 t/2 3t/4 t Abb. 1. Verhältnis zwischen B(c01 , t/4) zwischen B(c1 , t/2) Radius t/2 und Mittelpunkt c1 befindet. So beinhaltet P1 B(c01 , t/4). Da nach dem Punkt c2 gesucht wird, können die Punkte dieser Kugel gelöscht werden und es wird gehofft, dass die verbleibende Menge von Punkten eine guten Anteil an Punkten von P2 enthält. In dem zugrundeliegenden Paper wird dies als nächstes bewiesen. Sei P10 die Menge von Punkten P1 − B(c01 , t/4). Sei P 0 die Menge P10 ∪ P2 . Wie gerade erwähnt ist P2 Teilmenge von P 0 . Behauptung. |P2 | ≥ α|P10 | Beweis. Aufgrund eines Widerspruchbeweises wird angenommen, dass |P2 | ≤ α|P10 | ist. Beachte ∆(P1 , c01 ) ≥ ∆(P10 , c01 ) ≥ t2 |P10 | 16 Aus ∆(P1 , c01 ) ≥ (1 + α)∆(P1 , c1 ) folgt t2 |P10 | ≤ 16(1 + α)∆(P1 , c1 ) (3) Weiterhin ∆(P, c1 ) = ∆(P1 , c1 ) + ∆(P2 , c1 ) = ∆(P1 , c1 ) + ∆(P2 , c2 ) + t2 |P2 | ≤ ∆(P1 , c1 ) + ∆(P2 , c2 ) + 16α(1 + α)∆(P1 , c1 ) ≤ (1 + 32α)∆(P1 , c1 ) + ∆(P2 , c2 ) ≤ (1 + 32α)∆2 (P ) folgt die 2. Gleichung aus 2, während die 3. Ungleichung aus 3 und dem Sacherverhalt (1+ε)-Approximation Algorithm for 2-Means Clustering 45 |P2 | ≥ α|P10 | folgt. Dies widerspricht jedoch dem Fakt das P (2, α)-irreduzibel ist. Dies beweist die Behauptung. u t Kumar und andere kombinieren nun Lemma 1 und die vorhergehende Behauptung und implizieren damit, dass wenn eine Stichprobe von O( α12 ) Punkten von P 0 genommen wird und man die Schwerpunkte aller Teilmengen von Größe α2 dieser Stichprobe betrachtet, dann sollte mit konstanter Wahrscheinlichkeit ein Punkt c02 gefunden werden, für den ∆(P2 , c02 ) ≤ (1 + α)∆(P2 , c2 ) zutrifft. Aufgrund dessen finden sie die Schwerpunkte c01 und c02 , welche die Vorraussetzungen für das Lemma 3 erfüllen. Das einzige Problem besteht darin, dass der Parameter t nicht bekannt ist. Dieser muss “geraten„ werden, wobei die Eigenschaft des Algorithmus, dass er nur lineare Zeit zur Eingabe verbraucht, nicht verletzt werden dürfe. Sie schrieben, das angenommen werden darf, dass c01 (unabhängig von t) gefunden wurde. Es müsse von P 0 (alle Punkte der Menge P , außer denen, welche innerhalb der Kugel B(t/4,c01 ) lagen) eine Stichprobe genommen werden. Angenommen man kenne den Paramen ter i, so dass 2ni ≤ |P 0 | ≤ 2i−1 gilt. Betrachte man nun die Punkte in P in absteigender n 0 Reihenfolge der Distanz zu c1 . So seien Q0i die ersten 2i−1 Punkte in dieser Sequenz. Man beachte, dass P 0 eine Teilmenge von Q0i ist und |P 0 | ≥ |Q0i |/2. Ebenfalls kann Q0i in linearer n Zeit gefunden werden, da man den Punkt an der Position 2i−1 in linearer Zeit finden kann. 0 0 Aus |P2 | ≥ α|P | ergibt sich |P2 | ≥ α|Qi |/2. Folglich impliziert Lemma 1, dass es ausreichend ist O( α12 ) Punkte von Q0i zu nehmen, um c02 mit konstanter Wahrscheinlichkeit zu lokalisieren. Ein Problem sei jedoch, dass nun der Wert von i unbekannt ist. Alles auszuprobieren kostet O(n log n) Zeit, unter der Bedingung, dass α und d als Konstante betrachtet werden. Approximierende Distanzsuche könne ebenfalls nicht verwendet werden kann, da die Vorverarbeitung ebenfalls O(n log n) Zeit brauchen würde. Die Idee der Stichprobennahme und das Raten des Wertes i wurde kombiniert. Der zugrundeliegende Algorithmus verfährt wie folgt: Er probiert Werte für i in der Reihenfolge 0, 1, 2, . . . . Mit der Iteration von i wird die Menge Q0i gefunden. Man beachte, dass Q0i+1 eine Teilmenge von Q0i ist. Genauer betrachet ist Q0i+1 die Hälfte von Q0i und weiter von c0i entfernt. So wird in Iteration (i + 1) begonnen durch Stichprobenentnahme aus Menge Q0i , anstelle von P 0 um den Punkt c02 zu finden. Folglich wird Q0i+1 in linearer Zeit zu |Q0i+1 | gefunden. Die folgende Grafik soll nocheinmal den Sachverhalt für n=8 verdeutlichen. Die Rahmen sind jeweils mit dem Wert für i beschriftet. i=3 i=2 i=1 i=0 t c’1 Abb. 2. Punkte der Menge Q0i für n=8 und verschiedene i 46 Holger Bürger Die weitere Iteration von i führt außerdem zu der Summe ∆(P − Q0i+1 , c01 ). Weil ∆(P − Q0i+1 , c01 ) = ∆(P − Q0i , c01 ) + ∆(Q0i − Q0i+1 , c01 ) ist, kann ∆(P − Q0i+1 , c01 ) in Interation i + 1 in linearer Zeit zu Q0i+1 berechnet werden. Dies wird benötigt, da Kumar und andere c02 in Iteration i + 1 finden. Dann wird die 2-means Lösung berechnet, wenn alle Punkte P − Q0i c01 zugewiesen sind und die Punkte in Q0i dem näheren von c01 und c02 zugewiesen wurden. Dies wird in linearer Zeit zu |Q0i+1 | getan, wenn die Beträge zu ∆(P − Q0i , c01 ) für alle i bestimmt wurden. Kumar und andere merken an, dass daraufhin ersichtlich ist, dass die Iteration i lineare Zeit zu |Q0i | benötigt. Da sich der Betrag von |Q0i | um Faktor 2 verringert, beträgt die O(1) gesamte Laufzeit für einen gegebenen Wert von c01 O(21/α dn). Da es für c01 auch nur O(1) O(21/α ) Möglichkeiten gibt, ist die Laufzeit konstant. Behauptung. Die Kosten ∆ des Algorithmus liegen zwischen ∆2 (P ) ≤ ∆ ≤ (1 + α)∆2 (P ). Nun folgt der letzte Beweis, wortwörtlich übersetzt. Beweis. ∆2 (P ) ≤ ∆ ist offensichtlich, da jedem Punkt eines der beiden Zentren zugeordnet wird, unter damit verbundenen Kosten. Nun wird die Menge von Zentren betrachet, wobei jedes Zentrum ein (1 + α)-approximierter Schwerpunkt seines entsprechenden Clusters ist. Wenn jeder Punkt einem approximierten Schwerpunkt eines entsprechenden Clusters zugeordnet wird, folgt daraus, dass ∆ ≤ (1 + α)∆2 (P ) ist. Wenn die minimalen Kosten C betrachtet werden, können die konkreten Kosten nur besser sein als die Kosten dieses Algorithmus [14], da nur approximierte Schwerpunkte verwendet werden, aufgrund der in Beziehung stehenden Voronoi-Partitionen. werden. So ergibt sich ∆(C) ≤ ∆ ≤ (1+α)∆2 (P ). t u t u 3 Schluß Zusammenfassend ist zu sagen, dass dieser Algorithmus im Vergleich zu den anderen, in der Einleitung angesprochenen Algorithmen tatsächlich sehr einfach wirkt. Als erstes wurde festgestellt, dass die maximalen Abstände von Punkten zu ihren Schwerpunkten zu minimieren sind. Dann wurde der Sachverhalt verwendet, dass es möglich ist, bei einer Menge von Punkten P , für eine unbekannte Untermenge P 0 eine gute Approximation durch das Durchprobieren aller möglichen Teilmengen bestimmter Größe von P für das 1-means Problem zu finden. Daraufhin wurde dem ersten größeren Cluster viele Punkte zugeordnet und einem weiteren Cluster Punkte durch Zufallsauswahl zugeordnet, dies mit einer linearen Laufzeit zur Eingabegröße im Sinne des O-Kalküls. Jedoch wurde festgestellt, dass dieser Algorithmus einen starken konstanten Rechenaufwand produziert. Das die “Brauchbarkeit„ dieses Algorithmus für kleinere Dimensionen und Eingabegröße eher gering ist, wird in der Seminararbeit von Markus Heberling des gleichen Seminars noch näher erläutert. Literaturverzeichnis 1. S. Arora, P. Raghavan und S. Rao, 1998, Approximation schemes for euclidean k-medians and related problems. In Proceedings of the thirtieth annual ACM symposium on Theory of computing, Seite 106-113. ACM Press. (1+ε)-Approximation Algorithm for 2-Means Clustering 47 2. V. Arya, N. Garg, R. Khandekar, K. Munagala und V. Pandit, 2001, Local search heuristic for k-median and facility location problems. In Proceedings of the thirty-third annual ACM symposium on Theory of computing, Seite 21-29. ACM Press. 3. M. Bâdoiu, S. Har-Peled and P. Indyk, 2002, Approximate clustering via core-sets. In Proceedings of the thirty-fourth annual ACM symposium on Theory of computing, Seite 205-257. ACM Press. 4. M. Bern und D. Eppstein, 1997, Approximation algorithms for geometric problems. Seite 296-345. 5. A. Broder, S. Glassman, M. Manasse und G. Zweig, 1997, Syntactic clustering of the web. In Proceedings of the 6th International World Wide Web Conference. 6. I. N. Bronstein, K. A. Semendjajew, G. Musiol und H. Mühlig, 2001, Taschenbuch der Mathematik, 5. überarbeitete und erweiterte Auflage, Seite 624. Verlag Harri Deutsch. 7. W.F. de la Vega, M. Karpinski, C. Kenyon und Y. Rabani, 2003, Approximation schemes for clustering problems. In Proceedings of the thirty-fifth annual ACM symposium on Theory of computing, Seite 50-58. ACM Press. 8. S. Deerwester, S. Dumais, G. Furnas, T. Landauer und R. Harshman, 1990, Indexing by latent semantic analysis. 9. R. O. Duda, P. E. Hart und D. G. Stork, 2000, Pattern Classification. Wiley-Intersience Publication. 10. C. Faloutsos, R. Barbar, M. Flickner, J. Hafner, W. Niblack, D. Petkovic und W. Equitz, 1994, Efficient and effective querying by image content. J. Intell. Inf. Syst., 3(3-4):231-262. 11. S. Har-Peled and S. Mazumdar, 2004, On coresets for k-means and k-median clustering. In Proceedings of the thirty-sixth annual ACM symposium on Theory of computing, Seite 291-300. ACM Press. 12. M. Inaba, N. Katoh, und H. Imai, 1994, Applications of weighted voronoi diagrams ans randomization to variance-based k-clustering: (extended abstract). In Proceedings of the tenth annual symposium on Computational geometry, Seite 332-339. ACM Press. 13. S. Kolliopoulos and S. Rao, 1999, A nearly linear time approximation scheme for the euclidean k-medians problem. In Proceedings of the 7th European Symposium on Algorithms, Seite 326-371. 14. Amit Kumar and Yogish Sabharwal and Sandeep Sen, 2004, A Simple Linear Time (1 + ε) - Approximation Algorithm for k-Means Clustering in Any Dimensions. In Proceedings of the 45th Annual IEEE Symposium on Foundations of Computer Science, Seite 454-462. 15. J. Matousek, 2000, On approximate geometric k-clustering. In Discrete and Computational Geometry, Seite 61-84. Skalierbare Peer-to-Peer-Netzwerke Andreas Vogelsang Universität Paderborn [email protected] Zusammenfassung. Peer-to-Peer-Netzwerke (P2P-Netzwerke) verursachen allein in Deutschland inzwischen über 69% des Verkehrsaufkommens im Internet [4]. Besonders die große Anzahl an Teilnehmern und die hohe Inhomogenität der Teilnehmer untereinander, macht es schwierig ein P2P-Netzwerk zu konzipieren, das in Bezug auf eine Datumssuche gut skalierbar ist. In dieser Arbeit wird, neben einer Einführung in die Welt der P2P-Netzwerke, mit dem Content-Adressable Network (CAN) ein P2P-Netzwerk vorgestellt, das unter Verwendung von Distributed Hash Tables eine effiziente und gut skalierbare Datumssuche bereitstellt. 1 P2P-Netzwerke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 1.1 1.2 1.3 1.4 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Entstehung, Geschichte, Vorteile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Napster . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gnutella . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 DHT – Distributed Hash Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 50 50 51 53 2.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 2.2 Hash Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 2.3 Distributed Hash Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 3 CAN – Content-Addressable Network . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.1 3.2 3.3 3.4 3.5 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verwendung von DHT in CAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Funktionsweise und Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verbesserungsmöglichkeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 59 59 66 69 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 1 P2P-Netzwerke In diesem Kapitel soll eine Einführung in das Thema P2P-Netzwerke gegeben werden. Neben einer Definition sowie Daten zur Entwicklung und Geschichte werden mit Napster und Gnutella zwei bekannte und bedeutende Netzwerke vorgestellt. Abbildungen und Inhalt sind angelehnt an [5]. 50 Andreas Vogelsang 1.1 Einleitung Als Peer-to-Peer Netzwerke (P2P-Netzwerke) werden Netzwerke bezeichnet, in denen alle Teilnehmer gleichbehandelt werden. Das Netzwerk verwaltet und organisiert sich vollständig selbst ohne zentrale Instanz oder höhergestellte Teilnehmer. Die Teilnehmer eines P2P-Netzwerks werden als Peers (dt.: Gleichrangige, Ebenbürtige) bezeichnet. Diese Idee steht im Gegensatz zu der vorherrschenden Client-Server-Netzwerk-Struktur, bei der jeder Teilnehmer entweder die Rolle des Dienstanbieters (Server ) oder die des Dienstkonsumenten (Client) annimmt. Die Verwaltung des Netzwerkes wird dabei meistens ausschließlich von den Servern übernommen. Diese Rollenverteilung wird in einem P2P-Netzwerk derart aufgebrochen, dass jeder Teilnehmer gleichzeitig die Rolle des Servers und des Clients annehmen kann. Daraus folgt auch, dass die Verwaltung des Netzwerkes von allen Teilnehmern gleichermaßen übernommen wird. Ein P2P-Netzwerk ist gut skalierbar, wenn es bei steigender Teilnehmer-, oder Datenlast nicht übermäßig an Leistung verliert, oder gar ausfällt. Der Begriff Robustheit beschreibt das Verhalten des Netzwerks bei ausfallenden Teilnehmern, oder anderen unerwarteten Ereignissen. P2P-Netzwerke sind in der Regel Overlay Netzwerke, die auf das bestehende Internet aufgesetzt werden. Das heißt, auf die bestehende Netzwerkstruktur des bekannten Internets wird auf Anwendungsebene eine zusätzliche Netzwerkstruktur aufgesetzt, die das P2P-Netzwerk darstellt. Dieses kann zu Verwirrungen führen, wenn man über Eigenschaften des P2PNetzwerks spricht, denn das P2P-Netzwerk ist unabhängig von dem darunter liegenden Internet zu betrachten. So können zum Beispiel zwei unmittelbar benachbarte Teilnehmer eines P2P-Netzwerks im darunter liegenden Internet viele tausend Kilometer oder Routerhops entfernt sein. 1.2 Entstehung, Geschichte, Vorteile Das erste Netzwerk, das als P2P-Netzwerk bekannt wurde, war Napster, welches Shawn „Napster“ Fanning 1999 herausbrachte. Die Software, deren ursprüngliche Aufgabe die Bereitstellung eines File-Sharing-Systems war, erlangte schnell Popularität, da sie von vielen missbraucht wurde um urheberrechtlich geschützte Musik bereitzustellen oder herunterzuladen. Die immer weiter steigende Beliebtheit führte zusammen mit den sinkenden Zahlen der CD-Verkäufe dazu, dass die Musikindustrie immer stärkeren juristischen Druck auf die Betreiber von Napster ausübte, was schließlich Ende 2000 zur Schließung dieses P2P-Netzwerks führte. Ironischerweise hing das abrupte Ende umittelbar mit der Tatsache zusammen, dass Napster kein P2P-Netzwerk im eigentlichen Sinne war, sondern eine zentrale Instanz zur Verwaltung der Indexdaten hatte. Mehr dazu in Kapitel 1.3. Nach dem Scheitern von Napster versuchten viele Entwickler, den Kerngedanken der P2PNetzwerke stärker in eine Implementierung einfließen zu lassen. Ein Ergebnis war das Gnutella Netzwerk, dessen Client-Software im Jahr 2000 von Justin Frankel zum kostenlosen Download freigegeben wurde. Da dieses Netz völlig ohne zentrale Instanzen auskommt, ist es praktisch unangreifbar, denn es existiert, sobald nur ein Teilnehmer im Netz ist. Ausführlicher wird Gnutella im Kapitel 1.4 beschrieben. Im Laufe der Jahre kamen immer mehr Protokolle und Implementierungen auf den Markt, die immer leistungsfähigere P2P-Netzwerke zur Verfügung stellten. Skalierbare Peer-to-Peer-Netzwerke 51 Im Jahr 2008 werden P2P-Netzwerke zu verschiedensten Zwecken verwendet. Neben P2PFile-Sharing Netzen wie Bittorrent [1] existieren auch P2P-VoIP-Netze wie Skype [2] oder P2P-Netzwerke, die als Ziel haben, die Anonymität und somit das Grundrecht auf Meinungsäußerung zu sichern wie z.B. das Freenet [3]. Studien haben ergeben, dass in Deutschland über 69% des Verkehrsaufkommens im Internet über P2P Protokolle verursacht werden [4]. 1.3 Napster Einleitung Napster war das erste als P2P-Netzwerk bezeichnete Netzwerk. Im Juni 1999 stellte Shawn „Napster“ Fanning eine Beta-Version der zum Netz gehörigen Client Software zum kostenlosen Download bereit. Durch das Engagement eines Freundes von Fanning wurde das Netz, welches ursprünglich ein File-Sharing-System bereitstellen sollte, zu einem Portal zur Verbreitung von Musikdateien. Diese Funktionalität brachte der Software eine hohe Popularität und machte sie bereits im Herbst 1999 zum Download des Jahres [5]. Die einfache und schnelle Verbreitung von Musikdateien über Napster zog allerdings zahlreiche Verstöße gegen das Urheberrecht nach sich, so dass Napster Ende 2000 unter dem juristischen Druck der Musiklabels geschlossen werden musste. Im Anschluss ging Fanning einen Kooperationsvertrag mit Bertelsmann Ecommerce ein und vermarktet seitdem ein Client-Server-basiertes kommerzielles File-Sharing-System unter dem Namen Napster. Funktionsweise Abb. 1. Die Funktionsweise von Napster 52 Andreas Vogelsang So rasant der Popularitätsanstieg von Napster war, so einfach ist die Funktionsweise. Wie Abbildung 1 zeigt, melden sich alle Teilnehmer des Netzwerks an einem Server an. Eine Dateianfrage (Query) wird von einem Client zum Beispiel in Form des zu suchenden Dateinamens an den Server übermittelt. Auf dem Server sind Informationen zu der entsprechenden Datei gespeichert. Unter anderem besitzt der Server eine Liste von Netzteilnehmern, die diese Datei lokal bei sich gespeichert haben. Der Server schickt dem anfragenden Client eine Reply-Nachricht als Antwort, die eine Liste mit allen Clients enthält, die die gesuchte Datei bereitstellen. Die gesuchte Datei kann nun direkt von den Teilnehmern heruntergeladen werden. Evaluierung Napster war zwar das erste Netzwerk, das unter dem Namen P2P-Netzwerk bekannt wurde, aber nach der in Kapitel 1.1 gegebenen Definition handelt es sich bei Napster nicht um ein reines P2P-Netzwerk. Genauer gesagt entspricht lediglich der direkte Dateidownload von einem anderen Teilnehmer des Netzes der Definition. Die Suche nach einer bestimmten Datei und das Herausgeben der Kontaktdaten zu Besitzern dieser Datei wird über eine zentrale Instanz, den Server, organisiert. Gerade dieser Umstand machte es möglich, dass Napster von einem auf den anderen Tag geschlossen werden konnte. Nachdem die Server, die für die Dateisuche zuständig waren, abgeschaltet wurden, konnte kein Teilnehmer des Netzes mehr eine erfolgreiche Suchanfrage starten. Stärken Napster ist eine vergleichsweise einfache Möglichkeit, ein schnelles und effizientes FileSharing-System zu implementieren. Durch die Client-Server-Struktur ist es für die Betreiber einfach zu organisieren und zu koordinieren. Wenn eine Datei im Netzwerk vorhanden ist, dann wird sie durch die Dateisuche auch gefunden und kann direkt heruntergeladen werden. Schwächen Die großen Nachteile der in Napster genutzten Client-Server-Struktur liegen in den Bereichen Robustheit und Skalierbarkeit. Bei Ausfall des verwendeten Servers ist das ganze Netz funktionsunfähig. Es handelt sich also bei dem Server um einen sogenannten „single point of failure“. Das Netz ist an dieser Stelle von außen besonders angreifbar. Ebenso kann ein gesteigertes Datei- oder Teilnehmeraufkommen den Server, der diesen verwalten muss, überlasten und so ebenfalls zu einem Zusammenbruch des Netzes führen. Erkenntnisse Die hohe Popularität Napsters ließ erahnen, welche Möglichkeiten P2P-Netzwerke bieten. Viele Wissenschaftler und Firmen forschten in Folge an weiterentwickelten Netzwerken. Dabei wurden die bei Napster aufgetauchten Schwächen schnell zu Kernfeldern der Weiterentwicklung. Vor allem die Entwicklung einer verteilten Indexsuche, die es ermöglicht, Dateien ohne eine zentrale Instanz im Netzwerk effizient zu finden, ist eine der wichtigsten Problemstellungen beim Entwurf eines P2P-Netzwerks. Skalierbare Peer-to-Peer-Netzwerke 53 1.4 Gnutella Einleitung Im März 2000 stellten Justin Frankel und Tom Pepper von der Firma Nullsoft das GnutellaNetzwerk [6] vor. Bei dem Versuch, die Schwächen des in Kapitel 1.3 vorgestellten Napster auszumerzen, entstand ein P2P-Netzwerk, das diesen Namen auch in allen Teilen des Netzes verdient. Wie Napster auch ist Gnutella ein reines File-Sharing-System und bietet daher von der Funktionsweise wenig Innovatives. Die Netzwerkstruktur und die Indexsuche jedoch setzt sich deutlich von der in Napster ab. Funktionsweise Jeder Teilnehmer des Gnutella Netzwerkes verwaltet eine Menge von Nachbarknoten. Um eine solche Menge zu erhalten, kontaktiert ein neuer Peer des Netzwerkes eine Reihe von Peers, deren Adressen er durch eine Initialliste, die mit der Clientsoftware ausgeliefert wird, erhält. Der Kontakt wird hergestellt, indem der neue Peer eine sogenannte Ping-Nachricht nacheinander an die Peers der Initialliste schickt. Der erste Peer der Liste, der aktiv ist, antwortet mit einer Pong-Nachricht und leitet die Ping-Nachricht an alle Peers seiner Nachbarmenge weiter. Diese verfahren in derselben Weise bis zum k -nächsten Nachbarn des ersten kontaktierten Peers. Pong-Nachrichten werden auf dem selben Weg zurückgesendet, wie die dazu gehörige Ping-Nachricht. Der neue Peer erhält so durch den Empfang von Pong-Nachrichten eine Liste von aktiven Peers. Aus diesen Peers sucht sich der neue Peer zufällig m Peers aus, die dann seine Nachbarschaft definieren. Der Enstehungsprozess der Gnutella-Netzwerkstruktur ist also völlig zufällig und bedarf keiner zentralen Instanz (wie etwa bei einem Server) außer dem sogenannten TTL-Feld (time to live), das die Tiefe k der Rekursion festlegt, indem es bei jeder Ping-Nachrichten-Weiterleitung um eins verringert wird. Die Dateisuche ist analog zum Anmeldeprozess. Eine Query-Nachricht wird rekursiv an alle Nachbarn bis zur Tiefe k geschickt und von einem Peer p mit einer QueryHit-Nachricht beantwortet, wenn die gesuchte Datei von p bereitgestellt werden kann. Der Initiator der Suche kann die Datei dann direkt von Peers herunterladen, die ihm mit einem QueryHit geantwortet haben (siehe auch Abbildung 2). In Algorithmus 4 und 5 ist die Indexsuche von Gnutella in Pseudo-Code angegeben. Algorithmus 4 Dateisuche in Gnutella(1): Suche(Datei x, Knoten p) Vorbedingung: Knoten p sucht Datei x. Sei N die Menge der Nachbarn von p. Download(p0 , x) startet den direkten Download der Datei x vom Knoten p0 . for all n ∈ N do send Query(p, x, T T L) to n wait until receipt of a QueryHit or timeout if receipt a QueryHit(p0 , x) then download(p0 , x) 54 Andreas Vogelsang Algorithmus 5 Dateisuche in Gnutella(2): Empfang eines Query(Knoten p, Datei x, int T T L) bei einem Knoten p0 Vorbedingung: Knoten p0 hat Query(p, x, T T L) von Knoten p mit der Anfrage nach Datei x und time-tolive Wert T T L empfangen. Sei DB die lokale Datenbasis des Knotens p0 und N die Menge der Nachbarn von p0 . if x ∈ DB then send QueryHit(p0 , x) to p if T T L 6= 0 then for all n ∈ N do send Query(p0 , x, T T L − 1) to n while not timeout do On receipt of a QueryHit(q, x) send QueryHit(q, x) to p Abb. 2. Die Dateisuche in Gnutella. Eine Query-Nachricht mit TTL-Wert 2 wird rekursiv an alle Nachbarn weitergeleitet (a). Peers, die die gesuchte Datei bereitstellen können antworten mit einer QueryHit-Nachricht (b). Anschließend kann die gesuchte Datei direkt heruntergeladen werden (c). Evaluierung Wie beschrieben kommt das Gnutella Netzwerk gänzlich ohne strukturierende oder organisierende Instanzen aus, was es zum ersten P2P-Netzwerk im eigentlichen Sinne macht. Durch die Vermeidung eines dedizierten Servers löst Gnutella eines der großen Probleme von Napster. Auch die Indexsuche als völlig dezentralisierter Algorithmus wurde in Gnutella zum ersten Mal umgesetzt. Diese Eigenschaften machen das Gnutella Netzwerk von außen praktisch unangreifbar, da das Netzwerk besteht und funktioniert, sobald ein Teilnehmer Skalierbare Peer-to-Peer-Netzwerke 55 im Netzwerk ist. Dass es dennoch möglich ist, das Netz so zu stören, dass Funktionen nur noch eingeschränkt nutzbar sind, wird im Folgenden noch erklärt. Stärken Die Stärke von Gnutella liegt eindeutig in seiner verteilten Netzwerkstruktur, die es extrem robust macht. Außerdem ist sie sehr gut skalierbar, da viele Knoten aufgenommen werden können, ohne dass die Leistungsfähigkeit des Gesamtsystems darunter leidet. Schwächen Die Schwächen von Gnutella liegen in der verteilten Indexsuche, die im Gegensatz zur Netzwerkstruktur nicht gut skalierbar ist. Da die Suche nach einem Datum durch das TTL-Feld tiefenbeschränkt ist, wird ein Datum, das im Netzwerk faktisch vorhanden ist, nicht sicher gefunden. Nur, wenn das Datum von einem der k-nächsten Nachbarn bereitgestellt werden kann, findet die Indexsuche das Datum auch. Eine Erhöhung des TTL-Feldes, um dieses Problem zu umgehen, verstärkt nur noch die zweite gravierende Schwäche. Da es in keinster Weise klar ist, in welcher Richtung des Netzwerkes sich ein Datum befindet, verursacht die Indexsuche ein sehr hohes Nachrichtenaufkommen zwischen Knoten. Das Netzwerk wird mit Suchanfragen regelrecht geflutet. Böswillige Teilnehmer, die besonders viele Suchanfragen stellen, können so einzelne Netzwerkteilnehmer überfordern und das Netzwerk beträchtlich stören. 2 DHT – Distributed Hash Tables In diesem Kapitel sollen Distributed Hash Tables (DHT) als besonders geeignete verteilte Datenstruktur für eine effiziente Indexsuche in P2P-Netzwerken vorgestellt werden. Abbildungen und Inhalt sind angelehnt an [5] und [8]. 2.1 Motivation Mitentscheidend für den Erfolg eines P2P-Netzwerks ist eine effiziente Datensuche innerhalb des Netzwerkes. Aus den Erfahrungen von Napster kann gefolgert werden, dass nur eine verteilte Datenstruktur für P2P-Netzwerke Sinn macht, da sie ohne zentrale Instanzen auskommt und so extrem robust und angriffssicher ist. Dieses Konzept der verteilten Datenstruktur wird bereits im Gnutella-Netzwerk verwendet, jedoch auf Kosten einer ineffizienten Suche auf den Daten. Daten werden im Gnutella Netzwerk nicht zwangsläufig gefunden und die Suche nach ihnen verursacht ein hohes Nachrichtenaufkommen. Eine Datenstruktur, in der jeder Teilnehmer wüsste, wo er nach einem Datum suchen muss, würde eine gute Grundlage für eine effiziente Suche bilden. Ebenso wäre es wünschenswert, wenn Daten nahezu auf alle Peers gleichverteilt wären, damit nicht das Problem der Überlastung einzelner Peers mit sehr vielen Daten entsteht. 56 Andreas Vogelsang 2.2 Hash Tables Eine Datenstruktur, die die genannten Anforderungen sehr gut erfüllt, sind Hash Tabellen. Sie werden in zahlreichen Software-Systemen verwendet und gehören zu der Grundausstattung moderner Betriebssysteme. In Hash Tabellen erfolgt die Verteilung von Daten über eine Hash Funktion h : K → V, die jedem Datum unter Verwendung eines bestimmten Schlüssels (Key) k ∈ K eine scheinbar zufällige Position (Value) v ∈ V zuweist. Eine der einfachsten Hash Funktionen ist die Modulo-Funktion h(k) = k mod a, die einem Key k den Wert zuweist, der als Rest bei einer Division von k durch a entsteht. Typischerweise ist a gleich der Größe des Wertebereiches V. Abbildung 3 zeigt, wie Keys mit Hilfe der Modulo-Funktion auf Werte und somit auf Positionen abgebildet werden. Werden 2 verschiedene Keys auf einen Wert abgebildet, also gilt h(k1 ) = h(k2 ), k1 6= k2 spricht man von einer Kollision. In der Praxis treten solche Kollisionen jedoch kaum auf, wenn ein ausreichend großer Wertebereich gewählt wird. Die Modulo-Funktion ist im allgemeinen als Hash Funktion ungeeignet, da erreicht werden soll, dass Daten gleichmäßig auf den Wertebereich verteilt werden und folglich ähnliche Keys auf sehr unterschiedliche Werte abgebildet werden müssen. Dieses Konzept lässt sich auf Peer-to-Peer-Netzwerke übertragen, indem der Wertebereich als Menge der Peers aufgefasst wird und die Hash Funktion Indexdaten von Dateien auf einen bestimmten Peer abbildet. Benachbarte Elemente des Wertebereichs, also Peers sind dabei jeweils verbunden (siehe Abbildung 3). Diese Umsetzung bietet allerdings einige Nachteile. Da jeweils nur benachbarte1 Peers ver- Abb. 3. Die Hash Funktion h(k) = k mod 5 bildet die Keys k = 23, 15, 7, 3 nacheinander auf den Wertebereich V = {0, 1, 2, 3, 4} ab. Elemente des Wertebereichs können als Peers und Keys als Indexdaten interpretiert werden. bunden sind, steigt die Suchzeit mit der Anzahl der teilnehmenden Peers linear. Ebenso 1 im Sinne der Anordung im Wertebereich Skalierbare Peer-to-Peer-Netzwerke 57 verhält es sich mit dem Hinzufügen und dem Entfernen von Peers, bei dem die Neunummerierung lineare Zeit beansprucht. Der schwerwiegenste Nachteil ist jedoch, dass beim Hinzufügen oder Entfernen von Peers die Hash Funktion angepasst werden muss, was im schlechtesten Falle zu einer Umsortierung aller Key-Value-Paare führt. 2.3 Distributed Hash Tables Distributed Hash Tables (DHT) sind in der Lage, die Umsortierung von Key-Value-Paaren beim Hinzufügen oder Entfernen von Peers auf einen lokalen Bereich der Hash Table zu beschränken. Dazu wird der Bildbereich in ein kontinuierliches Intervall geändert. Wird beispielsweise das Intervall [0,1) gewählt, sieht die geänderte Hash Funktion wie folgt aus: h : K → [0, 1). Diese Hash Funktion bildet die Keys k ∈ K der Daten auf einen Punkt des Intervalls ab. Anders als bei den zuvor vorgestellten Hash Tables wird nun den Peers eines P2P-Netzwerks nicht genau ein Element des Bildbereichs der Hash Funktion zugeordnet sondern ein ganzer Bereich. Der Peer ist dann zuständig für alle Daten, deren Key von der Hash Funktion auf den Bereich des Peers abgebildet wird. Wird nun ein Peer hinzugefügt, wird diesem eine zufällige Position im Bildbereich zugeordnet. Der bisher für diese Position zuständige Peer teilt seinen Zuständigkeitsbereich und übernimmt nur einen Teil des Bereiches, während der andere Teil vom hinzugefügten Peer übernommen wird (siehe Abbildung 4). Ebenso verhält es sich beim Entfernen eines Peers. Der Bereich des entfernten Peers wird einfach durch einen benachbarten Peer mit übernommen. Somit verursacht das Hinzufügen und Entfernen von Peers in eine DHT nur lokale Änderungen der Key-Value-Paare und ist daher deutlich besser für P2P-Netzwerke geeignet als Hash Tables. Diese Eigenschaft wird auch Konsistenz genannt. Abb. 4. Nacheinander werden Peers der DHT hinzugefügt, indem sie eine zufällige Position zugewiesen bekommen. Der bisher für diese Position zuständige Peer teilt sich nun den Zuständigkeitsbereich mit dem neu hinzugefügten Peer. 58 Andreas Vogelsang Lemma 1. In einer DHT der Größe m mit n Teilnehmern hat der Zuständigkeitsbereich mit hoher Wahrscheinlichkeit (≥ 1 − n−c ) höchstens die Größe O( m n log n) und mindestens die Größe Ω( nmc ) (für eine Konstante c ≥ 0). Beweis. Für die untere Schranke betrachten wir einen Peer pi , der einen solchen minimalen Bereich der Größe nmc verwaltet. Die Wahrscheinlichkeit, dass ein neuer Peer auf diesen Bereich abgebildet wird und somit den Bereich von pi verkleinert, ist gegeben durch P (Peer wird in Bereich von pi abgebildet) = = Größe des Bereichs von pi Größe der DHT m nc m m = mnc 1 = c n = n−c Beim Hinzufügen von n Peers kann dieser Bereich maximal n mal geteilt werden, wodurch die Wahrscheinlichkeit für eine weitere Verkleinerung beschränkt ist durch n−c+1 . Für die obere Schranke betrachten wir die Wahrscheinlichkeit, dass kein Peer einem festen m Bereich der Größe B = O( m n log n) = c n log n zugeordnet wird und somit ein Peer zuständig ist für einen Bereich größer als dieser. Die Wahrscheinlichkeit, dass ein Peer dem Bereich B zugeordnet wird, ist gegeben durch Größe von B Größe der DHT c m log n = n m c log n = n P (ein Peer wird dem Bereich B zugeordnet) = Somit ist die Wahrscheinlichkeit, dass ein Knoten nicht dem Bereich B zugeordet wird n 1 − c log n . Für die Wahrscheinlichkeit, dass B nach Einfügen von n Knoten immer noch ungeteilt bleibt, gilt somit c log n n P (kein Peer teilt B) = 1 − n ≤ e− c log n n n ≤ n−c Also ist die Wahrscheinlichkeit, dass ein Bereich der Größe B von n Peers nicht unterteilt wird, sehr gering und somit sind die Zuständigkeitsbereiche der Peers in einer DHT mit sehr t hoher Wahrscheinlichkeit nicht größer als O( m n log n). u Geht man davon aus, dass die Daten gleichverteilt auf die ganze DHT sind, dann ist die Menge an Daten, die ein Peer verwaltet proportional zur Größe seines Zuständigkeitsbereiches. Da die durchschnittliche Größe eines Bereiches der DHT m n beträgt, folgt aus Lemma 1, dass ein Peer maximal nur log n mal mehr Daten verwaltet als der Durchschnitt. Skalierbare Peer-to-Peer-Netzwerke 59 3 CAN – Content-Addressable Network In diesem Kapitel soll gezeigt werden, wie Distributed Hash Tables in P2P-Netzwerken verwendet werden können um eine effiziente Indexsuche zu gewährleisten. Dieses soll am Beispiel des Content-Addressable Network (CAN) erläutert werden. Abbildungen und Inhalt sind angelehnt an [5] und [7]. 3.1 Einleitung Das Content-Addressable Network (CAN) war das erste P2P-Netzwerk, das mit Hilfe von Distributed Hash Tables eine effiziente Datensuche ermöglicht. Es wurde im Jahr 2000 von Sylvia Ratnasamy, Paul Francis, Mark Handley, Richard Karp und Scott Shenker in einem Paper [7] vorgestellt. Die Verwendung von DHT ist mittlerweile zum Standard in skalierbaren P2P-Netzwerken geworden. 3.2 Verwendung von DHT in CAN In einem CAN wird eine Hash Funktion h : K → Q, Q = [0, 1) × [0, 1) eingesetzt, die Datenkeys k ∈ K auf eine kontinuierliche quadratische Fläche abbildet. Die Hash Funktion sorgt dafür, dass Daten gleichmäßig auf die Fläche verteilt werden. Weiterhin wird die quadratische Fläche so partitioniert, dass jeder teilnehmende Peer für genau ein von mindestens n, idealerweise gleich großen Rechtecken zuständig ist. Ein Peer verwaltet nun alle Daten, dessen Key auf die Fläche des Peers abgebildet wird. Offensichtlich wird hier das Konzept der in Kapitel 2.3 vorgestellten DHT auf den 2-dimensionalen Raum übertragen. Eine mögliche Verteilung von Peers und Daten auf eine quadratische Fläche im CAN zeigt Abbildung 5. 3.3 Funktionsweise und Analyse Um die Funktionsweise eines CAN zu verstehen, sollen hier die grundlegenden Operationen auf einem CAN beschrieben werden. Dabei soll der Schwerpunkt mehr auf den grundsätzlichen Ideen hinter den Operationen liegen und nicht so sehr auf Implementationsdetails. Einfügen von Peers Wird ein Peer pneu in ein CAN eingefügt, wählt er eine zufällige Position auf der Fläche Q. Durch ein Verfahren, dass später erklärt wird, kontaktiert pneu den Peer palt , der bisher für diese Position zuständig war. Nun wird der Zuständigkeitsbereich von palt in der Mitte geteilt. Ist der Bereich ein Quadrat wird entlang der y-Achse geteilt sonst entlang der xAchse. Die beiden entstehenden Flächen werden von jeweils einem Peer übernommen (siehe auch Abbildung 6). Durch dieses Einfügeverfahren wird sichergestellt, dass sich die verteilte Datenstruktur nur in einem kleinen lokalen Bereich ändert, da sich lediglich der Zuständigkeitsbereich eines Knotens ändert. Diese Eigenschaft wird Konsistenz genannt und gibt der DHT auch den Beinamen Consistent Hashing. Im Unterkapitel Netzwerkstruktur und Routing wird gezeigt, dass sich beim Einfügen von Knoten die Netzwerkstruktur des CAN ebenfalls nur lokal verändert. 60 Andreas Vogelsang Abb. 5. Ein CAN mit Peers und Daten verteilt auf eine quadratische Fläche Q = [0, 1) × [0, 1). Einfügen von Daten Das Einfügen von Daten erfolgt analog zum Einfügen von Peers. Ein neu einzufügendes Datum d1 bekommt von der Hash Funktion eine zufällige Position (x, y) auf der Fläche Q des CAN zugewiesen. Der Peer p, in dessen Zuständigkeitsbereich der Punkt (x, y) liegt, ist dann zuständig für das neue Datum d1 . Zuständig heißt in diesem Fall, er verwaltet Meta-Daten, die zum Download des Datums d1 nötig sind 2 . Offensichtlich ist die Menge an Daten, die ein Peer verwalten muss, proportional zur Fläche, für die er zuständig ist. Zwar ist für den Einstieg eines neuen Peers jeder Punkt der Fläche gleichwahrscheinlich, eine völlig gleichmäßige Verteilung der Fläche auf alle Peers ist jedoch sehr unwahrscheinlich. Dennoch lässt sich die Größe des Zuständigkeitsbereiches eines Peers nach oben hin beschränken. Lemma 2. Sei PR,n die Wahrscheinlichkeit, dass ein Rechteck R mit Fläche A(R) nach Einfügen von n Peers nicht unterteilt wird. Dann gilt PR,n ≤ e−nA(R) Beweis. Wir betrachten ein Rechteck R mit Fläche q = A(R) Die Wahrscheinlichkeit, dass ein Peer beim Einfügen eine Position außerhalb von q zugewiesen wird, ist 1 − q, da für 2 z.B. eine Liste mit IP-Adressen aller Netzwerkteilnehmer, die das Datum zur Verfügung stellen Skalierbare Peer-to-Peer-Netzwerke 61 Abb. 6. Durch mehrfaches Einfügen von Peers wird die Fläche des CAN immer weiter unterteilt. die Gesamtfläche Q gilt A(Q) = 1. Diese Warscheinlichkeit ist unabhängig von anderen eingefügten Peers. Daher gilt für die Wahrscheinlichkeit, dass n Peers eine Position außerhalb von q zugewiesen bekommen (1 − q)n . Es gilt für alle m > 0: 1 m 1 1− ≤ m e Es folgt 1 nq ≤ e−nq = e−nA(R) PR,n = (1 − q)n = (1 − q) q und somit das Lemma. u t 62 Andreas Vogelsang Theorem 1. In einem CAN wird es nach dem Einfügen von n Peers mit hoher Wahrscheinlichkeit, d.h. mit Wahrscheinlichkeit ≥ 1 − n−c für eine Konstante c > 0, kein Rechteck R mit Fläche A(R) ≥ 2c lnnn geben. Beweis. Sei Ri ein Rechteck mit Fläche A(Ri ) = 2−i . Für die Wahrscheinlichkeit, dass ein Rechteck Ri von 2ci ln n nicht geteilt wird, gilt nach Lemma 2: PRi ,c2i ln n ≤ e−A(Ri )c2 = e−2 i ln n −i 2i c ln n = e−c ln n = n−c Es genügen also c2i ln n Peers, um Ri mit Wahrscheinlichkeit 1 − n−c zu teilen. Damit ein Rechteck Ri+1 überhaupt entsteht, muss das entsprechende Rechteck Ri geteilt werden. Wir betrachten das Einfügen weiterer neuer Peers nun staffelweise für i = 1, 2, . . . , log 2c nln n . In Staffel i werden c2i ln n neue Peers eingefügt. Diese teilen das umschließende Rechteck Ri eines Rechtecks mit hoher Wahrscheinlichkeit. Es wird also in der Staffel i = log 2c nln n , mit hoher Wahrscheinlichkeit, ein Rechteck Rlog 2c nln n mit der Größe n ln n A Rlog 2c nln n = 2− log 2c ln n = 2c n geteilt. Werden die Peers, die in den Staffeln hinzugefügt werden, zusammengezählt, ergibt sich: log n 2c ln n X log c2i ln n = c(ln n) i=1 n 2c ln n X 2i i=1 ≤ c(ln n)2 n 2c ln n =n Damit wird ein bestimmtes Rechteck der Größe 2c lnnn mit Wahrscheinlichkeit n−c log n von n Peers nicht geteilt. Von diesen Rechtecken gibt es höchstens n Stück. Damit ist die Wahrscheinlichkeit, dass eines dieser Rechtecke ungeteilt bleibt, höchstens n · n−c log n ≤ n−c+2 . Wählt man also c groß genug, so kann jede polynomiell kleine Fehlerwahrscheinlichkeit erreicht werden. u t Theorem 1 zeigt, dass ein Rechteck nach Einfügen von n Peers mit hoher Wahrscheinlichkeit nicht größer ist als 2c nln n . Da die Größe eines Rechtecks im Durchschnitt n1 ist, sagt Theorem 1 aus, dass ein Peer mit hoher Wahrscheinlichkeit nicht mehr als das 2c(ln n)-fache an Daten verwaltet als der Durchschnitt. Netzwerkstruktur und Routing Für den Einfüge- und Suchalgorithmus in P2P-Netzwerken muss eine Graphenstruktur auf den Peers des Netzes etabliert werden. In CAN geschieht dies, indem Peers orthogonal Skalierbare Peer-to-Peer-Netzwerke 63 benachbarter Rechtecke miteinander verbunden werden. Zusätzlich werden sogenannte Torus-Kanten eingefügt, die Rechtecke gleicher Höhe am rechten bzw. linken Rand verbinden. Analog werden Rechtecke des oberen und unteren Rands, die übereinander liegen, miteinander verbunden. Durch diese Torus Kanten wird die durchschnittliche Entfernung von Peers im Graphen halbiert. In allen Abbildungen dieser Arbeit werden jedoch aus Gründen der Übersichtlichkeit keine Torus Kanten eingezeichnet (siehe Abbildung 7). Bei einer völlig gleichmäßigen Unterteilung des Quadrats Q ergibt sich ein Netzwerkdurchmesser von √ O( n) für n Peers. Für die folgende Betrachtung nehmen wir an, dass die Kanten zwischen Peers immer vom Abb. 7. Ein CAN mit Netzwerkstruktur kleineren zum größeren Rechteck ausgerichtet sind und bei gleicher Größe in zufälliger Richtung. Jedes Rechteck hätte dann den maximalen Ausgangsgrad von vier Kanten, da jede Kante zu einem größeren oder gleichgroßen Rechteck führt. Insgesamt existieren dadurch maximal 4n Kanten im ganzen Graphen. Da jede Kante zwei Peers miteinander verbindet, haben die Peers einen durchschnittlichen Grad von höchstens acht Kanten. Insbesondere ist dieser Grad konstant und nicht abhängig von den Knoten n im Netzwerk. Diese Tatsache trägt wesentlich dazu bei, dass ein CAN sehr gut skalierbar ist. Die Suche nach einem Datum in einem CAN läuft dann in zwei Schritten ab. Zunächst wird mit Hilfe der Hash Funktion die Position des Datums in der Fläche Q bestimmt. Danach wird die Suchanfrage solange an den Nachbarnpeer weitergeleitet, dessen Rechteck in der x− oder y−Richtung näher an der Position des Datums liegt, bis der Peer erreicht ist, in dessen Zuständigkeitsbereich die Position des Datums liegt. Dieses Routing-Verfahren wird 64 Andreas Vogelsang neben der Datumssuche auch verwendet, um neu einzufügende Peers an die von ihnen zufällig gewählte Position zu routen. Dort treten sie dann in Kontakt mit dem bisher für den Punkt zuständigen Peer. Wie bei der Aufteilung der Zuständigkeitsbereiche hat das Einfügen eines Peers in der Netzwerkstruktur ebenfalls nur lokale Auswirkungen. Lediglich der Knoten, dessen Bereich geteilt wird, und seine unmittelbaren Nachbarn müssen ihre Nachbarschaftsumgebung anpassen. In Bezug auf die Netzwerkstruktur handelt es sich also ebenfalls um konsistentes Hashing. Ein Ablauf der Routing-Routine ist in Abbildung 8 abgebildet. Abb. 8. Routing in CAN. Die Suchanfrage von Peer p1 nach Datum d1 wird über die Peers p2 , p3 , p4 , p5 an den für das Datum zuständigen Peer p6 weitergeleitet. Entfernen von Peers, Defragmentierung Gerade in P2P-Netzwerken spielt Robustheit eine große Rolle, da häufig Peers ohne Vorwarnung das Netz verlassen oder ausfallen. Aus diesem Grund gibt es im CAN einen take-over Mechanismus. Ein Knoten sendet in regelmäßigen Zeitabständen seine Position und seine Nachbarschaft an seine Nachbarn. Bleibt eine solche Update-Message aus, wird ein solcher Knoten als fehlerhaft entdeckt. Jeder Knoten, der einen fehlerhaften Knoten entdeckt hat, startet einen Countdown-timer, der proportional zur Größe des Zuständigkeitsbereiches ist. Aus diesem Grund läuft der timer des Nachbarknotens mit der kleinsten Fläche am ehesten ab. Dieser übernimmt dann zusätzlich den Bereich des ausgefallenen Knotens und benachrichtigt die übrigen Nachbarn über die Veränderung (siehe Abbildung 9). Durch diesen Mechanismus ist es möglich, dass ein Knoten mehr als ein Rechteck verwal- Skalierbare Peer-to-Peer-Netzwerke 65 Abb. 9. Der Bereich eines ausgefallenen Peers p0 wird von dem Nachbarpeer p1 mit dem kleinsten Bereich übernommen. tet. Als Konsequenz kann eine sehr starke Fragmentierung des Netzes entstehen. Um dieser Fragmentierung entgegenzuwirken, wird von Zeit zu Zeit ein Defragmentierungsalgorithmus durchgeführt. Um diesen Algorithmus besser zu veranschaulichen ist es sinnvoll, das CAN als Binärbaum darzustellen. Die Wurzel des Baumes ist die ursprüngliche Fläche Q. Ein 66 Andreas Vogelsang Knoten im Baum hat als Kinder die beiden Rechtecke, in die es unterteilt wurde. Ist ein Rechteck nicht unterteilt, so ist es im Baum ein Blatt und verbunden mit dem Peer, der für das Rechteck zuständig ist. Der zur Abbildung 9 (b) passende Binärbaum ist in Abbildung 10 dargestellt. Während der Defragmentierungsroutine versucht ein Peer, der mehr als ein Rechteck ver- Abb. 10. Der zu Abbildung 9 (b) passende Binärbaum waltet, das kleinste von ihm verwaltete Rechteck an einen anderen Peer abzugeben. Sei A dieses kleinste Rechteck eines Peers p0 . Dann ist A in der Binärbaumdarstellung ein Blatt. Zur Defragmentierung wird der Bruderbaum B des Rechtecks A betrachtet. Im einfachen Fall ist B ebenfalls nur ein Blatt, das von einem Peer p1 verwaltet wird. Dann werden A und B miteinander verschmolzen und sie werden zusammen von p1 verwaltet (siehe Abbildung 11). Ist B kein Blatt, wird im Teilbaum B mit Hilfe einer Tiefensuche nach zwei benachbarten Blättern gesucht 3 . Diese beiden Blätter werden zu einer Fläche verschmolzen und von einem der beiden zuständigen Peers übernommen. Der übrig gebliebene Peer übernimmt das Rechteck A von p0 (siehe Abbildung 12). In beiden Fällen wird der Grad der Fragmentierung verringert. 3.4 Verbesserungsmöglichkeiten Durch verschiedene Verbesserungen des CAN können einige Metriken verbessert werden. Wir betrachten bei den folgenden Konzepten nur Veränderungen des Netzwerkdurchmessers, der Robustheit und des Knotengrades. 3 Dieses existiert, da ein Knoten des Baumes immer genau 0 oder 2 Kinder hat. Skalierbare Peer-to-Peer-Netzwerke 67 Abb. 11. Einfacher Fall der Defragmentierung. p0 gibt das Rechteck A an p1 ab. Abb. 12. Schwieriger Fall der Defragmentierung. Per Tiefensuche wird nach zwei benachbarten Blättern gesucht. Diese werden verschmolzen und von einem der zuständigen Peers übernommen. Der andere Peer übernimmt das Rechteck A. Dimensionen Bisher haben wir das CAN als eine 2-dimensionale Fläche angesehen. Dabei lag der Netz1 werkwerkdurchmesser bei O(n 2 ). Wird das CAN auf einen 3-dimensionalen Würfel erweitert 1 wird der Netzwerkdurchmesser auf O(n 3 ) verringert. Im allgemeinen Fall gilt für den Netz1 werkdurchmesser O(n d ) bei Verwendung von d Dimensionen. Auf der anderen Seite gilt jedoch für den Knotengrad O(d), da bei Verwendung von höheren Dimensionen (z.B. in 68 Andreas Vogelsang einem Würfel) jeder Peer mehr Nachbarn hat. Abbildung 13 stellt dar, wie sich die Verwendung von mehreren Dimensionen auf die Routingdistanz auswirkt. Abb. 13. Verwendung von mehreren Dimensionen und ihr Einfluss auf die Routingdistanz Realitäten Eine weitere Möglichkeit der Verbesserung ist das gleichzeitige Betreiben von mehreren CAN Netzwerken auf gleichen Daten und Peers. Durch die Verwendung von mehreren verschiedenen Hash Funktionen entstehen verschiedene Anordnungen von Peers und Daten in jeweils einem Netzwerk. Diese Netzwerke werden Realitäten genannt. Die Verwendung von r Realitäten erhöht die Robustheit, da bei Ausfall eines Netzes immer noch r − 1 weitere Netzwerke zur Verfügung stehen. Für den Netzwerkdurchmesser kann gezeigt werden, dass dieser nur noch O(log n) beträgt. Für das Routing ist dies allerdings nur eingeschränkt nützlich, da der kürzeste Weg nicht mehr unbedingt bekannt ist. Eine gewisse Verkürzung des Routing-Weges ist jedoch empirisch messbar zu erkennen. Durch die Verwendung von r Realitäten erhöht sich allerdings der Knotengrad um den Faktor r. Abbildung 14 stellt dar, wie sich die Verwendung von mehreren Realitäten auf die Routingdistanz auswirkt. Latenzoptimiertes Routing Wenn wir bisher von Weglängen beim Routing gesprochen haben, waren immer Wege im CAN gemeint. Allerdings sagt die Netzwerkstruktur nichts über die darunterliegende Netzwerkstruktur z.B. des Internets aus. Ein benachbarter Peer im CAN kann theoretisch auf der Skalierbare Peer-to-Peer-Netzwerke 69 Abb. 14. Verwendung von mehreren Realitäten und ihr Einfluss auf die Routingdistanz anderen Seite der Erde liegen (siehe auch Kapitel 1.1). Dadurch können beim Routing hohe Latenzzeiten enstehen. Ein Konzept, um dies zu verhindern, ist das sogenannte Überladen von Rechtecken. Während bisher immer ein Peer für ein Rechteck verantwortlich war, werden nun bis zu MaxPeers Peers einem Rechteck zugeordnet. Die Netzwerkstruktur wird dahingehend geändert, dass Verbindungen zu allen Peers eines Nachbarrechtecks gehalten werden. Der Knotengrad erhöht sich dadurch nur um den additiven Term MaxPeers−1. Beim Routing kann nun immer der Nachbarpeer mit der niedrigsten Latenz gewählt werden4 . Zusätzlich zur Latenzoptimierung wird die Robustheit erhöht, da nun, statt nur einem Peer, MaxPeers Peers eine Kopie des Datums bereitstellen. Außerdem verringert sich der Netzwerkdurchmesser, da mehr Peers das Netzwerk betreten müssen, bis ein Rechteck unn terteilt wird. So besteht ein CAN mit n Peers nur noch aus M axP eers Rechtecken. Eine weitere Möglichkeit, die Latenzzeiten zu reduzieren, ist, die Netzwerkstruktur an die topologische Struktur des Internets anzupassen. Dies ist allerdings zur Zeit nicht trivial, da es schwierig ist, Ortsinformationen über z.B. die IP-Adresse herauszufinden. 3.5 Zusammenfassung Die Entwicklung des Content-Adressable Network war in der Weiterentwicklung der P2PNetzwerke ein großer Schritt nach vorne. Zum ersten Mal wurde das Konzept der Distributed Hash Tables in einem P2P-Netzwerk verwendet und so konnte garantiert werden, dass ein Datum, das im Netzwerk vorhanden ist, auch gefunden wird. Zudem ist das CAN sehr gut skalierbar, da der Knotengrad konstant und unabhängig von der Anzahl der teilnehmenden 4 Die Latenz im Internet kann über ICMP Echo Requests ermittelt werden. 70 Andreas Vogelsang Peers ist und der Netzwerkdurchmesser bei einem 2-dimensionalen CAN mit n Teilnehmern √ nur bei O( n) liegt. Mit Hilfe von Verbesserungen kann die durchschnittliche Pfadlänge sogar auf O(log n) verringert werden. Allerdings ist dann der Knotengrad nicht mehr unabhängig von der Anzahl der Teilnehmer [7]. Trotzdem konnte sich das CAN in der Praxis nicht durchsetzen, da kurze Zeit später mit Chord [9] und Pastry [10] P2P-Netzwerke vorgestellt wurden, die noch bessere Werte bezüglich Knotengrad und Routing Zeit aufwiesen. Ein weiterer Nachteil, den alle P2P-Netzwerke haben, in denen Daten mittels einer Hash Funktion zufällig verteilt werden, ist, dass eine bestehende Ordnung auf den Daten (z.B. eine lexikographische Ordnung nach Dateinamen) nicht erhalten bleibt. Bereichsanfragen sind dadurch nicht sehr effizient. Auf diese Problemstellung wird im zugehörigen Seminar eingegangen. Literaturverzeichnis 1. Bittorrent.org (2006) Bittorrent Protocol Specification. http://bittorrent.org/protocol.html 2. Baset SA, Schulzrinne H (2004) An analysis of the skype peer-to-peer internal telephony protocol. http://arxiv.org/abs/cs/0412017 3. Clarke I, Sandberg O, Wiley B, Hong TW (2000) Freenet: A distributed anonymous information storage and retrieval system. In: International Workshop on Design Issues in Anonymity and Unobservability. 311–320 4. ipoque GmbH (2007) Internetstudie 2007. Die Auswirkungen von P2P-Filesharing, Voice over IP, Skype, Joost, Instant Messaging, One-Click Hosting und Mediastreaming wie YouTube auf das Internet. http:// www.ipoque.de/userfiles/file/p2p_study_2007_abstract_de.pdf 5. Mahlmann P, Schindelhauer C (2007) Peer-to-Peer-Netzwerke. Springer, Berlin Heidelberg New York 6. Clip2 (2001) The Gnutella Protocol Specification v0.4. http://www9.limewire.com/developer/gnutella_protocol_0.4.pdf 7. Ratnasamy S, Francis P, Handley M, Karp R, Shenker S (2001) A scalable content-adressable network In: Computer Communication Review. Volume 31., Dept. of Elec. Eng. and Comp. Sci., University of California, Berkeley 161–172 8. Mahlmann P, Schindelhauer C (2004) Algorithmen für Peer-to-Peer-Netzwerke, Vorlesungsskript, Universität Paderborn. http://wwwcs.upb.de/cs/ag-madh/WWW/Teaching/2004SS/AlgoP2P/Skript/skript-04-4.pdf 9. Stoica I, Morris R, Karger D, Kaashoek F, Balakrishnan H. (2001) Chord: A scalable Peer-to-Peer lookup service for internet applications. In: Guerin R, ed.:Proceedings of the ACM SIGCOMM 2001 Conference (SIGCOMM-01). Volume 31, 4 of Computer Communication Review., New York, ACM Press 149–160 10. Plaxtron CG, Rajaraman R, Richa A (1997) Accessing nearby copies of replicated objects in a distributed environment. In: 9th Annual Symposium om Parallel Algorithms and Architectures (SPAA ’97), New York, Association for Computer Machinery 311–320 Eine Einführung in kinetische Datenstrukturen Peter Kling Universität Paderborn Zusammenfassung. Zu vielen Problemen gibt es heutzutage effiziente Algorithmen, die diese lösen und dem Nutzer bestimmte Attribute — wie z.B das nächste Paar einer Punktemenge im Raum — berechnen. In modernen Anwendungen müssen solche statischen Probleme im Allgemeinen nicht nur einmal gelöst werden. Vielmehr werden sie in kontinuierliche Problemstellungen übertragen, indem die gegebene Problematik über die Zeit animiert wird. Diese kontinuierliche Problemstellung wirft neue Fragen auf, wie z.B. die Häufigkeit einer notwendigen Neuberechnung solcher Attribute. Die hier vorgestellte Idee der kinetischen Datenstrukturen versucht ein allgemeines Konzept aufzubauen, um diesem Übergang von einer statischen in eine kontinuierliche Situation gerecht zu werden. 1 Einführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 1.2 Aufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 2 Unterschiede zum klassischen Ansatz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 3 Kinetische Datenstrukturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 3.1 Grundaufbau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 3.2 Begriffe und Definitionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 4 Anwendung kinetischer Datenstrukturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 5 Davenport-Schinzel Sequenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 5.1 Definitionen und Begriffe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 5.2 Verbindung zu kinetischen Prioritätswarteschlangen . . . . . . . . . . . . . . . . . . . . . . . . . . 84 6 Fazit und Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 1 Einführung Dieses Kapitel soll dem Leser eine Idee davon geben, was kinetische Datenstrukturen prinzipiell darstellen und deren Nutzen motivieren. Anschließend wird der Aufbau dieser Arbeit erläutert. 72 Peter Kling 1.1 Motivation Die Modellierung realer Probleme erfordert häufig kontinuierliche Modelle. Diese enthalten ihrer Natur nach eine überabzählbare Menge an Informationen. Als Anwender ist man aber meist nur an einigen wenigen Attributen interessiert. So möchte man bei der Simulation eines Autorennens beispielsweise die aktuelle Position der einzelnen Fahrer, deren Geschwindigkeit oder den Erstplatzierten kennen. Wie man an diesem einfachen Beispiel bereits sieht, können solche Attribute ganz unterschiedlicher Natur sein. Während die Geschwindigkeit der einzelnen Fahrer kontinuierlich von der Zeit abhängt, ist das Attribut „Erstplatzierter“ während der gesamten Simulation nur endlich vielen Änderungen unterworfen. Es ist also diskret. Insbesondere bei diskreten Attributen kann man den Effekt der zeitlichen Kohärenz 1 ausnutzen. Kinetische Datenstrukturen stellen ein Konzept dar, bestimmte Attribute solch kontinuierlicher Modelle zu berechnen und während der betrachteten Zeitspanne aufrecht zu erhalten. Obwohl sich der Ansatz dabei auf diskrete Attribute konzentriert, ist zu bedenken, dass man kontinuierliche Attribute oft durch eine diskrete Beschreibung ausdrücken kann. So kann die Bahn eines sich bewegenden Objektes beispielsweise durch Trajektorien2 analytisch beschrieben werden. Diese Trajektorien können diskret angegeben werden (siehe Abbildung 1). Eine Änderung der Trajektorie kann dann über eine kinetische Datenstruktur als diskretes Attribut verwaltet werden. y x Abb. 1. Kontinuierliche Objektbahn als diskretes Attribut (Funktionsgleichung): τ : R → R2 , (sin(t), cos(t)). t 7→ 1.2 Aufbau Vor einer formalen Einführung der Begrifflichkeit, werde ich in Abschnitt 2 zunächst eine kurze Erläuterung eines klassischen Lösungsansatzes geben und diesen mit der Idee kinetischer Datenstrukturen vergleichen. In Abschnitt 3 folgt die formale Einführung, welche anschließend in Abschnitt 4 anhand eines Beispiels vertieft wird. Abschnitt 5 stellt einige wichtige Begriffe und Ergebnisse zur Verfügung, welche in der Analyse des Beispiels 1 2 Zeitliche Kohärenz im Diskreten beschreibt den Effekt, dass ein Attribut zu einem Großteil der Simulation seinen Wert nicht ändert. Bahnkurven Eine Einführung in kinetische Datenstrukturen 73 gebraucht werden, allerdings nicht spezifisch für kinetische Datenstrukturen sind. Abschließend folgt in Abschnitt 6 eine kurze Zusammenfassung der Ergebnisse sowie ein Ausblick auf fortgeschrittenere Anwendungen. 2 Unterschiede zum klassischen Ansatz Ein typisches Einsatzgebiet kinetischer Datenstrukturen stellt die Simulation kontinuierlicher Systeme dar. Jedoch gibt es natürlich auch einen klassischen Ansatz zur Simulation solcher Systeme. Im Folgenden sollen beide Ansätze verglichen werden. Außerdem wird der Unterschied zwischen kinetischen und dynamischen Datenstrukturen erläutert werden. Klassische Simulation Der klassische Ansatz ein System zu simulieren, welches zeitlichen Veränderungen ausgesetzt ist, basiert auf einer einfachen Diskretisierung der Zeit sowie auf der Annahme, dass bei kleiner Diskretisierung eine starke zeitliche Kohärenz vorliegt. Wir betrachten als Beispiel ein System sich in der Ebene bewegender Objekte (vgl. Abbildung 2). Die Objekte bewegen sich mit konstanter Geschwindigkeit in verschiedene Richtungen. Wir können die Position der Objekte zu einem beliebigen Zeitpunkt anhand dieser Daten und einer gegebenen Ausgangslage bestimmen. Nun wählt man eine globale Zeiteinheit ∆t, welche die Granularität der Simulation bestimmt. Nach jeder vergangenen Zeiteinheit werden die Positionen der Objekte neu berechnet. Wie in Abbildung 2 zu sehen ist, kann es dabei zu einer Kollision kommen. In diesem Fall müssen die Bewegungsvektoren neu berechnet werden. Die Genauigkeit der Simulation hängt hierbei stark von der Wahl der Zeiteinheit ab: je größer man ∆t wählt, desto geringer wird die zeitliche Kohärenz. Man übersieht bestimmte Systemänderungen (vgl. Abbildung 3). Eine zu kleine Wahl führt dazu, dass ein Großteil der Simulationszeit für unwichtige Berechnungen verschwendet wird. y y x Abb. 2. Bei richtiger Wahl von ∆t kommt es zur Kollision. x 74 Peter Kling y y x x Abb. 3. Wählt man ∆t zu groß, wird die Kollision „übersehen“. Bedenkt man, dass in vielen Simulationen die Trajektorien von Objekten und deren Zusammenwirkung durch Differentialgleichungen gegeben sind, zeigt sich ein Vorteil dieser Art der Simulation: Differentialgleichungen müssen im Allgemeinen numerisch gelöst werden, was durch eine feine Diskretisierung der Zeit geschieht. Die Feinheit dieser Diskretisierung kann nun natürlich auch als globale Zeiteinheit genutzt werden. Kinetische Simulation Eine Simulation mit Hilfe einer kinetischen Datenstruktur verfolgt einen lokaleren Ansatz. Im klassischen Ansatz wird durch die global gegebene Zeiteinheit jedes Objekt gleich behandelt. Man stelle sich eine Szene mit einer Schildkröte und einer Gewehrkugel vor. Die Gewehrkugel soll eine Fensterscheibe zerschlagen. Es stellt sich die Frage nach der Wahl von ∆t. Die schnelle Gewehrkugel benötigt offenbar ein sehr kleines ∆t – bei zu großer Wahl würde sie durch die Fensterscheibe hindurch fliegen, ohne diese zu zerstören. Ein kleines ∆t bedeutet aber unnötig viel Simulationsaufwand für die langsame Schildkröte. Im Grunde hat man bei der numerischen Lösung von Differentialgleichungen das selbe Problem. Deshalb werden hier adaptive Verfahren genutzt, die versuchen die Größe der Zeiteinheit an die aktuelle Situation anzupassen. Kinetische Datenstrukturen bieten einen ähnlichen Ansatz, arbeiten allerdings ereignisbasiert. Statt eine globale Zeiteinheit festzulegen und nach jedem Zeitschritt alle betrachteten Attribute auf Änderungen zu überprüfen, wird eine Ereignis-Warteschlange erstellt. Diese enthält Ereignisse in der Zukunft, die es abzuarbeiten gilt und welche wiederum neue Ereignisse auslösen können. Ein Ereignis tritt ein, wenn sich ein Attribut ändert. Die Leistung kinetischer Datenstrukturen besteht hierbei in der effizienten Verwaltung und Aufrechterhaltung der dazu notwendigen Datenstrukturen. Es ist wichtig zu bemerken, dass an dieser Stelle eine schwerwiegende und weitreichende Voraussetzung an das Anwendungsgebiet gestellt wird. Die zu berechnenden – also interessanten – Ereignisse liegen in der Zukunft. Die Berechnung der Eintrittspunkte solcher Ereignisse ist im Allgemeinen nicht trivial, oft sogar nicht möglich. Eine Möglichkeit mit Eine Einführung in kinetische Datenstrukturen 75 solchen Situationen dennoch umzugehen, besteht darin geeignete Approximationen zu verwenden. Kinetik vs. Dynamik Kinetik und Dynamik sind zwei eng zusammenhängende Begriffe. Umso wichtiger ist es, sich klar zu machen wo der Unterschied zwischen kinetischen und dynamischen Datenstrukturen liegt. Während kinetische Datenstrukturen helfen sollen, bestimmte Attribute eines Systems über eine zeitliche Veränderung aufrecht zu erhalten, befassen sich dynamische Datenstrukturen mit der Problematik einen gegebene Datensatz an eine Veränderung des Systems anzupassen. Typische Beispiele für dynamische Datenstrukturen sind sortierte Folgen, welche die Sortierung beim Einfügen oder Entfernen eines Elementes aufrecht erhalten. Der Unterschied wird besonders deutlich, wenn man kinetische Datenstrukturen betrachtet, die zusätzlich dynamische Eigenschaften haben. Neben der allgemeinen zeitlichen Veränderung der Attribute eines Systems können hier Objekte das System betreten oder verlassen. In Abschnitt 3.2 wird der Begriff (δ, n, m)-Szenario eingeführt werden, in dem derartige dynamische Effekte eine Rolle spielen. Auch in der Analyse des Kinetic Tournament in Abschnitt 4 werden dynamische Effekte — anhand solcher (δ, n, m)-Szenarien — berücksichtigt werden. Für eine genauere Beschreibung sei hier auf die Begriffserklärungen in Abschnitt 3.2 verwiesen. 3 Kinetische Datenstrukturen Es soll nun eine formalere Definition kinetischer Datenstrukturen gegeben werden. Dazu wird zunächst der grundlegende Aufbau einer kinetischen Datenstruktur erläutert sowie ein Überblick über den Ablauf einer Simulation anhand einer kinetischen Datenstruktur gegeben. Anschließend werden einige Begriffe definiert und teilweise an Beispielen näher erläutert. 3.1 Grundaufbau Kinetische Datenstrukturen sollen also ausgewählte diskrete Attribute in einem kontinuierlichen System aufrecht erhalten. Für ein gegebenes Attribut, welches in der kinetischen Datenstruktur verwaltet werden soll, besteht das grundsätzliche Verfahren der Kinetisierung im wesentlichen aus folgenden Schritten: 1. Betrachte einen (statischen) Algorithmus zur Berechnung des Attributes. 2. Umwandlung des Algorithmus in einen Gültigkeitsbeweis für das Attribut. 3. „Animieren“ des Beweises. Der letzte Punkt enthält den Kerngedanken kinetischer Datenstrukturen: es reicht nicht, einen Beweis dafür zu haben, dass ein aktueller Attributwert korrekt ist. Vielmehr muss erkannt werden, wann so ein Beweis fehlschlägt (also sich das betrachtete Attribut verändert hat3 ) und der Beweis muss an die sich veränderten Verhältnisse angepasst werden. Die Kunst 3 Oder besser noch: wann es fehlschlagen wird! 76 Peter Kling besteht gerade darin, Beweise zu finden, mit denen man diese beiden Kriterien effizient erfüllen kann4 . Eine Kinetische Datenstruktur bietet dem Benutzer zwei fundamentale Operationen zum Zugriff auf die verwalteten Daten: query Die query-Operation dient der Rückgabe eines bestimmten Attributes. update Die update-Operation aktualisiert den internen Zustand der kinetischen Datenstruktur. Die zwei wesentlichen strukturellen Komponenten einer kinetischen Datenstruktur sind die Gültigkeitsbeweise der Attribute sowie die Ereigniswarteschlange. Nach der Erstellung des Gültigkeitsbeweises — welcher aus sogenannten Zertifikaten besteht — wird berechnet, wann und aus welchem Grund er als nächstes Fehlschlagen wird. Diese Ereignisse werden in der Ereigniswarteschlange verwaltet und nach und nach abgearbeitet. Dabei kann ein Ereignis wiederum neue Ereignisse auslösen. Der Ablauf ist in Abbildung 4 verdeutlicht. Gültigkeitsbeweis Ereignis Zertifkat Fehlschlag Aktualisierung Beweis Aktualisierung update Attribut Aktualisierung Abb. 4. Ablauf der Simulation mit Hilfe einer kinetischen Datenstruktur. 3.2 Begriffe und Definitionen Gegeben sei ein zu simulierendes System mit einer Objektmenge S. Das System kann zu einem bestimmten Zeitpunkt t ∈ R≥0 durch eine Funktion π : S → V beschrieben werden, die jedem Objekt aus S eine Position im betrachteten Vektorraum V zuordnet (z.B. V = R2 ). Wir bezeichnen π als Konfiguration und Π := {π|π ist Konfiguration} als die Menge aller Konfigurationen. Wir beginnen mit der Definition von Attributen: 4 In diesem Zusammenhang spricht man auch von einem Beweisschema; es handelt sich eher um einen „Bauplan“ für einen Beweis als um einen Beweis selbst. Eine Einführung in kinetische Datenstrukturen 77 Definition 1 (Attribut). Ein Attribut ist eine Funktion, die einer Konfiguration π ∈ Π eine kombinatorische Beschreibung zuordnet. Attribute beschreiben also diskrete5 Eigenschaften des Systems zu einem bestimmten Zeitpunkt. Beispiele für Attribute sind z.B. das nächste Paar oder die konvexe Hülle einer Punktmenge (siehe Abbildung 5). a b c d e Abb. 5. Attribut „nächstes Paar“: (c, d); Attribut „konvexe Hülle“: (a, e, b) Um die Gültigkeit von Attributen zu untersuchen, werden sogenannte Zertifikate eingeführt. Sie dienen der Überprüfung bestimmter Eigenschaften für ein k-Tupel s ∈ S k (k ∈ N) von Objekten. Definition 2 (Zertifikat). Zertifikate sind Funktionen zs : Π → R und können drei verschiedene Zustände beschreiben. Ein Zertifikat zs : Π → R heißt: • gültig für eine Konfiguration π ∈ Π, falls zs (π) > 0 gilt • ungültig für eine Konfiguration π ∈ Π, falls zs (π) < 0 gilt • degeneriert für eine Konfiguration π ∈ Π, falls zs (π) = 0 gilt Man beachte, dass ein Zertifikat immer bezüglich bestimmter Objekte definiert ist. Sie sind die Grundbausteine für die Gültigkeitsbeweise von Attributen. Definition 3 (Gültigkeitsbeweis). Ein Gültigkeitsbeweis L ist eine endliche Menge von Zertifikaten6 . Wir bezeichnen L als gültig für eine Konfiguration π, falls alle z ∈ L gültig in π sind. Ist ein z ∈ L ungültig (degeneriert), so bezeichnen wir ganz L als ungültig (degeneriert). Gültigkeitsbeweise dienen der Zertifizierung von Attributen. Sie machen also eine Aussage über die Gültigkeit eines Attributwertes. Es gibt zwei verschiedene Arten von Gültigkeitsbeweisen. Zu deren Erläuterung wird allerdings zunächst folgender Begriff benötigt: Definition 4 (Szenario). Ein Szenario (πt )t∈[0,1] ist ein Weg7 im Konfigurationsraum Π. 5 6 7 Diskret in dem Sinne, dass sich die kombinatorische Beschreibung während der Simulation nur endlich oft ändert. Man kann L auch als Funktion Π → Rd auffassen, wobei d die Anzahl der Zertifikate des Gültigkeitsbeweises beschreibt. Ein Weg ist eine auf einem geschlossenen Intervall (hier [0, 1]) definierte stetige Abbildung. 78 Peter Kling Ein Szenario beschreibt also stetige Bewegungen der Objekte. Man sagt nun ein Gültigkeitsbeweis L zertifiziert ein Attribut A in einer Konfiguration π: • stark, falls ∀π 0 ∈ Π : L gültig für π 0 ⇒ A(π) = A(π 0 ). • schwach, falls für alle Szenarien (πt )t∈[0,1] mit π0 = π und L ist gültig für alle πt gilt: A(πt ) = A(π) ∀t ∈ [0, 1]. In beiden Fällen muss L auch gültig für die Konfiguration π sein. Anschaulich lassen sich diese Begriffe anhand von Abbildung 6 erklären. Wir bezeichnen die Menge ML = {π ∈ Π|L ist gültig für π} als die Menge der von L induzierten Konfigurationen. Abb. 6. Die markierten Bereiche stellen die durch L induzierten Konfigurationen dar. Starke Zertifizierung bedeutet, dass A in allen von L induzierten Konfigurationen den selben Wert annimmt, also auf ganz ML konstant ist. Schwache Zertifizierung hingegen benötigt nur, dass A auf einem 8 wegzusammenhängenden Teilgebiet von ML konstant ist. Im Verlauf der Simulation kann es theoretisch vorkommen, dass mehrere Ereignisse gleichzeitig eintreffen. Dies erschwert Analyse und Implementierung, da das Verhalten in diesem Fall undefiniert ist. Deshalb wollen wir nur Konfigurationen betrachten, die in allgemeiner Lage sind: Definition 5. Wir sagen eine Konfiguration befindet sich in in allgemeiner Lage, wenn in dieser Konfiguration höchstens eines der betrachteten Zertifikate degeneriert ist. Degenerierte Zustände von Zertifikaten sind gerade die interessanten Momente. Hier kann sich der Wert eines bestimmten Attributes ändern. Durch die Beschränkung auf diese Art von Konfigurationen9 kann Mehrdeutigkeit vermieden werden. Ein weiterer zentraler Begriff ist der des Beweisschemas: 8 9 Und zwar auf dem, das die Konfiguration π enthält. Diese Annahme ist durchaus vertretbar, da in einem kontinuierlichen System bereits eine infinitesimale Änderung ausreichen wird, um die degenerierten Zertifikate zu trennen. Eine Einführung in kinetische Datenstrukturen 79 Definition 6 (Beweisschema). Ein Beweisschema für ein Attribut A weißt allen Konfigurationen in allgemeiner Lage einen Gültigkeitsbeweis zu, der A in der jeweiligen Konfiguration zertifiziert (stark oder schwach). Ein Beweisschema erlaubt es uns also Gültigkeitsbeweise für Attribute und Konfigurationen zu „erstellen“. Die nächsten beiden Begriffe sind zentrale Gesichtspunkte in der Analyse kinetischer Datenstrukturen, da sie gewisse Aspekte der Effizienz eben dieser beschreiben. Definition 7 (Lokalität). Die Lokalität eines Beweisschemas beschreibt die maximale Anzahl an Zertifikaten, an denen ein beliebiges Objekt in einem Gültigkeitsbeweis des Schemas beteiligt ist. Mit diesem Begriff kann der Aufwand beschrieben werden, der nötig ist um den Zustand der kinetischen Datenstruktur an die Änderung einer Trajektorie10 anzupassen. Ist L die Lokalität des verwendeten Beweisschemas und beschreibt c die Kosten ein Element aus der Ereigniswarteschlange zu entfernen und hinzuzufügen, so ist dieser Aufwand gegeben durch O(cL). Definition 8 (Antwortzeit). Beschreibt die worst-case Berechnungszeit, um ein Ereignis aus der Ereigniswarteschlange vollständig zu bearbeiten. Dies umfasst insbesondere die Anpassung des aktuellen Gültigkeitsbeweises und die nötigen Aktualisierungen in der Ereigniswarteschlange selbst. Im Hinblick auf die Analyse kinetischer Datenstrukturen ist es notwendig, die Szenarien, insbesondere die Art der zugelassenen Trajektorien, genauer zu beschreiben. Wir werden uns deshalb in der Analyse auf folgende Szenarien-Klassen einschränken: Definition 9 ((δ, n)-Szenario). Ein Szenario (πt )t∈[0,1] bezüglich n Objekten, so dass die Trajektorie t 7→ πt (s) eines Objektes s ein Vektor von Polynomen in t vom Grade höchstens δ ist, heißt (δ, n)-Szenario. Definition 10 ((δ, n, m)-Szenario). (δ, n, m)-Szenarien beschreiben ein dynamisches Szenario, d.h. die beteiligten Objekte bewegen sich nicht nur, sondern es können auch Objekte hinzugefügt oder entfernt werden. Zur Modellierung erweitern wir den Vektorraum V um ein Sondersymbol ω. Ein Objekt s mit π(s) = ω in einer Konfiguration π wird als nicht sichtbar betrachtet. Ein Szenario (πt )t∈[0,1] auf einer Objektmenge S mit Positionen in R ∪ {ω} ist ein (δ, n, m)-Szenario, falls: • ∀s ∈ S ist γs : t 7→ πt (s) auf allen Intervallen I ⊆ [0, 1] mit ω ∈ / γs (I) ein Polynom vom Grade höchstens δ P • / γs (I)}| = m s∈S |{I ⊆ [0, 1]|I ist maximales Intervall mit ω ∈ • |{s ∈ S|πt (s) 6= ω}| ≤ n ∀t ∈ [0, 1] In einem (δ, n, m)-Szenario dürfen also maximal n Objekte gleichzeitig sichtbar sein, und es gibt insgesamt m verschiedene Bewegungsabschnitte, auf denen die Trajektorien Polynome sind. In der Analyse gehen wir bei (δ, n, m)-Szenarien davon aus, dass m = |S| 10 z.B. nach einer Kollision zweier Objekte 80 Peter Kling gilt, also m der Anzahl aller betrachteten Objekte entspricht. Damit ist jedes Objekt in genau einem Zeitintervall sichtbar11 . Anhand dieser Typen von Szenarien kann man die Effizienz einer kinetischen Datenstruktur analysieren. Darunter verstehen wir die gesamten Berechnungskosten, welche bei der Simulation eines gegebenen Szenarios anfallen. 4 Anwendung kinetischer Datenstrukturen Es soll nun eine einfache eindimensionale Anwendung für kinetische Datenstrukturen untersucht werden. Wir betrachten für eine endliche Menge S von reellen Zahlen das MaximumAttribut. Ausgehend von einem statischen Lösungsansatz konstruieren wir eine kinetische Variante, die das Maximum der Menge S über zeitliche Änderungen hinweg aufrecht erhält. Eine solche kinetische Datenstruktur bezeichnen wir als kinetische Prioritätswarteschlange. Die hier vorgestellte kinetische Prioritätswarteschlange heißt Kinetic Tournament. Kinetic Tournament Ausgangspunkt ist ein rekursiver Algorithmus zur Berechnung des Maximums (siehe Algorithmus 6). Die Ausgangsmenge S wird in zwei in etwa gleich große Hälften geteilt, auf denen rekursiv das Maximum bestimmt wird. Die Ergebnisse werden schließlich verglichen und das größere von beiden zurück geliefert. Algorithmus 6 RecursiveMaximum(S = (s1 , s2 , . . . , sn )) 1: if n = 1 then 2: return s1 3: else 4: k = d n2 e 5: m1 = RecursiveMaximum(s1 , . . . , sk ) 6: m2 = RecursiveMaximum(sk+1 , . . . , sn ) 7: return max(m1, m2) Wir wollen zunächst ein geeignetes Beweisschema aus diesem Algorithmus extrahieren. Dazu stellen wir den Ablauf des Algorithmus in Form eines Turnierbaumes dar (siehe Abbildung 7). Um die Rundungsoperation in Zeile 4 in der Analyse zu vermeiden, füllen wir die Objektmenge S mit dem Sentinel −∞ solange auf, bis |S| eine Zweierpotenz ist. So ein Turnierbaum beschreibt für eine gegebene Objektmenge, wie die einzelnen Vergleiche im Algorithmus (Zeile 7) jeweils ausfallen. Jeder innere Knoten zusammen mit seinen zwei Kindern entspricht dabei genau einem Aufruf von Zeile 7 und je tiefer im Baum der Knoten liegt, desto größer ist die Rekursionstiefe des zugehörigen Aufrufes. Das Ergebnis des Vergleichs der beiden Kinderknoten wird im Vaterknoten gespeichert. Die Wurzel des Baumes stellt schließlich das Maximum der Objektmenge dar. Ein Turnierbaum kann nun offensichtlich als Gültigkeitsbeweis für die kinetische Prioritätswarteschlange benutzt werden. Die einzelnen Zertifikate entsprechen den inneren Knoten 11 Dies vereinfacht die Analyse, ohne tatsächlich eine Einschränkung darzustellen: schließlich kann man einfach verschiedene Objekte identifizieren und so auch Objekte betrachten, welche mehrmals auftauchen und wieder verschwinden. Eine Einführung in kinetische Datenstrukturen 81 b b a c b c -∞ Abb. 7. Ein Turnierbaum (mit Sentinel) für S = {a, b, c} und a < b, c < b. des Baumes, genauer gesagt dem Vergleich der beiden Kinder so eines Knotens. Zusammen beschreiben diese inneren Knoten das Maximum offensichtlich eindeutig, es handelt sich hierbei also um Gültigkeitsbeweise mit starker Zertifizierung (vgl. Abschnitt 3.2). Es ist zu bemerken, dass der Turnierbaum innerhalb eines Szenarios immer der gleiche ist; verschiedene Gültigkeitsbeweise innerhalb eines Szenarios unterscheiden sich nur im Inhalt der Knoten. Die beschriebene Konstruktion des Turnierbaumes ergibt ein Beweisschema, erlaubt sie es doch für jede Konfiguration (in allgemeiner Lage) einen entsprechenden Gültigkeitsbeweis anzugeben. Die darauf basierende kinetische Datenstruktur wollen wir im Folgenden als Kinetic Tournament bezeichnen. Nun können wir bereits zwei einfache Ergebnisse festhalten: Lemma 1. Das oben beschriebene Beweisschema hat Lokalität O(log(n)) und Größe12 O(n). Beweis. Bei einem Turnierbaum handelt es sich offenbar um einen ausgeglichenen binären Baum mit O(n) Blättern und Höhe blog(n)c. Die Zertifikate eines beliebigen Gültigkeitsbeweises, also eines Turnierbaumes, sind gerade dessen inneren Knoten. Die Anzahl an Knoten eines ausgeglichenen binären Baumes ist O(n), folglich ist auch die Größe des Beweisschemas linear in n. Jedes Objekt o ∈ S ist durch ein Blatt des Turnierbaumes gegeben. Die Zertifikate, an denen dieses Objekt beteiligt ist, sind gerade alle Zertifikate auf dem Pfad vom zugehörigen Blatt zur Wurzel, für die das Objekt das Maximum darstellt. Die Länge dieses Pfades ist durch die Höhe des Baumes beschränkt. Folglich ist die Lokalität O(log(n)). u t Die Größe des Beweisschemas liefert uns gleichzeitig die maximale Anzahl an Elementen, die in der Ereigniswarteschlange verwaltet werden müssen. Ein Ereignis kann schließlich nur durch den Fehlschlag eines Zertifikates ausgelöst werden. Insbesondere erhalten wir folgendes Ergebnis: Korollar 1. Die Größe der Ereigniswarteschlange ist linear in n. Insbesondere benötigt das Hinzufügen bzw. Entfernen eines Ereignisses in die Ereigniswarteschlange Aufwand O(log(n)). 12 Die Größe eines Beweisschemas ist die maximale Anzahl an Zertifikaten in einem Gültigkeitsbeweis des Beweisschemas. 82 Peter Kling Die Effizienz einer mit diesem Beweisschema ausgestattete kinetische Datenstruktur soll im Folgenden anhand eines (δ, n, m)-Szenarios analysiert werden. Falls ein Objekt unsichtbar wird, ersetzen wir es im Baum durch den Sentinel −∞. Wird ein Objekt sichtbar, ersetzen wir ein beliebiges Blatt mit Inhalt −∞ durch das Objekt13 . Zunächst untersuchen wir die Antwortzeit dieser Datenstruktur. Lemma 2. Kinetic Tournament hat Antwortzeit O(log2 (n)). Beweis. Ein Ereignis bedeutet das Fehlschlagen von genau einem Zertifikat (Erinnerung: wir betrachten Konfigurationen in allgemeiner Lage). Das heißt, dass sich das Ergebnis des Vergleichs am zugehörigen inneren Knoten v möglicherweise verändert hat. Das neue Maximum muss im Turnierbaum weiter nach oben propagiert werden. Insbesondere müssen nur Knoten auf dem Pfad von v zur Wurzel aktualisiert werden. Die Anzahl der Aktualisierungen liegt also in O(log(n)). Jeder solchen Aktualisierung entspricht das Entfernen und Hinzufügen je eines Ereignisses in die Ereigniswarteschlange, was wiederum Zeit O(log(n)) benötigt (Korollar 1). Zusammen ergibt sich die Antwortzeit zu O(log2 (n)). t u Nun wollen wir die Effizienz des Kinetic Tournament untersuchen. Wir greifen dazu auf die Davenport-Schinzel Sequenzen zurück. Für den geneigten Leser enthält Abschnitt 5 die nötigen Definitionen sowie einige wichtige Ergebnisse, die im Folgenden benutzt werden. Zum Verständnis sollte man insbesondere Definition 13 sowie Korollar 3 beachten. Theorem 1. Kinetic Tournament hat in einem (δ, n, m)-Szenario Effizienz O(λδ+2 (m) log2 (n)). Beweis. Wir müssen die gesamten anfallenden Berechnungskosten für das betrachtete Szenario abschätzen. Das Eintreten eines Ereignisses führt zu der Aktualisierung des derzeitigen Gültigkeitsbeweises. Wie im Beweis von Lemma 2 gezeigt wurde, bedeutet eine solche Aktualisierung die Änderung von (möglicherweise mehreren) Zertifikaten. Betrachtet man den Turnierbaum, entspricht eine solche Zertifikatänderung dem Wechsel des Inhaltes an einem inneren Knoten. Jede solche Zertifikatänderung bewirkt wiederum die Entfernung und Hinzufügung eines Ereignisses in der Ereigniswarteschlange. Es wird nun gezeigt, dass die Anzahl µ der Änderungen in allen Knoten des Baumes durch λδ+2 (m)blog(n)c beschränkt ist. Dies liefert schließlich zusammen mit Korollar 1 die Behauptung. Sei dazu zunächst v ein beliebiger Knoten des Turnierbaumes T und bezeichne Tv den in v gewurzelten Teilbaum von T . Mit µv wollen wir die Anzahl P der Änderungen des Inhaltes von v während des Szenarios bezeichnen (es gilt also µ = v∈T µv ). Es bezeichne Sv ⊆ S die Teilmenge der betrachteten Objekte, die während des gegebenen Szenarios in Tv auftauchen. Setze außerdem nv = |Sv |. Betrachtet man das Szenario eingeschränkt auf den Baum Tv und die zugehörige Objektmenge, stellt der Inhalt des Knotens v zu jedem Zeitpunkt das Maximum des eingeschränkten Szenarios dar. Nun liefert Korollar 3 aus Abschnitt 5.2 die Abschätzung: µv < λδ+2 (nv ) 13 (1) So ein Blatt existiert hier immer, da der Baum in einem (δ, n, m)-Szenario maximal n Blätter mit Wert 6= −∞ haben kann, und wir die restlichen Blätter anfangs mit Sentinels aufgefüllt haben. Eine Einführung in kinetische Datenstrukturen 83 P Bezeichnet L14i die Menge aller Knoten der Höhe i im Baum T , so gilt offensichtlich . Zusammen mit Gleichung (1) und Lemma 3 (aus Abschnitt 5.1) liefert v∈Li nv = m dies folgende Abschätzung für die Anzahl der Änderungen in allen Knoten der Höhe i: X µv < v∈Li X λδ+2 (nv ) ≤ λδ+2 (m) (2) v∈Li Summation über alle blog(n)c Ebenen des Turnierbaumes liefert damit µ ≤ blog(n)cλδ+2 (m). Zusammen mit den Kosten einer Zertifikatänderung (siehe Korollar 1) liegt die Effizienz damit schließlich in O(λδ+2 (m) log2 (n)). t u 5 Davenport-Schinzel Sequenzen Die Abschätzungen in der Analyse des Kinetic Tournament (siehe Abschnitt 4) machen Gebrauch von den sogenannten Davenport-Schinzel Sequenzen. Obwohl diese nicht spezifisch für kinetische Datenstrukturen sind, sollen sie der Vollständigkeit halber hier kurz vorgestellt und erläutert werden. Für eine detailliertere Untersuchung sei auf [1] verwiesen. 5.1 Definitionen und Begriffe Bevor die Davenport-Schinzel Sequenzen eingeführt werden können, benötigen wir zunächst folgenden Begriff: Definition 11. Sei σ = (σ1 , σ2 , . . . , σm ) eine endliche Folge in Z. Dann heißt σ nicht wiederholend, falls σi 6= σi+1 ∀1 ≤ i < m. Nun kann eine Davenport-Schinzel Sequenz wie folgt definiert werden: Definition 12. Seien n, s ∈ N und σ = (σ1 , σ2 , . . . , σm ) eine endliche Folge von natürlichen Zahlen mit σi ∈ {1, 2, . . . , n} ∀1 ≤ i ≤ m. Dann heißt σ eine (n, s)-Davenport-Schinzel Sequenz, falls jede sich nicht-wiederholende Teilfolge von σ bestehend aus maximal zwei unterschiedlichen Zahlen höchstens die Länge s + 1 besitzt. Es mag zunächst fraglich erscheinen, inwiefern dieser Begriff bei einer Abschätzung im Zusammenhang mit der kinetischen Prioritätswarteschlange behilflich sein kann. Tatsächlich ist es weniger die Davenport-Schinzel Sequenz an sich, die hier von Interesse ist. Vielmehr interessiert uns, wie lang eine solche Sequenz bei gegebenen Parametern höchstens werden kann. Definition 13. Es bezeichne λs (n) die Länge einer längsten (n, s)-Davenport-Schinzel Sequenz. Bevor der Zusammenhang mit der kinetischen Prioritätswarteschlange erläutert wird, soll noch folgendes Ergebnis festgehalten werden: 14 Ein Objekt wird genau für ein Zeitintervall sichtbar und kann von dem Blatt in dem es erscheint nur „nach oben“ wandern. Betrachtet man benachbarte Teilbäume, kann ein Objekt insbesondere nicht den Teilbaum wechseln. 84 Peter Kling Lemma 3. Seien s, n, m ∈ N. Dann gilt: λs (n) + λs (m) ≤ λs (n + m) Beweis. Man betrachtet dazu zwei Davenport-Schinzel Sequenzen die gerade Länge λs (n) bzw. λs (m) haben. Addition von n auf alle Komponenten der zweiten Folge und Konkatenation beider Folgen liefert eine (n+m, s)-Davenport-Schinzel Sequenz der Länge λs (n)+λs (m). Es folgt die Behauptung. t u 5.2 Verbindung zu kinetischen Prioritätswarteschlangen Die Abschätzungen aus Kapitel 4, welche auf die Davenport-Schinzel Sequenzen zurück greifen, schätzen ab wie oft bei einer gegebenen Familie (fi )ni=1 von Polynomfunktionen15 die Funktion, die das Maximum darstellt, wechseln kann. Dieser Abschnitt soll aufzeigen, wo genau in der Betrachtung der kinetischen Prioritätswarteschlange aus Kapitel 4 die Davenport-Schinzel Sequenzen ein Rolle spielen. Definition 14. Sei (fi )i∈I eine Familie von Funktionen der Form fi : Rd → R (d ∈ N, I Indexmenge). Dann heißt F := supi∈I (fi ) die obere Kontur (engl.: upper envelope) der Funktionenfamilie16 . Wir interessieren uns insbesondere für den Fall einer endlichen Indexmenge (also I = {1, 2, . . . , n} für ein n ∈ N) und dass alle fi Polynome in einer Variablen vom Grade höchstens δ ∈ N sind. Diese Situation liegt in einem einfachen eindimensionalen (δ, n)-Szenario (vgl. Abschnitt 3.2) vor: die Trajektorien der einzelnen Objekte entsprechen den Funktionen fi (vgl. Abbildung 8). Die obere Kontur der Trajektorien enthält offensichtlich die Information, welches Objekt zu welchem Zeitpunkt das Maximum darstellt. Vernachlässigt man die Zeiten, zu denen ein Wechsel stattfindet, kann die obere Kontur als endliche Indexsequenz codiert werden: die Folge gibt den Index der Funktion an, welche gerade das Maximum darstellt. Wie sich heraus stellt, ist so eine Indexsequenz für n Funktionen vom Höchstgrad δ gerade eine (n, δ)-Davenport-Schinzel Sequenz. Lemma 4. Sei (fi )ni=1 eine endliche Familie von n Funktionen wobei die Funktionen fi : R → R Polynome vom Grade höchstens δ seien. Weiterhin sei σ = (σ1 , σ2 , . . . , σr ) r ∈ N die Indexsequenz zur oberen Kontur von (fi )ni=1 . Dann ist σ eine (n, δ)-Davenport-Schinzel Sequenz. Beweis. Sei σ 0 eine beliebige, sich nicht wiederholende Teilfolge von σ bestehend aus maximal zwei unterschiedlichen Zahlen i und j. Es ist zu zeigen: σ 0 hat höchstens Länge δ + 1. Für i = j ist die Aussage trivial (da σ 0 nicht wiederholend ist). Sei also i 6= j. Betrachte die zu den Indizes gehörenden Funktionen fi und fj . Beides sind Polynome und haben höchstens Grad δ, d.h. fi − fj hat auch höchstens Grad δ und damit maximal δ Nullstellen. Folglich wechselt die Funktion, die max(fi , fj ) darstellt, höchstens δ-mal. Insbesondere können fi und fj in der oberen Kontur maximal δ-mal wechseln. D.h. σ 0 hat höchstens die Länge δ + 1. t u 15 16 Jede Funktion fi entspricht dabei gerade der Trajektorie eines Objektes. Analog kann die untere Kontur (engl.: lower envelope) definiert werden. Eine Einführung in kinetische Datenstrukturen 85 R f1 obere Kontur f2 f3 f4 0 1 Zeit Abb. 8. Funktionenfamilie (Trajektorien) mit oberer Kontur. Zugehörige Indexsequenz: (1, 2, 4) Damit stellt nun λδ (n) als maximale Länge einer (n, δ)-Davenport-Schinzel Sequenz insbesondere eine obere Schranke für die Anzahl der möglichen Änderungen des Maximums in einem (δ, n)-Szenario für kinetische Prioritätswarteschlangen dar. Korollar 2. In einer kinetischen Prioritätswarteschlange ist die Anzahl der Änderungen des Maximums in einem (δ, n)-Szenario durch λδ (n) beschränkt. Für den etwas komplizierteren Fall eines (δ, n, m)-Szenarios kann ein ähnliches Resultat erziehlt werden: Korollar 3. In einer kinetischen Prioritätswarteschlange ist die Anzahl der Änderungen des Maximums in einem (δ, n, m)-Szenario durch λδ+2 (m) beschränkt. Lemma 4 lässt sich nicht direkt auf diesen Fall übertragen. Probleme macht insbesondere die Tatsache, dass die Funktionen hier nur stückweise stetig sind. Folgende Beobachtungen helfen allerdings ein analoges Lemma zu beweisen, aus dem direkt Korollar 3 folgt: • Es sind genau m Trajektorien fi : R → R ∪ {ω} (1 ≤ i ≤ m) zu betrachten. • Jede Trajektorie fi ist auf genau einem Intervall I ungleich ω (die Zeitspanne, in der das zugehörige Objekt sichtbar ist). • Je zwei Trajektorien fi , fj (i 6= j) schneiden sich maximal δ-mal. Zusätzlich gibt es zwei weitere Stellen, an denen sich die obere Kontur hinsichtlich fi und fj ändern kann: der Zeitpunkt, zu dem die zweite Funktion sichtbar wird und der Zeitpunkt, zu dem die erste der beiden Funktionen wieder unsichtbar wird. Insgesamt hat man also höchstens δ + 2 viele Stellen, an denen die Funktion, die max(fi , fj ) darstellt, wechseln kann. Da der entsprechende Beweis mit diesen Beobachtungen analog zu dem von Lemma 4 geführt werden kann, wird hier auf ihn verzichtet. 86 Peter Kling 6 Fazit und Ausblick Ich habe in dieser Arbeit den Begriff der kinetischen Datenstruktur eingeführt und an einem eindimensionalen Beispiel — der kinetischen Prioritätswarteschlange — vorgestellt. Die vorgestellten Ergebnisse basieren dabei auf einer Arbeit von Julien Basch [2]. Gänzlich ausgelassen wurden bisher Beispiele höherer Dimension. Ein Beispiel für zweidimensionale Anwendungen sind z.B. die konvexe Hülle oder das nächste Paar einer Punktmenge in der Ebene (vgl. auch Abbildung 5). Einen detaillierteren Einblick in das Thema sowie eine Analyse solch höher dimensionaler Beispiele kann in [3] gefunden werden. Kinetische Datenstrukturen versprechen eine effiziente Möglichkeit viele (geometrische) Probleme in veränderlichen Systemen zu lösen. Die ereignisbasierte Arbeitsweise hat gegenüber der klassischen zeitbasierten Simulation den Vorteil, dass der Tradeoff zwischen Effizienz und Genauigkeit bei weitem nicht so stark ausgeprägt ist. Allerdings stellen kinetische Datenstrukturen auch hohe Anforderungen an das Anwendungsgebiet. So müssen für die hier beschriebenen Anwendungen die Trajektorien der Objekte im Voraus bekannt sein. Auch dürfen diese — um eine aussagekräftige Analyse durchführen zu können — nicht von beliebiger Gestallt sein, sondern sollten polynominell in dem Zeitparameter sein. Es soll aber nicht unerwähnt bleiben, dass man auch diese Probleme mit kinetischen Datenstrukturen adressieren kann. So können kompliziertere Trajektorien z.B. durch Spline-Interpolation (siehe [5]) stückweise durch Polynome beschrieben werden. Sind die Trajektorien nicht bekannt, kann versucht werden durch Extrapolation Schätzungen für zukünftige Ereignisse zu bestimmen. Tatsächlich handelt es sich bei dem vorgestellten Konzept nicht um ein rein theoretisches. So enthält beispielsweise die Bibliothek CGAL17 Implementierungen kinetischer Datenstrukturen für einige ein- bis dreidimensionale Probleme. Eine Beschreibung und Beispielanwendungen können in [4] gefunden werden. Literaturverzeichnis 1. Pankaj K. Agarwal and Micha Sharir (1995) Davenport-Schinzel sequences and their geometric applications. Technical Report DUKE-TR-1995-21, Department of Computer Science, Duke University 2. Julien Basch and Leonidas J. Guibas (1999) Kinetic data structures. 3. Sabine Naewe (2007) Kinetische Datenstrukturen für zweidimensionale Probleme. Seminararbeit, Universität Paderborn 4. Daniel Russel (2007) Kinetic data structures. In CGAL Editorial Board, editor, CGAL User and Reference Manual. 3.3 edition 5. Hans R. Schwarz and Norbert Koeckler (2004) Numerische Mathematik, Seiten 104–124, 5. überarbeitete Auflage Teuber 6. Cgal. Computational Geometry Algorithms Library. http://www.cgal.org. 17 Computational Geometry Algorithms Library, siehe [6]. Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie Linda Röhrkohl Universität Paderborn [email protected] Zusammenfassung. Das Steinerbaumproblem ist ein klassisches N P-vollständiges Problem der Graphentheorie. In dieser Ausarbeitung wird dieses Problem erläutert und eine vollständige Komplexitätsanalyse durchgeführt. Anschließend werden Spezialfälle des Steinerbaumproblems, allesamt bekannte graphentheoretische Probleme, motiviert und Algorithmen zu ihrer Lösung präsentiert. Desweiteren werden zwei Algorithmen untersucht, mit denen sich das Steinerbaumproblem exakt lösen lässt. Da diese Algorithmen für die meisten Probleminstanzen exponentielle Laufzeit besitzen, wird abschließend ein Approximationsalgorithmus mit Güte 2 vorgestellt. Durch wiederholende, grundlegende Definitionen, soll es auch den Lesern, die sich als Amateure auf dem Gebiet der theoretischen Informatik betrachten, möglich sein dem vermittelten Inhalt einfach zu folgen. 1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 2 Graphentheoretische Defintionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 3 Das Steinerbaumproblem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 4 Die Komplexität des Steinerbaumproblems . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 5 Spezialfälle des Steinerbaumproblems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 5.1 Das Problem des kürzesten Weges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 5.2 Minimale Spannbäume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 6 Exakte Algorithmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 6.1 Der Enumerations-Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 6.2 Die Idee des Dreyfus-Wagner Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 7 Approximationsalgorithmen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 7.1 Ein einfacher Algortihmus mit Approximationsgüte 2 . . . . . . . . . . . . . . . . . . . . . . . . . 102 7.2 Verbesserung der Laufzeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 8 Offene Fragen - Ein Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 1 Einleitung Das Steinerbaumproblem ist ein Problem der Graphentheorie. Es besitzt jedoch viele praktische Anwendungsbereiche, wie z.B. die Netzwerktheorie oder die Modernisierung von Streckennetzen. 88 Linda Röhrkohl Diese Ausarbeitung ist angelehnt an die Kapitel 1 bis 6 von [1]. Zur ersten Veranschaulichung des Steinerbaumproblems kann man als Beispiel den dreispurigen Ausbau eines vorhandenen zweispurigen Autobahnnetzes nennen. Da es aus Kostengründen nicht möglich ist alle Autobahnen dreispurig umzubauen, macht die Regierung die Einschränkung, dass es nur möglich sein solle, von jeder Großstadt in jede andere Großstadt über dreispurige Autobahnen zu gelangen. Für die Straßenplaner gilt es somit, die Verbindungen im Autobahnnetz zu identifizieren, über die man alle Großstädte erreichen kann und die alles in allem eine minimale Gesamtlänge besitzen. Denn nur so können die Kosten für das gesamte Projekt minimiert werden. Betrachtet man den Bereich der Netzwerktechnik, so kann man sich vorstellen, dass es verschiedene Teilnehmer gibt, die über ein Netzwerk miteinander kommunizieren wollen. Teilweise sind die Teilnehmer direkt miteinander vernetzt, es gibt aber auch Kreuzungspunkte in denen Leitungen von verschiedenen Teilnehmer zusammentreffen. Jeder Leitungabschnitt hat eine individuelle Übertragungszeit. Die Teilnehmer können Nachrichten, die sie von anderen Teilnehmern empfangen an andere Teilnehmer weiterleiten. Um die schnellste Kommunikation aller Teilnehmer untereinander zu ermöglichen, ist es nötig das Teilnetz zu finden, an dem alle Teilnehmer angeschlossen sind und das eine minimale Gesamtübertragungszeit unter allen möglichen Teilnetzen besitzt. 2 Graphentheoretische Defintionen Zunächst ist es nötig einige Begriffsklärungen vorzunehmen. In dieser Ausarbeitung werden stets ungerichtete Graphen betrachtet. Wird im Folgenden von einer Kante (x, y) oder einer Weglänge p(x, y) gesprochen, so impliziert dieses stets, dass auch die Kante (y,x) bzw. die Weglänge p(y,x) gemeint ist. Außerdem wird zwischen Graphen G = (V, E) und Netzwerken N = (V, E, l) unterschieden. Als Netzwerke werden hierbei gewichtete Graphen mit nichtnegativer Gewichtsfunktion l : E(N ) → R≥0 bezeichnet. Ein Baum ist ein zusammenhängender, kreisfreier Graph. Gibt es einen Baum, der alle Knoten eines Graphen umfasst, so wird dieser Spannbaum genannt. Für zwei Knoten x und y bezeichnet p(x, y) stets die Länge des kürzesten Weges von x nach y. 3 Das Steinerbaumproblem Formalisiert man die in der Einleitung vorgestellten Problembeschreibungen, so gelangt man zu folgendem Ergebnis: Das Steinerbaumproblem behandelt die Fragestellung des Findens eines minimalen Teilgraphen zu einem Graphen G = (V, E), der alle Knoten k ∈ K einer Terminalmenge K ⊆ V beinhaltet. Definition 1 (Steinerbaum). Ein Teilgraph T von G heißt Steinerbaum für K (K ⊆ V (T )), wenn T ein Baum ist, der alle Knoten aus K enthält, sodass alle Blätter von T Knoten aus K sind. Knoten aus K heißen Terminale und Knoten aus V (T ) \ K heißen Steinerpunkte von T . Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 89 Betrachtet man die Problemstellung als Optimierungsproblem, so gilt es den Steinerbaum mit minimalem Gewicht zu finden. In ungewichteten Graphen gilt es somit den Steinerbaum mit minimaler Kantenzahl zu identifizieren, was zu folgender Problemdefintion führt: Definition 2 (Minimales Steinerbaumproblem in Graphen). Gegeben: Ein zusammenhängender Graph G = (V, E) und eine Menge von Terminalen (K ⊆ V ). Gesucht: Ein Steinerbaum T für K so, dass |E(T )| = min{|E(T ∗ )| |T ∗ ist ein Steinerbaum für K in G}. Betrachtet man hingegen Netzwerke, so minimiert man nicht die Kantenanzahl, sondern das Gesamtgewicht des Steinerbaums. Dieses spiegelt die folgende Problemdefinition wieder: Definition 3 (Minimales Steinerbaumproblem in Netzwerken). Gegeben: Ein zusammenhängendes Netzwerk N=(V,E,l) und eine Menge von Terminalen (K ⊆ V ). Gesucht: Ein Steinerbaum T für K so, dass l(T ) = min{l(T ∗ ) |T ∗ ist ein Steinerbaum für K in N}. Bei diesen Definitionen sollte auffallen, dass das Steinerbaumproblem in Graphen ein Spezialfall des Steinerbaumproblems in Netzwerken ist. Wählt man nämlich l(e) = 1 für alle e ∈ E, so kann man einfach eine Probleminstanz des Steinerbaumproblems in Graphen in eine Instanz für das Steinerbaumproblem in Netzwerken transformieren. 4 Die Komplexität des Steinerbaumproblems Die Untersuchung der Komplexität des Steinerbaumproblems erfordert, dass das Optimierungsproblem in ein Entscheidungsproblem transformiert wird. Dazu wird die Problemstellung in der Weise abgeändert, dass nicht mehr eine maximale oder minimale Lösung gesucht wird, sondern entschieden werden soll, ob es eine Lösung gibt, die eine entsprechende Schranke einhält. Für die Formulierung des Steinerbaumproblems in Graphen als Entscheidungsproblem ergibt sich dann die folgende Definiton: Definition 4 (Steinerbaumproblem in Graphen). Gegeben: Ein zusammenhängender Graph G=(V,E), eine Menge von Terminalen (K ⊆ V ) und eine ganze Zahl B. Frage: Existiert ein Steinerbaum T für K mit |E(T )| ≤ B? Zunächst werden nun die nötigen Definitionen und Grundlagen, die für eine Komplexitätsanalyse nötig sind, wiederholt, wobei von einer vorherigen Kenntnis der Leser ausgegangen wird. Ein grundlegendes Entscheidungsproblem ist das Satisfiability-Problem, das wie folgt definiert ist: 90 Linda Röhrkohl Definition 5 (Satisfiability). Gegeben: Eine boolsche Formel F in konjuktiver Normalform. Frage: Gibt es eine gültige Variablenbelegung, die F erfüllt? Betrachtet man nicht beliebige Formeln in konjunktiver Normalform, sondern beschränkt man die Anzahl Literale einer Klausel, so ergibt sich das kSAT-Problem. Definition 6 (k-Satisfiability(kSAT)). Gegeben: Eine boolsche Formel F in konjuktiver Normalform, bei der jede Klausel maximal k Literale besitzt. Frage: Gibt es eine gültige Variablenbelegung, die F erfüllt? In der Komplexitätstheorie geht es darum, den zur Lösung eines Entscheidungsproblems minimal benötigten Ressourcenbedarf zu bestimmen. Ressourcen können hierbei beispielsweise Laufzeit oder Speicherbedarf sein. Die Klassen P und N P fassen beispielsweise die Probleme zusammen, die in polynomieller Zeit entschieden werden können. In P sind die Probleme, die durch deterministische Turingmaschinen, in N P die, die durch nichtdeterministische Turingmaschinen in polynomieller Zeit entschieden werden können. Für ein Entscheidungsproblem Π = (I, Sol) ( mit I ist die Menge der Instanzen, die in polynomieller Zeit entscheidbar sind und Sol, die Menge der Entscheideungen die für diese Instanzen getroffen werden) bedeutet dies, dass es in N P ist, genau dann, wenn 1. die Größe der Lösung einer Instanz polynomiell abhängig ist von der Größe der Instanz selber. Es existiert also ein Polynom p mit |x| ≤ p(|I|) ∀I ∈ I und x ∈ Sol(I). 2. ein Algorithmus A und ein Polynom q existieren so, dass für alle I ∈ I gilt a) Wenn Sol(I) 6= ∅, dann gibt es ein x0 ∈ Sol(I), sodass A die Eingabe (I, x0 ) in Zeit q(|I|) akzeptiert. b) Wenn Sol(I) = ∅, dann verwirft A für jedes x ∈ Σ ∗ die Eingabe (I, x) in Zeit q(|I|). Um die Komplexität zu analysieren wird zudem das Mittel der polynomiellen Reduktion benötigt. Definition 7. Ein Entscheidungsproblem Π = (I, Sol) heißt polynomiell auf ein anderes Entscheidungsproblem Π ∗ = (I ∗ , Sol∗ ) reduzierbar, Π ≤p Π ∗ , falls es eine Funktion f : I → I ∗ gibt, die in polynomieller Zeit berechenbar ist und für die gilt ∀I ∈ I : Sol(I) 6= ∅ ⇐⇒ Sol∗ (f (I)) 6= ∅ Die polynomielle Reduktion macht es nun möglich, die schwierigsten Probleme in N P zu beschreiben. Definition 8. Ein Entscheidungsproblem Π ∗ ist N P-vollständig genau dann, wenn Π ∗ ∈ N P und ∀Π ∈ N P : Π ≤p Π ∗ . Im Jahre 1971 zeigte der kanadische Wissenschaftler Stephen Cook, dass Satisfiability in N P ist und sich auf alle anderen Probleme in N P reduzieren lässt [2]. Hiermit bewies er das Theorem 1. Theorem 1. Satisfiability ist N P-vollständig. Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 91 Mittels dieses fundamentalen Satzes ist es nun möglich die N P-Vollständigkeit vieler Entscheidungsprobleme durch polynomielle Reduktion auf SAT zu zeigen. Denn wenn sich alle Probleme in N P polynomiell auf SAT reduzieren lassen und gezeigt werden kann, dass sich SAT auf ein anderes Problem polynomiell reduzieren lässt, so folgt aus der Transitivität der polynomiellen Reduktion, dass sich alle Problem in N P auf dieses Problem polynomiell reduzieren lassen. Korollar 1. 3SAT ist N P-vollständig. Beweis. 3SAT ist offensichtlich in N P, denn für eine gegebene Variablenbelegung ist es einfach zu entscheiden, ob sie eine Formel in konjunktiver Normalform erfüllt oder nicht. SAT lässt sich einfach polynomiell auf 3SAT reduzieren, denn jede Boolsche Formel F in konjunktiver Normalform lässt sich in eine Formel F3 mit 3 Literalen pro Klausel umstellen. Dieses funktioniert wie folgt: Jede Klausel C = (l1 ∨ ... ∨ lk ) mit k > 3 in F ersetze durch die Klauseln C3 = (l1 ∨ l2 ∨ y1 ) ∧ (y1 ∨ l3 ∨ y2 ) ∧ ... ∧ ((yk−3 ∨ lk−1 ∨ lk ) in F3 . F3 ist so genau dann erfüllt, wenn F erfüllt ist. u t Zur Zeit ist kein Algorithmus bekannt, der jede Instanz des Steinerbaumproblems in polynomieller Zeit löst. Dieses ist, da allgemein angenommen wird, dass P = 6 N P gilt, nicht verwunderlich, denn: Theorem 2. Das Steinerbaumproblem in Graphen ist N P-vollständig. Beweis. Es ist offensichtlich, dass das Steinerbaumproblem in N P liegt, denn es ist trivial einen Algorithmus anzugeben, der prüft ob eine gegebene Lösung zulässig ist und die geforderte Schranke erfüllt. Somit gilt es nun, die zweite Bedingung für N P-Vollständigkeit zu beweisen: Das Steinerbaumproblem ist schwerer als alle anderen Probleme in N P. Dazu reduzieren wir 3SAT auf das Steinerbaumproblem. Seien x1 , ..., xn die Variablen und K1 , ..., Km die Klauseln einer zufälligen 3SAT -Instanz F. Es ist also nötig einen Graphen G = (V, E), eine Terminalmenge K und eine Grenze B so zu konstruieren, dass G genau dann einen Steinerbaum T für K beinhaltet, der maximal Länge B besitzt, wenn die gegebene 3SAT -Instanz erfüllbar ist. G wird wie folgt aufgebaut: Seien u und v zwei Knoten, die über einen Literal-Pfad P(siehe Abbildung 1) miteinander Abb. 1. Transformation von 3SAT in das Steinerbaumproblem: Der Literal-Pfad [1, S.52] verbunden sind. Dieser Pfad besitzt als Knoten die Literale aus F in negierter und unnegierter Form. Es ist über den Pfad P nur möglich von u nach v zu gelangen, wenn für 92 Linda Röhrkohl jedes Literal aus F der negierte oder der unnegierte Knoten ein Mal passiert wird. Für jede Klausel Ki von F sei Ci ein Knoten, der über Pfade zu allen Literalen verbunden ist, die in Ki vorkommen. Dieses wird in Abbildung 2 illustriert. Jeder dieser Pfade erhält die Länge t = 2n + 1. Die Terminalmenge ist K = {u, v} ∪ {C1 , ..., Cm } und B = 2n + tm. Abb. 2. Die Graphenkonstruktion für die Klausel Ki = x2 ∨ xj ∨ xn . Die gestrichelten Linien stellen Pfade der Länge t = 2n + 1 von Ci zu den entsprechenden Knoten des Literal-Pfads dar. [1, S.52] Es sind nun zwei Richtungen zu zeigen. 3SAT-Instanz F ist erfüllbar =⇒ Es gibt einen Steinerbaum T in G mit Länge ≤ B: Ist F erfüllbar, dann besteht der Steinerbaum zunächst aus einem (u, v)-Pfad P, der eine erfüllende Variablenbelegung repräsentiert. Ist xi in F wahr, dann ist xi ∈ P , sonst ist xi ∈ P . Der (u, v)-Pfad hat somit die Länge 2n. Jeder Klauselknoten Ci , (1 ≤ i ≤ m), kann mit P über einen Pfad der Länge t verbunden werden. Somit erhält man einen Steinerbaum der Länge 2n + tm = B; Es gibt einen Steinerbaum T in G mit Länge ≤ B =⇒ es gibt eine erfüllende Variablenbelegung für die 3SAT-Instanz: Jede Klausel Ci muss offensichtlich mit dem Literal-Pfad verbunden werden. Annahme: Es gibt eine Klausel Ci0 , die mit dem Literal-Pfad über mindestens zwei ihrer Pfade verbunden ist. Dann gilt aber |E(T )| ≥ (m + 1)t = 2n + 1 + mt > B. Dies ist ein Widerspruch und die getroffene Annahme kann nicht gelten. Somit müssen u und v über den Literal-Pfad miteinander verbunden sein was mindestens 2n Kanten bedeutet. Da jede Klausel einen Pfad mit Gewicht t benötigt um Ci mit dem Literal-Pfad zu verbinden, muss der Literal-Pfad genau 2n Kanten beinhalten. Somit repräsentiert der (u, v)-Pfad eine erfüllende Variablenbelegung. Da die Konstruktion des Graphen offensichtlich in polynomieller Zeit erfolgen kann gilt Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 93 3SAT ≤p Steinerbaumproblem in Graphen. u t 5 Spezialfälle des Steinerbaumproblems In diesem Kapitel werden zwei Spezialfälle des Steinerbaumproblems in Bezug auf die besondere Kardinalität der Terminalmenge vorgestellt. Beide Spezialfälle sind berühmte Probleme der Graphentheorie. Ist N = (V, E, l) ein Netzwerk und K ⊆ V die Terminalmenge, dann entspricht das Steinerbaumproblem im Fall von |K| = 2, also z.B. K = {s, t}, dem Problem des Findens des kürzesten Weges von s nach t in N . Gilt hingegen K = V , d.h. alle Knoten des Netzwerks sind auch Terminale, so ist das Problem äquivalent mit der Bestimmung eines minimalen Spannbaumes für N . Beide Problemstellungen und die bekanntesten Algorithmen zu ihrer Lösung werden im Folgenden vorgestellt. 5.1 Das Problem des kürzesten Weges Beim Problem des kürzesten Weges betrachtet man ein Netzwerk N = (V, E, l) und zwei Knoten s, t ∈ V . Es gilt einen kürzesten Weg von s nach t in G zu bestimmen. Der Algorithmus nach Dijkstra Ein Algorithmmus zur Lösung des Problems des kürzesten Weges wurde im Jahr 1959 von Edsger W. Dijkstra entwickelt. [3] Die Idee des Algorithmus ist die Folgende: Die Knotenmenge V lässt sich in jeder Runde, die der Algorithmus durchläuft, in drei disjunkte Teilmengen aufsplitten. Die erste Menge, im Folgenden mit W bezeichnet, enthält die Knoten die vom Startknoten s erreichbar sind und deren kürzeste Distanz von s bereits bestimmt wurde. Die zweite Menge fasst die Knoten x ∈ V \W zusammen, die über eine Kante e=(w,x) von einem Knoten w ∈ W erreichbar sind. Dieses sind die Knoten um die der kürzester Pfad sukzessive erweitert wird. In der dritten Menge sind die Knoten, die weder zur ersten noch zur zweiten Menge gehören. Die Funktion d : V (N ) → N gibt die jeweils aktuelle minimale Distanz des Knoten v von s an. Die Funktion π : V (N ) → V (N ) gibt den Vorgängerknoten des Knotens v an über den er auf dem kürzesten Weg von s erreicht wird. Bei Initialisierung erhält jeder Knoten v ∈ V \s die Distanz d[v] = ∞ zugewiesen. Es gilt d[s] = 0 und π[s] = nil. So lange wie der Zielknoten t nicht in W ist, also kein kürzester Weg von s nach t gefunden wurde, nimmt der Algorithmus den Knoten x aus V \ W , der die kürzeste Entfernung d[x] besitzt und fügt ihn zu W hinzu. Für alle Nachbarn y dieses Knotens, die nicht bereits in W sind, wird geprüft, ob ihre Entfernung d[y] durch den Weg über x und die Nutzung der Kante (x, y) ∈ E verringert werden kann. Ist dieses der Fall, so wird ihre Distanz d[y] und ihr Vorgänger π[y] entsprechend geändert. Theorem 3. Dijkstras Algorithmus ist korrekt und kann mit Laufzeit O(m + n log n) implementiert werden. 94 Linda Röhrkohl Algorithmus 7 DIJKSTRAS ALGORITHMUS Vorbedingung: Ein zusammenhängendes Netzwerk N=(V,E,l) und zwei Knoten s, t ∈ V . Ausgabe: Ein kürzester (s,t)-Pfad in N. {Initialisierung} W := ∅; d[s]:=0; π[s] :=nil; for all v ∈ V \{s} do d[v] = ∞ while t ∈ / W do Wähle x0 ∈ V \ W mit d[x0 ] = min{d[v]|v ∈ V \ W }; W := W ∪ {x0 } for all v ∈ Γ (x0 ) ∩ (V \ W ) do if d[v] > d[x0 ] + l(x0 , v) then d[v] = d[x0 ] + l(x0 , v) π[v] := x0 Beweis. Um die Korrektheit zu zeigen werden folgende Schleifeninvarianten gewählt, die nach jeder Iteration der while-Schleife gelten: 1. Für alle v ∈ W ist d[v] die Länge eines kürzesten (s, v)-Pfades und es existiert (wenn s 6= v) ein kürzester (s, v)-Pfad, der mit der Kante (π[v], v) endet. 2. Für alle v ∈ V \ W , mit d[v] < ∞, ist d[v] die Länge eines kürzesten (s,v)-Pfades im Netzwerk N [W ∪ {v}], dass durch die Knotenmenge W ∪ {v} induziert wird. Es existiert ein kürzester (s,v)-Pfad, der mit der Kante (π[v], v) endet. Trivialerweise gelten 1. und 2. nach der Initialisierung. Somit reicht es zu zeigen, dass, wenn 1. und 2. zu Beginn einer Iteration der while-Schleife gelten, sie auch am Ende der Iteration gelten. Aus diesem Grunde betrachte man den Knoten x0 der zu W hinzugefügt wird. Nach Invariante 2. existiert ein (s, x0 )-Pfad P in N [W ∪ {v}], der mit (π[v], v) endet und der Länge l(P ) = d[x0 ] besitzt. Sei P 0 ein beliebiger (s, x0 )-Pfad, der nicht vollständig in N [W ∪ {x0 }] liegt. Dann enthält P 0 einen Knoten y ∈ / W ∪ {x0 }. Aufgrund der Wahl von x0 als Knoten mit minimalem d[v] und der Tatsache, dass alle Kantenlängen nichtnegativ sind, kann man folgern, dass l(P ) = d[x0 ] ≤ d[y] ≤ l(P 0 ). Somit gilt 1. für die neue Menge W ∪ {x0 }. Die d-Werte von Knoten werden in der for-Schleife nur geändert werden, wenn man den Knoten über einen kürzeren Pfad, der über x0 führt erreichen kann. Dann werden die d-Werte dieser Knoten genau auf diesen kürzere Pfadlänge geändert und x0 der entsprechende Vorgänger. Hiermit folgt direkt, dass 2. ebenso gilt. Betrachtet man die Laufzeit so stellt man direkt fest, dass die Wahl des x0 der zeitaufwändigste Schritt des Algortihmus ist. Sie ist abhängig von der Implementierung. Speichert man die d-Werte in einem Array so dauert die Suche nach dem besten x0 Zeit von O(n). Da die while-Schleife bis zu (n − 1)-mal durchlaufen wird, würde für diese Verwaltung der d-Werte eine Laufzeit von O(n2 ) folgen. Eine bessere Laufzeit erreicht man, wenn man eine Priority Queue als Speicherstruktur für die d-Werte nutzt. Verwendet man beispielsweise einen Fibonacci Heap, wie er in [4] vorgestellt wird, erreicht man eine Laufzeit von O(m + n log n). Die Initialisierung benötig Zeit O(n). Dann werden maximal n − 1 Extract-Min Operationen zur Findung des x0 benötigt und maximal m Decrease-Key Operationen. Die Veränderung der Werte der Nachbarknoten kann in Zeit O(m) geschehen, da jede Kante maximal zweimal betrachtet wird. t u Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 95 Anmerkung 1. Ändert man die Terminierungsbedingung der while-Schleife von t ∈ / W zu W 6= V so berechnet Dijkstras Algorithmus die kürzeste Distanz des Knotens s zu allen anderen Knoten innerhalb der gleichen Laufzeitbeschränkung. Es gilt somit offensichtlich das folgende Theorem. Theorem 4. Sei N=(V,E,l) ein Netzwerk und s ∈ V . Dann kann man kürzeste Wege von s zu allen Knoten v ∈ V in Zeit O(m + n log n) berechnen. u t 5.2 Minimale Spannbäume Betrachtet man ein Netzwerk N = (V, E, l), so besteht das Problem des minimalen Spannbaums für N darin, einen Baum T in N zu finden, der alle Knoten v ∈ V beinhaltet, für den also gilt V (T ) = V und der dabei minimales Gewicht besitzt. Für T muss folglich gelten: P e∈E(T ) l(e) ist minimal. Der Algorithmus von Jarnik und Prim Ein Algorithmus zur Lösung dieses Problems wurde von Jarnik und Prim entwickelt. [5] Die Idee dieses Algorithmus ist ähnlich der, des Algortihmus von Dijkstra zur Berechnung des kürzesten Weges. Im Algorithmus wird zunächst ein beliebiger Knoten s ∈ V ausgewählt und dem Spannbaum T hinzugefügt. Alle Knoten, die zum Spannbaum gehören werden in der Menge W zusammgengefasst. Die Menge F ⊆ E enthält die Kanten von N , die den Spannbaum T bilden. Die Funktion d : V (N ) → N gibt die Distanz des Knoten v zu einem Knoten aus W zum jeweiligen Zeitpunkt des Algorithmus an. Die Funktion π : V (N ) → V (N ) gibt den Vorgängerknoten des Knotens v an, über den er beim Aufbau des minimalen Spannbaums von einem Knoten aus W erreicht wird. In jeder Runde wird der Knoten x0 ∈ V \ W zu W hinzugefügt, der die kürzeste Distanz von einem Knoten w ∈ W besitzt. Die Kante, über die der Knoten erreicht wird, wird in F ergänzt. So fährt der Algorithmus fort bis alle Knoten aus V in W enthalten sind und somit zum Spannbaum gehören. Algorithmus 8 JARNIK-PRIM ALGORITHMUS Vorbedingung: Ein zusammenhängendes Netzwerk N=(V,E,l). Ausgabe: Ein minimaler Spannbaum T=(V,F) für N. {Initialisierung} Wähle beliebiges s ∈ V W := ∅; F := ∅; d[s] := 0; π[s] :=nil; for all v ∈ V \{s} do d[v] = ∞ while W 6= V do Wähle x0 ∈ V \ W mit d[x0 ] = min{d[v]|v ∈ V \ W }; W := W ∪ {x0 }; F := F ∪ {(x0 , π[x0 ])}; for all v ∈ Γ (x0 ) ∩ (V \ W ) do if d[v] > l(x0 , v) then d[v] = l(x0 , v) π[v] := x0 96 Linda Röhrkohl Theorem 5. Der Jarnik-Prim Algortihmus ist korrekt und kann mit Laufzeit O(m+n log n) implementiert werden. Beweis. Die Korrektheit des Algorithmus zeigen wir mittels drei Schleifeninvarianten, die nach jeder Iteration der while-Schleife gelten: 1. Die Kanten in F bilden einen Spannbaum für die Knoten in W 2. Für alle v ∈ V \ W gilt d[v] = min{l(x, v)|x ∈ W und (x, v) ∈ E} und d[v] = l(π[v], v). Der Wert d[v] repräsentiert also die Länge der kürzesten Kante, die v mit den Knoten in W verbindet und (π[v], v) ist eine solche Kante. 3. Es existiert ein minimaler Spannbaum T ∗ = (V, F ∗ ) mit F ⊆ F ∗ . Trivialerweise gelten 1.-3. nach der Initialisierung. Nun nehmen wir an, dass 1.-3. zu Beginn einer Interation gelten, dann kann man einfach sehen, dass 1. und 2. auch am Ende der Iteration mit neuer Menge W gelten. Der Beweis verläuft analog zum Beweise von Dijkstras Algorithmus. Um 3. zu zeigen sei T ∗ = (V, F ∗ ) ein minimaler Spannbaum, der den (alten) Spannbaum F beinhaltet. Der Fall, dass (x0 , π[x0 ]) in F ∗ enthalten ist, ist trivial. Ist dieses nicht der Fall, dann existiert ein Pfad P in T ∗ der π[x0 ] und x0 verbindet. Da π[x0 ] in W ist und x0 nicht, muss der Pfad P mindestens eine Kante (y,z) enthalten bei der gilt y ∈ W und z ∈ / W . Aufgrund der Wahl von x0 und Invariante 2 weiss man, dass l(π[x0 ], x0 ) = d[x0 ] ≤ d[z] ≤ l(y, z). Sei nun F̃ := (F ∗ \ {(y, z)}) ∪ {(π[x0 ], x0 )}. Dann ist T̃ = (V, F̃ ) ein Spannbaum der Länge l(T̃ ) = l(T ∗ ) − l(y, z) + l(π[x0 ], x0 ) ≤ l(T ∗ ). Dann ist T̃ ein minimaler Spannbaum und F̃ beinhaltet, wie behauptet, die neue Menge F := F ∪ {(π[x0 ], x0 )}. Somit ist der Algorithmus korrekt. Die Zeitkomplexität von O(m + n log n) erreicht man wenn man als Speicherstruktur für die d-Werte Fibonacci-Heaps verwendet. Dann dauert die Initialisierung Zeit von O(n). In jeder Iteration der while-Schleife wird zur Bestimmung des x0 eine Extract-Min-Operation und maximal m Decrease-Key-Operationen durchgeführt. Da es maximal n − 1 Durchläufe der Schleife gibt, ergibt sich eine Gesamtlaufzeit von O(m + n log n). t u Die Idee des Algorithmus von Kruskal Einen anderen Ansatz zur Lösung des Problems liefert der Algortihmus von Kruskal. [6] Dieser Algorithmus funktioniert nach der Greedy-Strategie. Alle Kanten e ∈ E werden ensprechend ihres Gewichts l(e) austeigend sortiert. Der Algorithmus prüft in jeder Iteration für die Kante, die unter den verbleibenden Kanten minimales Gewicht hat, ob ihr Hinzufügen zu F einen Kreis in T ergeben würde. Ist dieses der Fall, so wird die Kante verworfen, andernfalls wird sie zu F hinzugefügt. Kruskals Algorithmus kann so implementiert werden, dass seine Laufzeit durch die Zeit, die für das Sortieren der Kanten benötigt wird, dominiert wird. Das Sortiern ist in Lauzeit O(m log n) möglich. Auf den Korrektheitsbeweis wird an dieser Stelle verzichtet. Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 97 Algorithmus 9 KRUSKALS ALGORITHMUS Vorbedingung: Ein zusammenhängendes Netzwerk N=(V,E,l). Ausgabe: Ein minimaler Spannbaum T=(V,F) für N. {Initialisierung} Sortiere die Kanten so, dass l(e1 ) ≤ ... ≤ l(em ). Sei F := ∅. {Aufbau des Spannbaums} for i := 1 to m do if (V, F ∪ {ei }) ist kreisfrei then F := F ∪ {ei }. 6 Exakte Algorithmen Im letzten Abschnitt wurde gezeigt, dass es für Spezialfälle der Terminalmenge K Algortihmen gibt, die das Steinerbaumproblem in Netzwerken exakt und in polynomieller Laufzeit lösen. In diesem Abschnitt werden nun Algorithmen vorgestellt, die das Steinerbaumproblem exakt lösen. Ihre Laufzeit ist im Allgemeinen exponentiell. Sie kann aber auch polynomiell sein, wenn entweder davon ausgegangen werden kann, dass die die Anzahl der Nicht-Terminale |V | − |K| oder die Anzahl der Terminale |K| konstant ist. Die erste Idee für einen solchen exakten Algorithmus ist sehr einfach: Zähle alle Teilmengen E 0 ⊆ E der Kanten von N auf, prüfe ob sie einen Steinerbaum für K bilden und behalte die Menge, die den kleinsten Baum bildet. Dieser Algortihmus ist offensichtlich korrekt, aber natürlich nicht sonderlich effizient. Seine Laufzeit ist sogar exponentiell abhängig von der Anzahl der Kanten |E|. Die Algorithmen, die im Folgenden vorgestellt werden, funktionieren nach ähnlichen Prinzipien, sind allerdings deutlich effizienter. 6.1 Der Enumerations-Algorithmus Betrachtet man das Steinerbaumproblem für Netzwerke, so kann es nach Definition in einem Steinerbaum für K in N bis zu |V \ K| Steinerpunkte, also Knoten v ∈ V \ K geben. Da alle Blätter von T Terminale sind lässt sich die Anzahl Steinerpunkte, die einen Grad von mindestens 3 haben und somit einen Kreuzungspunkt in T bilden, beschränken. Diese Tatsache wird der im Folgenden beschriebene Enumerations-Algortihmus ausnutzen.[7] [8] Lemma 1. Ein Steinerbaum T für eine Terminalmenge K mit |K| = k beinhaltet maximal k − 2 Steinerpunkte mit Grad von mindestens 3. Beweis. Sei s2 die Anzahl Steinerpunkte in T , die einen Grad 2 haben und s3 die Anzahl Steinerpunkte, die einen Grad von mindestens 3 haben. Die Anzahl der Knoten des Steinerbaums ergibt sich somit als |V (T )| = k + s2 + s3 . Hiermit und aus der Tatsache, dass T ein Baum ist, folgt für die Summe der Knotengrade aller Knoten von T X dT (v) = 2|E(T )| = 2(|V (T )| − 1) = 2(k + s2 + s3 − 1). v∈V (T ) 98 Linda Röhrkohl Aus der Defintion von s2 und s3 folgt andererseits X v∈V (T ) dT (v) = X v∈K | X dT (v) + dT (v) ≥ k + 2s2 + 3s3 . v∈V (T )\K {z ≥k } | {z ≥2s2 +3s3 } Durch Gleichsetzung folgt somit s3 ≤ k − 2. t u Es seien nun u und w zwei Kreuzungspunkte in T , also zwei Knoten mit Grad von mindestens 3, die über einen Pfad P miteinander verbunden sind. Da T ein minimaler Steinerbaum ist folgt, dass P ein kürzester (u,w)-Pfad ist, wenn alle Knoten auf P den Grad 2 besitzten und keine Terminale sind. Die Steinerpunkte mit Grad 2 eines minimalen Steinerbaum liegen folglich immer auf einem kürzesten Weg von einem Terminal zu einem anderen Terminal, von einem Terminal zu einem Kreuzungspunkt, oder von einem Kreuzungspunkt zu einem Kreuzungspunkt in T . Das sogenannte (vollständige) Distanz-Netzwerk von N, D(N ) = (V, ED , lD ), definiert für jedes Knotenpaar u, v ∈ V die kürzeste Distanz voneinander. Es ist also definiert als ED = V × V und lD (u, v) = p(u, v), mit p(u, v) ist die Länge des kürzesten Pfades von u nach v in N. Das Distanznetzwerk kann in polynomieller Zeit berechnet werden, indem beispielsweise der Algorithmus von Dijkstra für jeden Knoten v ∈ V einmal ausgeführt wird. Aus den bisherigen Ergebnissen gelangt man zu der Aussage, dass sich der minimale Steinerbaum T für N einfach in polynomieller Zeit berechnen lässt, wenn man die Menge seiner Kreuzungspunkte S kennt. In diesem Fall bestimmt man zunächst das vollständige Distanznetzwerk D(N ). In dem Teilnetzwerk von D(N ), dass von den Knoten K ∪ S induziert wird, berechnet man einen minimalen Spannbaum TSp . Dieser beinhalt alle Terminale K und alle Kreuzungspunkte des minimalen Steinerbaums. Um letztendlich den minimalen Steinerbaum zu bekommen müssen die Kanten e = (u, v) ∈ E(TSp ), die schließlich den kürzesten Pfad von u nach v repräsentieren, noch durch den tatsächlichen kürzesten Weg von u nach v in N ersetzt werden. Der Enumerations-Algorithmus nutzt nun die Tatsache, dass die Anzahl der Kreuzungspunkte |S| durch den Wert k − 2 beschränkt ist und führt die Berechnung des minimalen Spannbaums für alle entsprechenden Kreuzungspunktemengen durch. Der kleinste minimale Spannbaum wird schließlich in den zugehörigen minimalen Steinerbaum T transformiert. Algorithmus 10 ENUMERATIONS ALGORITHMUS Vorbedingung: Ein zusammenhängendes Netzwerk N = (V, E, l) und eine Terminalmenge K ⊆ V . Ausgabe: Ein minimaler Steinerbaum T für N . 1: Berechne das Distanz-Netzwerk D(N ) = (V, ED , lD ) und speichere für jede Kante (u, v) ∈ ED den kürzesten (u, v)-Pfad in N. 2: Berechne für alle S ⊆ V \ K mit |S| ≤ k − 2 einen minimalen Spannbaum TSp für das Teilnetzwerk von D(N ), das von K ∪ S induziert wird. 3: Transformiere den kleinsten der Spannbäume TSp , die in Schritt 2 berechnet wurden, in einen Steinerbaum T in N . Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 99 Theorem 6. Der Enumerations-Algorithmus berechnet einen minimalen Steinerbaum. Er kann so implementiert werden, dass seine Laufzeit beschränkt ist von O(n2 log n + nm + min{nk−2 , 2n−k } · k 2 ). Beweis. Die Korrektheit des Algorithmus folgt unmittelbar aus den zuvor gemachten Bemerkungen. Die Laufzeit ergibt sich aus den einzelnen Schritten. Schritt 1, die Berechnung des Distanz-Netzwerks, kann in Zeit O(n2 log n + nm) geschehen indem man Dijkstras Algortihmus n mal ausführt. In SchrittP2 berechnet man einen minimalen Spannbaum (mit maximal 2k-2 Knoten) für k−2 n−k maximal i=0 i ≤ min{nk−2 , 2n−k } verschiedene Mengen K ∪ S. Da jede dieser Berechnungen in Zeit O(k 2 ) gemacht werden kann, indem man den Algortihmus von Jarnik und Prim verwendet, dauert Schritt 2 maximal O(min{nk−2 , 2n−k } · k 2 ) Zeit. In Schritt 3 wird nur noch der kleinste minimale Spannbaum TSp in einen Steinerbaum transformiert. Da jede Kante des Netzwerks N maximal in einem kürzesten Pfad, also einer Kante in TSp enthalten sein kann, kann Schritt 3 in Zeit O(m) erledigt werden. t u Aus diesem Beweis kann man weiterhin folgern, dass die Laufzeit des Algorithmus polynomiell beschränkt in der Größe des Netzwerks ist, wenn man nur Instanzen des Problems betrachtet, in denen die Anzahl der Nicht-Terminale von einer festen Konstante begrenzt ist. Denn so ist es möglich über alle Teilmengen S ⊆ V \K in polynomieller Zeit zu enumerieren. Korollar 2. Sei C ∈ N beliebig, aber fest. Dann berechnet der Enumerations-Algorithmus für alle Netzwerke N = (V, E, l) und Terminalmengen K ⊆ V mit |V \ K| ≤ C einen minimalen Steinerbaum in Zeit O(n2 log n + nm). 6.2 Die Idee des Dreyfus-Wagner Algorithmus Nachdem im letzten Abschnitt ein Algorithmus vorgestellt wurde, der das Steinerbaumproblem bei konstanten Nicht-Terminalmengen in polynomieller Zeit optimal löst, wird nun die Idee eines Algorithmus vorgestellt, der bei konstanten Terminalmengen die optimale Lösung in polynomieller Zeit berechnet. Der Dreyfus-Wagner-Algorithmus [9] arbeitet nach dem Prinzip der dynamischen Programmierung. Hierbei berechnet er die Länge eines minimalen Steinerbaums für eine Terminalmenge K, aus den Längen der Steinerbäume für alle echten Teilmengen K’ von K. Zunächst werden also die Steinerbäume für alle 2-elementigen Teilmengen von K berechnet. Aus diesen Ergebnissen lassen sich die Steinerbäume für alle 3-elementigen Teilmengen berechnen bis schließlich ein minimaler Steinerbaum für die gesamte Terminalmenge K berechnet wird. Im Folgenden sei für X ⊆ K und v ∈ V \ X der Wert s(X ∪ {v}) die Länge eines minimalen Steinerbaums für X ∪ {v}. sv (X ∪ {v}) sei die Länge eines minimalen Steinerbaums für X ∪ {v} in dem v mindestens den Grad 2 besitzt. Gibt es einen solchen Steinerbaum nicht, ergibt sich die Länge nach Definition als sv (X ∪ {v}) = ∞. Die Werte s(X ∪ {v}) und sv (X ∪ {v}) können rekursiv berechnet werden, was folgendes Lemma zeigt: Lemma 2. Sei X ⊆ K, X 6= ∅ und v ∈ V \ X. Dann ist 100 Linda Röhrkohl sv (X ∪ {v}) = min {s(X 0 ∪ {v}) + s((X \ X 0 ) ∪ {v})} ∅6=X 0 (X und s(X ∪ {v}) = min{min {p(v, w) + s(X)}, min {p(v, w) + sw (X ∪ {w})}}. w∈X w∈V \X Beweis. Um die erste Gleichung zu zeigen, betrachtet man den minimalen Steinerbaum T für eine Teilmenge X von K und einen Knoten v aus V \ X mit Grad von mindestens 2. Die Länge des minimalen Steinerbaums ist somit sv (X ∪ {v}). T kann man am Knoten v in zwei disjunkte Steinerbäume trennen, von denen der eine die Knotenmenge X 0 ∪ {v} und der andere die Knotenmenge X \ X 0 ∪ {v} umfasst. Beide Steinerbäume enthalten v mit Grad ≥ 1. Die Länge des gesamten Steinerbaums sv (X ∪ {v}) erhält man nun, indem man die Längen der beiden kleineren Steinerbäume addiert. Minimiert man über alle nichtleeren, echten Teilmengen X 0 , so erhält man die erste Gleichung. Dieses wird durch die Abbildung 3 verdeutlicht. Um die 2. Gleichung zu zeigen sei T ein minimaler Steinerbaum für X ∪ {v}, bei dem der Abb. 3. Beweis der 1. Gleichung der Dreyfus-Wagner-Rekursion. [1, S.79] Grad von v keiner Beschränkung unterliegt. Für ein Blatt u in T sei Pu der längste Pfad in T, der in u beginnt und auf dem alle inneren Knoten den Grad 2 besitzen und zudem nicht in K liegen. Es sind nun 3 Fälle zu unterscheiden. Minimiert man über alle 3 Fälle, erhält man die Gültigkeit von Gleichung 2. Fall 1: v hat Grad von mindestens 2. Dann ist s(X ∪ {v}) = sv (X ∪ {v}). Dieser Fall wird durch Wahl von w = v eingeschlossen. Fall 2: v ist ein Blatt in T und Pv endet in einem Knoten w ∈ X. Dann ist T die Vereinigung eines minimalen Steinerbaums für X und eines kürzesten (v, w)-Pfades. Also gilt s(X ∪ {v}) = p(v, w) + s(X). Fall 3: v ist ein Blatt in T und Pv endet in einem Knoten w ∈ / X. Dann hat w einen Grad von mindestens 3. Also ist T in diesem Fall die Vereinigung eines minimalen Steienerbaums für X ∪ {w} in dem w mindenstens den Grad 2 besitzt und einem kürzesten (v, w)-Pfad. Also gilt s(X ∪ {v}) = p(v, w) + sw (X ∪ {w}). Diese 3 Fälle werden durch Abbildung 4 illustriert. t u Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 101 Abb. 4. Beweis der 2. Gleichung der Dreyfus-Wagner-Rekursion. [1, S.79] Der Dreyfus-Wagner-Algorithmus berechnet mit der Rekursionsformel von Lemma 2 die Länge eines minimalen Steinerbaums. Diese ergibt sich für ein beliebiges v ∈ K als s(K) = s((K \ {v}) ∪ v). Algorithmus 11 DREYFUS-WAGNER ALGORITHMUS Vorbedingung: Ein zusammenhängendes Netzwerk N=(V,E,l) und eine Terminalmenge K ⊆ V . Ausgabe: Die Länge eines minimalen Steinerbaum T für K {Initialisierung} for all v, w ∈ V do berechne p(v,w); for all {x, y} ⊆ K do s({x, y}) := p(x, y); {Rekursionsausführung analog zu Lemma 2} for i := 2 to k − 1 do for all X ⊆ K mit |X| = i und alle v ∈ V \ X do sv (X ∪ {v}) = min∅6=X 0 (X {s(X 0 ∪ {v}) + s((X \ X 0 ) ∪ {v})} for all X ⊆ K mit |X| = i und alle v ∈ V \ X do s(X ∪ {v}) = min{minw∈X {p(v, w) + s(X)}, minw∈V \X {p(v, w) + sw (X ∪ {w})}} Theorem 7. Der Dreyfus-Wagner Algorithmus berechnet die Länge eines minimalen Steinerbaums in O(3k n + 2k n2 + n2 log n + nm)Schritten. Beweis. Die Korrektheit des Algorithmus folgt durch Lemma 2. Die Laufzeit ergibt sich durch n-malige Ausführung von Dijkstras Algorithmus (O(n2 log n + nm)) und die Anzahl Berechnungen in der ersten und zweiten Rekursionsgleichung. Die Anzahl der Berechnungen der ersten Rekursionsformel ist abhängig von den Möglichkeiten v, X 0 und X zu wählen. Da jedes Terminal zu genau einer der Mengen X 0 , X \ X 0 und K \ X gehört, sind sie begrenzt durch O(3k n). Anhand der Anzahl Möglichkeiten X und v zu wählen ergibt sich, dass die zweite Rekursionsformel für O(2k n) Tupel ausgeführt werden muss. Da für jedes Tupel n Berechnungen nötig sind führt dieses zum Summanden O(2k n2 ). u t Möchte man nicht nur die Länge eines minimalen Steinerbaums berechnen, sondern den Steinerbaum an sich, so muss man neben den Längenberechnungen auch die Knoten und Kanten speichern, für die sich die entsprechenden Längen ergeben und sie am Schluss zu einem Steinerbaum zusammenfügen. Die Lösungsidee, des Dreyfus-Wagner-Algorithmus sollte nun erkannt sein. Es ergibt sich für ihn abschließend folgendes Korollar: Korollar 3. Sei C ∈ N beliebig, aber fest. Dann berechenet der Dreyfus-Wagner-Algorithmus für alle Netzwerke N=(V,E,l) und Terminalmengen K ⊆ V mit |K| ≤ C einen minimalen Steinerbaum in Zeit O(n2 log n + nm). 102 Linda Röhrkohl 7 Approximationsalgorithmen Da das Steinerbaumproblem N P-vollständig ist, ist es solange nicht möglich einen polynomiellen Algorithmus zu finden, der das Problem exakt löst, wie nicht P = N P bewiesen wurde. Auch kann besonders in praktischen Anwendungen nicht immer vorausgesetzt werden, dass die Kardinalität der Terminalmenge bzw. der Nichtterminalmenge konstant ist und die Instanz des zugrundeliegenden Netzwerks hinreichend klein ist um einen der vorgestellten exakten Algorithmen zur Lösung des Problems in Betracht zu ziehen. Um dennoch in polynomieller Zeit an gute Lösungen des Problems zu gelangen verwendet man sogenannte Approximationsalgorithmen. Approximationsalgorithmen sollen nicht zwingend die optimale Lösung liefern, sondern eine Lösung, die möglichst einen Wert besitzt, der nah am Optimum liegt. Die Qualität eines Approximationsalgorithmus wird durch die Approximationsgüte angegeben. Die Approximationsgüte eines Approximationsalgorithmus gibt an, um wieviel schlechter eine Lösung des Algortihmus maximal, im Vergleich zur optimalen Lösung des Problems ist. Das Maximum wird hierbei über alle Instanzen des Problems bestimmt. Bezeichnet lopt (I) den Wert einer optimalen Lösung für eine Instanz Iund l(I), der Wert der Lösung, die der Algorithmus für die Instanz I bestimmt, dann ist die Approximationsgüte g für ein Minimierungsproblem definiert durch g = max{ l(I) | I ist Instanz des P roblems}. lopt (I) Im Fall des Steinerbaumproblems ist die Approximationsgüte definiert durch den maximalen Quotienten der Länge des Steinerbaums, den der Algorithmus ermittelt und der Länge des minimalen Steinerbaums. Hierbei werden alle Instanzen des Steinerbaumproblems betrachtet. 7.1 Ein einfacher Algortihmus mit Approximationsgüte 2 In diesem Abschnitt wird ein Approximationsalgorithmus für das Steinerbaumproblem mit Approximationsgüte 2 vorgestellt. Dieser Algorithmus liefert also im schlechtesten Fall einen Steinerbaum, der doppelt so lang wie der minimale Steinerbaum ist. Um diese Approximationsgüte zu erreichen nutzt der Algorithmus einen Zusammenhang der Länge des minimalen Steinerbaum mit der Länge des minimalen Spannbaums für K im zugehörigen vollständigen Distanznetzwerk ND = (K, ED , lD ). Dieser Zusammenhang wird durch das folgende Lemma wiedergespiegelt: Lemma 3. Sei N = (V, E, l; K) ein Steinerbaumproblem. Dann erfüllt jeder minimale Spannbaum T im vollständigen Distanz-Netzwerk ND = (K, ED , lD ) 2 lD (T ) ≤ (2 − ) · smt(N ), k mit k = |K| ist die Kardinalität der Terminalmenge und smt(N), die Länge des minimalen Steinerbaums für K in N. Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 103 Beweis. Sei Topt ein minimaler Steinerbaum in N. Betrachtet man Topt im Gesamtnetzwerk eingebettet und den Weg W um Topt herum (wie in Abbilung 5), dann passiert man auf W jedes Terminal mindestens einmal und läuft zweimal entlang jeder Kante. Die Länge von W ist somit doppelt so groß wie die Länge von Topt , also l(W ) = 2 · smt(N ). Sei t die Anzahl Blätter von Topt , dann gibt es in W t ≤ k Pfade zwischen aufeinander- Abb. 5. Illustration des Beweises des Lemma. Der Weg W besteht aus den Pfaden 1-2, 2-3, ...,7-8 und 8-1. Um den Weg W 0 zu erhalten entfernt man den Pfad von 7 nach 8. [1, S.88] folgenden Blättern in Topt . Entfernt man den längsten dieser Pfade, so ist die Länge des verbleibenden Wegs l(W 0 ) maximal (1 − 1t )-mal so groß wie l(W ). Dieses ist der Fall, wenn alle t Pfade die gleiche Länge besitzen. Nun ist offensichtlich, dass man indem man dem Weg W 0 folgt einen Spannbaum für K in ND konstruiert, der sogar ein Pfad ist. Die Länge dieses Spannbaum ist maximal l(W 0 ). Da t ≤ k gilt, folgt somit 1 1 2 lD (T ) ≤ l(W 0 ) ≤ (1 − ) · l(W ) = (1 − ) · 2smt(N ) = (2 − ) · smt(N ). k k k u t Da ein minimaler Spannbaum nach Theorem 5 in polynomieller Zeit berechenbar ist und ein minimaler Spannbaum im vollständigen Distanznetzwerk einen minimalen Steinerbaum mit Güte 2 approximiert, kann man diesen Spannbaum dazu nutzen einen Steinerbaum zu konstruieren, der maximal zweimal so lang ist wie der minimale Steinerbaum für dieses Netzwerk. Auf diese Weise berechnet der folgende MSP-Algorithmus [10] einen approximierten Steinerbaum. Das Beispiel in Abbildung 6 illustriert die verschiedenen Schritte des Algorithmus. Außerdem macht es deutlich, dass die Schritte 4 und 5 für die Probleminstanzen benötigt werden bei denen das Teilnetzwerk N [TD ] nicht kreisfrei ist. Um aus N [TD ] einem Steinerbaum zu erzeugen muss folglich mindestens noch eine Kante entfernt werden. Aus diesem Grund berechnet man in Schritt 4 erneut einen minimalen Spannbaum. Besitzt dieser Blätter, die keine Terminale sind, sind die Kanten zu ihnen für einen Steinerbaum ebenfalls unnötig und werden daher entfernt. Theorem 8. Sei N = (V, E, l; K) ein Netzwerk. Dann berechnet der MST-Algorithmus in polynomieller Zeit einen Steinerbaum SK für N so, dass gilt 2 l(SK ) ≤ (2 − ) · smt(N ). k 104 Linda Röhrkohl Algorithmus 12 MSP-ALGORITHMUS Vorbedingung: Ein zusammenhängendes Netzwerk N=(V,E,l) und eine Terminalmenge K ⊆ V . Ausgabe: Ein minimaler Steinerbaum SK für N. 1: Berechne das Distanz-Netzwerk ND = (K, ED , lD ) und speichere für jede Kante (u, v) ∈ ED den kürzesten (u,v)-Pfad in N. 2: Berechne einen minimalen Spannbaum TD in ND . 3: Transformiere TD in ein Teilnetzwerk N [TD ] von N indem jede Kante von TD durch den entsprechenden kürzesten Pfad in N ersetzt wird. 4: Berechne einen minimalen Spannbaum T für das Teilnetzwerk N [TD ]. 5: Transformiere T in einen Steinerbaum SK für N, indem nach und nach die Blätter aus T entfernt werden, die keine Terminale sind. Abb. 6. Illustration der verschieden Schritte des MST-Algorithmus. [1, S.90] Beweis. Aufgrund von Lemma 3 gilt l(TD ) ≤ (2 − k2 ) · smt(N ). Da l(TD ) in Schritt 3 unverändert bleibt, TD in Schritt 4 höchstens zu T verkleinert wird und T in Schritt 5 ebenfalls höchtens noch zu SK verkleinert wird, gilt l(TD ) ≥ l(T ) ≥ l(SK ). Somit ist auch die Länge des approximierten Steinerbaum SK höchstens (2 − k2 )-mal so groß wie es der minimale Steinerbaum ist. t u Die Laufzeitanalyse des Algorithmus zeigt dass die Berechnung des Distanz-Netzwerks ND der zeitaufwendigste Schritt ist, denn hierzu muss für alle k Terminale die Berechnung der kürzesten Wege zu allen anderen Knoten erfolgen, was jeweils maximal Zeit von O(n log n + m) benötigt. Die Berechnung der Spannbäume ist jeweils in Zeit O(n log n + m) möglich. Für den Worst-Case k = |V | erhält man für den MSP-Algorithmus also eine Laufzeit von O(n2 log n + nm). 7.2 Verbesserung der Laufzeit Um die Laufzeit des MSP-Algorithmus zu verbessern, muss man den zeitaufwendigsten Schritt, die Berechnung des vollständigen Distanznetzwerks überdenken. Hierzu schlug der deutsche Informatiker Kurt Mehlhorn im Jahre 1988 vor, statt des voll∗ = (K, E ∗ , l∗ ) zu verwenden.[11] In diesem ständigen, ein neuartiges Distanznetzwerk ND D D Netzwerk sollen alle Knoten v ∈ V in verschiedene Komponenten aufgeteilt werden. Jedes Das Steinerbaumproblem - Ein klassisches Problem der Graphentheorie 105 Terminal s ∈ K entspricht einer Gruppe Ψ (s). Alle anderen Knoten v ∈ V \ K gehören zu der Gruppe des Terminals zu dem sie die minimale Distanz p(s, v) besitzen. Haben sie zu mehreren Terminalen die gleiche minimale Distanz, so werden sie einer beliebigen dieser Gruppen zugeordnet. ∗ beinhaltet genau dann eine Kante zwischen zwei Komponentenknoten, wenn es in E ED eine Kante gibt, die zwei Knoten aus den beiden Komponenten miteinander verbindet. In ∗ sind sozusagen die Kreuzungskanten zweier Komponenten. Das Gewicht einer Kante ist ED der minimale Wert eines Pfades über den zwei Terminale miteinander verbunden werden können. Formal bedeutet dies: ∗ ∗ ∗ ND = (K, ED , lD ) mit ∗ (x, y) ∈ ED ⇐⇒ ∃(u, v) ∈ E mit u ∈ Ψ (x) und v ∈ Ψ (y), ∗ lD (x, y) = min{p(x, u) + l(u, v) + p(v, y)|u ∈ Ψ (x), v ∈ Ψ (y), (u, v) ∈ E}. Ein solches Neztwerk lässt sich schnell berechnen. Man fügt in das ursprüngliche Netzwerk N einen Knoten s0 ein, den man mit allen Terminalen s ∈ K über eine Kante mit Gewicht 0 verbindet. Dann berechnet man mit einer Ausführung von Dijkstras Algorithmus die kürzesten Wege von s0 zu allen Knoten v ∈ V . Der erste Knoten, der auf dem kürzesten Weg von s0 zu v passiert wird, ist offensichtlich das Terminal s, zu dem v die kürzeste Distanz besitzt und in dessen Gruppe Ψ (s) v somit gehört. Die Pfadlängen p(s, v) aller Knoten zu den entsprechenden Terminalen werden durch die Ausführung von Dijkstras Algorithmus automatisch mit berechnet, denn sie entsprechen der kürzesten Pfadlänge p(s0 , v). ∗ und l∗ ist anschließend einfach und kann im Vergleich zur BeDie Berechnung von ED D rechnung der Komponenten vernachlässigt werden. Es ergibt sich also für die Berechnung ∗ die Laufzeit O(n log n + m) durch einmaliges Ausführen von Dijkstras des Netzwerkes ND ∗ auch Algorithmus. Mehlhorn bewies anschließend, dass jeder minimale Spannbaum in ND in minimaler Spannbaum in ND ist. Transformiert man diesen Spannbaum anschließend in den Teilgraphen von N, erhält man einen Steinerbaum für K in N, der der gleichen Approximationsgüte wie der MSP-Algorithmus genügt, aber nur eine Laufzeit O(n log n + m) benötigt. Mehlhorns Algorithmus sieht folgendermaßen aus: Algorithmus 13 MEHLHORNS-ALGORITHMUS Vorbedingung: Ein zusammenhängendes Netzwerk N=(V,E,l) und eine Terminalmenge K ⊆ V . Ausgabe: Ein minimaler Steinerbaum SM für N. ∗ ∗ ∗ 1: Berechne das Distanz-Netzwerk ND = (K, ED , lD ). ∗ ∗ 2: Berechne einen minimalen Spannbaum TD in ND . ∗ ∗ ∗ 3: Transformiere TD in einen Steinerbaum SM := N [TD ] für N, indem jede Kante von TD durch den entsprechenden Pfad in N ersetzt wird. 8 Offene Fragen - Ein Ausblick In dieser Arbeit wurde das klassische Steinerbaumproblem ausführlich untersucht. Komplexität, Spezialfälle und Lösungsansätze wurden betrachtet. Es wurden sowohl exakte als 106 Linda Röhrkohl auch approximative Lösungsansätze vorgestellt, doch es sind sicherlich auch noch Fragestellungen unbeachtet geblieben. Sind die exakten Lösungsansätze für einen Einsatz in der Praxis überhaupt zu verwenden, oder ist es unrealistisch anzunehmen dass die Terminalmenge oder die Nichtterminalmenge konstant bleibt? Gibt es Approximationsalgorithmen, die eine bessere Güte als 2 besitzen? Wie berechnet man Steinerbäume in Netzwerken, in denen sich die Strukturen ständig verändern können? Hier wären beispielsweise Computernetze zu nennen, in denen Computer die Terminale und Router die Nicht-Terminale bilden können und in denen die Computer sich am Netz an- und abmelden können. Alles dieses sind Fragen, mit denen sich die Forschung bereits befasst hat und auf die in einer Vielzahl von Papern eingegangen wird. Unter anderem waren dieses auch Fragen aus dem Gebiet der dynamischen Steinerbäume, die die Seminarausarbeitung betrachtet. Literaturverzeichnis 1. Prömel H. J., Steger A. (2002) The Steiner Tree Problem. A Tour through Graphs, Algorithms, and Complexity. Vieweg, Braunschweig/Wiesbaden 2. Cook S. A. (1971) The complexity of theorem-proving procedure. In: 3rd Annual Symposium on Foundations of Computer Science: 431–439 3. Dijkstra E. (1959) A note on two problems in connexion with graphs. In: Numerische Mathematik 1, Springer, Berlin Heidelberg New York, 269–271 4. Fredman M., Tarjan R. (1987) Fibonacci heaps and ther uses in improved network optimization algorithms. J. ACM 34: 596–615 5. Prim R. (1957) Shortest connection networks and some generalizations. Bell Systems Technical Journal 36: 1389–1401 6. Kruskal J. (1956) On the shortest spanning subtree of a graph and the traveling salesman problem. Proceedings of the American Mathematical Society 7: 48–50 7. Hakimi S. (1971) Steiner’s problem in graphs and its applications. Networks Vol. 1, Nr.2: 113–133 8. Lawler E. (1976) Combinatorial Optimization: Networks and Matroids. Holt, Rinehart and Winston, New York 9. Dreyfus S., Wagner R. (1972) The Steiner problem in graphs. Networks Vol. 1: 195–207 10. Kou L., Markowsky G., Berman, L. (1981) A fast algorithm for Steiner trees. Acta Inform. 15: 141–145 11. Mehlhorn K. (1988) A faster approximation algorithm for the Steiner problem in graphs. Inform. Process. Lett 27: 125–128 Aspektgraphen und Verdeckung Michael Kruse Universität Paderborn [email protected] Zusammenfassung. In dieser Ausarbeitung wird eine Repräsentation eines Objektes oder einer ganzen Szene einer 3D-Computergrafik vorgestellt, der so genannte Aspektgraph. Ein Aspektgraph beschreibt Eigenschaften der Szene, die von der Position des Betrachters abhängig ist. Die zu wählenden Eigenschaften sind von Anwendung abhängig. Die hier gewählte Eigenschaft ist die Sichtbarkeit von Elementen der Szene von der Betrachterposition aus gesehen. Dazu werden zwei Algorithmen vorgestellt. Zum einen die naive Herangehensweise und zum Anderen der Algorithmus von Plantinga und Dyer aus der Veröffentlichung [1]. Zum besseren Verständnis werden bei Algorithmen zuerst auf 2D-Grafiken mit orthographischer Projektion angewandt, um sie dann auf 3D-Grafiken in orthographischer und perspektivischer Projektion zu verallgemeinern. Für alle Fälle wird die Größenkomplexität der nötigen Strukturen und die Zeitkomplexität beider Algorithmen gezeigt. 1 Anwendungen und Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 1.1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 1.2 Beispielanwendungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 1.3 Definitionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 2 Verdeckung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 3 2D-Rendering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 3.1 3.2 3.3 3.4 3.5 Perspektivische Projektion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Ereignisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 Orthographische Projektion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Der naive Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Der Algorithmus von Plantinga und Dyer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 4 3D-Rendering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 4.1 4.2 4.3 4.4 4.5 4.6 4.7 Ereignisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Orthographische Projektion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Perspektivische Projektion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 Maximale Größe eines Aspektgraphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 Minimale Größe eines Aspektgraphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 Der naive Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 Der Algorithmus von Plantinga und Dyer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 5 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 108 Michael Kruse 1 Anwendungen und Definition 1.1 Einleitung Das Informatik-Fachgebiet Computergrafik beschäftigt sich mit dem Abbilden von 3DObjekten oder 3D-Szenen auf eine 2D-Bildfläche (Projektion). Je nachdem in welcher Position sich ein Betrachter relativ zum Objekt befindet, hat das Objekt eine andere Darstellung. In dieser Ausarbeitung wird die Darstellung eines Objektes zumeist auf die topologische Erscheinung von einem bestimmten Sichtpunkt, auch Aspekt genannt, reduziert. Ein Aspektgraph speichert die Darstellungen eines Objektes oder einer Szene und welche ineinander übergehen können. Eine weitere Datenstruktur namens VSP beschreibt, wann sich der Aspekt ändert. Unter anderem können diese Informationen dazu genutzt werden, alle sichtbaren Elemente der Szene zu bestimmen. Dies ist der Schwerpunkt dieser Ausarbeitung. 1.2 Beispielanwendungen Objekterkennung in Bildern Auf einer Rastergrafik ist ein Objekt abgebildet, z.B. auf einer Fotografie. Ein Computerprogramm, welchem möglichst viele Ansichten (bzw. Aspekte) dieses Objektes bekannt sind, kann das abgebildete Objekt mit den bekannten Aspekten vergleichen. Bei genügender Ähnlichkeit gilt das Objekt als erkannt. Billboarding Ein Billboard ist ein 2D-Bild innerhalb einer 3D-Computergrafik. Die Normale des Billboards ist dabei immer zum Betrachter gerichtet, so dass das Objekt von allen Seiten gleich aussieht. In älteren Computerspielen wurde dies z.B. für Bäume genutzt. Statt immer das gleiche Bild darzustellen kann es der Perspektive des Betrachters angepasst werden. Dazu kann das passende Bild im zugehörigen Aspektgraphen abgespeichert und bei der zugehörigen Ansicht verwendet werden. Diese Technik wurde bereits beim PC-Spiel Wolfenstein 3D[2] eingesetzt (Abb. 1). Auf dem linken Bild ist je ein Soldat von vorne und hinten abgebildet. Dies sind vordefinierte 2D-Grafiken. Die Grafik wird ausgetauscht, wenn sich der Sichtwinkel ändert (rechtes Bild). Abb. 1: Screenshots aus dem PC-Spiel Wolfenstein 3D[2] Als Aspektgraph modelliert würde eine Grafik für jeden Knoten des Aspektgraphens erstellt werden. Einer Kante wird gefolgt und damit die Grafik des Billboards ausgetauscht, wenn der andere Aspekt dem aktuellen Aspekt ähnlicher ist. Aspektgraphen und Verdeckung 109 In Wolfenstein 3D wurden sicherlich keine Aspektgraphen genutzt, sondern die Differenz zwischen der Sichtrichtung der Spielers und der des Soldaten. Daher kann sich die Grafik ändern, wenn sich der Spieler nur dreht. Occlusion-Culling Culling bezeichnet das Entfernen von Elementen aus 3D-Szenen, die nicht auf der Projektion erscheinen. Occlusion-Culling (eng. Occlusion = Verdeckung) dementsprechend das Entfernen von Elementen, die von weiteren Elementen verdeckt werden und daher nicht auf der Projektion erscheinen. In der Computergrafik sind mit Elementen normalerweise ganze Objekte gemeint, die vollständig oder gar nicht aus der Szene entfernt werden. Ein Aspektgraph kann die sichtbaren Elemente für jede Betrachterposition speichern, es werden dann nur diese Elemente gerendert. 1.3 Definitionen Definition 1 (Aspektgraph). Ein Aspektgraph ist ein ungerichteter Graph G = (V, E), in dem die Knoten v ∈ V einen Aspekt einer Szene oder eines Objekts entsprechen und die Kanten e ∈ E die möglichen Übergänge zwischen diesen. Zur Verdeutlichung ein Beispiel: Gegeben sei ein Würfel (Abb. 2). Von diesem gibt es 3 Projektionen: Mit einer sichtbaren Seite (A), mit zwei sichtbaren Seiten (B) und mit drei sichtbaren Seiten (C). A B C Abb. 2: Ausgewählte Aspekte eines Würfels Der Aspektgraph zu diesen Ansichten besteht aus drei Knoten, für jede Ansicht eine (Abb. 2). Angenommen, die Projektion kann nicht direkt über eine Ecke des Würfels wechseln, so dass 2 Flächen auf einmal sichtbar werden, sondern nur indirekt über die Kanten des Würfels. Unter dieser Voraussetzung sieht der Aspektgraph wie in Abb. 3 aus. Abb. 3: Aspektgraph der 3 Ansichten von Abb. 2 2 Verdeckung Im Folgenden sollen die sichtbaren Objektmerkmale (Ecken, Kanten, Seitenflächen, Polyeder) zu jeder Betrachterposition im Aspektgraphen gespeichert werden. Die Bestimmung 110 Michael Kruse soll dabei genau sein, d.h. zu jeder Betrachterposition soll genau ermittelt werden können, welche Merkmale sichtbar sind und welche nicht. Dies soll nun näher definiert werden. Definition 2 (Objektraum, Bildraum, Sichtraum). Die Eingabe besteht aus ein oder mehreren Objekten (Szene) im Objektraum. Diese sollen in den Bildraum niedrigerer Dimension abgebildet werden. Als weiterer Eingabeparameter dient die Position des Betrachters (eng. Viewpoint) im Sichtraum (eng. Viewpoint Space). Definition 3 (Labeled Image Structure Graph (LISG)). Der Labeled Image Structure Graph (aus [4]) ist eine Darstellung der Abbildung im Bildraum als Graph GLISG = (VLISG , ELISG ). Eine Ecke des Objekts erscheint im LISG, wenn er in der Abbildung sichtbar ist. Ecken werden so miteinander durch Kanten verbunden, wie sie im Bildraum sichtbar sind. Sollten sich zwei Kanten im Bildraum schneiden, wird als Schnittpunkt ein neuer Knoten eingeführt. Dieser wird T-Junction genannt. Ecken, Kanten und Seitenflächen im Objektraum können Bezeichner (eng. label) gegeben werden, die dann auch im LISG erscheinen. Da der LISG nach Definition ein Graph ist, haben die Ecken keine Koordinaten im Bildraum, er beschreibt nur die Struktur. Die Bezeichner können aber sicherstellen, dass Elemente aus dem Objektraum im LISG identifiziert werden können. Es kann zwischen zwei Typen von LISGs unterschieden werden: der transparente LISG und der verdeckende LISG (eng. opaque LISG). Im transparenten LISG sind alle Seitenflächen durchsichtig und daher sind alle Ecken und Kanten des Objektraumes zu sehen (Abb. 4). Bildraum LISG Abb. 4: Transparente Abbildungen Bei dem verdeckenden LISG werden die Seitenflächen mit berücksichtigt (Abb. 5). Ecken werden durch Flächen entweder ganz oder gar nicht verdeckt. Kanten können auch nur teilweise verdeckt werden. An den Schnittpunkten zwischen verdeckter Kante und verdeckender Fläche entsteht dabei ein neuer Knoten, denn eine Kante eines Graphen kann nicht an einer anderen Kante enden. Dieser neuer Knoten, der keine Abbildung einer Ecke des Objektes ist, wird T-Junction genannt. Aspektgraphen und Verdeckung 111 T-Junction Bildraum LISG Abb. 5: Verdeckende Abbildungen Für die Betrachtung von Sichtbarkeit ist nur der Teil der Topologie eines Objektes im Bildraum interessant, der die sichtbare Struktur an einer Betrachterposition bestimmt. In den folgenden Abschnitten wird ein Aspekt durch die zugehörige Topologie bestimmt. Für diesen Zweck wird die Äquivalenz zweier Topologien (bzw. Aspekte) wie folgt definiert: Definition 4 (Äquivalenz von Topologien im Bildraum). Zwei Topologien sind äquivalent, wenn die zugehörigen LISGs isomorph sind. Haben Ecken und Kanten Bezeichnungen, so muss der zugehörige Isomorphismus auch zwischen den Ecken und Kanten mit den gleichen Bezeichnern abbilden. Ein Aspektgraph beinhaltet nicht, wann eine Änderung der Betrachterposition eine Änderung des Aspektes zur Folge hat. Diesen Zweck erfüllt die folgende Struktur. Definition 5 (Viewpoint Space Partition (VSP)). Ein Viewpoint Space Partition ist eine Partitionierung des Sichtraumes in maximal große Regionen in denen die Topologie äquivalent sind. Regionen sind zusammenhängend, d.h. zwei maximale Regionen mit äquivalenter Topologie, die aber nicht zusammenhängend sind, bleiben zwei unterschiedliche Regionen. Der VSP ist zum Aspektgraphen dual, d.h. die Partitionen (bzw. Regionen) des VSP sind die Ecken des Aspektgraphen und umgekehrt, denn innerhalb einer Region ist immer derselbe Aspekt zu sehen. 3 2D-Rendering Der zweidimensionale Objektraum ist einfacher zu verstehen als der dreidimensionale, deshalb sollen die Konzepte zuerst im zweidimensionalen Raum gezeigt und dann auf den dreidimensionalen übertragen werden. 3.1 Perspektivische Projektion Bei der perspektivischen Projektion (oder auch Zentralprojektion) ist der Objektraum auch der Sichtraum, da sich der Betrachter in der Szene befindet. Da der Objektraum bereits zweidimensional ist, muss der Bildraum eindimensional sein. Die Projektionsfläche soll ein 112 Michael Kruse Kreis um den Betrachter sein, somit hat er eine Rundumsicht. Die Bildkoordinate ist eine Bogenlänge auf dem Projektionskreis, also ein Winkel. Dimensionen Koordinaten Objektraum 2D (x, y) Sichtraum 2D (u, v) Bildraum 1D (α) Tabelle 1: Kenndaten perspektivischer 2D-zu-1D-Projektion 3.2 Ereignisse Der Übergang von einer Region des VSP zu einer anderen wird (nach [5]) Ereignis genannt. Wenn der Betrachter die Position wechselt, ist das Ereignis, dass sich der Aspekt (bzw. die Topologie) ändert. Der Bereich des VSP, in der sich der Aspekt ändert, wird auch kritische Region genannt. Im zweidimensionalen Raum bedeutet ein Ereignis, dass zwei Ecken im transparenten LISG ihre Position tauschen, zu sehen in Abb. 6. Es wird daher VV-Ereignis (VV für eng. Vertex-Vertex) genannt. Im mittleren LISG sind beide Ecken an der gleichen Position, im verdeckenden LISG wäre nur eine Ecke (im Beispiel „B“) zu sehen, die die andere verdeckt. Danach wird die Ecke A durch eine Kante verdeckt, in der Abbildung angedeutet durch ausgrauen. A B AB B A Abb. 6: Überquerung einer kritischen Region Werden eine oder beide Ecken durch eine weitere Kanten verdeckt, so gibt es zwar eine (pseudo-)kritische Region, aber kein Ereignis, da die Topologien äquivalent sind. Das Ereignis selbst wird verdeckt. Kritische Regionen, dessen Sichtbarkeit noch nicht geprüft wurde, werden auch potenzielle kritische Regionen genannt. Als weiteres Beispiel ändert der Betrachter in Abb. 7a seine Position wie in Abb. 7b. Abb. 8 zeigt die zugehörigen Projektionen einer solchen Szene. Die Knoten aus dem Objektraum sind teilweise beschriftet. Daraus resultieren die zugehörigen LISGs in Abb. 9, die eindimensional angeordnet sind. Von der einen zur anderen Position erscheinen gleich zwei neue Ecken, die vorher verdeckt waren, d.h. es wurden gleich mehrere kritische Regionen überquert. Aspektgraphen und Verdeckung 113 B A C A (a) (b) Abb. 7: 2D-Objektraum A A BC Abb. 8: Rendering durch Wolfenstein 3D[2] A A B C Abb. 9: LISGs Der VSP der gesamten Szene lässt sich berechnen. Zu der Arbeit [3] gehört ein Programm, welches den VSP für den zweidimensionalen perspektivischen Fall berechnen kann. Abbildung 10 zeigt den berechneten VSP des vorigen Beispiels. Die gelben Strecken sind die Kanten des Objektraumes und die schwarze Linien stellen die potentiellen kritischen Regionen dar. In Regionen mit gleicher Färbung sind die gleiche Anzahl Kanten sichtbar. Je heller die Farbe, desto mehr sichtbare Kanten. Abb. 10: 2D-VSP erstellt mit dem Programm aspect.jar [3] 114 Michael Kruse 3.3 Orthographische Projektion Bei der orthographischen Projektion (oder auch Parallelprojektion) befindet sich der Betrachter anschaulich unendlich weit von der Szene entfernt, so dass alle Sichtlinien parallel verlaufen. Zur Angabe der Betrachterposition reicht daher der Winkel dieser Sichtlinien. Dieser kann entweder als Bogenlänge (θ) oder als normierter Vektor (a, b) = (cos θ, sin θ) angegeben werden. Durch die Normierung bleibt der dadurch definierte Raum eindimensional. Das hat den Vorteil, dass für weitere Berechnungen keine trigonometrischen Funktionen beachtet werden müssen. Die Projektionsfläche ist ein Kreis mit unendlichem Radius, der die gesamte Szene umschließt. Dimensionen Koordinaten Objektraum 2D (x, y) Sichtraum 1D (θ) oder (u, v) mit |(u, v)| = 1 Bildraum 1D (s) Tabelle 2: Kenndaten orthographischer 2D-zu-1D-Projektion Abb. 11a zeigt die kritischen Regionen eines Objektes. Gestrichelte Linien deuten verdeckte Ereignisse an. Abb. 11b zeigt den VSP auf dem unendlich weit entfernten Projektionskreis. Eine vereinfachte Version ist Abb. 12. (a) (b) Abb. 11: Objekt unter orthographischer Projektion Abbildung 12a zeigt ein einfaches Beispielobjekt mit nur zwei Kanten. Die Linien zeigen die kritischen Regionen. In Abb. 12b ist der VSP mit seinen Regionen eingezeichnet. Aspektgraphen und Verdeckung A C (a) 115 A B C B (b) Abb. 12: Einfaches Objekt unter orthogonaler Projektion 3.4 Der naive Algorithmus Der VSP und der Aspektgraph einer Szene soll nun berechnet werden. Dafür soll zuerst ein einfacher Ansatz verwendet werden. Algorithmus 14 Naiver Algorithmus zur Berechnung des Aspektgraphen unter orthogonaler 2D-Projektion for jede Kombination (e1 , e2 ) zweier Ecken do Bestimme die Linie durch beide Punkte Bestimme die beiden Schnittpunkte der Linie auf dem Projektionskreis Sortiere alle Schnittpunkte nach ihrer Koordinate for jede Region r zwischen zwei aufeinander folgenden Schnittpunkten do Erstelle den LISG für einen Punkt innerhalb der Region r Füge einen neuen Knoten v mit diesem LISG dem Aspektgraphen hinzu for alle Knoten v und v 0 , dessen Regionen nebeneinander liegen do if die LISGs von v und v 0 sind äquivalent then Vereinige beide Knoten else Verbinde v und v 0 durch eine Ecke return den Aspektgraphen Theorem 1 (Laufzeit des naiven 2D-Algorithmus). Die Laufzeit des Algorithmus 14 beträgt O(n4 ) Beweis. Es gibt m = n(n−1) Kombinationen zweier Ecken und die doppelte Anzahl von 2 Schnittpunkten mit der Projektionsfläche sowie Regionen zwischen diesen, also O(n2 ). Ein Vergleichssortierer sortiert diese in O(m log m) = O(n2 log n2 ). Die Laufzeit für das Erstellen des LISG mit Bestimmung der Verdeckung eines Elementes mit allen anderen beträgt O(n2 ) ( hidden line removal-Algorithmus), für alle Regionen zusammen also O(mn2 ) = O(n4 ). 116 Michael Kruse Jede Region hat genau 2 Nachbarregionen und das Vergleichen benötigt nur lineare Laufzeit, sofern alle Ecken eindeutige Bezeichner haben. Das Vergleichen aller Nachbarregionen benötigt also O(mn) = O(n3 ). Der höchste Aufwand beträgt damit O(n4 ). t u 3.5 Der Algorithmus von Plantinga und Dyer Hier soll ein Algorithmus mit besserer Laufzeit als der in Abschnitt 3.4 gezeigt werden, wie er in [1] für 3D vorgestellt wurde. Der „Trick“ dabei ist, den Aspektgraphen vor dem VSP zu berechnen. Dafür wird ein neuer Raum eingeführt, der so genannte Aspektraum. Bei der orthogonalen 2D-Projektion kann so eine Laufzeit von O(n3 ) (statt O(n4 )) für die Berechnung des VSP erreicht werden. Definition 6 (Der Aspektraum (ASP)). Der Aspektraum ist das kartesische Produkt aus Sichtraum V und Bildraum I. Ein Element belegt einen Punkt des Aspektraumes (v, i) ∈ V × I, wenn es aus der Betrachterposition v ∈ V an der Position i ∈ I des Bildes sichtbar ist. Bei der zweidimensionalen orthographischen Projektion haben sowohl Sichtraum als auch der Bildraum eine Dimension von eins. Folglich hat der Aspektraum zwei Dimensionen. Ein Punkt im Aspektraumes soll mit (θ) × (s) = (θ, s) beschrieben werden. Abbildung 13 zeigt die LISGs (vertikal ausgerichtet) des Objektes von Abb. 12 in 45°Schritten. Die vertikale Achse zeigt demnach den Bildraum und die horizontale Achse den Sichtraum. Die Verläufe der Ecken A (rot), B (blau) und C (Olivfarben) sind linear approximiert. Hervorzuheben ist, dass B zwischen 135° und 180° sowie A zwischen 270° und 315° verdeckt wird. A B C 0° 45° 90° 135° 180° 235° 270° 315° 360° θ Abb. 13: Die LISGs von Abb. 12 Wie man nicht schwer erkennen kann handelt es sich bei A um eine cos-Kurve und bei B um eine (− sin)-Kurve. Kennzeichnet man nicht die Ecken, sondern die Kanten im Aspektraum, so ergeben sich Flächen wie in Abb. 14. Die Kante CA ist rot und die Kante CB blau markiert. Aspektgraphen und Verdeckung 117 Abb. 14: Der Aspektraum zu Abb. 12 Aus dieser Beobachtung lässt sich ein Algorithmus bauen. Für dreidimensionales Rendering werden in Abschnitt 4.7 ein paar mehr Details erläutert. Algorithmus 15 Berechnung des Aspektraumes für orthogonale 2D-Projektion for jede Kante e im Objektraum do A ← Fläche von e im Aspektraum for jede bereits vorhandene Fläche B im Aspektraum do if A verdeckt B then B ←B\A if A wird von B verdeckt then A ← A \ B (und aktualisiere A im Aspektraum) Füge B zum Aspektraum hinzu Es soll nun die Größe des Aspektraumes bestimmt werden. Bei den Position der Ecken im Aspektraum handelt es sich immer um Sinuskurven mit unterschiedlichen Phasen (Winkel zum Ursprung) und Amplituden (Entfernung zum Ursprung). Zwei solcher Kurven haben maximal 2 Schnittpunkte. Angenommen, das Objekt habe O(n) Ecken (und Kanten), dann haben diese bis zu O(n2 ) Schnittpunkte im Aspektgraphen. Da dieser außerdem planar ist, gibt es auch nur höchstens O(n2 ) Kanten und Regionen, was damit die Obergrenze der Komplexität des Aspektgraphen darstellt. Das Kombinieren zweier Aspekträume benötigt O(nm), wobei m und n die Größe er beiden Aspekträume sind. Das sukzessive Hinzufügen von Aspekträumen der Größe O(n) zum gemeinsamen Aspektraum der Größe O(n2 ) benötigt eine amortisierte Laufzeit von O(n3 ). Um auch den VSP zu bestimmen reicht es aus, die Bildkoordinate i wegzulassen (Abb. 15). Der verbliebene Raum ist eindimensional und die Ecken müssen höchstens noch 118 Michael Kruse nach ihrer Sichtraumkoordinate sortiert werden, was O(n2 log n2 ) benötigt. Jedes maximale Intervall zwischen diesen Ecken ergeben genau einen Knoten im Aspektgraphen. Abb. 15: Vom Aspektraum zum VSP unter Weglassung der Bildkoordinate 4 3D-Rendering Das 2D-Rendering-Kapitel wurde zur Veranschaulichung eingeschoben. In diesem Kapitel soll es um das „normale“ Projizieren von 3D-Szenen auf eine 2D-Projektionsfläche gehen. Dabei gibt es ein paar Unterschiede, wie die Natur von Ereignissen. 4.1 Ereignisse Im dreidimensionalen gibt es 2 Ereignistypen. Zum einen gibt es die Möglichkeit, dass ein Element hinter einer Seitenfläche verschwindet oder auftaucht, der Beginn oder das Ende eines verdeckenden Polygons wird durch eine Kante beschränkt. Nur Ecken kommen für das andere Element in Frage da sie den Beginn oder das Ende der anderen Elemente markieren. Deshalb wird dieses EV-Ereignis („EV“ für eng. edge-vertex) genannt. Zu Beachten ist, dass es keine Rolle spielt, auf welcher Seite der Kante oder Ecke sich die Seitenfläche befindet, in jedem Fall wird ein Ereignis erzeugt. Abbildung 16 illustriert davon ein paar Möglichkeiten. Die erzeugte potenzielle kritische Region ist eine Ebene durch die Kante und die Ecke, in den Abbildungen blau-transparent angedeutet. Aspektgraphen und Verdeckung 119 Abb. 16: Ausprägungen von EV-Ereignissen Der zweite Typ sind die EEE-Ereignisse („EEE“ für eng. edge-edge-edge). Dabei führt die Sichtlinie an drei unterschiedlichen Kanten vorbei, die sich vom Betrachter aus gesehen in einem Punkt schneiden (Abb. 18a und 17b). Der LISG ändert sich an dieser Stelle, weil sich ein oder mehrere T-Junctions auf andere Kanten verschieben (Abb. 17 (a) und (c)). Es spielt auch hier prinzipiell keine Rolle, auf welche Seite der Kanten die Seitenfläche zu sehen ist. → (a) → (b) (c) Abb. 17: Ein EEE-Ereignis aus der Betrachterperspektive Es soll nun die kritische Region bestimmt werden, welche durch ein EEE-Ereignis erzeugt wird. Seien 3 Kanten gegeben. Kante 1 verbindet die Punkte p11 und p12 , Kante 2 die Punkte p21 und p22 , Kante 3 die Punkte p31 , p32 . Die Sichtlinie schneidet jede dieser Kanten. Sei nun p ein Punkt auf der ersten Kante, die die Sichtlinie kreuzt (Gleichung 1, Abb. 18b zeigt drei solcher Sichtlinien). p =p11 + s(p12 − p11 ) (a) (b) (1) (c) Abb. 18: EEE-Ereignis Seien dann n2 und n3 die Normalen zweier Ebenen, die jeweils den Punkt p und die Kante p21 p22 bzw. p31 p32 enthalten (Gleichung 2). n2 =(p21 − p) × (p21 − p22 ) n3 =(p31 − p) × (p31 − p32 ) (2) Die Schnittlinie dieser beiden Ebenen entspricht der gesuchten Sichtlinie, die den Punkt p enthält sowie die beiden anderen Kanten kreuzt. Der Richtungsvektor ergibt sich durch 120 Michael Kruse das Kreuzprodukt beider Normalen (Gleichung 3). Als Ortsvektor eignet sich der Punkt p. Die sich ergebende Geradengleichung 4 ist linear abhängig von t und quadratisch von s. Interpretiert man diese als Parameter eine bivarianten Funktion, so erhält man die Formel für die Fläche der (potentiellen) kritischen Region. d =n2 × n3 (3) q =p + td =p11 + s(p12 − p11 ) + t(((p21 − (p11 + s(p12 − p11 ))) × (p21 − p22 )) (4) × ((p31 − (p11 + s(p12 − p11 ))) × (p31 − p32 ))) =f (t, s) Damit sind die Regionen des VSP nicht unbedingt Polyeder, die durch gerade Flächen begrenzt werden. Abbildung 18c zeigt die kritische Region für das gegebene Beispiel grautransparent. Wie zwei quadratische univariante Funktionen nur höchstens 2 Schnittpunkte haben, so haben zwei bivariante Funktionen nur höchsten 2 (quadratische) Schnittkurven. Dadurch, dass es zwei Schnittkurven und -punkte geben kann, ändert sich jedoch nicht die Methodik der Berechnung des VSP oder Aspektgraphen. Die asymptotische Laufzeit für die Berechnung bleibt gleich. Zur Vereinfachung werden daher in den folgenden Abschnitten Begriffe verwendet, die eigentlich nur auf Polytope zutreffen. Man kann ein EV-Ereignis auch als Spezialfall des EEE-Ereignisses ansehen: Wenn sich zwei der Kanten eines EEE-Ereignisses in einem Punkt schneiden, so entsteht dort eine Ecke. Zusammen mit der dritten Kante bildet diese das EV-Ereignis. Deshalb genügt die Betrachtung das EEE-Ereignisses. 4.2 Orthographische Projektion Für die orthographische 3D-zu-2D-Projektion (3D-Parallelprojektion) werden für den Sichtraum zwei Winkel für die Sichtlinien benötigt, z.B. θ für die XZ-Achse und ϕ für die XYAchse. Alternativ kann ein normierter Richtungsvektor der Sichtrichtung angegeben werden. Der Bildraum bleibt jedoch durch zwei kartesische Koordinaten bestimmt. Anschaulich ist der Sichtraum eine Sphäre mit unendlichem Durchmesser um die Szene im Objektraum. Die Projektionsfläche und damit der Bildraum ist eine Ebene, die die Sphäre am gewählten Sichtpunkt tangiert. Dimensionen Koordinaten Objektraum 3D (x, y, z) Sichtraum 2D (θ, ϕ) oder (u, v, w) mit |(u, v, w)| = 1 Bildraum 2D (s, t) Abb. 19: Kenndaten orthographischer 3D-zu-2D-Projektion Abbildung 20 zeigt einen gerenderten Tetraeder, seinen VSP auf der Projektionsphäre und den zugehörigen Aspektgraph. Regionen des VSP und Knoten des Aspektgraphen sind grün markiert, wenn 3 Seitenflächen zu sehen sind, blau bei 2 Seitenflächen und grün bei nur einer sichtbaren Seitenfläche. Aspektgraphen und Verdeckung Objektraum VSP 121 Aspektgraph Abb. 20: Ein Tetraeder unter orthographischer Projektion 4.3 Perspektivische Projektion Analog kann man die perspektivische 3D-zu-3D-Projektion (3D-Zentralprojektion) betrachten. Der Sichtraum ist eine Position des Betrachters innerhalb des Objektraumes und somit dreidimensional. Die Projektionsfläche soll eine Sphäre um den Betrachter sein, daher kann ein Punkt im Bildraum mit zwei Winkeln angegeben werden. Dimensionen Koordinaten Objektraum 3D (x, y, z) Sichtraum 3D (u, v, w) Bildraum 2D (α, β) Abb. 21: Kenndaten perspektivischer 3D-zu-2D-Projektion 4.4 Maximale Größe eines Aspektgraphen Sei eine Szene oder ein Objekt mit v Ecken, e Kanten und a Flächen gegeben und sei n = max {v, e, a}. Allgemeiner beschrieben handelt es sich einfach um ein Objekt der Größe O(n). Weiterhin soll angenommen werden, dass bei Schnitten immer der „Normalfall“ zutrifft. Sonderfälle wie parallele Geraden und Flächen sowie dass zwei Geraden oder Flächen identisch fallen werden ausgeblendet. Zwei Geraden haben immer einen Schnittpunkt und zwei Flächen immer eine Schnittgerade um Sonderfälle nicht einzeln behandeln zu müssen. Sie gelten als well-behaved [4]. Theorem 2 (Maximale Größe bei orthographischer Projektion). Der Aspektgraph hat bei orthographischer 3D-Projektion maximal O(n6 ) Ecken und Kanten, wobei n die Anzahl der Ecken, Kanten und Flächen der abgebildeten Objekts ist. Beweis. Die Größe des VSP hängt primär von der Anzahl der Ereignisse ab. Für den allgemeineren Fall der EEE-Ereignisse müssen 3 Ecken kombiniert werden. Es gibt O(n3 ) solcher Kombinationen, die zusammen ein EEE-Ereignis erzeugen können. Dies sind die potentiellen kritischen Regionen in Form von quadratischen Flächen. Abgebildet auf den Sichtraum – die unendlich große Sphäre um das Objekt – werden diese auf quadratische Kurven abgebildet (die Schnittmenge mit dieser Sphäre). Zwei quadratische Kurven haben maximal 2 Schnittpunkte und somit gibt es insgesamt O(2n3 n3 ) = O(n6 ) 122 Michael Kruse Schnittpunkte aller Kombinationen zweier Kurven. Da der dadurch entstandene Graph von Schnittpunkten und verbindende Kurven planar ist, gibt es auch höchstens O(n6 ) Kanten und Regionen. Damit hat auch der Aspektgraph eine Größe von O(n6 ), denn dieser ist zum VSP dual. t u Theorem 3 (Maximale Größe bei perspektivischer Projektion). Der Aspektgraph hat bei perspektivischer 3D-Projektion maximal O(n9 ) Ecken und Kanten, wobei n die Anzahl der Ecken, Kanten und Flächen des abgebildeten Objektes ist. Beweis. Auch hier gibt es O(n3 ) Kombinationen dreier Kanten und somit O(n3 ) EEEEreignisse. Im dreidimensionalen Raum werden drei Ebenen benötigt, um einen Schnittpunkt zu erzeugen. Zwei quadratische Flächen haben bis zu zwei Schnittkurven. Mit einer weiteren quadratischen Fläche haben diese Kurven je bis zu 2 Schnittpunkte. Somit gibt es O(4(n3 )3 ) = O(n9 ) Schnittpunkte mit allen Kombinationen dreier EEE-Ereignisse. Man betrachte nun eine einzelne kritische Region eines EEE-Ereignisses. Alle anderen O(n3 ) kritischen Regionen bilden O(n3 ) Schnittkurven auf der einzelnen kritischen Region. Wie bei der orthographischen Projektion bilden diese einen planaren Graph mit O(n6 ) Ecken (die Schnittpunkte der Kurven), Kanten und Flächen. Alle O(n3 ) haben dann zusammen O(n3 ) · O(n6 ) = O(n9 ) Ecken, Kanten und Flächen. Jede Fläche hat auf beiden Seiten eine räumliche Region ( Zelle). Mit den O(n9 ) Flächen gibt es also höchstens O(2n9 ) = O(n9 ) Zellen im VSP. Wegen der Dualität ist auch der Aspektgraph von der Größenordnung O(n9 ). t u Sollte man für jeden Knoten des Aspektgraphen auch speichern, welche Flächen sichtbar sind (z.B. den LISG), so erhöht sich der Speicherbedarf für jeden Knoten entsprechend um O(n) oder O(log n)[4]. 4.5 Minimale Größe eines Aspektgraphen In diesem Abschnitt soll gezeigt werden, dass Szenen mit dieser Komplexität auch wirklich gibt (und eigentlich auch der Regelfall ist). Theorem 4 (Worst-Case-Größe bei orthographischer Projektion). Die Worst-CaseKomplexität eines Aspektgraphen bei orthographischer Projektion ist Ω(n6 ) Beweis. Gegeben sei folgendes Objekt: n vertikale Streifen mit gleicher Breite (rot in der Abbildung 22a) und davor n horizontale Streifen (grün), welche ein Gitter bilden. Die vertikalen Streifen sind dabei leicht gedreht, so dass sie nicht ganz orthogonal zu den horizontalen Streifen sind. Weiter davor befinden sich wiederum n vertikale Streifen (grau) mit kleineren Sichtschlitzen. Diese sollen gerade so groß sein, dass eine vollständige Kante der leicht gekippten vertikalen Streifen zu sehen ist, aber es kann niemals das Gitter durch zwei Schlitze gleichzeitig beobachtet werden. Die Ausdehnung der Streifen nach hinten sei vernachlässigbar. Die Kanten der vertikalen Streifen, der horizontalen Streifen und der Sichtschlitze können sich von bestimmten Positionen des Betrachters aus scheinbar in einem Punkt schneiden, was zuvor EEE-Ereignis genannt wurde. Bewegt sich nun der Betrachter in horizontaler Richtung, so bekommt er folgende EEE-Ereignisse mit: Das Gitter hat (n − 1)2 Löcher mit jeweils 4 Ecken. Mit jedem Sichtschlitz schneidet sich jede dieser Ecken an den den Seitenkanten des Schlitzes zwei mal. Einmal beim Auftauchen vor einem Streifen und ein Aspektgraphen und Verdeckung 123 weiteres mal beim verdeckt werden durch den nächsten Streifen. Da es n − 1 Sichtschlitze gibt, ändert sich der LISG 2(n − 1)3 = Θ(n3 ) mal, da jedesmal T-Junctions erscheinen oder verschwinden. Stellt man bei orthogonaler Projektion zwei solcher Streifenmuster nebeneinander, eines davon um 90° gedreht (Abb. 22a), so schneiden sich alle vertikalen kritischen Regionen des einen mit den horizontalen kritischen Regionen des anderen. Beide haben Θ(n3 ) kritische Regionen, so dass es insgesamt Θ(n6 ) Schnittpunkte und Regionen auf der Projektionssphäre gibt und somit Θ(n6 ) Knoten im zugehörigen Aspektgraphen. u t (a) (b) Abb. 22: Beispiele mit maximaler asymptotischer Größe des Aspektgraphen Theorem 5 (Worst-Case-Größe bei perspektivischer Projektion). Die Worst-CaseKomplexität eines Aspektgraphen bei perspektivischer Projektion ist Ω(n9 ) Beweis. Für die perspektivische Projektion benötigt man 3 solcher Streifenmuster, angeordnet wie in Abbildung 22b. Der Betrachter befindet sich zwischen allen Sichtschlitzen. Er kann sich vertikal, horizontal und nach vorn und hinten bewegen und jedesmal überquert er bis zu Θ(n3 ) kritische Regionen. Alle kritischen Regionen aller drei Streifenmuster treffen sich in Θ((n3 )3 ) Punkten. Dies entspricht einer Anzahl von Θ(n9 ) Knoten im Aspektgraphen. u t 4.6 Der naive Algorithmus Wie für die 2D-Projektion soll hier exemplarisch nur der orthographische Fall behandelt werden. Der perspektivische Fall folgt jedoch dem gleichen Schema. 124 Michael Kruse Algorithmus 16 Naiver Algorithmus zur Berechnung des Aspektgraphen unter orthogonaler 3D-Projektion for jede Kombination (e1 , e2 , e3 ) dreier Kanten do Berechne kritische Region Berechne Schnittkurve mit der Projektionssphäre for jede Kombination (g1 , g2 ) zweier Kurven auf der Projektionsfläche do Finde Schnittpunkt(e) zwischen g1 und g2 Verbinde Punkt(e) mit den bisher gefundenen Nachbarpunkten Mit einem Graphensuchalgorithmus finde alle Regionen im Graphen for jede gefundene Region r do Erstelle den LISG für einen Punkt innerhalb der Region r Füge einen neuen Knoten v mit diesem LISG dem Aspektgraphen hinzu Füge eine Kante mit jedem Knoten einer Nachbarregion hinzu for jeden Nachbarknoten v 0 do if die LISGs von v und v 0 sind äquivalent then Vereinige beide Knoten break for Theorem 6 (Laufzeit des naiven 3D-Algorithmus). Die Laufzeit des Algorithmus 16 ist O(n10 ) unter orthographischer Projektion. Beweis. Die erste for-Schleife wird m = O(n3 )-mal durchlaufen, da es so viele Kombinationen dreier Kanten gibt. Projiziert auf die Projektionssphäre ergeben dies m Kurven. Jede Kurve kann jede andere bis zu vier mal schneiden, so dass es q = O(4m2 ) = O(n6 ) Schnittpunkte gibt. Ein Graphensuchalgorithmus kann alle Regionen in linearer Laufzeit bezüglich q finden. Das Erstellen des LISG mit Verdeckung für an einer Betrachterposition innerhalb einer Region ist mit einem hidden-line-removal-Algorithmus in O(n2 ) möglich. Eine Region kann durch alle O(m) Kurven begrenzt werden und sie von einer anderen Region trennen, so das es O(m) Nachbarregionen gibt. Ein LISG hat O(n) Elemente, diese miteinander auf Äquivalenz zu vergleichen kostet O(n) für jede Nachbarregion. Die letzte äußere Schleife hat also eine Laufzeit von q(O(n2 ) + mO(n)) = O(n6 (n2 + n3 n)) = O(n10 ). Verfolgt man das gleiche Schema für den perspektivischen Fall, so erhält man eine Laufzeit von O(n13 ). Damit ist die Laufzeit in beiden Fällen um das O(n4 )-fache größer als die Ausgabegröße. Dass das auch besser geht zeigt, wie beim 2D-Fall auch, der folgende Algorithmus im nächsten Abschnitt. 4.7 Der Algorithmus von Plantinga und Dyer Wie bei Anwendung auf das 2D-Rendering ist der Trick dabei, den Aspektgraphen vor dem VSP zu berechnen. Dabei werden die Objekte wieder in den Aspektraum übertragen. Dieser ist (θ, ϕ, s, t) für orthogonale und (u, v, w, α, β) für die perspektivische Projektion und somit 4-dimensional (bzw. 5-dimensional). Die orthogonale Projektion besteht im Wesentlichen aus einer Rotation des Objektraumes und dann dem Weglassen der dritten Koordinate. Verdeckungen werden noch nicht berücksichtigt. Stellt man die Sichtrichtung nicht mit zwei Winkeln dar, sondern mit einem Richtungsvektor, ergibt sich die Abbildungsmatrix 5. w ist dabei der normierte Richtungsvektor, v ein normierter zu w orthogonaler Vektor und u = w × v. v wird in der Computergraphik auch up-Vektor genannt. Er bestimmt die Rotation des Bildes und ist zur Berechnung des LISG nicht von Bedeutung. Aspektgraphen und Verdeckung ux uy uz x s 100 vx vy vz y = t 010 wx wy wz z 125 (5) Eine Ecke im Objektraum ergibt übertragen in den Aspektraum einen Grat (2D in orthographischer, 3D bei perspektivischer Projektion), da er ohne Überdeckung von überall sichtbar ist und im Bildraum als ein Punkt (0D) erscheint. Analog ist eine Kante im Objektraum eine Facette (3D in orthographischer, 4D in perspektivischer Projektion) im Aspektraum. Eine Seitenfläche des Objektraumes (die andere Elemente verdecken kann) ist eine volldimensionale Zelle im Aspektraum. Zu den Begriffen Peak, Grat, Facette und Zelle siehe auch Tabelle 3. Auch wenn die Elemente keine Polytope sein müssen, sollen diese Begriffe hier verwendet werden. Dimension 3D-Raum 4D-Raum 5D-Raum 0D Ecke, Punkt Punkt Punkt 1D Kante, Linie Linie, Peak Linie 2D Polygon, Seitenfläche Grat, Polygon Polygon, Peak 3D Polyeder Facette, Polyeder Grat, Polyeder 4D Zelle, Polychor, 4-Polytop Facette, Polychor 5D Zelle, 5-Polytop Tabelle 3: Benennung von Elementen in höherdimensionalen Räumen Der Aspektraum lässt sich berechnen, indem man alle Seitenflächen des Objektraumes konsekutiv dem Aspektraum hinzufügt (Algorithmus 17). Eine Seitenfläche unterteilt den Raum in zwei Halbräume. Elemente im Halbraum hinter der Seitenfläche können verdeckt werden, während Elemente im vorderen Halbraum die Fläche verdecken können (Die Rückseite der Seitenfläche soll durchsichtig sein). Daher müssen die sich im Aspektraum überlappenden Elemente voneinander subtrahiert werden. Die Seitenfläche wird von den von den Elementen im hinteren Halbraum und die Elemente des vorderen Halbraums von der Seitenfläche subtrahiert. Algorithmus 17 Berechnung des Aspektraumes für 3D-Projektion 1: A ← leerer Aspektraum 2: for jedes Polygon a im Objektraum do 3: B ← Ausdehnung von a als Polytop des Aspektraumes 4: Avorne ← A ∩ Halbraum auf der Vorderseite von a 5: Ahinter ← A ∩ Halbraum auf der Rückseite von a 6: Ahinter ← Ahinter \ B 7: B ← B \ Avorne 8: A ← Avorne ∪ Ahinter ∪ B 9: return A Die Mengenoperationen sind nicht ganz trivial. Alle Elemente im Aspektraum können durch Facetten beschrieben werden. Alle Zellen werden durch Facetten begrenzt. Facetten sind ihrerseits Repräsentationen von Kanten des Bildraumes. Zwei Facetten schneiden sich in einem Grat und repräsentieren somit einen Punkt. Drei Facetten schneiden sich in einem Peak und entsprechen einem EEE-Ereignis. Vier Facetten schneiden sich in einem 126 Michael Kruse Punkt (bzw. Linie) und entsprechen einem Element, welches einen Punkt auf der Bildebene darstellt, der nur bei einem ganz bestimmten Ansichtswinkel zu sehen ist. Im 5D-Raum könnten sich auch fünf Facetten in einem Punkt schneiden. Dies entspräche einem Punkt auf der Bildfläche, welcher nur an einer ganz bestimmten Betrachterposition zu sehen wäre. Wenn es diesen Punkt allerdings gibt, so kann sich der Betrachter auf der Sichtlinie zum Punkt beliebig vor und zurück bewegen, ohne den Punkt aus den Augen zu verlieren, ein Widerspruch. Ein solches Ereignis kann es daher nicht geben. Der Aspektraum hat also O(n) Facetten, O(n2 ) Grate, O(n3 ) Peaks und höchstens O(n4 ) Punkte (bzw. Linien) entsprechend der Anzahl von Kombinationen von Facetten. Wie die zugehörigen EEE-Ereignisse sind die Peaks von den Aspektraumkoordinaten quadratisch abhängig. Entsprechend sind die Punkte (bzw. Linien) Funktionen dritten Grades. Nun kann auch die Laufzeit des Algorithmus bestimmt werden. Theorem 7 (Laufzeit des Algorithmus von Plantinga und Dyer). Die Laufzeit des Algorithmus 16 ist bei orthographischer und perspektivischer Projektion O(n5 ) Beweis. O(n) Elemente werden konsekutiv dem Aspektraum hinzugefügt. In [6] wird gezeigt, dass die Laufzeit für das Vereinigen zweier Aspekträume O(nm) beträgt, n und m sind die jeweiligen Größen der Aspekträume. Das Vereinigen aller Aspekträume zu einem Aspektraum der Größe O(n4 ) ist in O(n5 ) möglich. t u Aus dem Aspektraum kann auch der VSP bestimmt werden. Wie vorher gezeigt hat der VSP – wie auch der Aspektgraph – eine Komplexität von Θ(n6 ) (bzw. Θ(n9 )), der Aspektraum jedoch nur O(n4 ). Das resultiert daraus, dass der Aspektraum auf den Sichtraum abgebildet wird indem die Bildkoordinaten entfernt werden. Durch diese Operation kann es deutlich mehr Schnitte zwischen den Elementen geben. Die O(n3 ) Peaks (Linien) im orthogonalen Aspektraum sind Linien im Sichtraum, die sich in O((n3 )2 ) = O(n6 ) Punkten schneiden können. Die O(n4 ) Linien im perspektivischen Aspektraum könnten sich in O((n4 )2 ) = O(n8 ) Schnittpunkten treffen, aber die O(n3 ) Peaks (Flächen) in O((n3 )3 ) = O(n9 ) Punkten. Die die O(n6 ) (bzw. O(n9 )) Schnittpunkte im Sichtraum der O(n3 ) Peaks lassen sich nach [1] mittels binärer Suche in nur O(log n) zum VSP hinzufügen. Das ergibt eine Gesamtlaufzeit von O(n6 log n) für die orthographische und O(n9 log n) für die perspektivische Projektion. Um den VSP in den dualen Aspektgraphen zu konvertieren ist nur noch lineare Laufzeit nötig, der jeweilige Aspekt (z.B. der LISG) wurde damit aber noch nicht bestimmt. Dies kann wie beim naiven Algorithmus auch in O(n2 ) pro Knoten des Aspektgraphen geschehen. 5 Fazit Ein Aspektgraph bietet eine Möglichkeit, Sichtbarkeiten einer Szene in einer Datenstruktur zu speichern. Die Laufzeit und der Speicherplatzbedarf der hier vorgestellten Methode zur genauen Bestimmung der Sichtbarkeit jedes einzelnen Elementes ist zwar polynomiell bezüglich der Anzahl der Elemente in der Szene, für praktische Einsätze in der Computergraphik aber viel zu hoch (vgl. Tabelle 4). Selbst durch den hier vorgestellten Algorithmus von Plantinga und Dyer verbessert sich das nicht wesentlich. Für bestimmte Anwendungen jedoch, wie z.B. Echtzeitgrafik, ist lineare Laufzeit ein Muss. In diesem Anwendungsgebiet Aspektgraphen und Verdeckung 127 ergäbe es jedoch auch keinen Sinn, die Sichtbarkeit auf jede Ecke genau zu Bestimmen. Daher kann man überlegen, wie der Aspektgraph approximiert werden kann. Tabelle 4 fasst die Strukturgrößen und Berechnungslaufzeiten zusammen. Mit dem Zusatz konvex markierte Zeilen treffen auf den Spezialfall mit einem konvexen Polyeder im Objektraum zu. Die Daten sind teilweise aus [1] entnommen. Rendermodus Größe des VSP Naiver Ansatz Erreichbar 2D orthographisch O(n2 ) O(n4 ) O(n3 ) 4 7 2D perspektivisch O(n ) O(n ) O(n4 log n) 3D orthographisch konvex O(n2 ) O(n7 ) O(n2 ) 3 9 3D perspektivisch konvex O(n ) O(n ) O(n3 ) 3D orthographisch O(n6 ) O(n10 ) O(n6 log n) 9 13 3D perspektivisch O(n ) O(n ) O(n9 log n) Tabelle 4: Vergleich der Größe und Berechnungslaufzeit eines VSP Literaturverzeichnis 1. Plantinga WH, Dyer CR (1990) Int J Comput Vision, Volume 5, Number 2: 137–160 2. id Software, Apogee Software Ltd (1992) Wolfenstein 3D. 3. Matthias H (2007) Parametrisierte Generierung und automatische Bewertung virtueller Szenen. Diplomarbeit, University of Paderborn, Paderborn 2007 4. Schiffenbauer RD (2001) A survey of aspect graphs. PhD thesis, Polytechnic University of Brooklyn, New York 5. Koendrick JJ, van Doorn AJ (1976) Biological Cybernetics 24: 51–59 6. Plantinga WH, Dyer CR (1990) The aspect representation. In: Technical Report 684. University of Wisconsin-Madison, Wisconsin-Madison Teil II Seminar Cell to Cell Visibility in PVS Systemen André Gärtner Universität Paderborn Zusammenfassung. Um das Sichtbarkeitsproblem in Architekturen zu lösen, werden Räume in Zellen aufgeteilt und über Portale miteinander verbunden. Diese Arbeit erklärt, wie man durch Berechnung von Stabbing Lines, die durch die Portale gelegt werden, die Sichtbarkeit sowie Schatten, der durch lichtblockierende Objekte (z.B. Wände) entsteht, innerhalb der Zellen bestimmt werden kann. Dazu wird eine Methode gezeigt, wie sich das Problem auf den Schnitt von Kanten eines fünfdimensionalen Polytops mit vierdimensionalen Hyperebenen übertragen läßt. Die Übertragung erfolgt mit Hilfe von Plücker-Koordinaten. 1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 2 Plücker-Koordinaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 3 Berechnung der Stabbing Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 4 Stabbing von 3D Portal-Sequenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 4.1 4.2 4.3 4.4 4.5 4.6 4.7 Penumbra und Antipenumbra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 Oberflächen und Schneisen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 Grenz- und innenseitige Schneisen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Zweidimensionales Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 EEE Schneisen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 VE Schneisen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Containment Funktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 5 Berechnung des Antipenumbra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 5.1 Algorithmus am Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 6 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 1 Einleitung In der Computergraphik ist ein häufiges Problem, die Sichtbarkeit verschiedener Objekte zu bestimmen. Dies ist z.B. der Fall, wenn man innerhalb einer Szene entscheiden muss, was von einem bestimmten Standpunkt aus sichtbar ist. Die Berechnung, ob ein Objekt von dort aus sichtbar ist, ist zeitaufwendig und daher insbesondere für komplexe Architekturen oder Videospiele, in denen viele Objekte durch Wände verdeckt sind, nur eingeschränkt oder gar 132 André Gärtner nicht in Echtzeit möglich. Man versucht daher präventiv die Menge der potentiell sichtbaren Objekte (engl. Potentially Visible Set, PVS ) zu bestimmen und alle nicht sichtbaren Objekte auszusortieren, so dass zur Laufzeit nur noch eine kleine Teilmenge aller Objekte gerendert werden muss. Gelöst wurde dieses Problem von Teller und Séquin [5, 6] für den zweidimensionalen Raum. Räume eines Gebäudes werden dabei in Zellen aufgeteilt, die über durchsichtige Portale miteinander verbunden sind. Zwischen einzelnen Zellen besteht genau dann eine Sichtbarkeit, wenn durch eine Sequenz von Portalen eine Gerade (engl. Sightline oder Stabbing line) hindurch gelegt werden kann. Auf diese Weise können nun für jede Zelle die von dort aus sichtbaren Zellen bestimmt werden, so dass die Anzahl der zur Laufzeit zu betrachtende Objekte auf die in diesen Zellen befindlichen Objekte verringert werden kann. Dieses Vorgehen lässt sich auch im dreidimensionalen Raum, durch Suchen einer Stabbing Line, die durch eine Sequenz aus Portalen in der Form konvexer orientierter Polygone verläuft (Abb. 1), anwenden. Übertragen läßt sich das Problem auf den Schnitt der Kanten eines fünfdimensionalen Polytops mit einer vierdimensionalen Hyperebene1 . Die Übertragung erfolgt mit Hilfe von Plücker-Koordinaten [3, 6], die die Darstellung einer Geraden des R3 als Punkt oder Hyperebene des fünfdimensionalen projektiven Raumes ermöglichen. Ein weiterer Anwendungsbereich, der die Suche nach Stabbing Lines ausnutzt, ist die Berechnung von Licht und Schatten, wie sie in einer weiteren Arbeit von Teller [2, 6] beschrieben wird. Versteht man die Stabbing Lines nicht als Sichtlinien sondern als Lichtstrahlen, so kann auf diese Weise berechnet werden, wie viel Licht auf ein Objekt fällt. Je nachdem, ob Lichtstrahlen ganz, teilweise oder gar nicht durch andere Objekte verdeckt werden, befindet sich das Objekt entweder in einem Schatten oder Halbschatten oder aber ist voll erleuchtet. Abb. 1. Stabbing Line durch vier unterschiedliche Polygone 2 Plücker-Koordinaten Zur Darstellung von Punkten im projektiven Raum werden homogene Koordinaten verwendet. Punkte des euklidischen Raums Rn werden dazu im projektiven Raum P n durch ein (n + 1)-Tupel beschrieben, indem den n ursprünglichen Koordinaten eine zusätzliche Koordinate w hinzugefügt wird, wobei w eine reele Zahl mit w 6= 0 ist. In der Computer1 Eine Hyperebene ist das Äquivalent zu einer Ebene in höher-dimensionale Räumen. Sie teilt diesen Raum in zwei Hälften. Cell to Cell Visibility in PVS Systemen 133 graphik wird zumeist w = 1 gewählt, so dass der Punkt (x, y, z) des R3 auf (x, y, z, 1) im P 3 abgebildet wird. Ein geordnetes Paar voneinander verschiedener Punkte p = (px , py , pz ) und q = (qx , qy , qz ) definiert eine gerichtete Gerade l im R3 . Im projektiven Raum P 3 kann dies als 2 x 4 Matrix dargestellt werden: px p y p z 1 qx qy qz 1 Durch Plücker-Koordinaten [7] ist es möglich diese Darstellung auf ein 6-Tupel Πl = (πl0 , πl1 , πl2 , πl3 , πl4 , πl5 ) abzubilden, das diese Gerade ebenfalls eindeutig beschreibt. Dazu werden die Determinanten der sechs 2 x 2 Untermatrizen berechnet und wie folgt den πi zugeordnet: πl0 = px qy − qx py πl1 = px qz − qx pz πl2 = px − qx πl3 = px qy − qx py πl4 = pz − qz πl5 = qy − py Die Elemente des so entstandene 6-Tupels können als homogene Koordinaten eines Punktes im P 5 (dem Plücker-Raum) aufgefasst werden. Eine Gerade im R3 entspricht somit einem Punkt im P 5 . Durch Permutation der einzelnen Koordinaten erhält man den Vektor (π4 , π5 , π3 , π0 , π1 , π2 ), mit dem sich eine Hyperebene im R5 beschreiben lässt, die alle Geraden enthält, die die ursprüngliche Gerade im R3 schneiden. Die Untersuchung der gegenseitigen Lage zweier Geraden im R3 lässt sich nun auf die Überprüfung der Lage eines homogenen Punktes (als Repräsentant der einen Gerade) zu einer Hyperebene (als Repräsentant der anderen Gerade) im P 5 zurückführen. Wenn a und b zwei gerichtete Gerade sind, und Πa , Πb die korrespondierenden Plücker Darstellungen, kann eine Relation side(a, b) als permutiertes inneres Produkt definiert werden: Πa Πb = πa0 πb4 + πa1 πb5 + πa2 πb3 + πa4 πb0 + πa5 πb1 + πa3 πb2 Mit Hilfe dieser Relation kann bestimmt werden, wie die beiden Geraden zueinander liegen (Abb. 2). Gilt side(a, b) < 0, so läuft die Gerade b dem Uhrzeigersinn an a vorbei, wenn man auf die Spitze der gerichteten Geraden a schaut. Für side(a, b) > 0 läuft b genau entgegengesetzt an a vorbei (Rechte-Hand-Regel). In beiden Fällen sind die Graden windschief zueinander. Gilt hingegen side(a, b) = 0, so sich beide Geraden koplanar, d.h. sie scheiden sich oder aber sie sind parallel. Jede gerichtete Gerade in 3D-Raum korrespondiert mit einen Punkt im Plücker-Raum, aber nicht umgekehrt. Nur die Punkte Π, die der quadratischen Relation genügen Π Π =0 korrespondieren zu realen Geraden im 3D-Raum. Bei allen anderen Punkten handelt es um imaginären Gerade (Geraden mit komplexen Koeffizienten). 134 André Gärtner Abb. 2. Anordnungen von Geraden im 3D-Raum und ihre Entsprechung im 5D-Raum Abb. 3. Anordnungen von Geraden im 3D-Raum und ihre Entsprechung im P 5 Graphisch kann man sich die Punkte, die die obige quadratische Gleichung erfüllen, als eine 4-dimensionale, durch eine Linie begrenzte Fläche im P 5 (ein so genannten PlückerQuadrik) vorstellen, oder - in den R3 übertragen - als einen einschaligen Hyperboloiden (Abb. 3). Im Folgenden wird für die Abbildung einer gerichteten Geraden l des R3 auf PlückerKoordinaten die Funktion Π : l 7→ Π(l) verwendet. Für die Rückübertragung von Punkten, die auf der Plücker-Quadrik liegen, dient die Funktion L : Π 7→ l(Π). 3 Berechnung der Stabbing Lines Angenommen, eine Szene besteht aus einer beliebigen Anzahl konvexer orientierter Polygone, die jeweils ein Portal repräsentieren. Insgesamt besitzen diese Polygone n Kanten (auch Generatorkanten genannt). Jede Kante Ek mit k1, ..., n dieser Polygone ist durch ein Segment einer gerichtete Gerade ek bestimmt. Da die Polygone orientiert sind, kann jede dieser Geraden ek so orientiert werden, dass eine durch die Portal gelegte Stabbing Line s zu jeder dieser Geraden ek im gleichen Verhältnis verlaufen muss (Abb. 4). In einem rechtsgerichteten Koordinatensystem bedeutet dies, dass s die Relation side(s, ek ) ≥ 0 mit k1, ..., n erfüllen muss. Die zu ek korrespondierende Hyperebene hk ist definiert als: hk = {xP 5 : x Πk = 0} Cell to Cell Visibility in PVS Systemen 135 Abb. 4. Verlauf der Stabbing Line s entlang der Kanten eines Polygons Für jede Stabbing Line s mit side(s, ek ) ≥ 0 gilt daher S Πk ≥ 0, wobei S die Darstellung von s in Plücker-Koordinaten ist. Im P 5 muss sich der Punkt S folglich in oder oberhalb der Hyperebenen hk befinden (Abb. 5). Bezeichnet h+ k den durch hk abgeschlosseT nen Halbraum, dann liegt S innerhalb oder auf der Grenze des konvexen Polytops k h+ k, das durch diese Hyperebenen gebildet wird. Abb. 5. Lage von S = Π(s) zu den Hyperebenen hk T Die Oberflächenstruktur eines konvexen Polytops k h+ k (die konvexe Hülle) besitzt eine Worst-Case Komplexität quadratisch zu der Anzahl der definierenden Halbräume [8] und kann durch einen randomisierten Algorithmus in O(n2 ) berechnet werden [9]. Allerdings ist es nicht ausreichend, einen Punkt innerhalb des durch die Hyperebenen gebildeten Polytops zu finden, da nicht alle Punkte innerhalb dieses Polytops tatsächlich einer Gerade im R3 entsprechen. Eine solche Gerade existiert genau dann, wenn es einen Punkt x gibt, der sich sowohl innerhalb oder auf der Grenze des konvexen Polytops befindet (x Πk ≥ 0,∀k) und zugleich auch auf einer Plücker-Quadrik liegt (x x =T0). Gesucht ist somit die Schnittmenge der Plücker-Quadrik mit dem durch k h+ k begrenzten Polytop. Diese Menge lässt sich durch die folgende Überlegung weiter einschränken: Existiert eine - durch eine Reihe von Polygonen - durchgehende Gerade, die keine der Polygonkanten berührt, so lässt sich diese Gerade derart verschieben, dass sie zunächst eine Kante, dann zwei, drei und schließlich vier Kanten berührt. Die Menge der so gebildeten Stabbing Lines wird Extremal genannt (dazu mehr in Kapitel 4). Die Anzahl von vier Kanten ergibt sich aus der Tatsache, dass eine Geraden im dreidimensionalen Raum gerade durch die Bestimmung von vier Freiheitsgrade spezifiziert wird. 136 André Gärtner So kann eine Gerade z.B. durch Angabe zweier Abschnitte auf zwei vorgegebenen Koordinatenebenen bestimmt werden, wofür jeweils zwei Koordinaten ausreichen. Alternativ können für die Abdeckung der Freiheitsgrade auch vier Geraden (eben die Polygonkanten) verwendet werden, die die gesuchte Gerade scheiden. Diese Gerade verläuft dann entweder durch die Vertices2 zweier Polygone, durch den Vertex eines Polygons und die windschiefe Kanten zweier anderer Polygone oder aber durch die windschiefen Kanten von vier verschieden Polygonen. Abb. 6. Schnitt einer aus vier Hyperebenen Πk gebildeten fünfdimensionalen Linie L mit dem PlückerQuadrik Betrachtet man je vier dieser Geraden als Hyperebenen im Plücker-Raum, so spezifiziert ihre Schnittmenge eine Gerade L T des fünfdimensionalen Raumes. Die so gebildete Gerade entspricht einer Kante des durch k h+ k begrenzten Polytops. Zur Ermittlung aller extremalen Stabbing Lines reicht es also aus, die Geraden durch die Kanten dieses Polytops mit der entsprechenden Plücker-Quadrik zu schneiden (Abb. 6). Analog zum dreidimensionalen Raum ergeben sich hieraus null, ein, zwei oder unendlich viele Schnittpunkte, die den extremalen Stabbing Lines entsprechen (Abb. 7). Abb. 7. Zwei Schnittgeraden durch vier generische Linien im R3 Die Berechnung einer durch vier Geraden festgelegten Gerade [4] erfolgt daher in zwei Schritten. Als erstes muss aus allen vier Geraden lk (bzw. ihre entsprechenden Hyperebe2 Einzahl: Vertex, ist ein Grundbaustein der polygonalen Modellierung: Zwei Vertices ergeben zusammen die Endpunkte einer Linie, drei Vertices definieren ein Dreieck, usw. Cell to Cell Visibility in PVS Systemen 137 nen) eine Gerade l des fünfdimensionalen Raumes bestimmt werden. Diese Gerade l wird anschließend mit dem Plücker-Quadrik geschnitten, d.h. sie muss die Gleichung l l = 0 erfüllen. Der erste Schritt beruht auf der Singulärwertzerlegung von Matrizen [10, 11]. Diese wird auf eine Matrix M , bestehend aus den vier Hyperebenen Πk , angewendet, die zu vier Polygonkanten lk korrespondieren, um den Kern dieser Matrix zu bestimmen: Π04 Π05 Π03 Π00 Π01 Π02 Π14 Π15 Π13 Π10 Π11 Π12 M = Π24 Π25 Π23 Π20 Π21 Π22 Π34 Π35 Π33 Π30 Π31 Π32 Nach der Anwendung der Singulärwertzerlgung kann M als das Produkt dreier Matrizen als U ΣV T geschrieben werden, wobei U eine orthogonale 4x4 Matrix, Σ eine diagonale 4x6 Matrix und V eine 6x6 Matrix ist: σ 0 0 0 0 0 0 u00 · · · π03 u00 · · · π05 0 σ0 0 0 0 0 .. . . . .. M = U ΣV T = ... . . . ... . 0 0 σ0 0 0 0 . u30 · · · π33 u · · · π 50 55 0 0 0 σ0 0 0 Die Werte der Diagonalen von Σ ergeben sich dabei aus den Eigenwerten von M . Die Anzahl der von 0 verschiedenen Zeilen bestimmt dabei den Rang der Matrix. Jede dieser von 0 verschiedenen Zeilen korrespondiert mit einer Spalte in V und bilden in Kombination den Kern der Matrix M . Dieser enthält die Plücker-Koordinaten der Geraden, die die vier Geraden schneiden, aus denen M gebildet wurde. Sind alle Zeilen in Σ von 0 verschieden (d.h. linear unabhängig) dann hat M den Rang 4. Die letzten beiden Zeilen von V bilden dann den Kern von M . Benennt man diese beiden Zeilen mit F und G, dann lässt sich eine Abbildung Λ : P 7→ P 5 mit Λ(t) ≡ F + tG definieren. Aus der Kern-Eigenschaft geht nun hervor, dass Λ(t) Πk = 0 für 0 ≤ k ≤ 3 gilt. Da es sich bei Λ um eine injektive Funktion handelt, besteht ein Isomorphismus zwischen P und der Menge aller realen und imaginären Geraden, die durch je vier Polygonkanten spezifizierten sind. Die Menge der tatsächlich vorhandenen Schnittgeraden im R3 korrespondiert daher mit den Nullstellen der quadratischen Gleichung Λ(t) Λ(t) = 0. Diese lässt sich durch Einsetzen der obigen Definition für Λ nach F F t2 + 2F Gt + G G = 0 auflösen. Für die Diskriminante d dieser Gleichung ergibt sich (F G)2 −(F F )∗(GG). Daraus folgt für d < 0, dass keine Schnittgerade im R3 existiert. Für d = 0 gibt es genau eine Schnittgerade und für d > 0 zwei. Gilt hingegen (unabhängig von t) (F F )2 + (F G)2 + (G G)2 = 0, dann gibt es unendlich viele Lösungen für die Gleichung und somit genau so viele Schnittgeraden im R3 . Hat M den Rang 3 (die letzten drei Zeilen von V bilden den Kern von M ), dann ergibt sich in diesem Fall Λ(u, v) : P 2 7→ P 5 mit 138 André Gärtner Λ(u, v) = uF + vG + H. F , G und H entsprechen dann den letzten drei Zeilen der Matrix V . Auch die hierdurch bestimmten Geraden müssen wieder die quadratische Gleichung Λ Λ = 0 erfüllen. Das Ergebnis dieser Gleichung hängt jetzt jedoch von zwei Parametern ab. Ergeben sich als Lösung zwei Geraden, dann wird die Menge der Schnittgeraden durch zwei ein-parametrige Geradenscharen gebildet. Andernfalls kann die Funktion durch eine einzelne Variable t parametrisiert werden. Daraus ergibt sich dann für u(t) und v(t) die Menge der Schnittgeraden als L(u(t)F + v(t)G + H). Die Bestimmung der Schnittgeraden für Matrizen mit Rang 2 oder 1 erfolgt analog auf der Basis von drei bzw. vier Parametern. 4 Stabbing von 3D Portal-Sequenzen Im vorherigen Kapitel wurde gezeigt, wie man die Lage von Stabbing Lines innerhalb von Portalen berechnet. Nun wird ein Algorithmus vorgestellt, wie man mit Hilfe dieser Stabbing Lines Licht und Schatten berechnen kann. Versteht man die Stabbing Lines nicht als Sichtlinien sondern als Lichtstrahlen, so kann auf diese Weise berechnet werden, wie viel Licht auf ein Objekt fällt. Diese Methode wird sowohl für den 2D als auch für den 3D Fall vorgestellt und analysiert. 4.1 Penumbra und Antipenumbra Angenommen ein Flächenlicht strahlt in einer Szene mit mehrere Occludern3 . Diese Occluder erzeugen einen Schatten und verhindern so, dass Licht bestimmte Regionen in der Szene erreicht. Jeder Punkt in der Szene läßt sich somit im Bezug zur Lichtquelle charakterisieren. Abbildung 8 zeigt ein zweidimensionales Beispiel. Wenn ein Punkt nichts von der Lichtquelle ”sehen” kann, sagt man, dass der Punkt im Umbra (Schatten) liegt. Kann ein Punkt hingegen etwas, aber nicht alles, von der Lichtquelle ”sehen”, sagt man, dass dieser im Penumbra (Halbschatten) liegt. Wenn keins der beiden Situationen zutrifft, wird der Punkt von der ganzen Lichtquelle bestrahlt. Abb. 8. Umbra und Preumbra eines Occluder im 2D-Raum Stellt man sich vor, das die Occluder durch konvexe Portale bzw. transparente Ebenen ersetzt werden, kann man jeden Punkt komplementär charakterisieren. Als Antiumbra 3 Ein Objekt das den Durchfall von Licht teilweise oder komplett verhindert Cell to Cell Visibility in PVS Systemen 139 definiert man den Lichtkegel (auch als Volume bezeichnet), von dem aus die Lichtquelle komplett einsehbar ist (Abb. 9). Für eine gegebene Lichtquelle und eine Menge von Portalen oder Occludern definiert sich Umbra als das räumliche Komplement der Vereinigung von Antiumbra und Antipenumbra. Ähnlich ist Antiumbra das Komplement der Vereinigung von Umbra und Penumbra. Abb. 9. Antiumbra und Antipenumbra durch eine Portal-Sequenz Man möchte nun die beleuchteten Bereiche einer Lichtquelle (im Folgenden immer das erste Portal der Sequenz) innerhalb einer erreichten Zelle durch eine Gerade, die die Sequenz durchdringt, charakterisieren. Die Charakterisierung für den Bereich einer Sequenz mit einem Portal ist trivial. In diesem Fall, ist das Antipenumbra die ganze Halbebene hinter dem Portal, die Nachbarzelle der Quellzelle ist. Durch die Konvexität der Zellen liefert es genau das Volumen der erreichten Zelle. Berechnungen des Antipenumbra für Portalsequenzen mit zwei oder mehr Portalen, beziehen Schnitte zwischen Vertices und Kanten von Portalen mit ein. Es wird im weiteren dieses Kapitels gezeigt, dass dies lineare und quadratische Primitive einschließt um das beleuchtete Volumen korrekt zu beschreiben. In Kapitel 3 wurden die Portale als orientiert dargestellt. In zwei Dimensionen bedeutet das, dass jedes Portal vom Sichtpunkt eines Portal traversierenden Lichtstrahls, ein ”linkes” und ”rechtes” Ende besitzt. Im R3 bedeutet die Portal-Orientierung, dass das PortalPolygon, gesehen als eine geordnete Sequenz von Punkten, vom Sichtpunkt eines Betrachters auf die Lichtquelle, im Uhrzeigersinn erscheint. 4.2 Oberflächen und Schneisen Es gibt drei Arten von extremalen Stabbing Lines: Vertex-Vertex Geraden (kurz: VV), Vertex-Edge-Edge Geraden (kurz: VEE) und vierfach Edge Geraden (kurz: 4E). Stellen wir uns vor, dass man eine extremale Stabbing Line (egal von welchem Typ) durch Lockerung von genau einer der vier Freiheitsgrade von der ursprünglichen Position weg schiebt (vgl. Abb. 10). Die Oberfläche, oder Schneise (engl. Swath), die durch die Verschiebung entsteht, ist planar oder gebogen wie eine Schar. Schneisen, wie VE oder EEE Geraden, werden Event Surfaces genannt. Abbildung 10-i zeigt eine extremale VV Stabbing Line, die an vier Kanten A, B, C und D gebunden ist. Durch Lockerung der Beschränkung an C erhält man eine VE Schneise (planar), die über A, B und D gespannt ist. Kommt die Schneise an ein Hindernis (in diesem Fall: Kante E), so terminiert diese als eine VV Gerade, die über A, B, D und E gespannt ist. Abbildung 10-ii zeigt eine extremale 4E Stabbing Line, die an die Kanten A, B, C und D 140 André Gärtner Abb. 10. Verschiebung einer Stabbing Line, die im 3D eine planare VE Schneise (i) oder eine quadratische EEE Fläche (ii) generiert gebunden ist. Die Lockerung der Beschränkung an A produziert eine EEE Schneise (Schar), die über B, C und D gespannt ist. In dem Beispiel trifft die Gerade auf die Ecke E und stop als VEE Gerade. Bedenken wir nun die gleiche Situation im 5D-Raum, gegeben durch eine Plücker Transformation (Abb. 11). Extremale Geraden bilden auf einzelne Punkte in Plücker Koordinaten T ab und zwar die Schnittpunkte der Kanten bzw. die 1D-Flächen des Polytops k h+ k mit der Plücker-Quadrik. Da Schneisen zur ein-parametrischen Geradenfamilie gehören, korrespondieren diese zu Kurven in Plücker-Koordinaten. Diese Kurven sind die Spuren (engl. Traces) oder Schnittpunkte der 2D-Fläche des Polytops mit der Plücker-Quadrik und daher kegelförmig. Die 3D Schneisen, die zu den 5D kegelförmigen Spuren korrespondieren, nennt man auch extremale Schneisen. Alle Schneisen haben drei Generatorgeraden und somit drei Generatorkanten, die von Elementen der Portal Sequenzen entstehen. Abb. 11. Spuren (Schnittpunkte) von Extremalen auf dem Plücker-Raum 4.3 Grenz- und innenseitige Schneisen Eine 1D-Geradenfamilie kann extremal im 5D sein, solange sie komplett im Antipenumbra liegt (im 3D-Raum). Sobald extremale Stabbing Lines in dem Inneren des Antipenumbra Cell to Cell Visibility in PVS Systemen 141 liegen, sind auch extremale Schneisen im Inneren. Eine extremale Schneise die auf der Grenze des Antipenumbra liegt wird als Grenzschneise (engl. Boundary Swath) definiert. Alle anderen extremalen Schneisen sind innenseitig (engl. internal ). Untersuchungen der 2DT Flächen des Polytops k h+ liefern alle extremalen Schneisen. Es ist dabei wichtig, diese k Unterscheidung zwischen Grenzschneisen und innenseitigen Schneisen zu machen. Diese Unterscheidung kann nur lokal gemacht werden, durch Untersuchung der drei Generatorkanten und ihrer Generator-Polygone. Nur durch Berücksichtigung dieser konstanten Anzahl von geometrischer Begrenzungen wird im Folgenden gezeigt, wie man berechnen kann, ob eine Stabbing Line auf ”beiden Seiten” existieren kann. Wenn das der Fall sein sollte, kann die Schneise nichts zu der Antipenumbra Grenze betragen und sie wird als innenseitig klassifiziert. 4.4 Zweidimensionales Beispiel Die Begriffe für Grenz- und innenseitige Schneisen lassen sich am einfachsten am zweidimensionalen Beispiel erklären (Abb. 12). Portale und die Lichtquelle sind Geradensegmente. Die über Kreuz verlaufenden Geraden, die die Portalsequenz durchdringen, enthalten eine extremale Schneise (im 2D ein Geradensegment), wo eine beschränkte Stabbing Line (z.B durch Portal Endpunkte) vorkommen kann. Die dargestellte Fläche hinter dem letzten Portal ist eine konvexe Fläche, die durch die zwei überkreuzenden Kanten und das Portal selbst aufgespannt wird. Diese Kanten sind solange Grenzschneisen im 2D, wie sie den Antipenumbra Bereich von dem unbeleuchteten Bereich voneinander trennen. Die restlichen Kanten sind gültige Stabbing Lines aber innenseitige Schneisen. Abb. 12. Schneisen eines 2D-Beispiels Um dies etwas genauer zu verstehen, stellt man sich eine nicht überkreuzende Kante E vor, die langsam von den begrenzenden Punkten p und q rund herum wegbewegt wird (Abb. 13). Die Grenzpunkte der Portale liegen dabei auf der selben Seite von E. In dem Beispiel wird nun die Gerade um den Punkt p gedreht, die nur ins innere des mittleren Portals wandern kann. Daraus ergibt sich, das die Kante E in dem unteren Bereich des letzten Portals wandert (gestrichelte Linie). Dreht man die Kante E um den Punkt q, so wandert die Kante in den oberen Bereich des letzten Portals (gepunktete Linie). Solange E gültige Stabbing Lines erlaubt (egal ob nach oben oder unten), kann diese keine beleuchteten von nicht-beleuchteten Region separieren. Die Schnittgerade gilt somit als innenseitige Schneise. Betrachten wir jetzt die Situation noch für eine überkreuzende Kante E (Abb. 14). Die Portal Endpunkte p und q liegen also auf der entgegengesetzten Seite von E. Dreht man 142 André Gärtner Abb. 13. innenseitige Schneise einer Portalsequenz die Gerade nun um diese Punkte, wandert diese nur in eine Richtung des jeweiligen Portals. Dies liefert nur Geraden auf einer Seite von E (die beinhaltende Seite des Antipenumbra). E wird in diesem Fall Grenzschneise bezeichnet. Abb. 14. Grenzschneise einer Portalsequenz 4.5 EEE Schneisen Im Dreidimensionalen, können innenseitige und Grenzschneisen folgendermaßen unterschieden werden. Angenommen, drei Generatorkanten A, B und C bilden eine Basis für eine EEE-Schneise. Über diese Geraden wird eine Gerade L an den Punkten a, b und c gespannt (Abb. 15-i). An diesen Punkten erheben sich drei Vektoren Na , Nb und Nc senkrecht zu L und den Generatorkanten. Wichtig ist dabei, dass die Richtung so gewählt wird, dass man ein positives Skalarprodukt mit einem ins Portal gerichteten Vektor erhält. Man sagt, dass drei koplanare Vektoren enthalten (engl. contained ) sind, wenn ein anderer Vektor existiert, dessen Skalarprodukt mit allen drei Vektoren strikt positiv ist. Eine Schneise ist innenseitig, genau dann wenn dessen korrespondierende Ni enthalten sein können. Angenommen die Ni können wie in Abbildung 15 enthalten sein, dann hat ein Vektor ein positives Skalarprodukt mit den Ni (zeigend in Richtung des grauen Bereichs wie in Abb. 15-ii), und man teilt die Konfiguration mit einer Ebene, die L und diesen Vektor beinhaltet. Die Spur (Schnitt) der Schneise auf dieser Ebene ist die Stabbing Line L, welche die Teilungsebene in zwei Bereiche L+ und L− partitioniert (Abb. 15-iii). L kann in winzigen Schritten bewegt werden, z.B. um Punkt a. Das Innere der zwei Portale erlaubt L nur in die Richtung L+ zu drehen (gepunktete Stabbing Lines). Analog entstehen die Stabbing Lines Cell to Cell Visibility in PVS Systemen 143 Abb. 15. Eine innenseitige EEE-Schneise (i), herunter geschaut an L (ii) und in Richtung L traversiert (iii) (gestrichelt) im L− wenn man um Punkt c dreht. Auf Grund der Tatsache, dass Stabbing Lines in beide Richtungen gehen, kann es keine Grenzschneise sein. Abb. 16. Eine Grenz-EEE-Schneise (i), herunter geschaut an L (ii) und in Richtung L traversiert (iii) Im Vergleich, kann Ni in Abbildung 16 nicht enthalten sein. Jeder Vektor hat mit den anderen Vektoren ein negatives Skalarprodukt. Angenommen es gibt ein negatives Skalarprodukt mit Nc und man teilt die Konfiguration mit einer Ebene, die L und einen solchen Vektor beinhaltet (Abb. 16-iii). Eine Drehung um den Punkt b generiert Stabbing Lines im L− (gepunktet) und so auch eine Drehung um Punkt c. Diese Konfiguration liefert also keine Stabbing Lines im L+ . Solange dies für irgendeine Teilungsebene für L zutrifft, ist die Schneise eine Grenzschneise. 4.6 VE Schneisen Angenommen die Schneise ist von Type VE. Dies ist ein Spezialfall einer EEE Konstruktion, in der zwei der drei Kanten involviert sind. Es ist nötig diesen Fall gesondert zu betrachten, da es das einfache Verhalten der Containment-Funktion erklärt (dazu mehr im nächsten Unterkapitel). In Abbildung 17 sind die Generatorkanten A und B gegeben, die die VE Schneise am Vertex v definieren, sowie eine Kante C, die zwei Generator-Polygone P und Q, eine Ebene 144 André Gärtner durch C und die Gerade S. Orientiere S so, dass Q über dieser Geraden liegt (S + ). Solange Q konvex ist, ist dieses immer möglich. S teilt den Raum hinter der Ebene von Q in zwei Regionen S + und S − . Wenn Stabbing Lines in einer dieser Regionen existieren können, ist die Schneise eine Grenzschneise. Dies ist möglich, genau dann wenn S eine Teilungsebene von P und Q ist bzw. sich Polygon P komplett unter S befindet. Abb. 17. Grenz- (i) und innenseitige (ii) VE-Schneise Angenommen S teilt Polygon P und Q voneinander und man wählt eine Schnittgerade der Schneise, die so wegbewegt wird, dass diese sich vom Schneisen-Vertex v löst, aber noch bei Kante C verbleibt. Der bewegende Linienschnitt mit P kann dann nur unter S liegen (Abb. 17-i). Folglich müssen alle Stabbing Lines den Bereich S + unter der Ebene von Q schneiden. Ähnliches Verhalten ergibt sich, wenn man die Stabbing Line von C ins Innere von Q wegbewegt und weiter an v gebunden bleibt. Die Schneise liefert nur Stabbing Lines im S + und ist somit eine Grenzschneise. Zum Vergleich sei angenommen, das die Ebene S P und Q nicht teilt, so dass die Kanten A und B im S + liegen (Abb. 17-ii). Wieder bewegt man eine Schneise so dass sie vom Vertex v losgelöst kommt, aber bei Kante C bleibt. Wenn die Gerade (gestrichelt) nach A über Ebene S wandert, wird diese sich mit der Region S − hinter der Ebene von Q schneiden. Sollte Kante B unter S liegen, würde die Bewegung nach B Stabbing Lines (gepunktet) im S + produzieren. Wenn A und B unter S liegen, liegen die Geraden bei v und schneiden das Innere von Q. Die Schneise liefert Stabbing Lines, die in S − und S + liegen und kann somit keine Grenzschneise sein. Sei darauf hingewiesen, dass die drei-Vektor Konstruktion für EEE Schneisen auch für diese degenerierte Einstellung einsetzbar ist. 4.7 Containment Funktion Die Containment-Funktion ist ein Kriterium um zwischen Grenz- und innenseitigen Schneisen zu unterscheiden. Dies trifft nur auf eine einzelne Stabbing Line zu, nicht aber auf eine ganze Schneise. Praktischer Weise liefert die Auswertung der Containment-Funktion auf einen Teil der Schneise aber Resultate. Grund dafür ist, dass die Konfiguration der Normalen, die von den Portalkanten ausgehen, erhalten bleiben. Um zu zeigen wieso das so ist, stellt man sich eine Konfiguration von drei koplanaren Vektoren Na , Nb und Nc vor. Angenommen, die Konfiguration ändert ständig von beinhaltend zu nicht beinhaltend (z.B. Cell to Cell Visibility in PVS Systemen 145 durch Drehung des Vektors Nc ) wie in Abbildung 18. An dem Moment wo Nc die Grenze (gepunktete Linien) überschreitet, muss Nc und einer von Na oder Nb antiparallel sein. Abb. 18. Containment und Non-Containment, mit bewegendem Nc für feste Na und Nb Damit dies in der EEE-Schneisen-Konstruktion passiert, müssen zwei oder drei Generatorkanten koplanar sein. Ähnlich bei einer VE-Schneisen-Konstruktion, muss ein Kantenpaar koplanar sein. Die Generatorkanten sind aber fest, nur die Verschiebungsgeraden variieren. Folglich wird nur durch Verschiebung einer extremalen Geraden entlang einer Schneise eine sich ständig ändernde Vektorkonfiguration generiert. Der Containment des Vektors ist eine konstante Funktion. 5 Berechnung des Antipenumbra Der benötigte rechnerische Mechanismus für die Berechnung des Antipenumbra ist nun vollständig. Folgende Annahmen werden getroffen: Eingabe ist eine Liste von m orientierten Polygonen P1 ...Pm (gegeben als Liste von n Kanten). Das erste Polygon P1 ist die Lichtquelle, die restlichen sind Löcher (Portale). Die Polygone sind disjunkt und so geordnet, dass der negative Halbraum definiert durch die Ebene von Pi alle Polygone Pj , i < j ≤ m beinhaltet. Der Algorithmus wandelt jede gerichtete Kante in eine Hyperebene in Plücker-Koordinaten um und ermittelt dann die gemeinsamen Schnitte der sich ergebenden Halbräume, ein konvexes 5D Polytop. Wenn kein Schnitt vorliegt, oder das Polytop keinen Schnitt mit der Plücker-Fläche hat, gibt es kein Antipenumbra. Gibt es Schnitte, wird die Polytop-Struktur nach Spuren von Grenzschneisen (Schnitt von 1D-Flächen (Kanten) und 2D-Flächen (Dreiecke) mit der Plücker-Quadrik) abgesucht (Abb. 11). Diese Spuren sind mit einer Schleife verknüpft, welche mit Komponenten der Antipenumbra-Grenze korrespondieren. Es kann mehrere Schleifen geben, da der Schnitt der Polytop-Grenze mit der Plücker-Quadrik mehrere Komponenten haben kann. Jede Schleife besteht aus wechselnden Polytop-Kanten und -Dreiecken mit der PlückerQuadrik (vgl. Abb. 19). Jede Kante, die sich mit der Plücker-Fläche schneidet ist ein Dual einer extremalen Stabbing Line im R3 . Der Schnitt zwischen Dreieck und der PlückerQuadrik ist ein Dual einer extremalen Schneise. Die Vorkommnis von Kanten und Dreiecken auf dem Polytop impliziert so die Adjazenz von korrespondierenden Linien und Schneisen im 3D. Das Übergehen einer Kante von einem Dreieck zum nächsten auf einem Polytop ist äquivalent zum Übergehen von extremalen Stabbing Lines zwischen zwei extremalen 146 André Gärtner Abb. 19. Schleife über Polytope-Kanten und -Dreiecke Schneisen im 3D. Folglich kann der Algorithmus von 2D-Fläche zu 2D-Fläche der PolytopFläche ”gehen”, nur durch Überquerung der 1D-Flächen Vorkommnisse. Jeder vorgefundene Kegel im 5D impliziert drei Generatorkanten im 3D, die in konstanter Zeit auf Containment untersucht werden (man beachte, das die Containment-Achse, Gerade L in Abb. 16, als Dual irgendeiner Überschneidung der Dreieckskanten mit der Plücker-Quadrik genommen werden kann). Kegel, deren Dual-Kanten enthalten sind, sind Duale von innenseitigen Schneisen (andernfalls sind sie Duale von Grenzschneisen). Sobald die Oberflächenstruktur des Polytops traversiert ist und die Grenzschneisen ermittelt sind, werden diese ausgegeben. Wenn eine Schleife durchlaufen ist, wird die Suche an einer noch ungeprüften Kante fortgesetzt. Jede geschlossene Schleife im 5D dieser Methode, ist das Dual der Grenze einer verbundenen Komponente des Antipenumbra im 3D. Algorithmus 18 Eingabe der gerichteten Kanten Ek der Polygone P1 ...Pm gerichtete Kanten in gerichtete Geraden ek konvertieren ek in PlückerTHalbräume hk = Π(ek ) transformieren 5D Polytop k h+ k berechnen T 2D-Flächen Schnitte von k h+ k mit der Plücker Oberfläche ermitteln Extremale Schneisen als Grenz- oder innenseitige Schneisen klassifizieren für alle durch DFS gefundene Komponenten des Antipenumbra T traversiere Grenz-2D-Flächen von k h+ k bilde jede gefundene Spur auf eine 3D Grenzschneise ab Ausgabe der Schneisen als quadratische Oberfläche 5.1 Algorithmus am Beispiel Um die Komplexität des Algorithmus zu verdeutlichen, wurde dieser von Teller in der Programmiersprache C und FORTRAN-77 auf einer 20-MIP Silicon Superworkstation implementiert. Um die konvexe Hülle von n Hyperebenen im 5D zu berechnen, wurden Algorithmen verwendet, die von Allan Wilks, Allen McIntosh und Michael Hohmeyer geprägt worden sind [2]. Abbildung 20 zeigt eine Menge von Polygonen mit n = 15, wobei das erste Polygon die Lichtquelle darstellt.TDie Antipenumbra Berechnung braucht bei zwei CPUs nur wenige Sekunden. Das Polytop k h+ k , entstanden aus 15 Halbräumen im 5D, hat 80 Fassetten, 186 2D-Flächen (Dreiecke) und 200 1D-Flächen (Kanten). Von den 186 Dreiecken werden 78 Cell to Cell Visibility in PVS Systemen 147 Abb. 20. Ein Lichtquelle mit drei Portalen (i) und den sich daraus ergebenden VE- (rot), EEE-Schneisen (grün) (ii) Dual-Spuren auf der Plücker-Quadrik induziert und somit auch 78 extremale Schneisen generiert. Von den 78 Schneisen sind 62 innenseitig und 16 grenzend (Abb. 20-ii). Von den 16 Grenzschneisen sind 10 VE- (rot) und 6 EEE-Schneisen (grün). Von den 200 Kanten schneiden 39 den Plücker-Quadrik und liefern die extremalen VV, VEE und 4E Stabbing Lines (Abb. 21). Man beachte, dass die extremalen Stabbing Lines die Form der AntipenumbraGrenze gestalten. Abb. 21. 39 Extremale Stabbing Lines (i) prägen die Antipenumbra-Grenze (ii) 6 Fazit Teller hat gezeigt, dass sich der Schatten - entstehend durch ein Lichtquelle - durch eine Portalsequenz mit n Kanten mit einem erwarteten Aufwand von O(n2 ) berechnen läßt. Beschrieben wurde das Antipenumbra als ein Volumen begrenzt durch die Regionen von quadratischen und planaren Flächen und gezeigt, dass jede Schneise oder Anteil der AntipenumbraGrenze im 3D durch einen Schnitt einer fünfdimensionalen konvexen Hülle mit einer vierdimensionalen Fläche, der Plücker-Quadrik, entsteht. Dieser Algorithmus ist an die Berechnung von Aspekt Graphen angelehnt, die Bereiche mit qualitativ unterschiedlichen Sichten einer Lichtquelle in einer Szene trennen. Es wurde eine Implementierung einer Antipenumbra-Berechnung über mehrere Polygonsequenzen demonstriert. Wie Teller beschreibt, wurde der Algorithmus durch ein Sichtbarkeitsprojekt, der statisches und Volumen-basierendes Culling im Dreidimensionalen umfasste, angeregt. Der Aufwand zur Bestimmung des Antipenumbra und somit auch der Stabbing 148 André Gärtner Lines lohnt sich insbesondere dann, wenn eine Szene einen Vielzahl verdeckter Objekte aufweist, wie es z.B. auf das Innere von Gebäuden, dicht bebaute Innenstädte oder ähnliches zutrifft. Werden so bereits im Vorhinein für jede Zelle die von dieser aus potentiell sichtbaren Zellen bestimmt, verringert sich der Aufwand für das Culling und Rendering erheblich, da viele Objekte aus nicht sichtbaren Zellen nicht mehr betrachtet werden müssen. Damit die Berechnung des Antipenumbra und Stabbing Lines überhaupt möglich wurde, wurde ein Verfahren gezeigt, mit dem sich der Schnitt von Kanten eines fünfdimensionalen Polytops mit einer vierdimensionalen Hyperebene berechnen läßt. Die Übertragung erfolgt mit Hilfe von Plücker-Koordinaten, die die Darstellung von Geraden des R3 als Punkte oder Hyperebenen des fünfdimensionalen projektiven Raumes ermöglichen. Literaturverzeichnis 1. Seth Teller und Pat Hanrahan, 1993, Global visibility algorithms for illumination computations, International Conference on Computer Graphics and Interactive Techniques, Seiten: 239 - 246. 2. Seth J. Teller, 1992, Computing the antipenumbra of an area light source, ACM SIGGRAPH Computer Graphics, Volume 26 - Issue 2, Seiten: 139-148. 3. Seth J. Teller und Michael E. Hohmeyer, 1992, Stabbing Oriented Convex Polygons in Randomized O(n2 ) Time, Technischer Bericht, Computer Science Department, U.C. Berkeley. 4. Seth J. Teller und Michael E. Hohmeyer, 1992, Computing the lines piercing four lines, Technischer Bericht, Computer Science Department, U.C. Berkeley. 5. Seth J. Teller und Carlo H. Séquin, 1991, Visibility preprocessing for interactive walkthroughs, ACM SIGGRAPH Computer Graphics, Volume 25 - Issue 4, Seiten: 61-68. 6. Seth J. Teller, 1992, Visibility Computations in Densely Occluded Polyhedral Environments, Dissertation, Computer Science Department, U.C. Berkeley, Seiten: 70-99. 7. Jorge Stolfi, 1989, Primitives for computational geometry, Technischer Bericht 36, DEC SRC, Seiten: 189-197. 8. Branko Grünbaum, 1967, Convex Polytopes, Wiley-Interscience, New York. 9. Kenneth L. Clarkson und Peter W. Shor, 1989, Applications of random sampling in computational geometry II, Discrete Computational Geometry, Seiten: 387-421. 10. Wikipedia, Begriff: Singulärwertzerlegung, Stand: Jan. 2008, http://de.wikipedia.org/wiki/Singul%C3%A4rwertzerlegung. 11. Gene H. Golub und Charles F. Van Loan, 1989, Matrix Computations, John Hopokins University Press. Hohe Verfügbarkeit in skalierbaren verteilten Hashingdateien mit Mirroring Marco Müller Universität Paderborn [email protected] Zusammenfassung. Heutzutage findet die Datenhaltung in Softwareprojekten nicht mehr nur auf einem Computer statt, sondern ist oftmals in einem Netz aus mehreren Computern verteilt und besteht aus einer großen Anzahl von Daten. Allerdings ist es dann nicht gewährleistet, dass alle Computer des Netzes auch immer verfügbar sind. Mirroring ist ein bekanntes Konzept, um diesem Problem zu begegnen. In dieser Arbeit soll dieses Konzept in das LH*-Schema, ein Hashingverfahren für skalierbare, verteilte Dateien, integriert werden. Dabei sollen Ausfälle von einem oder mehreren Computern so abgefangen werden, dass die Daten trotzdem verfügbar bleiben, ohne dabei die sonstigen Eigenschaften zu verlieren. Die hier vorgestellten Schemata erreichen immer noch sowohl eine ähnliche Zugriffszeit, als auch eine ähnliche Skalierbarkeit wie das LH*-Schema. Der Preis dafür sind ein höherer Speicherbedarf und ein erhöhter Bedarf an Nachrichten zur Kommunikation. Die verschiedenen Schemata haben unterschiedliche Eigenschaften, die sich aus den Anforderungen ergeben. Dies schlägt sich vor allem in den Kosten für die Wiederherstellung nach einem Ausfall nieder. 1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 1.1 Lineares Hashing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 2 Das LH*-Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 2.1 Clients . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 2.2 Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 2.3 Weitere Eigenschaften des LH*-Schemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 3 Das LH*-Schema mit Mirroring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 3.1 Allgemeine Eigenschaften von LH* mit Mirroring . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 3.2 Besonderheiten des SA-Mirrors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 3.3 Besonderheiten des SD-Mirrors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 4 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 1 Einleitung Hashing als eine Möglichkeit, große Datenmengen zu speichern, wird heutzutage in vielen Bereichen der Informatik eingesetzt. Durch die schnellen Zugriffszeiten und den geringen Speicherbedarf, den Hashingverfahren im Gegensatz zu Algorithmen, die Baumstrukturen 150 Marco Müller verwenden, besitzen, sind solche Verfahren sehr attraktiv für z.B. die Indexierung von Tabellen in einer Datenbank. Allerdings muss beim statischen Hashing im Vorfeld klar sein, wie groß der Wertebereich zu wählen ist, da es sonst zu vielen Kollisionen kommt und die Zugriffszeit zu sehr erhöht wird. Um diesem Problem entgegenzutreten, wurden dynamische Hashingverfahren entwickelt, die den Wertebereich dynamisch erweitern. Das bekannteste unter ihnen ist das Lineare Hashing [Lit80]. Diese Verfahren operieren auf dem Arbeitsspeicher eines Rechners und lagern, wenn nötig, Teile des Bildbereichs auf Festplatten oder ähnliche Medien aus. Allerdings sind heutzutage die Zugriffszeiten auf eine Festplatte höher als auf den Arbeitsspeicher eines anderen Computers. Demnach ergeben sich Vorteile bezüglich der Zugriffszeit, wenn man Hashingverfahren auf verteilte Systeme oder auf Computercluster ausweitet. Ein Verfahren, dass sich dieser Problemstellung widmet, ist das LH*-Schema [Lit93]. Dieses wird in dieser Arbeit näher beleuchtet. Allerdings gilt es bei der Realisierung von z.B. Software für Banken noch eine Komponente zu beachten: die Verfügbarkeit. In einem verteilten System kann es zu Ausfällen einzelner Knoten kommen, sei es durch Stromausfälle, temporäre Ausfälle von Teilen des Arbeitsspeichers, Wartungsarbeiten oder ähnliches. Das kann dazu führen, dass ein Computer nicht verfügbar ist, auf dem gerade ein Hashwert gespeichert werden soll, bzw. sich ein Hashwert befindet, nach dem gesucht wird. Solche Ausfälle müssen abgefangen werden. In dieser Arbeit soll dazu das Mirroring als zusätzliche Funktion des LH*-Schemas vorgestellt werden. Im folgenden Abschnitt werden die Grundprinzipien des Linearen Hashing, auf dem das LH*-Schema aufbaut, vorgestellt. Die Kapitel 2 und 3 beschäftigen sich dann mit dem LH*Schema und wie man Mirroring in dieses integrieren kann, ohne seine sonstigen Vorzüge zu verlieren. Abschließend wird ein Fazit gezogen. 1.1 Lineares Hashing Das Lineare Hashing ist die am häufigsten genutzte Möglichkeit des dynamischen Hashings. Es verwendet dabei das verzeichnislose Schema des dynamischen Hashings und erweitert die Hashtabelle in jedem Schritt um lediglich einen Slot. Die zugrunde liegende Datenstruktur bilden sogenannte Tries, eine spezielle Art von Bäumen, bei denen ein Durchlauf dadurch charakterisiert ist, dass an den Kanten jeweils ein Zeichen des Alphabets hinzugenommen wird. Ein Knoten ist durch den Pfad zu ihm kodiert. Eine genauere Beschreibung von Tries findet sich in [Enb88]. Um Lineares Hashing effizient durchführen zu können, müssen bestimmte Anforderungen an die verwendete Hashfunktion gestellt werden. Der Wertebereich der Schlüssel muss dynamisch veränderbar sein. Die am häufigsten genutzte Methode, dies zu erreichen, ist eine binäre Kodierung des Schlüssels. Durch Hinzunahme eines Bits wird der Schlüssel erweitert und der Bildbereich vergrößert. Das Reduzieren des Bildbereich geschieht analog. So wird beispielsweise ein Slot, der zunächst durch den Schlüssel 00 adressiert wird, nach einer Erweiterung des Schlüssels mit dem Schlüssel 000 adressiert. Soll der Bildbereich reduziert werden, so wird ein Bit, analog dem Vergrößern des Bildbereichs, entfernt. Um zu gewährleisten, dass die schon vorhandenen Schlüssel/Werte-Paare weiterhin benutzt werden können und keine neue Berechnung durchgeführt werden muss, werden mehrere Hashfunktionen hi benutzt, die jeweils den Adressraum {0, 1, ..., 2i − 1} abdecken, wobei i eine beliebige natürliche Zahl ist. Bei der Gestaltung der Hashfunktionen ist zu beachten, dass Skalierbare verteilte Hashingverfahren mit Mirroring 151 für jeden Hashwert hi (k) immer eine der folgenden Gleichungen gilt: hi (k) = hi−1 (k) hi (k) = hi−1 (k) + 2i−1 Da alle Schlüssel von der Form hi (k) = bi−1 ...b1 b0 sind, mit b ∈ {0, 1}, kann der Adressraum der Schlüssel erweitert werden, ohne dass die bisherigen Werte neu berechnet werden müssen. In der Handhabung gibt es einige Unterschiede zwischen dem verzeichnisorientierten und dem verzeichnislosen Verfahren, auf die ich nicht näher eingehen möchte (vgl. dazu [Enb88]). Für das Lineare Hashing ist nur das verzeichnislose Verfahren relevant. Dazu wird eine Variable, im Folgenden p genannt, eingeführt, die als sogenannter Split-Pointer fungiert. Kommt es zu einem Überlauf, so wird der Slot gesplittet, auf den p gerade zeigt. Dabei ist zu beachten, dass dies nicht notwendigerweise der Slot sein muss, der den Überlauf ausgelöst hat. Auch wird lediglich ein Slot zum Bildbereich hinzugefügt, es findet keine Verdopplung des Bildbereichs statt, wie man es beim Hinzufügen eines Bits erwarten würde. Dadurch wird gewährleistet, dass durch schlechte Wahl der Schlüssel der Bildbereich nicht unnötig groß wird, was bei einem Hinzufügen des zusätzlichen Bits zu allen Slots der Fall wäre. Als Ergebnis wird im Schnitt eine Auslastung von 60% erreicht(vergleiche dazu [Lit80]). Abbildung 1 auf Seite 153 soll die Expansion verdeutlichen. Sei s die Anzahl Slots beim Start der i-ten Expansion. Es gilt: s = 2i und die momentan genutzte Hashfunktion sei hi (k). w, x, y und z bezeichnen hier sogenannte Überlaufslots, die genutzt werden, wenn ein Slot überläuft, der nicht im nächsten Schritt gesplittet wird. Im Beispiel gibt es vier Slots, demnach sind s = 4, i = 2 und die verwendete Hashfunktion ist h2 (k). Der Split-Pointer p zeigt auf den Slot 0, da wir uns am Beginn der zweiten Expansionsphase befinden (Beispiel in Abbildung 1, Position (a) ). Nehmen wir nun an, Slot b läuft über. Es wird nach dem letzten Slot (in diesem Fall nach d) ein neuer Slot eingefügt und der Slot, auf den p zeigt, in diesem Fall Slot a, wird auf a und A aufgeteilt. Dann wird p inkrementiert. Um den Überlauf von b abzufangen, wird ein Überlaufslot eingeführt, in diesem Beispiel w, der die Werte, die über die Kapazität des Slots hinausgehen, speichert. Nun ergibt sich das Bild, das Position (b) im Beispiel zeigt. Um zu unterscheiden, ob ein Wert in Slot a oder in Slot A gespeichert werden soll, wird ein zusätzliches Bit benötigt. Nun wird also hi+1 (k) zur Adressierung für diese beiden Slots verwendet. Für alle übrigen Slots wird weiterhin hi (k) verwendet. Im Allgemeinen gilt für die Adressierung der Slots folgender Algorithmus: begin i f hi (k) ≥ p then s l o t := hi (k) e l s e s l o t := hi+1 (k) ; i f necessary , chase the overflow chain end Listing 1. Adressierung der Slots [Enb88] 152 Marco Müller Alle Slots links vom Split-Pointer p werden also mit hi+1 (k) adressiert, alle rechts von p bis zur Grenze s − 1 (der letzte Slot, der noch mit i Bits adressierbar ist) werden weiterhin mit hi (k) adressiert. Nun läuft der Slot d über und Slot b, inklusive seines Überlaufslots w, wird aufgeteilt auf b und B. Die Werte, die zum Überlauf von Slot d geführt haben, werden im Überlaufslot x gespeichert. Man erkennt, dass es einen Zusammenhang zwischen dem Slot, auf den p zeigt (derjenige, der gesplittet wird), und dem neuen Slot gibt. Der neue Slot lässt sich immer durch s + p adressieren. Im nächsten Schritt läuft erneut d (bzw. der Überlaufslot x) über, was dazu führt, dass c gesplittet wird und ein zweiter Überlaufslot, hier y, eingeführt werden muss (siehe Position (d) im Beispiel). Im letzten Schritt für diese Expansionsstufe soll Slot B überlaufen. Nun wird d mit seinen beiden Überlaufslots gesplittet. Da nun nach dem Inkrementieren von p gilt: p = s wird p wieder auf 0 gesetzt, was signalisiert, dass dieser Expansionsschritt beendet ist. Für alle Slots wird nun hi+1 (k) zur Adressierung verwendet. Nun wird i inkrementiert, s = 2i neu berechnet und die Grenze für den nächsten Expansionsschritt (s − 1) wird ebenfalls neu berechnet. Dies führt zur Position (e) im Beispiel. p ist wieder bei 0, i hat den Wert 3 und s den Wert 8. Zur Adressierung wird ausschließlich h3 (k) verwendet. Es besteht die Möglichkeit, durch Wahl von anderen Strategien, was das Splitten der Slots angeht, eine Verbesserung herbeizuführen. Dazu kann man sich überlegen wann ein Slot gesplittet und ein neuer Slot eingeführt wird, aber auch wie ein Slot gesplittet wird. Dies soll hier nicht weiter erläutert werden, nachzulesen sind diese Möglichkeiten in [Enb88]. 2 Das LH*-Schema LH* stellt eine Erweiterung des Linearen Hashing dar. Im Gegensatz zum Linearen Hashing, welches auf einem Prozessor läuft, ist eine LH*-Datei auf mehreren Computern verteilt. Dabei existiert keine zentrale Instanz, die alles koordiniert. Man unterscheidet zwischen Clients, die Schlüssel suchen, bzw. einfügen und Servern, die die Schlüssel und die dazugehörigen Werte speichern. Zur Kommunikation der Clients mit den Servern werden Nachrichten ausgetauscht. Auf die Besonderheiten der einzelnen Komponenten wird später näher eingegangen. Um solch ein Netzwerk umsetzen zu können, werden bestimmte Anforderungen an die zugrundeliegende Datenstruktur gestellt [Lit93]: 1. Eine Datei wird nur schrittweise erweitert und auch nur, wenn alle Server, die sich gerade in Benutzung befinden, zu einem gewissen Grad ausgelastet sind. 2. Es existiert keine zentrale Steuerungseinheit, die zunächst benachrichtigt werden muss. 3. Keine Operation (Suchen, Einfügen, Splitten usw.) benötigt atomare Ausführungen unter verschiedenen Clients. Datenstrukturen, die diese Anforderungen erfüllen, werden auch SDDS1 [Lit93] genannt. Anforderung 1 ist intuitiv klar und galt schon beim Linearen Hashing. Anforderung 2 ist essentiell, um mit weniger Nachrichten auszukommen und für die Größe der LH*-Datei nicht durch die Größe der zentralen Instanz beschränkt zu sein. Anforderung 3 ist unverzichtbar, da nicht garantiert werden kann, dass zu jedem Zeitpunkt alle Clients verfügbar sind. Um solch eine SDDS effizient nutzen zu können, müssen möglichst wenige Nachrichten zum Einfügen, bzw. Suchen eines Schlüssels gebraucht werden und die Auslastung sollte möglichst 1 Scalable Distributed Data Structure Skalierbare verteilte Hashingverfahren mit Mirroring Abb. 1. Beispiel für Lineares Hashing 153 154 Marco Müller hoch sein. Beides ist beim LH*-Schema gegeben, wie später gezeigt wird. Eine LH*-Datei wird auf mehreren Servern gespeichert. Dabei wird auf jedem Server genau ein Slot gespeichert, und zwar in dessen Arbeitsspeicher. Eine LH*-Datei expandiert genau so wie eine Datei beim Linearen Hashing. Da es genauso viele Server wie Slots gibt, ist dies ohne weiteres möglich. Genau wie beim Linearen Hashing hat jeder Slot ein Expansionslevel i und es gibt einen Split-Pointer p, der auf einen Slot zeigt. In den folgenden Abschnitten 2.1 und 2.2 wird näher auf die beiden Komponenten des LH*-Schemas, die Clients und die Server eingegangen. 2.1 Clients Clients manipulieren eine LH*-Datei, indem sie mit einem Server über Nachrichten kommunizieren. Sie fügen Schlüssel ein oder suchen nach Schlüsseln. Da es viele Clients gibt, die von der Existenz anderer Clients nichts wissen und unabhängig voneinander die LH*-Datei verändern können, verändert ein Client die Datei, ohne dass andere Clients davon erfahren. Man könnte eine zentrale Instanz einführen, die die beiden Werte, das Expansionslevel i und den Split-Pointer p, verwaltet und alle Clients informiert, oder jeder Client benutzt eine eigene Kopie. Letzteres führt dazu, dass die Clients unterschiedliche Werte für ihre Kopien haben. Diese sind im Regelfall nicht die Werte der Datei. Beides ist nicht optimal, aber im weiteren Verlauf wird die zweite Variante verwendet. Im nächsten Abschnitt soll näher auf die Adressberechnung des Clients eingegangen werden. Im darauffolgenden Abschnitt wird das Verfahren zum Anpassen der Werte eines Clients an die der LH*-Datei näher erläutert. Adressierung Da die Clients alle unterschiedliche Werte von i und p haben können, besitzen alle eine Kopie der beiden Werte, im Folgenden als i0 und p0 bezeichnet. Mit diesen Kopien berechnet jeder Client den Hashwert für den Schlüssel mit demselben Algorithmus wie beim Linearen Hashing (siehe Listing 1 auf Seite 151). Da die Kopien des Clients aber typischerweise nicht den tatsächlichen Werten entsprechen, kann es sein, dass die Berechnung des Hashwertes falsch war. In diesem Fall würde dieser Fehler durch die Server entdeckt werden (genaueres dazu findet sich in Kapitel 2.2) und eine IAM2 wird an den Client geschickt. Im folgenden Abschnitt wird darauf näher eingegangen. Ist der berechnete Wert korrekt, bleibt diese Nachricht aus, auch wenn i0 und p0 nicht i und p entsprechen. Anpassung der eigenen Kopie Wenn ein Client eine falsche Kopie der Werte hat und somit einen falschen Server anspricht, so wird eine Nachricht von diesem Server an den Client geschickt, die sogenannte IAM. Durch diese Nachricht werden die Kopien i0 und p0 neu gesetzt und nähern sich den tatsächlichen i und p an (Die übermittelten Werte müssen nicht den tatsächlichen entsprechen, da der Server, der zuerst vom Client angesprochen wird, seine Werte übermittelt, nicht derjenige, wo der Hashwert tatsächlich gespeichert ist). Dies sorgt dafür, dass Nachrichten nur übermittelt werden, wenn es zwingend notwendig ist, denn auch wenn die Kopien falsch 2 Image Adjustment Message Skalierbare verteilte Hashingverfahren mit Mirroring 155 sind, aber trotzdem die richtige Adresse berechnet wird, wird keine Nachricht gesendet. Das Result sind weniger Fehler bei der Adressierung, denn mit jedem Fehler, den ein Client macht, werden seine Kopien erneuert und den tatsächlichen Werten angenähert, sofern ein Client aktiv genug ist. Ein Client, der kaum Schlüssel sucht, bzw. Schlüssel einfügen möchte, verpasst natürlich viele Änderungen an der Datei und wird demnach mehr Fehler bei der Adressierung haben, als ein Client, der häufiger aktiv ist. Listing 2 zeigt den Algorithmus zum Anpassen der Kopien eines Clients. Dabei sind i das Expansionslevel der LH*-Datei, i0 die Kopie des Clients, p0 der Split-Pointer des Clients und a die Adresse des Servers bzw. des Slots. Die beiden Schritte decken die beiden möglichen Fälle ab: einmal, dass der adressierte Slot schon gesplittet wurde (Schritt 1), und dass der adressierte Slot noch nicht gesplittet wurde (Schritt 2). In jedem der beiden Fälle entspricht das Expansionslevel i0 nun dem der Datei. Lediglich der Split-Pointer kann von dem der Datei abweichen. 1 : i f i > i0 then i0 ← i − 1 , p0 ← a + 1 ; 0 2 : i f p0 ≥ 2i then p0 ← 0 , i0 ← i0 + 1 ; Listing 2. Adjustment Algorithmus [Lit93] 2.2 Server Server speichern Schlüssel mit den dazu korrespondierenden Werten. Dabei ist auf jedem Server genau ein Slot gespeichert. Server bekommen von Clients Nachrichten mit den einzufügenden Schlüsseln, bzw. Schlüsseln, nach denen gesucht wird. Wie im vorigen Abschnitt erläutert, kann es vorkommen, dass ein Server eine Nachricht erhält, die eigentlich nicht für ihn bestimmt ist. Deshalb überprüft jeder Server, ob er der richtige Empfänger der Nachricht ist und leitet die Nachricht an einen anderen Server weiter, falls er nicht der richtige Empfänger ist. Der genaue Ablauf dieses Prozesses wird im nächsten Abschnitt näher erläutert. Adressierung Jeder Server berechnet nach Erhalt einer Nachricht vom Client die Adresse neu, um zu überprüfen ob er der richtige Empfänger ist. Wenn nicht, berechnet er die Zieladresse neu und leitet die Nachricht an die neue Adresse weiter. Dann schickt er eine IAM an den Client, der die Anfrage gestellt hatte. Diese IAM enthält den aktuellen Wert des Servers für das Expansionslevel. Die Weiterleitung der Nachricht an einen weiteren Server findet höchstens zweimal statt, wie später noch gezeigt wird. Da ein Server den Wert des Split-Pointers p nicht kennt, kann er nicht den Algorithmus verwenden, den der Client benutzt (Listing 1 auf Seite 151). Er verwendet folgenden Algorithmus: a0 ← hi (C) ; i f a0 6= a then a00 ← hi − 1(C) i f a00 > a and a00 < a0 then a0 ← a00 ; Listing 3. Adressberechnung des Servers [Lit93] 156 Marco Müller Dabei ist i das Expansionslevel des Servers und a0 die neu berechnete Adresse für den Schlüssel C, sowie a die vom Client berechnete und übermittelte Adresse. Sollte bei der Berechnung herauskommen, dass a0 = a gilt, so ist der Server der richtige Empfänger und führt die Anfrage vom Client aus. Ansonsten wird die Nachricht an den Server mit der Adresse a0 weitergeleitet. Dieser führt wiederum den Algorithmus aus und sendet die Nachricht gegebenenfalls weiter. Spätestens dann wird, wie oben erwähnt, der richtige Server gefunden. Dies verdeutlicht folgender Satz [Lit93]: Theorem 1. Der Algorithmus aus Listing 3 auf Seite 155 findet die richtige Adresse für jeden Schlüssel C, der mit dem Algorithmus aus Listing 1 auf Seite 151 berechnet wurde. Dabei wird C höchstens zweimal weitergeleitet. Beweis zu Theorem 1: Sei a die Adresse des Servers, der C vom Client empfangen hat, j sei das Expansionslevel des Servers mit Adresse a und i das Level der Datei, sowie i0 das Level des Clients. Mit Level(a) wird das Expansionslevel des Servers mit der Adresse a bezeichnet. Wenn gilt: a = a0 = hj (C), so ist a die richtige Adresse für C und der Algorithmus terminiert. Sonst sei a00 = hj−1 (C). Nun gibt es zwei Möglichkeiten: (i.) n ≤ a < 2i oder (ii.) a < n oder a ≥ 2i . Zunächst zu (i.): Dann gilt: j = i. Angenommen a00 6= a (Im Fall a00 = a würde die Nachricht zu a0 weitergeleitet werden und a0 wäre die richtige Adresse), ⇒ Nachricht wird weitergeleitet an a00 und es gilt: i0 < j − 1 und a00 > a, sowie Level(a00 ) = j = i und a00 = hLevel(a00 )−1 (C). Nun gilt entweder: a00 = a0 = hi (C) und a00 ist die richtige Adresse für C oder: a00 < a0 . Dann ist Level(a0 ) = i und a0 ist die richtige Adresse für C. Somit gibt es in jedem Fall von (i.) höchstens zwei Weiterleitungen. Nun zu (ii.): Dann gilt: j = i + 1 und a00 ≥ a. Angenommen a00 > a (Im Fall a00 = a würde die Nachricht zu a0 weitergeleitet werden und a0 wäre die richtige Adresse), ⇒ Nachricht wird weitergeleitet an a00 und Level(a00 ) = i oder Level(a00 ) = i + 1. Im Fall Level(a00 ) = i + 1 gilt: hLevel(a00 ) (C) = a00 und a00 ist somit die richtige Adresse für C. Sonst gilt: a00 = hLevel(j)−1 (C). Sei nun a0 = a00 , ⇒ a00 ist die Adresse für C. Ansonsten gilt: a0 > a00 und a0 ≥ 2i , ⇒ Level(a0 ) = i + 1 und a0 ist die richtige Adresse für C. Somit gibt es auch in Fall (ii.) höchstens zwei Weiterleitungen. Der Algorithmus aus Listing 3 auf Seite 155 verwendet diese Beweisführung zur Berechnung von a00 , bzw. a0 . Darüber hinaus gibt es Möglichkeiten, den Algorithmus zu verbessern. Beispielsweise könnte man die Berechnung von a00 verwenden, um herauszufinden, ob C schon einmal weitergeleitet wurde. Dadurch könnte man sich die Berechnung von a00 beim zweiten Empfänger sparen. 2.3 Weitere Eigenschaften des LH*-Schemas Splitten von Slots Wie schon weiter oben erwähnt, erfolgt die Expansion genauso wie beim linearen Hashing. Um das Splitten eines Slots durchzuführen, wird ein Koordinator eingesetzt, der die aktuellen Werte i und p der LH*-Datei verwaltet und ändert. Das Splitten kann wieder kontrolliert (z.B. abhängig von der Auslastung) oder unkontrolliert (z.B. bei jeder Kollision) Skalierbare verteilte Hashingverfahren mit Mirroring 157 durchgeführt werden. Jeder Slot, der ein Splitten auslöst, schickt eine Nachricht an diesen Koordinator. Dieser schickt die Nachricht weiter an den Slot, auf den p gerade zeigt und aktualisiert seine Werte nach demselben Schema wie beim Linearen Hashing. Der Server, der die Nachricht zum Splitten erhält (mit Expansionslevel i), führt folgende Schritte durch [Lit93]: (a) Erstellen des neuen Slots mit der Adresse p + 2i mit Expansionslevel i + 1. (b) Splitten der enthaltenen Werte mit der Funktion hi+1 auf den eigenen und den neuen Slot. (c) Sein eigenes Expansionslevel um einen erhöhen. (d) Den Koordinator benachrichtigen, dass der Split vollzogen wurde. Durch Schritt (d) wird die Sichtbarkeit der Splits serialisiert. Wenn solche Splits für Clients sichtbar wären, die falsche Kopien von i und p haben, könnte eine Adresse berechnet werden, die außerhalb der Datei liegen würde, was die Korrektheit des Algorithmus zum Anpassen der kopierten Werte (Algorithmus 2 auf Seite 155) beeinträchtigen würde. Weitere Möglichkeiten existieren, um das Splitten zu variieren [Lit93], beispielsweise ohne einen Koordinator. Güte Die Güte des LH*-Schemas wird durch die Anzahl der Nachrichten, die zum Einfügen, bzw. Suchen eines Schlüssels erforderlich sind, ermittelt. Beim Suchen sind im besten Fall zwei Nachrichten nötig (eine zum Senden des zu suchenden Schlüssels und eine zum Empfangen der Informationen) und im schlechtesten Fall werden noch zwei Nachrichten benötigt, um die Suchanfrage weiterzuleiten. Beim Einfügen eines Schlüssels sind mindestens eine, wenn der Client die richtige Adresse berechnet, und höchstens drei Nachrichten, falls die Anfrage zweimal weitergeleitet wird, nötig. In [Lit93] wurden Simulationen durchgeführt, um zu evaluieren, wieviele Nachrichten im Schnitt benötigt werden und wie sich die Fehlerrate verhält. Dabei wurde beobachtet, dass die Nachrichtenzahl steigt, wenn die Kapazität eines Slots geringer ist und dass die Zahl sich dem Minimum von zwei, bzw. einer Nachricht annähert. Was ebenfalls beobachtet wurde ist, dass die durchschnittliche Fehlerrate ca. log2 (k) entspricht, wobei k die Anzahl der Slots darstellt. Darüber hinaus haben aktive Clients einen deutlichen Vorteil, was die Fehlerrate angeht, als weniger aktive Clients. Dies ist intuitiv erkennbar, da aktive Clients ihre Kopien seltener anpassen müssen als inaktive Clients. Abschließend sei noch zu sagen, dass die Auslastung einer LH*-Datei immer zwischen 65% und 95% liegt (siehe dazu [Lar80]). 3 Das LH*-Schema mit Mirroring Für gewisse Anforderungen, z.B. Bank-Applikationen, ist es unerläßlich, dass die gespeicherten Daten immer verfügbar sind. Dies gilt auch für das Speichern mittels Hashing. Das LH*-Schema - wie es im vorangegangenen Kapitel vorgestellt wurde - garantiert dies jedoch nicht. Wenn man beispielsweise davon ausgeht, dass die Wahrscheinlichkeit pd , dass ein Slot verfügbar ist, bei 99% liegt und die Ausfälle der einzelnen Slots unabhängig voneinander 158 Marco Müller sind, so ist die Wahrscheinlichkeit, dass die gesamte LH*-Datei verfügbar ist bei pF = pN d , mit N = Anzahl Slots in der Datei. Ein Vorteil des LH*-Schemas, die Skalierbarkeit, wird so abgeschwächt, da bereits ab einer Slotanzahl von 1000 die Wahrscheinlichkeit, dass die Datei verfügbar ist bei pF = 0,00004 liegt, also bei nahezu 0%. Trotz der Vorteile, die LH* sonst bietet, ist diese Wahrscheinlichkeit für Applikationen, die mit großen Datenbeständen arbeiten, nicht tragbar, da sie entweder auf die Skalierbarkeit oder auf die Verfügbarkeit verzichten müssten. Mirroring ist ein beliebte Technik, um eine hohe Verfügbarkeit zu erreichen, und findet schon in unterschiedlichen Bereichen Anwendung. Schon unter der Annahme, dass es zwei Slots gibt, die dieselbe Information tragen, vergrößert sich die Wahrscheinlichkeit für die Verfügbarkeit enorm. So ist die Wahrscheinlichkeit für einen Slot pc = (1−(1−pd )2 ) = 0,9999. Für 1000 Slots ergibt sich für die Datei eine Wahrscheinlichkeit von pF = (1−(1−pd )2 )N = 91%. Das ist wesentlich besser als ohne Mirroring und für die oben erwähnten Applikationen tragbar. Natürlich muss dafür gesorgt werden, dass die Vorteile des LH*-Schemas nicht verloren gehen. Eine Möglichkeit wäre, das Mirroring auf der Ebene der Server durchzuführen und jeden Server zu spiegeln. Dadurch würde keine Anpassung des LH*-Schemas notwendig werden, da es für jeden Key weiterhin eine Adresse zum Speichern gibt. Allerdings sind solche komplizierten Server sehr teuer im Vergleich zu den konventionellen Servern, die zahlreich produziert werden. Außerdem sind sie nicht gegen unvorhergesehene Ereignisse wie Stromausfälle oder Brände gesichert. Eine weitere Möglichkeit ist, das Mirroring auf der Ebene des LH*-Schemas durchzuführen. Dann müssen Anpassungen vorgenommen werden, z.B. müssen alle Kopien eines Slots verschiedene Adressen haben und diese müssen anderen Komponenten sichtbar sein. Dadurch lassen sich die oben genannten Nachteile von Mirroring auf Server-Ebene lösen. Das LH*-Schema, wie es in Kapitel 2 vorgestellt wurde, soll in diesem Kapitel um Mirroring erweitert werden, um eine größtmögliche Verfügbarkeit zu garantieren. Dabei sind folgende Eigenschaften wünschenswert [Lit96]: 1. 2. 3. 4. 5. Verfügbarkeit aller Daten trotz des Ausfalls eines Knotens Verfügbarkeit aller Daten in den meisten Fällen bei Ausfällen mehrerer Knoten Verfügbarkeit der meisten Daten bei Ausfällen eines Knotens in jedem Mirror Balancierte Auslastung nach Ausfällen Effiziente Wiederherstellung nach Ausfällen Es werden zwei verschiedene Arten von Schemata, die LH* um Mirroring erweitern, vorgestellt. In Kapitel 3.2 wird der Structurally-Alike Mirror (SA-Mirror) vorgestellt und in Kapitel 3.3 die beiden Arten des Structurally-Dissimilar Mirror (SD-Mirror), der looselycoupled SD-Mirror und der minimally coupled SD-Mirror. In Abbildung 2 werden diese schematisch dargestellt. Der nächste Abschnitt beschäftigt sich mit allgemeinen Eigenschaften, die ein LH*-Schema mit Mirroring haben muss. 3.1 Allgemeine Eigenschaften von LH* mit Mirroring Zunächst sei festgelegt, dass es zwei LH*-Dateien gibt, im weiteren F1 und F2 genannt, die als Mirror bezeichnet werden. Sie sind gespiegelt, jede Änderung an der einen Datei wird sofort an der anderen durchgeführt. Beide Dateien haben gleich viele Slots und einen LH*-Koordinator (vgl. Abschnitt 2.3), der das Splitten durchführt. Skalierbare verteilte Hashingverfahren mit Mirroring 159 Abb. 2. Die verschiedenen Typen der LH*-Mirror: (a) SA-Mirror, (b) loosely-coupled SD-Mirror, (c) minimally coupled SD-Mirror Jeder Server und jeder Client ist in der Lage, die Slots selbstständig zu lokalisieren, um die Kopie zu finden, falls ein Slot nicht verfügbar ist. Dabei müssen die beiden Dateien nicht gleich aufgebaut sein. Im Allgemeinen gilt für einen Schlüssel c, der in Datei F1 in Slot d gespeichert ist und in Datei F2 in Slot d0 , dass d 6= d0 ist. Es werden also nicht dieselben Hashfunktionen genutzt, aber der Aufbau beider Dateien ist sowohl für die Server, als auch für die Clients transparent. Jeder Mirror hat seine eigenen Clients und jeder Client hat einen primären Mirror, auf den er immer zugreift. Zugriffe auf den jeweils anderen Mirror, den sekundären Mirror, werden nur im Ausnahmefall realisiert. Dies geschieht sobald der Slot des primären Mirrors ausfällt. Ein Client, der den Mirror F1 als primären hat, wird auch F1 -Client genannt. Sollte ein Server ausfallen und somit ein Slot nicht verfügbar sein, so muss dieser wiederhergestellt werden, sobald er wieder verfügbar ist. Dazu wird dem LH*-Koordinator eine Funktion hinzugefügt, die das Wiederherstellen übernimmt. Für die Wiederherstellung gibt es zwei Ansätze [Lit96]: • Die Wiederherstellung wird solange verzögert, bis der nicht verfügbare Slot wieder verfügbar ist. In dieser Zeit wird eine Kopie aller Schlüssel, die in diesem Slot eingefügt werden sollen, angelegt. • Ein neuer Slot, auch Spare genannt, wird sofort angelegt. Durch den Spare wird eine höhere Verfügbarkeit erreicht, allerdings benötigt man auch mehr Speicher. Dies könnte in manchen Applikationen zu Problemen führen. Im weiteren Verlauf wird die interessantere Möglichkeit mit den Spares näher untersucht. 160 Marco Müller 3.2 Besonderheiten des SA-Mirrors Beim SA-Mirror (Structurally-Alike Mirror ) sind beide Mirrors strukturell gleich. Sie haben dieselbe Slotgröße, verwenden ähnliche Hashfunktionen und dieselben Verfahren, um die Auslastung zu kontrollieren. Änderungen an einem Mirror werden dem anderen so schnell wie möglich mitgeteilt. Dies übernimmt der Server mit der richtigen Adresse für die gesendete Anfrage. Den zu einem Slot korrespondierenden Slot des anderen Mirror nennt man Buddy. Das führt dazu, dass ein Schlüssel in beiden Mirrors in den Slot mit derselben Nummer gespeichert wird. Dies unterscheidet sich von der ursprünglichen Annahme. Dadurch wird die Weiterleitung von Anfragen durch die Clients über die Mirrors vereinfacht und ist effizienter, da ein Server eine Anfrage an seinen Buddy typischerweise ohne Fehler bei der Adressierung, bzw. Weiterleitung an einen anderen Server durchführen kann. Weiterhin werden Splits nach derselben Abfolge von Anfragen durchgeführt, egal ob sie von einem F1 -Client oder einem F2 -Client vorgenommen wurden. Dabei werden benötigte Splits unabhängig von dem jeweils anderen Mirror entdeckt und durchgeführt. Ein Server, der einen Split entdeckt, leitet die Anfrage an seinen Buddy weiter und leitet den Split ein, unabhängig von den Aktionen, die sein Buddy veranlasst. Dieser wird typischerweise seinerseits einen Split einleiten. Durch Fehler bei der Propagierung der Anfrage oder durch verschiedene Splitzeiten kann es vorkommen, dass ein Slot in einem Mirror existiert, der im anderen Mirror noch nicht existiert. Durch diese Asynchronizität könnte ein Client eine Anfrage an einen Server stellen, dessen Slot noch nicht existiert. Dies kann dadurch geschehen, dass ein Client eine IAM von einem Server bekommt, der gerade gesplittet hat und der korresponierende Buddy seinen Split noch nicht vollzogen hat. Wenn der Client nun eine Anfrage an den anderen Mirror stellt und den Buddy des gerade erzeugten Slots als Adresse ausmacht, so tritt der oben erwähnte Fall ein. Nun sendet der Client die Anfrage an den Eltern-Server (derjenige, der das Splitten veranlassen müsste). Dieser wiederum sendet die Anfrage an den eigentlichen Server, sobald dessen Slot erzeugt wurde. Sollte der Eltern-Server nicht verfügbar sein, so wird der Koordinator informiert. Allgemein sieht das Verfahren des Clients folgendermaßen aus: Ein Client berechnet die Adresse für den Server, der seine Anfrage bearbeiten soll, nach dem LH*-Schema (vgl. Kapitel 2) und schickt diese dann an diesen Server, beispielsweise Adresse a. Wenn es sich um einen F1 -Client handelt, wird dieser Server zur F1 -Datei gehören. Existiert der Slot von Adresse a nicht, so wird die Anfrage an den Eltern-Server gesendet. Sollte der Client erfahren, dass a nicht verfügbar ist, so wird die Anfrage an den Buddy a0 gesendet. Dieser verarbeitet die Anfrage dann. Solange der Client keine Benachrichtigung bekommt, dass a wieder verfügbar ist, wird er nun immer a0 benachrichtigen, anstelle von a, sofern er diese Adresse berechnet. Bekommt er eine Mitteilung, dass a wieder verfügbar ist, aktualisiert er seine Zuordnungstabelle. Wie schon beim LH*-Schema erwähnt, kann der Client einen Fehler bei der Adressierung begehen. Dann wird die Anfrage weitergeleitet. Bei einem SA-Mirror gibt es zusätzlich zu den Möglichkeiten des LH*-Schemas, wie eine Anfrage propagiert wird, weitere Möglichkeiten, da die Anfrage zwischen den beiden Mirrors propagiert werden kann. Jeder Server - nehmen wir an, er gehört zu einer F1 -Datei und hat die Adresse a1 - der eine Anfrage empfängt, überprüft zunächst, ob der Client ein F1 -Client, also ein primärer Client ist. Ist dem so, wird weiter verfahren wie beim LH*-Schema und die Anfrage wird gegebenenfalls an weitere Server innerhalb der F1 -Datei weiter propagiert. Zusätzlich propagiert der Server mit der richtigen Adresse die Nachricht an seinen Buddy weiter, sofern es sich bei der An- Skalierbare verteilte Hashingverfahren mit Mirroring 161 frage um ein Update handelt. Ist der Client ein sekundärer Client, so überprüft der Server zunächst, ob sein Buddy a01 verfügbar ist. Ist dieser verfügbar, versucht a1 , die Anfrage an a01 weiterzuleiten. Dann übernimmt a01 die Bearbeitung der Anfrage. In jedem Fall wird eine IAM an den Client geschickt, mit der Information, dass a01 wieder verfügbar ist, da dies ja ein primärer Server für den Client ist. Diese IAM kann mit einer anderen IAM kombiniert werden, beispielsweise wenn die Anfrage an einen weiteren Server weitergeleitet würde. Sollte das Senden von a1 an a01 fehlschlagen, informiert a1 den Koordinator. Ist a01 die richtige Adresse, antwortet der Server auf die Anfrage, ansonsten leitet er die Anfrage an einen anderen Server a2 ∈ F1 weiter. Dieser verfährt genauso wie a1 . Er überprüft, ob er der richtige Empfänger ist und handelt dementsprechend. Sollte a2 nicht verfügbar sein, wird die Anfrage an a02 gesendet und dieser handelt wie oben beschrieben. Sollte die Anfrage weder von a2 noch von a02 beantwortet werden können, so wird noch einmal weitergeleitet. Dann ist in jedem Fall die richtige Adresse gefunden (siehe dazu auch Theorem 1 auf Seite 156). Der Koordinator, der hier auch als Wiederherstellungs-Manager fungiert, kann ebenfalls entdecken, dass ein Server nicht verfügbar ist, wenn er einen Split veranlassen möchte. In diesem Fall veranlasst der Koordinator das Erzeugen eines Spares. Dieser Thematik widmet sich der nächste Abschnitt. Erzeugen eines Spares Ein Spare wird immer dann erzeugt, wenn ein Server nicht verfügbar ist und auf diesen zugegriffen werden soll. Angenommen der Server mit der Adresse f ist nicht mehr verfügbar. Es muss zunächst Speicherplatz für den Spare allokiert werden. Dazu wird zunächst ein Knoten s für den Spare gesucht. So ein Knoten besteht überlicherweise aus mehreren Servern. Dann wird eine Tabelle angelegt, in der gespeichert wird, welche Adresse zu welchem Server gehört. Nun wird in dieser Tabelle eingetragen, dass Anfragen, die eigentlich für f bestimmt sind, nun an den Spare in Knoten s gesendet werden. Der Spare nimmt nun die Rolle von Server f ein und empfängt alle Anfragen, die eigentlich für f vorgesehen sind. Die Werte, die bisher in f gespeichert waren, werden vom Buddy von f gesendet. Da das Erzeugen eines Spares im SD-Mirror genauso verläuft, wird es hier nicht weiter beleuchtet, sondern findet in Abschnitt 3.3 statt. Sollte der Server mit der Adresse f wieder verfügbar sein, bevor alle Clients ihre Anfragen für f schon automatisch zum Spare umleiten, wird eine Anfrage für den „alten“ Speicherort von f vom Knoten, der diesen Speicherort beinhaltet zum Spare umgeleitet und eine IAM wird an den Client zurückgesendet, in der dann die „neue“ Adresse für Server f enthalten ist. So wird dann nach und nach für jeden Client die logische Adresse f auf die tatsächliche Speicheradresse vom Spare angepasst und der vorherige Speicherplatz für f kann neu vergeben werden. Güte Typisch für Verfahren, die Mirroring nutzen, ist, dass doppelt soviel Speicherplatz erforderlich ist wie bei einem Verfahren ohne Mirroring. Gibt es keine Fehler, weil ein Slot nicht verfügbar ist, so ändert sich die Anzahl Nachrichten, die verschickt werden, minimal. Für eine Suche bleibt sie genauso wie beim LH*, für das Einfügen wird eine zusätzlich Nachricht für die Benachrichtigung des Buddys benötigt. Das Splitten eines Slots kostet doppelt 162 Marco Müller soviele Nachrichten, da es zwei identische LH*-Dateien gibt. Sollten Fehler, aufgrund von ausgefallenen Servern auftreten, so erhöht sich die Anzahl der Nachrichten bei jedem Versuch, einen ausgefallen Server zu erreichen, um zwei. Um einen Spare zu erzeugen, werden typischerweise zwei zusätzliche Nachrichten gebraucht, gemäß dem Fall, die zu kopierenden Werte können in einer Nachricht gesendet werden. Für einen Verlust von Daten aufgrund des Ausfalls von einem Server in jedem Mirror ergibt sich eine Wahrscheinlichkeit von (1 − pd )2 . Falls dies auftritt, würden die Kosten für den Verlust durchschnittlich 0,7 * b Werten betragen, wobei b der Slotgröße entspricht. 3.3 Besonderheiten des SD-Mirrors Die beiden SD-Mirrors (Structurally-Dissimilar Mirror ) haben im Allgemeinen unterschiedliche Eigenschaften, beispielsweise unterschiedliche Slotgrößen oder andere Verfahren um die Auslastung zu kontrollieren. Die Hashfunktionen, die gewählt werden, müssen sich nicht ähneln, auch wenn dies das Erzeugen eines Spares vereinfachen würde. Der Vorteil des SDMirrors im Vergleich zum SA-Mirror liegt in der Allgemeingültigkeit, man kann z.B. die Mirrors auf heterogenen Systemen speichern mit unterschiedlichen Speichergrößen. Der Hauptunterschied zwischen dem SA-Mirror und dem SD-Mirror ist jedoch, dass sich ein Slot hinsichtlich des SD-Mirrors ebenso verhält wie ein Client, also eine Kopie der beiden Werten i und p einer LH*-Datei hat und IAM s empfängt. Beim SD-Mirror unterscheidet man zwischen zwei verschiedenen Arten. Diejenigen, die dieselben Hashfunktionen verwenden und Änderungen sofort dem jeweils anderen Mirror mitteilen, werden loosely-coupled SD-Mirror genannt. Diejenigen, die keine Voraussetzungen an die Eigenschaften der Mirrors stellen, werden auch minimally coupled SD-Mirror genannt. Wie man in Abbildung 2 auf Seite 159 sieht, liegt der Vorteil des loosely-coupled SD-Mirrors darin, dass die Wiederherstellung effizienter geschieht, da die einzelnen Werte nicht so über den zweiten Mirror verteilt sind wie beim minimally coupled SD-Mirror. In den letzten beiden Abschnitten wird näher auf diese beiden Arten eingegangen. Loosely-coupled SD-Mirror Auf der Seite des Clients gibt es im Gegensatz zum SA-Mirror nur einen Unterschied: der Client hat für jeden Mirror eine Kopie von i und p, also typischerweise zwei Kopien. Jede Kopie wird aktualisiert, wenn sie zur Berechnung einer Adresse genutzt wird. Typischerweise nutzt ein Client eine Kopie wesentlich häufiger, nämlich die seiner primären Datei. Dies führt dazu, dass die andere Kopie sehr häufig falsche Berechnungen liefert und es somit häufig zu Fehlern kommt, wenn ein Server der primären Datei ausfällt. Dieses Problem hat ein SA-Mirror nicht, was sich positiv auf dessen Zugriffszeit auswirkt. Die Rolle der Server ist ebenfalls ein wenig anders. Da es keine Buddys gibt, wird in jedem Schritt die Berechnung der Adresse durchgeführt, so wie sie bei LH* vorgestellt wurde. Dementsprechend wird eine Anfrage an den anderen Mirror geschickt, wenn der korrekte Server gefunden wurde. Splits sind genau wie beim SA-Mirror asynchron. Erzeugen eines Spares Angenommen, es fällt der Slot mit der Adresse n1 in Mirror F1 aus und sein Expansionslevel ist j1 . Um den Spare effizient erzeugen zu können, müssen im Mirror F2 die Slots, in Skalierbare verteilte Hashingverfahren mit Mirroring 163 denen die Werte für n1 gespeichert sind, gefunden werden. Da beide Mirrors dieselben Hashfunktionen benutzen, gibt es zwei Möglichkeiten: 1. Die gesuchten Werte befinden sich alle in einem Slot. Dann existiert entweder noch kein Slot, für den gilt n1 = n2 oder das Expansionslevel j2 von n2 ist kleiner als j1 und enthält dann möglicherweise mehr Werte als n1 . 2. Die gesuchten Werte sind über mehrere Slots verstreut, das bedeutet, dass j2 > j1 gilt. Um den 1. Fall abzudecken, kann folgende Formel genutzt werden, um den gesuchten Slot n2 zu finden: (n2 = n1 ) ∨ (n2 = n2,1 = n1 − 2j1 −1 ) ∨ (n2 = n2,1,1 = n2,1 − 2j1 −2 ) ∨ ...(n2 = 0) Für den 2. Fall müssen mehrere Slots durchsucht werden. Dazu muss n1 selber sowie alle Slots im Teilbaum durchsucht werden. m bezeichnet hier alle Slots, die durchsucht werden müssen. Folgende Formel drückt dies aus: (m = n1 ) ∨ (m = n1,1 = n1 + 2j1 −1 ) ∨ (m = n1,2 = n1 + 2j1 ) ∨ ...(m = n1 + 2j2 −1 )∨ (m = n1,1,1 = n1,1 + 2j1 ) ∨ (m = n1,1,2 = n1,1 + 2j1 +1 )∨ (m = n1,1,1,1 = n1,1,1 + 2j1 +1 ).... Typischerweise tritt Fall 1 ein, wenn die Slotgröße b2 von F2 größer ist als die von F1 (b1 ). Der 2. Fall tritt ein, falls b1 > b2 gilt. Für b1 = b2 handelt es sich um einen SA-Mirror. Die durchschnittliche Anzahl r1 der Slots, die in F2 durchsucht werden müssen, um einen Spare in F1 zu erzeugen, ist dabei (vergleiche dazu auch Bild (b.) in Abbildung 2 auf Seite 159): r1 = M ax[1, bb21 ] Güte Die Kosten zum Suchen und Einfügen von Schlüsseln, unter der Annahme, dass es keine Ausfälle gibt, ist genauso wie beim SA-Mirror. Die Kosten zum Splitten erhöhen sich in F2 um (1 + r1 ), im Vergleich zu den Split-Kosten von F1 . Die Kosten, wenn Serverausfälle geschehen, sind höher als beim SA-Mirror. Wenn eine Propagierung im SA-Mirror eine Nachricht benötigt, so werden im loosely-coupled SD-Mirror bei einem gleichen F1 bis zu zwei Nachrichten mehr benötigt. Die exakten Werte müssen noch gefunden werden. Das Erzeugen eines Spares kostet (1 + 2 ∗ r1 ) Nachrichten, unter der Annahme, dass jeweils eine Nachricht zum Allokieren eines Slots und zum Senden der Werte eines Slots ausreichen. Die Wahrscheinlichkeit für einen Ausfall eines Servers in jedem Mirror ist M in[N11 ,N2 ]2 , ist also sehr gut skalierbar. Falls dies auftritt, würden die Ausfallkosten im Durchschnitt 0,7 * M in[b1 , b2 ] betragen, was um r1 weniger ist als beim SA-Mirror. Somit würden weniger Werte ausfallen, als beim SA-Mirror Minimally coupled SD-Mirror Die Funktionsweise der Clients und der Server sind genauso wie beim loosely-coupled SDMirror, ebenso die Berechnung der Adressen. Das Verfahren zur Erzeugung des Spare ist 164 Marco Müller allerdings anders, da die Werte, die in den Spare kopiert werden müssen, auf dem Mirror verteilt sind. Somit müssen alle Server bzw. Slots durchgegangen werden, um alle Werte zu bekommen. Dadurch erhöhen sich die Kosten für das Wiederherstellen. Die Wahrscheinlichkeit, dass bei einem Ausfall eines Slots und seines korrespondierenden Slots im anderen Mirror einige Werte nicht mehr verfügbar sind, ist größer als bei den anderen Verfahren, nahezu 1 bei großen Slots. Dafür fehlen weniger Werte und der Speicherbedarf ist gering. Uniformes Hashing vorausgesetzt, ist die Anzahl der fehlenden Werte approximiert 0,7 * b1 M ax[ M , b2 ], wobei gilt: M = 2i−1 und i ist das Level des jeweiligen Mirror. 2 M1 4 Fazit Die hier vorgestellten Schemata eignen sich alle, um Hashing bei einer guten Skalierbarkeit auf verteilten Systemen anzuwenden. Die drei Schemata, die LH* noch um Mirroring erweitern, erhöhen zudem die Verfügbarkeit der gespeicherten Werte. Sie brauchen zwar wesentlich mehr Speicherplatz als das zugrundeliegende LH*-Schema, allerdings verliert dieser Faktor immer mehr an Bedeutung, da der Preis für Speicher mit jedem Jahr fällt. Im Gegensatz dazu erreichen sie weiterhin eine sehr gute Zugriffszeit, die nahe am Optimum liegt. Die einzelnen Unterschiede der drei Verfahren sind in den Anforderungen, die man an die Schemata stellt, begründet. Es lassen sich nicht alle Anforderungen zusammen umsetzen und jedes Schema setzt andere Anforderungen um. Der SA-Mirror beispielsweise kommt mit weniger Nachrichten bei der Wiederherstellung von ausgefallenen Servern aus, hat aber eine größere Ausfallrate wie der loosely-coupled SD-Mirror. Für zukünftige Arbeiten ist eine detailliertere Analyse der Kosten der hier vorgestellten Schemata wünschenswert, um einen besseren Vergleich machen zu können. Ebenfalls könnte man sich weitere Varianten vorstellen, die beispielsweise ohne einen Koordinator auskommen, oder die Technik der Spares verfeinern oder austauschen. Ein weiterer Ansatz wäre die Verwendung von mehr als zwei Mirrors, wie es hier die Fall ist, um evtl. eine höhere Verfügbarkeit zu erreichen. Literaturverzeichnis Com77. D. Comer & R. Sethi (1977) The complexity of trie index construction, Journal of the ACM, Vol. 24, P. 428-440 Enb88. R. J. Enbody & H. C. Du (1988) Dynamic Hashing Schemes, ACM Computer Surveys, Vol. 20, Nr. 2, P. 85-113 Lar80. P.A.Larson (1980) Linear Hashing with partial expansions, ACM Transactions on Database Systems, Vol. 7, No. 4, P. 566-587 Lit80. W. Litwin (1980) Linear Hashing : A new tool for file and table adressing, Sixth International Conference on Very Large Data Bases, P. 212-223 Lit93. W. Litwin & M.-A. Neimat & D.A. Schneider (1993) LH* - Linear Hashing for Distributed Files, Proceedings of the 1993 ACM SIGMOD international conference on Management of data, P. 327-336 Lit96. W. Litwin & M.-A. Neimat (1996) High-Availability LH* Schemes with Mirroring, Proceedings of the First IFCIS International Conference on Cooperative Information Systems, P. 196-207 Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen in 2D-Umgebungen Benjamin Eikel Universität Paderborn, [email protected] Zusammenfassung. Das vorgestellte Verfahren berechnet einen kürzesten Weg in einer zweidimensionalen Umgebung zwischen einem Start- und einem Zielpunkt. Hierbei umgeht es Hindernisse in der Umgebung, die beliebig geformt sein können. Die Berechnung ist schneller als die bei Gitter-basierten Verfahren, aber mindestens so genau. Wenn ein kürzester Weg existiert, wird er im Gegensatz zu anderen Quadtree-basierten Verfahren von diesem Verfahren gefunden, auch wenn die Platzierung der Hindernisse ungünstig ist. Es wird eine neue Datenstruktur, der Framed-Quadtree, vorgestellt, die eine erweiterte Form eines Quadtrees ist. Diese sorgt für die hohe Effizienz und Genauigkeit des Verfahrens. Schlüsselwörter: Quadtree, kürzester Weg, Wegeberechnung, Roboter 1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 1.2 Bisherige Verfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 2 Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 2.1 2.2 2.3 2.4 Datenstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Wellenausbreitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Ablaufplanung für Eintrittspunkte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Bestimmung des kürzesten Weges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 3 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 3.1 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 3.2 Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 1 Einleitung 1.1 Motivation Der hier behandelte Algorithmus findet einen kürzesten Weg in einer bekannten, zweidimensionalen Umgebung, der an Hindernissen vorbeiführen muss. Solche Wege sind interessant für die Wegeplanung von Robotern, für GPS-gestützte Navigationssysteme und den Entwurf von integrierten Schaltkreisen. Diese Seminararbeit basiert auf dem Artikel von Chen, Szczerba und Uhran, Jr. [1]. 166 Benjamin Eikel 1.2 Bisherige Verfahren Dieses Verfahrens vereint die Vorteile von früheren Verfahren, die als Datenstruktur Gitter oder Quadtrees benutzen. Verfahren mit quadratischen Gitterzellen finden kürzeste Pfade. Allerdings sind sie ineffizient, wenn es große Regionen ohne Hindernisse gibt, da alle Zellen in diesen Regionen betrachtet werden müssen. Verfahren, die Quadtrees benutzen, sind allgemein effizienter als Gitter-basierte Verfahren. Dies liegt an der Eigenschaft des Quadtrees, große Regionen nicht zwangsläufig weiter unterteilen zu müssen, wie dies beim Gitter geschieht. Solche Verfahren finden aber nicht immer den kürzesten Weg. Wenn ein Hindernis genau auf den Grenzen zweier Quadranten eines Quadtrees wie in Abbildung 1 liegt, liefern die Verfahren keinen optimalen Weg. Eine Verschiebung des Quadtrees funktioniert zwar für ein Hindernis, bei mehreren Hindernissen kann dies aber dazu führen, dass nach der Verschiebung ein anderes Hindernis auf einer Grenze liegt. Außerdem ist der Aufwand für die Neuberechnung des Quadtrees hoch. Abb. 1. Beispiel, bei dem ein Verfahren mit einem Quadtree nicht den kürzesten Weg findet. Pfad A (rot) ist der von dem Verfahren gefundene Weg, Pfad B (blau) ist der kürzeste Weg. Die Zahl in einer Zelle des Quadtrees sind die Kosten, um von dieser Zelle zum Ziel zu gelangen. Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen 167 2 Algorithmus Das im Folgenden vorgestellte Verfahren erhält als Eingabe eine Umgebung mit Hindernissen. Die Hindernisse können beliebig beschrieben sein (Vielecke, Gitterzellen oder mathematische Funktionen). Aus der Umgebung wird die in Abschnitt 2.1 vorgestellte Datenstruktur erstellt. Hierfür muss lediglich geprüft werden, ob ein Teil eines Hindernisses in einem Quadrat liegt, was durch Schnittberechnungen erfolgen kann. 2.1 Datenstruktur Wegen der genannten Nachteile der bisherigen Verfahren wird hier eine neue Datenstruktur vorgestellt. Diese Datenstruktur heißt Framed-Quadtree und ist eine Erweiterung des Quadtrees. In einem Quadtree repräsentiert ein Knoten einen quadratischen, zweidimensionalen Bereich. Im Framed-Quadtree gibt es drei verschiedene Arten von Knoten. Freie Knoten stehen für einen Bereich, in dem sich keine Hindernisse befinden. Bereiche, in denen sich Hindernisse befinden, werden durch Hindernis-Knoten modelliert. Diese beiden Knotenarten sind Blätter des Framed-Quadtrees. Die dritte Knotenart, der Mischknoten, ist ein innerer Knoten des Framed-Quadtrees und beinhaltet vier Kindknoten. Er repräsentiert Bereiche, die sowohl frei als auch durch Hindernisse blockiert sind. Die Bereiche werden solange weiter unterteilt, bis ein Knoten entweder nur aus freien oder blockierten Bereichen besteht und dann zur ersten oder zweiten Knotenart gehört, oder der Knoten die kleinste erlaubte Größe (Auflösung) erreicht hat, aber noch Teile des Hindernisses enthält. Im letzten Fall wird der Knoten als Hindernis markiert. Falls es sich anstatt um einen Punktroboter um einen Roboter mit Ausdehnung handelt, sollte die Auflösung so gewählt werden, dass sich der Roboter durch die kleinstmöglichen Bereiche bewegen kann. Also sollte die kleinstmögliche Größe mindestens so groß wie die Ausdehnung des Roboters sein. Die Blattknoten des Framed-Quadtrees erhalten zusätzlich einen Rahmen aus quadratischen Zellen. Diese Zellen haben die kleinste erlaubte Größe (Auflösung). Der Sinn dieser Rahmenzellen liegt in der möglichen Durchquerung des Quadranten durch den Roboter. Wenn der Roboter einen freien Quadranten durchqueren soll, sind nur der Eintrittspunkt und Austrittspunkt dieses Quadranten wichtig. Beide müssen auf dem Rand des Quadranten liegen. Ein Pfad durch den Quadranten kann also festgelegt werden, indem eine Rahmenzelle als Eintrittspunkt und eine als Austrittspunkt bestimmt wird. Abbildung 2 zeigt einen Framed-Quadtree in graphischer Darstellung und als Baum. Bei der Berechnung des kürzesten Weges in einem Framed-Quadtree muss erwähnt werden, dass dieser nur aus stückweise kürzesten Wegen zusammengesetzt ist. Der Weg durch einen Quadranten ist wirklich ein kürzester Weg. Allerdings kann ein Roboter beim Übergang von einer Rahmenzelle eines Quadranten in eine Rahmenzelle eines benachbarten Quadranten in nur acht Richtungen gehen, da eine Rahmenzellen höchstens so viele benachbarte Rahmenzellen haben kann. Der größte Teil des Weges führt allerdings durch freie Quadranten, so dass dieses Problem nicht allzu stark ins Gewicht fällt. Weiterhin kann ein nahezu kürzester Weg berechnet werden, indem der gefundene Weg geglättet wird. 2.2 Wellenausbreitung Zur Berechnung des kürzesten Weges wird ein Verfahren angewandt, das eine Welle beginnend bei der Anfangsposition des Roboters aussendet. Diese Welle weist jeder freien Zelle 168 Benjamin Eikel Abb. 2. Die Beispielsumgebung oben links wird in den Framed-Quadtree oben rechts unterteilt. Die Darstellung als Baum ist im unteren Teil zu sehen. Abbildung übernommen aus [1]. des Framed-Quadtrees ähnlich einer Breitensuche einen Distanzwert zu. Dieser Distanzwert beschreibt die Kosten für den Roboter, diese jeweilige Position vom Startpunkt aus zu erreichen. Es wird die L2 -Metrik verwendet. Die Lp -Metrik ist definiert als q distp (a, b) := p |ax − bx |p + |ay − by |p [2]. Die L2 -Metrik beschreibt im zweidimensionalen Raum R2 also die bekannte Distanz zwischen zwei Punkten a, b ∈ R2 mit q . dist2 (a, b) = (ax − bx )2 + (ay − by )2 Innerhalb eines Quadranten des Framed-Quadtrees breitet sich die Welle von Rahmenzelle zu Rahmenzelle aus. Hierbei kann die Ausbreitung von einer Rahmenzelle zu einer Rahmenzelle innerhalb desselben Quadranten oder zu einem benachbarten Quadranten erfolgen. Eine Rahmenzelle, die durch eine Rahmenzelle eines benachbarten Quadranten erreicht wird, heißt Eintrittspunkt. Die Wellenausbreitung kann einen Quadranten mehrfach erreichen und daher kann es mehrere Eintrittspunkte geben. Die maximale Anzahl an Eintrittspunkten ist die Anzahl an Rahmenzellen eines Quadranten. Die Wellenausbreitung erfolgt nun rundenweise. Eine WFT (wave frontier table) beinhaltet die aktuell durch die Welle erreichten Quadranten, deren Rahmenzellen noch nicht Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen 169 vollständig abgearbeitet worden sind. Zu Beginn beinhaltet diese Tabelle nur den Quadranten mit der Anfangsposition des Roboters. In jeder Runde wird die Welle nun in benachbarte Quadranten ausgebreitet, welche bei Erreichen zu der Tabelle hinzugefügt werden. Weiterhin wird eine Kontrollvariable wellenwert benutzt, die in jeder Runde um eins erhöht wird. In der i-ten Runde ist der Wert also i. Während einer Iteration i breitet sich die Welle in alle Rahmenzellen aller Quadranten aus der WFT aus, zu denen der kürzeste Weg von der Anfangsposition des Roboters bis zu dieser Rahmenzelle eine Distanz d mit i − 1 < d ≤ i hat. In jeder Runde werden die Eintrittspunkte der Quadranten aus der WFT betrachtet und die Welle von dort in diesen Quadranten oder benachbarte Quadranten ausgebreitet. Wenn alle Rahmenzellen eines Quadranten und alle benachbarten Rahmenzellen einen Distanzwert erhalten haben, dann wird der Quadrant aus der WFT entfernt. Für die Terminierung gibt es zwei Möglichkeiten. Entweder erreicht die Ausbreitung der Welle den Quadranten, der die Zielposition enthält, oder die WFT ist leer. Wenn die WFT leer ist und die Welle das Ziel nicht erreicht hat, dann kann der Roboter von seiner Anfangsposition die Zielposition nicht erreichen. 2.3 Ablaufplanung für Eintrittspunkte Sei n die Seitenlänge eines Quadranten gemessen in der Anzahl der Rahmenzellen. Bei einem Gitter-basiertem Verfahren bestünde ein Quadrant aus n × n Zellen und eine Wellenausbreitung in diesem Quadranten benötigte O(n2 ) Schritte. In einem Framed-Quadtree wird der freie Bereich in der Mitte nicht verwendet und die Welle breitet sich nur über die Rahmenzellen aus. Ein Quadrant hat 4 · n − 4 = O(n) Rahmenzellen. Definition 1. Sei RQ die Menge von Rahmenzellen eines Quadranten Q in einem FramedQuadtree. Seien a, b ∈ RQ Eintrittspunkte von Q. Sei dist(y, z) eine Funktion, die einer Rahmenzelle y ∈ RQ einen Distanzwert zuweist, wenn sich die Welle von Eintrittspunkt z ∈ RQ ausgebreitet hat. Sei RQ (a) = {y ∈ RQ | dist(y, a) < dist(y, b)}. Dann dominiert Eintrittspunkt a den Eintrittspunkt b über RQ (a). RQ (a) ist also eine Menge von Rahmenzellen eines Quadranten Q, zu denen sich die Welle von Eintrittspunkt a mit einem geringeren Distanzwert ausbreitet hat als von Eintrittspunkt b aus. Ein Quadrant kann mehrere Eintrittspunkte enthalten. Von jedem dieser Eintrittspunkte wird die Welle weiter ausgebreitet. Im schlimmsten Fall können alle Rahmenzellen auch Eintrittspunkte sein. Wenn von jedem dieser Eintrittspunkte aus versucht würde, die Welle zu allen anderen Eintrittspunkten auszubreiten, führte dies zu einer Laufzeit von O(n2 ). Die im Folgenden vorgestellte Ablaufplanung sorgt dafür, dass für die Wellenausbreitung in einem Quadrant eine Laufzeit in O(n) eingehalten wird. Dafür ist die Beobachtung wichtig, dass einige Eintrittspunkte nicht betrachtet werden müssen, da sie von anderen Eintrittspunkten dominiert werden. Wenn während einer Runde mehrere Eintrittspunkte derselben Rahmenzelle einen Distanzwert zuweisen wollen, dann wird der Rahmenzelle der niedrigste Wert zugewiesen. Bei den zwei kleinstmöglichen Quadranten mit einer Rahmenzelle oder vier Rahmenzellen, bei denen kein freier Bereich in der Mitte existiert, wird die Welle zu allen angrenzenden 170 Benjamin Eikel Abb. 3. Aufteilung der Rahmenzellen eines Quadranten in vier Seiten. Rahmenzellen ausgebreitet. Bei diesen Quadranten kann dies in O(1) Zeit durchgeführt werden. Vorerst wird nur noch der Fall betrachtet, dass Eintrittspunkte an einer Seite eines Quadranten auftreten. Hierfür werden die Rahmenzellen eines Quadranten wie in Abbildung 3 zu sehen aufgeteilt. Wenn eine Ablaufplanung von Eintrittspunkten für eine Seite gelingt, so kann diese für die anderen drei Seiten benutzt werden, indem der Quadrant um 90°, 180° und 270° gedreht betrachtet wird. Definition 2. Sei RQ die Menge von Rahmenzellen einer bestimmten Seite j eines Quadranten Q in einem Framed-Quadtree. Ein Eintrittspunkt a von Q wird blockiert auf Seite j nach Runde iT genannt, wenn es andere Eintrittspunkte von Q gibt, die a über RQ nach Runde iT dominieren. Das bedeutet, dass a nach Runde iT weiteren Rahmenzellen auf Seite j keinen Distanzwert mehr zuweisen kann. Jeder Eintrittspunkt erhält vier binäre Blockierungsmarkierungen. Diese zeigen an, ob der Eintrittspunkt für die jeweilige Seite des Quadranten blockiert ist. In jeder Runde i werden die Eintrittspunkte überprüft, die mindestens für eine Seite nicht blockiert sind und es wird versucht, den Rahmenzellen auf den nicht blockierten Seite des Quadranten Distanzwerte von diesen Eintrittspunkten aus zuzuweisen. Die Eintrittspunkte auf Seite 1 können den Rahmenzellen auf vier Seiten Distanzwerte zuweisen. Die Ablaufplanung muss vier Fälle unterscheiden, die den vier Seiten entsprechen. Diese vier Fälle werden im Folgenden einzeln abgehandelt. Hierfür sei Q der betrachtete Quadrant und i die Runde, in welcher der erste Eintrittspunkt Seite 1 von Q erreicht. Der Quadrant Q hat also vor Runde i keine Eintrittspunkte. Es wird gezeigt, wie die notwendigen Datenstrukturen für Runde i aufgebaut werden und wie eine Aktualisierung für die folgenden Runden erfolgt. Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen 171 Seite 1 In Runde i erreichen k ≥ 1 Eintrittspunkte die Seite 1. Diese k Eintrittspunkte werden in eine Liste eingefügt. In jeder Runde wird diese Liste durchlaufen und die Eintrittspunkte versuchen, die Welle nach links und nach rechts auszubreiten. Falls beide Seiten des Eintrittspunktes durch kleinere Distanzwerte blockiert sind oder der Rand des Quadranten erreicht ist, so ist dieser Eintrittspunkt blockiert und wird aus der Liste entfernt. Nach jeder Runde enthält die Liste dann nur nicht blockierte Eintrittspunkte. Falls in späteren Runden neue Eintrittspunkte die Seite 1 erreichen, werden sie an den Anfang der Liste eingefügt. Den Rahmenzellen wird nach jeder Runde, wie bereits oben erwähnt, der kleinste Distanzwert zugewiesen. Lemma 1. Sei Q ein n × n Quadrant in einem Framed-Quadtree. Die Wellenausbreitung durch die Eintrittspunkte kann allen Rahmenzellen auf Seite 1 von Q Distanzwerte in Laufzeit O(n) zuweisen. Die Laufzeit ist unabhängig von der Anzahl von Eintrittspunkten. Beweis. Die Eintrittspunkte auf Seite 1 können die Welle zu höchstens einer Rahmenzelle auf der rechten und einer auf der linken ausbreiten. Daher kann zu einer Rahmenzelle b auf Seite 1 die Welle von höchstens zwei Eintrittspunkten ausgebreitet werden. Der Rahmenzelle wird der niedrigere Distanzwert zugewiesen. In jeder Runde wird die Welle von einem Eintrittspunkt zu mindestens einer der O(n) Rahmenzellen ausgebreitet oder der Eintrittspunkt wird aus der Liste entfernt. Jeder dieser zwei Fälle benötigt konstante Laufzeit. Da in jeder Runde mindestens einer Rahmenzelle ein Distanzwert zugewiesen wird, beträgt die Laufzeit für Seite 1 O(n). Seite 2 In diesem Fall wird die Wellenausbreitung von Eintrittspunkten auf Seite 1 zu Rahmenzellen auf Seite 2 betrachtet. Es wird wieder angenommen, dass k ≥ 1 Eintrittspunkte in Runde i das erste Mal auf Seite 1 auftreten. Die Eintrittspunkte werden in eine Liste eingefügt. Weil diese Eintrittspunkte in Runde i auftreten, müssen sie einen Distanzwert zwischen i − 1 und i haben. Welche Rahmenzellen auf Seite 2 von Eintrittspunkten auf Seite 1 Distanzwerte erhalten, hängt von der Entfernung zwischen den Rahmenzellen und den Eintrittspunkten ab. Daher wird die Liste mit den k Eintrittspunkten nach x-Koordinate sortiert (Festlegung der x-Achse in Abbildung 3). Da die Koordinaten ganzzahlige Werte in einem bekannten Bereich sind, kann eine Sortierung mit dem Bucket-Sort-Algorithmus [3] in linearer Zeit erfolgen. Lemma 2. Seien a und b zwei verschiedene Eintrittspunkte auf Seite 1 eines Quadranten Q in einem Framed-Quadtree. Sei adw der Distanzwert und ax die x-Koordinate von a. Wenn adw ≤ bdw und ax < bx , dann wird b von a auf Seite 2 dominiert und b muss nicht weiter betrachtet werden. Beweis. Sei z eine beliebige Rahmenzelle auf Seite 2, der sowohl a als auch b einen Distanzwert zuweisen wollen. Wenn der Distanzwert von z vom Eintrittspunkt a zugewiesen wird, dann gilt zdw = adw + dist2 (a, z). Wenn ax < bx gilt, dann gilt auch dist2 (a, z) < dist2 (b, z) für jede Rahmenzelle z auf Seite 2. Eine Rahmenzelle erhält von den Eintrittspunkten a und b den kleineren Distanzwert zdw = min {adw + dist2 (a, z), bdw + dist2 (b, z)}. Wenn nun 172 Benjamin Eikel adw ≤ bdw und ax < bx , dann gibt es keine Rahmenzelle auf Seite 2, die von b einen Distanzwert erhalten kann, der kleiner ist als der von a. Daher dominiert a den Eintrittspunkt b über alle Rahmenzellen auf Seite 2 und b muss nicht weiter betrachtet werden. Aus der sortierten Liste mit k Eintrittspunkten können nun die Punkte extrahiert werden, die nicht wie in Lemma 2 beschrieben nicht weiter betrachtet werden müssen. Diese neue Liste kann durch eine Variante der „dominating maxima of planar points“ [1] in Zeit O(k) = O(n) berechnet werden. Die auf Seite 2 nicht blockierten Eintrittspunkte dieser Liste müssen die Welle nun zu den Rahmenzellen auf Seite 2 ausbreiten. Dies muss erfolgen, ohne dass jeder Eintrittspunkte eine Ausbreitung zu jeder der Rahmenzellen versucht, da dies zu einer zu hohen Laufzeit führt. Daher werden hierzu die Voronoi-Domänen auf Seite 2 berechnet. Definition 3. Die Voronoi-Domäne V Di (a) auf Seite i eines Eintrittspunktes a auf Seite 1 ist ein Bereich von Rahmenzellen auf Seite i, in dem a alle anderen Eintrittspunkte auf Seite 1 dominiert. Wenn die Voronoi-Domäne auf Seite 2 eines Eintrittspunktes die leere Menge ∅ ist, dann ist er blockiert auf Seite 2 und kann aus der Liste der nicht blockierten Eintrittspunkte entfernt werden. Die nicht blockierten Eintrittspunkte p1 , p2 , . . . , pk0 mit k 0 ≤ k befinden sich absteigend nach x-Koordinate sortiert in der Liste (p1 x > p2 x > . . . > pk0 x ). p1 ist der Eintrittspunkt, der am weitesten rechts auf Seite 1 liegt. Die Liste wird nun, beginnend mit p1 , durchlaufen und die folgenden Datenstrukturen werden für die bisher betrachteten j Eintrittspunkte p1 , p2 , . . . , pj verwendet, bevor pj+1 betrachtet wird. Erstens die Liste Lj ⊆ {p1 , p2 , . . . , pj }. Sie enthält einen Eintrittspunkt pγ ∈ {p1 , p2 , . . . , pj } genau dann, wenn pγ nicht von einem Eintrittspunkt aus {p1 , p2 , . . . , pj } dominiert wird auf Seite 2. Zweitens die Voronoi-Domänen auf Seite 2 der Eintrittspunkte aus Lj . Die Liste wird durchlaufen, bis alle Voronoi-Domänen der Eintrittspunkte aus Lk0 berechnet wurden. Zu Beginn kann L1 und V D2 (p1 ) leicht berechnet werden, denn L1 = {p1 } und V D2 (p1 ) enthält alle Rahmenzellen der Seite 2. Nun sollen die Voronoi-Domänen der Eintrittspunkte in Lj+1 aus denen der Eintrittspunkte in Lj berechnet werden. Der erste Eintrag in der Liste Lj sei der zuletzt hinzugefügte Eintrittspunkt pj 0 mit 1 ≤ j 0 ≤ j. Es werden jetzt nur die Voronoi-Domänen auf Seite 2 der Eintrittspunkte pj+1 und p0j berechnet. Dies geschieht durch Berechnung der gemeinsamen Grenze zwischen den beiden Voronoi-Domänen. Sei die Rahmenzelle z diese gemeinsame Grenze auf Seite 2 und seien a, b zwei Eintrittspunkte auf Seite 1. Für die Rahmenzelle z auf Seite 2 gilt zx = 0 und für die zwei Eintrittspunkte auf Seite 1 gilt ay = by = 0. Es muss gelten: zdw = zdw ⇒ ⇒ ⇒ adw + dist2 (a, z) = bdw + dist2 (b, z) q q 2 2 (ax − zx ) + (ay − zy ) + adw = (bx − zx )2 + (by − zy )2 + bdw q q a2x + zy2 + adw = b2x + zy2 + bdw (i) Die Werte der Eintrittspunkte ax , adw , bx , bdw sind bekannt und die Gleichung kann für zy gelöst werden. Bei zwei Lösungen wird nur die positive Lösung benötigt, denn Rahmenzellen mit negativer y-Koordinate sind nicht vorhanden. Der Wert von zy bestimmt eine Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen 173 Rahmenzelle z auf Seite 2, welche die gemeinsame Grenze der Voronoi-Domänen von a und b ist. Jede Voronoi-Domäne auf Seite 2 kann durch zwei begrenzende Rahmenzellen festgelegt werden, eine obere und eine untere Begrenzungszelle. Die untere Begrenzungszelle von V D2 (pj 0 ) ist die Rahmenzelle in der unteren, linken Ecke des Quadranten, weil die x-Koordinate der nicht blockierten Eintrittspunkte mit steigendem j abnimmt und pj 0 der zuletzt eingefügte Eintrittspunkt ist. Da pj 0 , um überhaupt eingefügt zu werden, mindestens eine Rahmenzelle dominieren muss, muss die Voronoi-Domäne mindestens aus der untersten Rahmenzelle auf Seite 2 bestehen. Die Rahmenzelle auf der Grenze zwischen den VoronoiDomänen gehöre ohne Beschränkung der Allgemeinheit zur Voronoi-Domäne von pj 0 . Die Liste der Eintrittspunkte Lj+1 und deren Voronoi-Domänen können dann wie folgt berechnet werden. Fall 1: z ist die Rahmenzelle in der unteren, linken Ecke des Quadranten. Da die Grenze z per Definition zu pj 0 gehört, erhält pj+1 keine Voronoi-Domäne auf Seite 2 und wird nicht zu Lj hinzugefügt, weshalb Lj+1 = Lj gilt. Die Voronoi-Domänen bleiben also unverändert. Der nächste Eintrittspunkt pj+2 kann betrachtet werden. Fall 2: zy > 0 und ist nicht oberhalb der oberen Begrenzungszelle der Voronoi-Domäne V D2 (pj 0 ). Dann ist die neue untere Begrenzungszelle der Voronoi-Domäne V D2 (pj 0 ) die Rahmenzelle z. Die Rahmenzelle direkt unterhalb von z ist die obere Begrenzungszelle von V D2 (pj+1 ) und die Rahmenzelle in der unteren, linken Ecke wird die untere Begrenzungszelle. Die Voronoi-Domäne von V D2 (pj 0 ) wird also verkleinert und V D2 (pj+1 ) erhält die frei gewordenen Rahmenzellen wie in Abbildung 4 zu sehen. Der Eintrittspunkt pj+1 wird zu Lj hinzugefügt; Lj+1 = Lj ∪ {pj+1 }. Die Betrachtung kann mit pj+2 fortgesetzt werden. Fall 3: Wenn z oberhalb der oberen Begrenzungszelle der Voronoi-Domäne V D2 (pj 0 ) ist, dann wird pj 0 von pj+ 1 dominiert auf Seite 2 und pj 0 wird aus Lj entfernt. Der nächste Eintrittspunkt in Lj sei pj 00 . Die untere Begrenzungszelle der Voronoi-Domäne V D2 (pj 00 ) sei dann nun die untere, linke Rahmenzelle des Quadranten. Der gesamte Vorgang wird nun für pj+1 und pj 00 anstelle von pj 0 wiederholt. Wenn der Vorgang schlussendlich terminiert und pj+1 in Lj+1 enthalten ist, kann mit pj+2 fortgefahren werden. Die Berechnung der begrenzenden Rahmenzelle z kann in konstanter Zeit erfolgen. In Fall 1 geschieht nichts, im zweiten Fall wird pj+1 zu Lj+1 hinzugefügt und im dritten Fall wird ein Eintrittspunkt aus Lj entfernt. Alle drei Operationen benötigen konstante Zeit. In einer Runde i werden zuerst die Eintrittspunkte sortiert, dann die blockierten Eintrittspunkte entfernt und anschließend die Liste der Eintrittspunkte Lk0 durchlaufen, um die VoronoiDomänen auf Seite 2 zu berechnen. Die ersten beiden Operationen benötigen O(n) Zeit, der Durchlauf der Liste mit der Aktualisierung der Voronoi-Domänen benötigt O(k) Zeit. Wenn also k neue Eintrittspunkte in einer Runde i auftreten, ist die Laufzeit zur Verarbeitung O(n + k) = O(n). Nachdem in Runde i die ersten k Eintrittspunkte aufgetreten sind, können in folgenden Runden i + j, j ≥ 1 neue Eintrittspunkte auf Seite 1 auftreten. Die bestehenden Datenstrukturen können dann aktualisiert werden. Angenommen in Runde i + j treten m neue Eintrittspunkte auf. 174 Benjamin Eikel Abb. 4. Zweiter Fall: Neue Voronoi-Domäne für pj+1 durch Verkleinerung der Voronoi-Domäne von pj 0 . Lemma 3. Sei b der am weitesten links liegende Eintrittspunkt auf Seite 1 in oder vor Runde i + j − 1, j ≥ 1 in einem Quadranten eines Framed-Quadtrees. Ein in Runde i + j auftretender Eintrittspunkt e auf Seite 1 wird dominiert auf Seite 2 wenn ex > bx . Beweis. Da b schon vor Runde i + j aufgetreten ist und e erst in Runde i + j auftritt, muss für die Distanzwerte edw > bdw gelten. Lemma 2 besagt, dass e von b dominiert wird, wenn bdw ≤ edw und bx < ex . Wenn also auch ex > bx gilt, dominiert b den Eintrittspunkt e bezüglich Seite 2. Sei b der Eintrittspunkt auf Seite 1, der vor Runde i + j aufgetreten ist und der am weitesten links liegt. Aufgrund des Lemmas 3 können in einer Runde alle Eintrittspunkte, die rechts von b auftreten, sofort verworfen werden. Sei Ei+j die Menge der anderen Eintrittspunkte, also diejenigen, die links von b aufgetreten sind. Sei b0 ∈ Ei+j der Eintrittspunkt, der am weitesten links liegt. Mit einem Bucket-Sort in dem Intervall b0x bis bx können die Eintrittspunkte aus Ei+j in Laufzeit O(bx − b0x + 1) sortiert werden. Die nach Lemma 2 dominierten Eintrittspunkte können dann entfernt werden, was Zeit O(m) benötigt. Die 0 . Für die Eintrittspunkte aus dieser Menge müssen nun dann entstehende Menge sei Ei+j die vor dieser Runde berechneten Voronoi-Domänen aktualisiert werden. Hierfür kann das 0 oben beschriebene Verfahren für Runde i verwendet werden, mit dem man die Menge Ei+j durchläuft. Die Operation für jeden Eintrag der Menge benötigt konstante Laufzeit, die gesamte Aktualisierung benötigt Laufzeit O(m). In jeder Runde der Wellenausbreitung ab Runde i + 1 versucht jeder Eintrittspunkt auf Seite 1 den Rahmenzellen auf Seite 2, die in der eigenen Voronoi-Domäne sind, einen Distanzwert zuzuweisen. Dies kann nur erfolgen, wenn der zuzuweisende Distanzwert kleiner oder gleich wellenwert ist. Das Verfahren wird so lange fortgesetzt, bis die obere Begrenzungszelle einer Voronoi-Domäne einen Distanzwert erhalten hat. Denn dann hat der Eintrittspunkt allen Rahmenzellen, über die er dominiert, einen Distanzwert zugewiesen und ist danach blockiert für Seite 2. Er kann dann aus der Liste der Eintrittspunkte entfernt werden. Wenn diese Liste leer ist, endet das Verfahren. Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen 175 Lemma 4. Sei Q ein n × n Quadrant in einem Framed-Quadtree. Die Welle kann durch die Eintrittspunkte auf Seite 1 zu den Rahmenzellen auf Seite 2 in Laufzeit O(n), unabhängig von der Anzahl von Eintrittspunkten, durchgeführt werden. Beweis. Die Voronoi-Domänen für mehrere Eintrittspunkte, die in Runde i auftreten, können in Zeit O(n) berechnet werden. In allen darauffolgenden Runden i+j, j ≥ 1 benötigt der Bucket-Sort-Algorithmus O(n) Zeit, denn jeder Eintrittspunkt auf Seite 1 kann höchstens ein Mal in allen Runden neu auftreten und sortiert werden müssen. Die gesamte Laufzeit der Aktualisierung der Voronoi-Domänen ist linear in der Anzahl N ≤ n der auftretenden Eintrittspunkte, denn die Operationen für die Aktualisierung der Voronoi-Domäne für einen Eintrittspunkt ist konstant. Da jeder Eintrittspunkt nur Rahmenzellen aus seiner VoronoiDomäne Distanzwerte zuweisen kann und diese Voronoi-Domänen in Zeit O(n) verwaltet werden können, ist die Laufzeit für die Wellenausbreitung O(n). Seite 3 Um die Welle von Eintrittspunkten auf Seite 1 zu Rahmenzellen auf Seite 3 auszubreiten, kann das Verfahren für Seite 2 in gespiegelter Form benutzt werden. Seite 4 Bei der Ablaufplanung für Seite 4 ist es problematisch, dass hier nicht wie bei Seite 2 Eintrittspunkte aufgrund ihrer Lage auf Seite 1 direkt als blockiert ausgeschlossen werden können. Doch es kann ein Ausschluss von Eintrittspunkten auf Seite 1 anhand des Zeitpunkts ihres Auftretens durchgeführt werden. Angenommen in einem n × n Quadrant Q in einem Framed-Quadtree treten die ersten Eintrittspunkte auf Seite 1 in Runde i auf. Sei t1 der Wert von wellenwert, wenn√die Eintrittspunkte auftreten (hier t1 = i). Angenommen während der Runden t1 bis dt1 + 2 · n − ne treten k ≥ 1 Eintrittspunkte auf Seite 1 auf. Diese werden beim Auftreten in eine Liste eingefügt. √ Lemma 5. Jeder Eintrittspunkt auf Seite 1, der nach Runde dt1 + 2 · n − ne auftritt, kann keine Voronoi-Domäne auf Seite 4 erhalten und muss daher nicht weiter betrachtet werden. Beweis. Sei x der erste Eintrittspunkt auf Seite 1 in Runde t1 . Wenn keine anderen Eintrittspunkte auftreten, dann wäre die Zeit, um von x allen Rahmenzellen auf Seite 4 einen Distanzwert zuzuweisen gleich der Zeit, um die Rahmenzelle zu erreichen, die am weitesten von x entfernt ist. Im schlimmsten Fall, wenn x eine Rahmenzelle in der Ecke des Quadranten ist, ist die am weitesten entfernte Zelle die diagonal gegenüberliegende Rahmenzelle auf Seite 4. In Abbildung 5 ist dieser schlimmste Fall zu sehen und die Zelle √ auf Seite 4 mit z bezeichnet. Um die Entfernung zu dieser√ Zelle zu überbrücken, werden 2 · n Runden benötigt. Also wird diese Zelle in Runde t1 + 2 · n erreicht. Falls andere Eintrittspunkte auf Seite 1 auftreten, können diese ebenfalls versuchen, den Rahmenzellen auf Seite 4 einen Distanzwert zuzuweisen. Die minimal benötigte Anzahl von Runden hierfür ist n, mit der die direkt oberhalb liegende Rahmenzelle erreicht werden kann. Daher kann ein Eintrittspunkt √ y, der in Runde t2 mit t2 > t1 + 2 · n − n auftritt, keine Rahmenzelle auf Seite 4 vor Runde t2 + n erreichen. Aber zu diesem Zeitpunkt sind bereits alle Rahmenzellen auf Seite 4 durch den Eintrittspunkt x erreicht worden. Daher ist y blockiert und muss nicht mehr betrachtet werden. 176 Benjamin Eikel Abb. 5. Die Wellenausbreitung von x nach z benötigt √ 2 · n Schritte, die von y nach z benötigt n Schritte. √ In Runde dt1 + 2 · n − ne werden die k Eintrittspunkte nun nach ihren x-Koordinaten mit einem Bucket-Sort sortiert, so wie dies bei der Ablaufplanung für Seite 2 der Fall war. Für die Berechnung der Voronoi-Domänen auf Seite 4 wird wieder eine Rahmenzelle z benötigt, die auf der Grenze zwischen zwei Voronoi-Domänen von Eintrittspunkten a und b liegt. Die Koordinaten ay und by sind gleich null und zy ist gleich der Seitenlänge des Quadranten. Setzt man das in Gleichung (i) ein, erhält man die gesuchte Rahmenzelle z durch Auflösen der folgenden Gleichung zur x-Koordinate zx . q q 2 2 (ax − zx ) + zy + adw = (bx − zx )2 + zy2 + bdw Nun wird das gleiche Verfahren verwendet wie für Seite 2. Die Liste der Eintrittspunkte wird durchlaufen und die Voronoi-Domänen werden berechnet und in den darauffolgenden Runden aktualisiert. Dann weisen die Eintrittspunkte den Rahmenzelle in ihrer Voronoi-Domäne die Distanzwerte zu, bis alle Rahmenzellen einen Wert erhalten und alle Eintrittspunkte blockiert sind. Lemma 6. Sei Q ein n × n Quadrant in einem Framed-Quadtree. Die Eintrittspunkte auf Seite 1 können in Zeit O(n) allen Rahmenzellen auf Seite 4 einen Distanzwert zuordnen. Die Zeit ist nicht abhängig von der Anzahl der Eintrittspunkte. Beweis. Es gibt maximal n Eintrittspunkte auf Seite 1, die den n Rahmenzellen auf Seite 4 einen Distanzwert zuordnen wollen. Die Voronoi-Domänen der Eintrittspunkte können in O(n) Zeit berechnet werden. Jeder Eintrittspunkt weist nur Rahmenzellen in seiner VoronoiDomäne einen Distanzwert zu. Also ist die gesamte Laufzeit wie für Seite 2 O(n). Gesamter Quadrant Lemma 7. Sei Q ein n × n Quadrant in einem Framed-Quadtree. Unabhängig von der Anzahl der Eintrittspunkte in Q benötigt die Wellenausbreitung über Q Laufzeit O(n). Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen 177 Beweis. Wenn der Quadrant entweder eine oder vier Rahmenzellen besitzt, kann die Welle wie bereits oben beschrieben in konstanter Zeit ausgebreitet werden. Bei größeren Quadranten kann die Welle über die vier Seiten in linearer Zeit ausgebreitet werden (Lemmata 1, 4, 6). Während jeder Runde der Wellenausbreitung wird jede Seite eines Quadranten einmal als Seite 1 angesehen und die Wellenausbreitung von dieser Seite zu den vier Seiten durchgeführt. Den Rahmenzellen wird der kleinste der vier Werte zugewiesen. Hier ergibt sich also eine Laufzeit von O(4 · n) = O(n). Die Korrektheit dieses Algorithmus kann genauso gezeigt werden wie bei Gitter-basierten Algorithmen. Der Beweis wird hier nicht durchgeführt. 2.4 Bestimmung des kürzesten Weges Während der Durchführung der Wellenausbreitung werden von den Eintrittspunkten den Rahmenzellen Distanzwerte zugewiesen. Sobald eine Rahmenzelle r ihren endgültigen Distanzwert von einem Eintrittspunkt e erhält, wird ein Zeiger von r auf e gesetzt. Wenn der Quadrant mit der Zielposition gefunden wird, können diese Zeiger zurück verfolgt werden. Dies ergibt einen kürzesten Weg vom Ziel zur Anfangsposition des Roboters. Wenn man diesen Weg umgekehrt, erhält man den kürzesten Weg vom Roboter zum Ziel. Theorem 1. Sei T ein Framed-Quadtree und Ta ⊂ T enthalte alle Quadranten, die Blätter des Baums sind und keine Hindernisse enthalten. Für einen Quadranten Q ∈ Ta , sei u(Q) der Umfang von Q. u(Q) entspricht also der Anzahl an Rahmenzellen in Q. Das hier vorgestellte Verfahren berechnet einen kürzesten Weg in Laufzeit O(U ) + O(TNachbar ). HierP bei ist U = i∈Ta u(i) und TNachbar ist die Zeit zur Aktualisierung der Nachbar-Zeiger der Quadranten in T . Beweis. Die Welle breitet sich nur durch freie Quadranten aus und sobald ein Quadrant vollständig abgearbeitet wurde, wird er nicht noch einmal besucht. Durch jeden Quadrant kann laut Lemma 7 die Welle in linearer Zeit bezogen auf den Umfang des Quadranten ausgebreitet werden. Im schlimmsten Fall wird jeder freie Quadrant einmal besucht, weshalb sich der erste Summand in Abhängigkeit von der Summe des Umfangs aller Quadranten ergibt. Die Aktualisierung der Nachbar-Zeiger erfolgt durch Suche des entsprechenden Nachbarquadranten im Baum, woraus sich der zweite Summand ergibt. Dieser ist linear in der Auflösung des Framed-Quadtrees und in den meisten Fällen sogar konstant. Man kann U auch ansehen als die Gesamtanzahl von Rahmenzellen, die in allen freien Quadranten enthalten sind. 3 Zusammenfassung 3.1 Fazit Das hier vorgestellte Verfahren spielt seine Vorteile hauptsächlich in Umgebungen aus, in denen große, freie Bereiche vorhanden sind. In diesen Fällen ist es weitaus schneller, als Gitterbasierte Verfahren, die solche Bereiche nicht zusammenfassen können. In Gitter-basierten Verfahren kann der Roboter bei einer Bewegung von einer Gitterzelle zur nächsten auch nur aus acht verschiedenen Richtungen wählen. In dem hier gezeigten Verfahren werden in großen, freien Bereichen echte kürzeste Wege mit beliebigen Richtungen benutzt. Weitherhin besitzt es durch Einführung der neuen Datenstruktur Framed-Quadtree nicht den Nachteil, 178 Benjamin Eikel dass es den kürzesten Weg in einigen Fällen nicht findet, wie es bei anderen Quadtreebasierten Verfahren vorkommen kann. Es ist aber durch die aufwändigeren Verfahren zur Wellenausbreitung und Ablaufplanung rechenintensiver als einfache Quadtree-basierte Verfahren. Die Laufzeit in Abhängigkeit von der Anzahl an Rahmenzellen in allen Quadranten hat auch Nachteile. Falls die Hindernisse in der Umgebung so platziert sind, dass der FramedQuadtree nur aus Quadranten kleinster Größe besteht, dann gibt es so viele Rahmenzellen wie es bei einem Gitter-basierten Verfahren Gitterzellen gäbe. Der Vorteil in der Laufzeit gegenüber Gitter-basierten Verfahren verschwindet dann und möglicherweise wird das Verfahren aufgrund des Verwaltungsaufwandes sogar langsamer als diese Verfahren. Das Verfahren wurde von den Autoren des zugrundeliegenden Artikels implementiert. Die Abbildungen 6 und 7 zeigen zwei Ergebnisse bei der Suche eines kürzesten Weges in einer Beispielumgebung. In der Umgebung in Abbildung 7 müsste ein Gitter-basiertes Verfahren ungefähr 14000 freie Gitterzellen durchsuchen und das Framed-Quadtree-Verfahren durchsucht hier nur etwa 4250 Rahmenzellen. Dies entspricht einer Ersparnis von etwa zwei Dritteln. 3.2 Ausblick Ein Vorteil des Framed-Quadtree-Verfahrens ist die Möglichkeit zur Erweiterung. Es können beispielsweise mehrere Ziele in die Umgebung eingefügt werden. Durch die Wellenausbreitung können mehrere Ziele erreicht werden, wenn das Verfahren nicht nach dem Erreichen des ersten Ziels angehalten wird. Sind alle oder eine vorgegebene Anzahl von Zielen gefunden worden, kann der Roboter anhand der Distanzwerte der Ziele, die für ihn die Kosten darstellen, um dieses Ziel zu erreichen, entscheiden, welches Ziel er anfährt. Hier könnten für die Ziele verschiedene Prioritäten gesetzt und anhand derer eine Entscheidung getroffen werden. Eine weitere Erweiterung ist die Verwendung des Verfahrens im dreidimensionalen Raum. Hierfür muss das dreidimensionale Pendant zum Quadtree, der Octree, zur neuen Datenstruktur Framed-Octree erweitert werden. Allerdings ist die Berechnung der VoronoiDomänen schwieriger als im zweidimensionalen Raum. Literaturverzeichnis 1. Chen DZ, Szczerba RJ, Uhran, Jr. JJ (1997) A framed-quadtree approach for determining euclidean shortest paths in a 2-d environment. IEEE Transactions on Robotics and Automation 13(5):668–681 2. de Berg M, van Kreveld M, Overmars M, Schwarzkopf O (2000) Computational Geometry: Algorithms and Applications, Zweite Ausgabe. Springer-Verlag, Berlin Heidelberg New York 3. Cormen TH, Leiserson CE, Rivest RL, Stein C (2001) Introduction to algorithms, Zweite Ausgabe. MIT Press, Cambridge, Massachusetts Framed-Quadtree-Verfahren zur Bestimmung von kürzesten Wegen 179 Abb. 6. Framed-Quadtree mit einer Auflösung von 64 × 64 und zufälligen Hindernissen. Die schwarze Linie zeigt den stückweise kürzesten Pfad. Abbildung übernommen aus [1]. Abb. 7. Framed-Quadtree mit einer Auflösung von 128 × 128 und zufälligen Hindernissen. Die schwarze Linie zeigt den stückweise kürzesten Pfad. Abbildung übernommen aus [1]. Konstruktion von geometrischen Spannern mit geringem Durchmesser Philipp Wissneth Universität Paderborn [email protected] Zusammenfassung. Geometrische Spanner werden zur Approximation vollständiger euklidischer Graphen eingesetzt. Es handelt sich hierbei um Graphen, deren Knotenmenge einer Punktmenge im Rd entspricht und deren Kanten so definiert sind, dass der kürzeste Pfad zwischen zwei Knoten p und q höchstens um einen konstanten Faktor größer ist als der euklidische Abstand zwischen den beiden Punkten. Der Durchmesser eines Spanners ist definiert als die maximale Anzahl Kanten über alle Pfade mit minimaler Anzahl Kanten von jedem beliebigen Punkt p zu jedem beliebigen Punkt q. In dieser Arbeit wird eine randomisierte Datenstruktur für einen geometrischen Spanner vorgestellt, welche, bezogen auf eine Menge von n Punkten, mit hoher Wahrscheinlichkeit einen Durchmesser von O(log n) hat. Des Weiteren wird ein Algorithmus zur Beantwortung von Pfadanfragen auf dieser Datenstruktur vorgestellt und analysiert. 1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 2 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 2.1 2.2 2.3 2.4 Grundlegende Definitionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Θ-Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Algorithmische Konstruktion von Θ-Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 Bemerkungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 3 Der Skip List Spanner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 3.1 Konstruktion des Skip List Spanners . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 3.2 Ein Algorithmus zur Konstruktion von t-Spanner Pfaden . . . . . . . . . . . . . . . . . . . . . . 189 4 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 1 Einleitung Geometrische Spanner dienen der Approximation vollständiger euklidischer Graphen. Dabei soll sich die Summe der einzelnen euklidischen Abstände der Kanten in einem Pfad von einem Punkt p zu einem Punkt q höchstens um einen konstanten Faktor gegenüber dem euklidischen Abstand zwischen p und q unterscheiden. In dieser Ausarbeitung wird eine randomisierte Datenstruktur vorgestellt, welche mit hoher Wahrscheinlichkeit einen geringen Durchmesser besitzt. D.h., die Anzahl der Kanten in einem Pfad von einem beliebigen Punkt p zu einem beliebigen Punkt q soll möglichst gering sein ohne dabei die Spannereigenschaft zu verletzen. Des Weiteren wird ein Algorithmus vorgestellt, mit dessen Hilfe es 182 Philipp Wissneth möglich ist, einen Pfad zwischen zwei beliebigen Punkten in der vorgestellten Datenstruktur zu bestimmen. Sowohl die Datenstruktur als auch der Algorithmus wurden von Arya, Mount und Smid in [4] eingeführt. Zur effizienten Konstruktion solcher Datenstrukturen wird eine Technik vorgestellt, welche auf der Beantwortung von orthogonalen Bereichsanfragen basiert. 2 Grundlagen In diesem Kapitel werden für die Konstruktion des Algorithmus zur Beantwortung von Pfadanfragen nötige Datenstrukturen vorgestellt. Zunächst werden der Begriff t-Spanner definiert und einige Eigenschaften von Spannern vorgestellt. Im Anschluss wird eine zur Konstruktion von t-Spannern eingesetzte Datenstruktur, der Θ-Graph, eingeführt. Zur effizienten Konstruktion von Θ-Graphen wird eine Datenstruktur zur Beantwortung orthogonaler Bereichsanfragen verwendet. 2.1 Grundlegende Definitionen Sei S eine Menge von n Punkten im Rd . Bei einem euklidischen Graphen für S entspricht die Knotenmenge der Menge S. Eine Kante eines solchen Graphen ist definiert als (p, q) : p, q ∈ S. Das Gewicht einer Kante (p, q) ist definiert als der euklidische Abstand zwischen den Punkten p und q. Sei E die Kantenmenge eines Graphen G. Für ein t > 1 ist der Graph G = (S, E) ein t-Spanner, wenn für jedes Paar von Punkten p, q ∈ S ein Pfad von p nach q existiert, dessen Gewicht höchstens um den Faktor t größer ist als der euklidische Abstand zwischen p und q. Für einen t-Spanner kann eine Pfadanfrage für ein Paar von Punkten (p, q) ∈ S gestellt werden. Das Resultat einer solchen Anfrage wird dann als t-Spanner Pfad von p nach q bezeichnet. Der Durchmesser D eines t-Spanners bezeichnet die maximale Pfadlänge über alle Pfade von jedem beliebigen Punkt p zu jedem beliebigen Punkt q, deren Anzahl der Kanten im t-Spanner-Pfad minimal ist. Der euklidische Abstand zwischen zwei Punkten p und q im Rd wird im folgenden Text mit |pq| bezeichnet. 2.2 Θ-Graphen Eine Form von t-Spannern sind die sogennannten Θ-Graphen. Die Idee bei der Konstruktion von Θ-Graphen besteht darin, ausgehend von einem Punkt p zunächst eine Kante zu einem Knoten zu wählen, welcher sich grob in der Richtung des Zielknotens q befindet. Dafür wird der Raum Rd durch Kegel in mehrere Sektionen aufgeteilt. Ein Kegel ist definiert als die Schnittmenge von d Halbräumen im Rd . Die einzelnen Halbräume werden jeweils durch eine Hyperebene begrenzt, welche sich in einer allgemeinen Lage befindet. Der Punkt, an dem sich sämtliche Halbräume schneiden ist definiert als die Kegelspitze. Zur Veranschaulichung dienen hier R2 und R3 : Im R2 entspricht eine Hyperebene einer Geraden. Die von der Geraden abgegrenzte Ebene entspricht nun einem Halbraum Konstruktion von geometrischen Spannern mit geringem Durchmesser 183 (in diesem Spezialfall auch Halbebene genannt). Im R3 entspricht eine Hyperebene einer Ebene. Der von der Ebene abgegrenzte Raum entspricht einem Halbraum. Der Winkel Θ (0 < Θ < π) legt fest, in welchem Winkel die d Halbräume zueinander stehen. Da sich die einzelnen Halbräume in einem gemeinsamen Punkt schneiden, entsteht ein geometrisches Konstrukt in Form eines Kegels. Die Menge C sei definiert als eine Sammlung von Kegeln, welche ihren Ursprung im Koordinatenursprung haben, dessen Kegel einen Winkel von Θ besitzen und den Rd abdecken. In [8] wird gezeigt, wie eine solche Menge C, bestehend aus O((c/Θ)d−1 ) Kegeln, für eine geeignete Konstante c konstruiert werden kann. Jeder Kegel besitzt einen Strahl lC , welcher vom Ursprung des Kegels ausgeht und sich innerhalb des Kegels befindet. Dabei darf sich lC irgendwo im Kegel befinden (in den folgenden Zeichnungen wurde die Winkelhalbierende gewählt). Ein verschobener Kegel Cp ist definiert als der Kegel C, dessen Ausgangspunkt vom Koordinatenursprung zum Punkt p verschoben wurde. Formal kann Cp wie folgt beschrieben werden: Cp := C +p := {x+p : x ∈ C}. Abbildung 1 zeigt zwei Kegel im R2 . Einer hat seinen Ausgangspunkt im Koordinatenursprung, der zweite Kegel ist um den Punkt p verschoben worden. Analog hierzu wird der verschobene Strahl lC,p definiert. Der Strahl lC,p hat seinen Ursprung im Punkt p und entspricht dem um den Punkt p verschobenen Strahl lC . lC,p lC p 0 0 Abb. 1. Ein Kegel mit Ausgangspunkt im Koordinatenursprung inklusive Strahl lC und ein zugehöriger, um den Punkt p verschobener Kegel (d = 2). Definition 1 (Θ-Graph [1]). Sei k ≥ 2 ein ganzzahliger Wert und Θ = 2π/k. S sei eine Menge von Punkten im Rd . Der gerichtete Graph Θ(S, k) ist wie folgt definiert. 1. Die Knoten von Θ(S, k) sind die Punkte in S. 2. ∀p ∈ S und ∀C ∈ C, sodass in dem verschobenen Kegel Cp Punkte aus S\{p} enthalten sind, existiert eine Kante von p zu einem Punkt r in Cp ∩ S\{p}, dessen orthogonale Projektion auf den Strahl lC,p dem Punkt p am nächsten ist. Existieren mehrere solcher Punkte, wird ein beliebiger Punkt gewählt. Abbildung 2 illustriert die Auswahl einer Kante (p, r) in einem Kegel Cp . Für den ΘGraph lässt sich folgendes Lemma definieren: 184 Philipp Wissneth lC,p r p Abb. 2. Ein Kegel mit Ausgangspunkt p und Strahl lC,p (d = 2). In einem Θ-Graphen wird für diesen Kegel die Kante (p, r) hinzugefügt, da die orthogonale Projektion auf lC,p am nächsten zu p ist. Lemma 1. Sei k > 8 ein ganzzahliger Wert, Θ = 2π/k und sei S eine Menge bestehend aus n Punkten im Rd . Dann ist der Graph Θ(S, k) ein t-Spanner für t = 1/(cos Θ − sin Θ). Der Graph enthält O((c/Θ)d−1 n) Kanten für eine Konstante c. Die Anzahl der Kanten ergibt sich daraus, dass in jedem der n Punkte p ∈ S für alle Kegel (welche O((c/Θ)d−1 ) betragen) eine Kante bestimmt wird. Ein Beweis für die Bestimmung von t folgt in Kapitel 3. 2.3 Algorithmische Konstruktion von Θ-Graphen Der folgende Abschnitt befasst sich mit der algorithmischen Konstruktion von Θ-Graphen. Arya, Mount und Smid beschreiben in [4] eine Datenstruktur, mit welcher sich der Graph Θ(S, k) in Zeit O(n logd−1 n) und einem Speicherbedarf von O(n logd−2 n) erstellen lässt. Vor der eigentlichen Konstruktion werden einige Notationen eingeführt: Sei C ein Kegel aus C. Es seien h1 , h2 , . . . , hd die Hyperebenen, welche die Halbräume begrenzen, die C definieren. H1 , H2 , . . . , Hd seien Linien durch den Koordinatenursprung, so dass jedes Hi (1 ≤ i ≤ d) jeweils orthogonal zu hi ist. Hi ist so gerichtet, dass Hi in die Richtung zeigt, in welche sich der Kegel C ausbreitet. Des Weiteren ist L definiert als die Linie, welche den Strahl lC enthält und ebenfalls durch den Koordinatenursprung geht. Für einen beliebigen Punkt p im Rd seien im Folgenden seine Koordinaten in Bezug auf die entsprechende Achse mit p1 , p2 , . . . , pd gekennzeichnet. Der Wert von p0i mit 1 ≤ i ≤ d kennzeichne den vorzeichenbehafteten euklidischen Abstand zwischen dem Koordinatenursprung und der orthogonalen Projektion von p auf Hi . Das Vorzeichen wird dadurch bestimmt, ob sich die entsprechende Projektion in Bezug zur Richtung von Hi “rechts” oder “links” vom Koordinatenursprung befindet. Analog hierzu bezeichne p0d+1 den vorzeichenbehafteten euklidischen Abstand zwischen dem Koordinatenursprung und der orthogonalen Projektion von p auf L. Abbildung 3 verdeutlicht diesen Zusammenhang für d = 2. Sei nun angenommen, dass p ein Punkt in S ist. Bei der Berechnung des Graphen Θ(S, k) muss eine Kante ausgehend von p zu einem Punkt q in Cp mit minimalem Abstand in Bezug zur orthogonalen Projektion von q auf lC,p gefunden werden. Dies ist äquivalent zum Bestimmen eines Punktes q ∈ S\{p}, sodass aus allen 1 ≤ i ≤ d mit qi0 ≥ p0i ein Punkt mit 0 minimaler qd+1 -Koordinate gefunden wird. Die Datenstruktur, auf dessen Basis dieser Punkt bestimmt wird, ist eine erweiterte Version eines Bereichsbaumes (vgl. [5]). Sie ist wie folgt aufgebaut: Auf oberster Ebene Konstruktion von geometrischen Spannern mit geringem Durchmesser H1 h1 + p p'2 lC,p L p 0 H2 p'1 185 h2 + p Abb. 3. Die Linien Hi sind orthogonal zu hi (1 ≤ i ≤ d). Die gestrichelten Linien kennzeichnen die orthogonale Projektion des Punktes p auf die Linien Hi (d = 2). existiert ein balancierter binärer Suchbaum in dessen Blättern die Punkte aus S gespeichert sind. Diese Punkte sind nach ihren q10 -Koordinaten sortiert. Für jeden Knoten v dieses Baumes sei Sv die Teilmenge aus S, welche in dem Teilbaum unter v gespeichert ist. Jeder Knoten v enthält nun einen Zeiger auf die Wurzel eines sortierten binären Suchbaumes über Sv , welcher in seinen Blättern nach seinen q20 -Koordinaten sortiert ist. Sämtliche Knoten dieses Baumes enthalten wiederum einen Zeiger auf sortierte binäre Suchbäume, welche in ihren Blättern nach ihrer q30 -Koordinate sortiert sind usw. Diese rekursive Konstruktion wird bis zu Suchbäumen, welche nach ihrer qd0 -Koordinate sortiert sind, fortgesetzt. Ein Baum, welcher in seinen Blättern qi0 -Koordinaten enthält, wird im Folgenden als Baum der Ebene i bezeichnet. Zusätzlich zu dem in einem Knoten u eines Baumes der Ebene d gespeicherten Suchintervall wird dort eine weitere Information gespeichert. Es handelt sich hierbei um den Punkt, welcher in Bezug auf die in den Blättern des von u gespeicherten Teilbaumes enthaltene 0 -Koordinate besitzt. Teilmenge von S eine minimale qd+1 Sobald diese Datenstruktur konstruiert wurde, ist es möglich, die entsprechenden Kanten von Θ(S, k) zu bestimmen. Für einen beliebigen Punkt p ∈ Rd wird eine entsprechende Menge von Knoten aus Bäumen der Ebene d berechnet, sodass alle Teilmengen von S, welche in den Teilbäumen dieser Knoten gespeichert sind, der Menge der Punkte innerhalb des Kegels Cp entsprechen. In der vorgestellten Datenstruktur müssen also sämtliche Punkte q ∈ S\{p} bestimmt werden, bei denen für alle 1 ≤ i ≤ d die Eigenschaft qi0 ≥ p0i gilt. Diese Menge von Punkten kann durch eine orthogonale Bereichsanfrage bestimmt werden (siehe [5]). Die Bestimmung der Kante in Cp zur Berechnung von Θ(S, k) erweist sich nun als besonders leicht: Für jeden der eben bestimmten Knoten u ∈ S, welcher die Wurzel eines 0 Teilbaumes der Ebene d ist, wurde ein Knoten qu gespeichert, dessen qu,d+1 -Koordinate im jeweiligen Teilbaum minimal ist. Sei nun q derjenige Knoten aus allen bestimmten Knoten 0 u, welcher den minimalen Wert für qu,d+1 besitzt. Folglich ist (p, q) eine Kante von Θ(S, k). 0 Bis auf die Bestimmung der minimalen Werte für qd+1 entspricht die vorgestellte Datenstruktur der eines Bereichsbaumes. Bereichsbäume haben einen Speichplatzbedarf von O(n logd−1 n) und können in Zeit O(n logd−1 n) erstellt werden. Die Bestimmung des Punk0 tes eines Teilbaumes mit minimalem Wert für die qd+1 -Koordinate kann mit Hilfe einer 186 Philipp Wissneth Bottom-Up Prozedur geschehen. Hier wird ausgehend von den Blättern eines Baumes der 0 Ebene d die Bezeichnung des Knotens mit minimaler qd+1 -Koordinate nach oben propagiert. Auf Basis der Eigenschaften von Bereichsbäumen (vgl. [5] oder [6]) kann folgendes Lemma definiert werden: Lemma 2 (vgl. [4]). Sei S eine Menge von n Punkten im Rd und sei C ein Kegel aus C. Die oben beschriebene Datenstruktur hat eine Größe von O(n logd−1 n) und kann in Zeit O(n logd−1 n) erstellt werden. Die Zeit zum Einfügen oder Löschen eines Punktes in bzw. aus dieser Datenstruktur beträgt O(logd n). Zu jedem Punkt p ∈ Rd kann in Zeit O(logd n) 0 ein Punkt q in Cp ∩ S\{p} bestimmt werden, dessen qd+1 -Koordinate minimal ist, beziehungsweise festgestellt werden, dass kein solcher Punkt existiert. Es muss beachtet werden, dass sich die gezeigte Datenstruktur ausschließlich auf einen einzigen Kegel C aus C bezieht. Es lassen sich also die Kanten für sämtliche verschobenen Kegel Cp , welche auf C basieren, berechnen. Dies kann in Zeit O(n logd n) geschehen. Dieser 0 -Koordinate Wert ergibt sich daraus, dass für die Berechnung einer Kante mit minimaler qd+1 für einen bestimmten Kegel Cp (wobei p ∈ S) die erstellte Datenstruktur mit dem Punkt p befragt wird. Dies kann in Zeit O(logd n) geschehen (vgl. Lemma 2). Will man die Kanten sämtlicher Kegel Cp erhalten, muss die erstellte Datenstruktur mit sämtlichen Punkten aus S, (|S| = n) befragt werden. Es muss also n mal eine Anfrage auf die erstellte Datenstruktur gestartet werden. Die Laufzeit beträgt folglich O(n logd n) (das Erstellen der Datenstruktur benötigt O(n logd−1 n) Zeit und ist somit in der O-Notation enthalten). Bei der Konstruktion des Θ-Graphen lässt sich sowohl beim Speicherplatzbedarf als auch bei der Laufzeit ein Faktor von log n einsparen. Dies wird dadurch möglich, dass bereits a priori sämtliche Punkte bekannt sind, mit denen die erstellte Datenstruktur befragt wird: Alle Punkte aus S. Die Punkte aus S werden nun der Reihe nach absteigend nach ihrer p01 -Koordinate sortiert. Die Berechnung der einzelnen Kanten in den verschobenen Kegeln erfolgt nun entsprechend dieser Liste von p01 -Koordinaten in absteigender Reihenfolge. Wie bereits oben gezeigt, wird auch hier für jeden Kegel C ∈ C ein erweiterter Bereichsbaum konstruiert. Allerdings geschieht dies hier lediglich für die Koordinaten p02 , . . . , p0d+1 . Es wird also die Datenstruktur aus Lemma 2 für Dimension d − 1 angewandt. Um sicherzustellen, dass bei einer Anfrage für einen Punkt p ausschließlich Punkte r ∈ S mit einer r10 -Koordinate betrachtet werden, welche größer oder gleich p01 sind, werden in den Bereichsbaum nur die Punkte eingefügt, welche in der zuvor konstruierten Liste “über” dem aktuell betrachteten Punkt p liegen. Durch eine Anfrage der Datenstruktur für jeden Punkt p wird nun ein Punkt q bestimmt, 0 bei dem für alle 2 ≤ i ≤ d die Eigenschaft qi0 ≥ p0i gilt und qd+1 minimal ist. Des Weiteren ist sichergestellt, dass die Datenstruktur zu diesem Zeitpunkt nur Punkte r aus S enthält, deren Koordinate r10 größer oder gleich p01 ist. Daraus folgt, dass die Eigenschaft qi0 ≥ p0i 0 für alle 1 ≤ i ≤ d gilt und qd+1 minimal ist. Nachdem für die Anfrage mit Punkt p ein passender Punkt q bestimmt wurde, wird p bezüglich seiner Koordinaten (p02 , . . . , p0d+1 ) in den erweiterten Bereichsbaum eingefügt und es kann die Anfrage für den nächsten Punkt aus der nach p01 -Koordinaten sortierten Liste von Punkten aus S gestartet werden. Da das Einfügen von Punkten in den erweiterten Bereichsbaum Zeit O(logd−1 n) benötigt und dies für alle n Punkte aus S durchgeführt wird, ergibt zusätzlich zum Konstruieren des erweiterten Bereichsbaumes für die Dimension d − 1 ein Zeitbedarf von O(n logd−1 n). Gemäß Konstruktion von geometrischen Spannern mit geringem Durchmesser 187 Lemma 2 wird für die Konstruktion eines erweiterten Bereichsbaumes für die Dimension d − 1 Zeit O(n logd−2 n) benötigt. Die benötigte Zeit zur Bestimmung sämtlicher Kanten der verschobenen Kegel Cp zu einem Kegel C ∈ C ist also durch O(n logd−1 n) beschränkt. Um Θ(S, k) vollständig zu berechnen, müssen für sämtliche Kegel C ∈ C die Kanten der verschobenen Kegel Cp bestimmt werden. Aus Lemma 1 geht hervor, dass Θ(S, k) O((c/Θ)d−1 n) Kanten enthält. Das bedeutet insbesondere, dass für die Konstruktion ein Speicherplatz von O((c/Θ)d−1 n + n logd−2 n) benötigt wird, also dem Platz zum Speichern der berechneten Kanten und dem Platz zum Speichern der einzelnen erweiterten Bereichsbäume. Ferner beträgt die Anzahl der Kegel C ∈ C O((c/Θ)d−1 ). Daraus ergibt sich eine Laufzeit von O((c/Θ)d−1 n logd−1 n) zur Konstruktion des Graphen Θ(S, k). Die Ergebnisse zum Graph Θ(S, k) und seiner algorithmischen Konstruktion werden wie folgt zusammengefasst: Theorem 1 (vgl. Theorem 5 in [4]). Sei k > 8 ein ganzzahliger Wert, Θ = 2π/k und S eine Menge von n Punkten im Rd . Der Graph Θ(S, k) ist ein t-Spanner für t = 1/(cos Θ − sin Θ). Er enthält O((c/Θ)d−1 n) Kanten für eine Konstante c. Unter einem Speicherplatzverbrauch von O((c/Θ)d−1 n + n logd−2 n) kann der Graph in Zeit O((c/Θ)d−1 n logd−1 n) konstruiert werden. 2.4 Bemerkungen Die hier eingeführten Θ-Graphen dienen als Grundlage für die im folgenden Kapitel vorgestellte Technik zur Konstruktion von t-Spannern mit geringem Durchmesser. Des Weiteren wird in Kapitel 3 auf das folgende Lemma zurückgegriffen. Ein entsprechender Beweis ist in [3] zu finden. Lemma 3. Sei k > 8 ein ganzzahliger Wert und Θ = 2π/k. Ferner seien p und q beliebige disjunkte Punkte im Rd und C sei ein Kegel aus C, sodass q ∈ Cp . Sei r ein beliebiger Punkt im Rd ∩ Cp , sodass die orthogonale Projektion von r auf den Strahl lC,p mindestens so nah zu p ist wie die orthogonale Projektion von q auf lc,p . Es gilt 1. |pr| cos Θ ≤ |pq|, und 2. |rq| ≤ |pq| − (cos Θ − sin Θ)|pr|. Außerdem wird bei der Konstruktion der im nächsten Kapitel eingeführten Datenstruktur auf das Konzept von Skip Listen (vgl. [2]) zurückgegriffen, weshalb an dieser Stelle kurz deren Eigenschaften wiederholt werden sollen: Skip Listen sind eine randomisierte Datenstruktur zur effizienten Suche auf geordneten Mengen. Die Datenstruktur besteht aus n Listen, welche sich in verschiedenen Ebenen befinden. In der Liste der Ebene 1 befinden sich alle Elemente. Es wird per Münzwurf bestimmt, ob sich ein Element einer Liste der Ebene i in der übergeordneten Liste i + 1 befindet. Da es sich hierbei um einen fairen Münzwurf handelt, ist zu erwarten, dass die Anzahl der Elemente einer Liste der Ebene i + 1 halb so groß ist wie die Anzahl der Elemente der darunter liegenden Liste der Ebene i. Elemente, welche in mehreren Listen auftreten besitzen einen Zeiger zu ihren Vorkommen in der jeweils höheren bzw. niedrigeren Ebene. Die Anzahl der zu erwartenden Ebenen beträgt O(log n). 188 Philipp Wissneth 3 Der Skip List Spanner Ziel dieses Kapitels ist die Vorstellung und Analyse eines t-Spanners, welcher einen möglichst geringen Durchmesser hat. Arya, Mount und Smid führen in [4] einen t-Spanner ein, dessen Durchmesser mit hoher Wahrscheinlichkeit O(log n) beträgt. Der vorgestellte Spanner basiert auf der Kombination von den bereits im vorhergegangenen Kapitel eingeführten Θ-Graphen und Skip-Listen. 3.1 Konstruktion des Skip List Spanners Bevor eine entsprechende Datenstruktur angegeben werden kann, werden zunächst aus der Menge S der Punkte im Rd entsprechende Teilmengen gebildet. Es sei S1 = S. Für ein i > 1 wird die Menge Si wie folgt ermittelt: Für jeden Punkt aus Si−1 wird ein fairer Münzwurf ausgeführt. Jeder Punkt, für den der Münzwurf mit dem Ergebnis “Kopf” ausgegangen ist, ist Bestandteil der Teilmenge Si . Die Konstruktion der Teilmengen ist dann beendet, wenn für eine Menge Si ausschließlich das Ergenis “Zahl” geworfen wurde, also Si = ∅. Mit h sei die Anzahl der Iterationen für diese Konstruktion gekennzeichnet. Es besteht also folgende Beziehung zwischen den einzelnen Teilmengen von S: ∅ = Sh+1 ⊆ Sh ⊆ Sh−1 ⊆ Sh−2 ⊆ · · · ⊆ S2 ⊆ S1 = S Die im Folgenden definierte Datenstruktur basiert auf den oben erstellten Mengen Si . Definition 2 (Skip List Spanner [4]). Sei k ≥ 2 ein ganzzahliger Wert und Θ = 2π/k. Sei S eine Menge von n Punkten im Rd . Si , 1 ≤ i ≤ h seien die oben durch den fairen Münzwurf konstruierten Teilmengen von S. Der Skip List Spanner, SLS(S, k) ist wie folgt definiert. 1. Für jedes 1 ≤ i ≤ h existiert eine Liste Li , welche die Punkte aus Si beinhaltet (in beliebiger Reihenfolge). 2. Für jedes 1 ≤ i ≤ h existiert ein Graph Θ(Si , k). 3. Für jedes 1 ≤ i ≤ h existiert der umgekehrte Graph Θ0 (Si , k), welcher durch die Umkehrung der Kantenrichtung in Θ(Si , k) erhalten wird. 4. Für jedes 1 < i ≤ h enthält jedes p ∈ Si einen Zeiger von seinem Auftreten in Li zum in Li−1 korrespondierenden Auftreten von p. 5. Für jedes 1 ≤ i < h enthält jedes p ∈ Si+1 einen Zeiger von seinem Auftreten in Li zum in Li+1 korrespondierenden Auftreten von p. Lemma 4. Sei k > 8 ein ganzzahliger Wert, Θ = 2π/k und sei S eine Menge von n Punkten im Rd . Der Skip List Spanner SLS(S, k) ist ein t-Spanner für t = 1/(cos Θ − sin Θ). Er enthält O((c/Θ)d−1 n) Kanten für eine Konstante c. Ferner kann dieser Graph mit hoher Wahrscheinlichkeit in Zeit O((c/Θ)d−1 n logd−1 n) mit einem Speicherplatzbedarf von O((c/Θ)d−1 n + n logd−2 n) konstruiert werden. Beweis. Da der Skip List Spanner SLS(S, k) insbesondere den Graphen Θ(S1 , k) = Θ(S, k) enthält, ist er nach Theorem 1 ein t-Spanner für t = 1/(cos Θ − sin Θ). Die Anzahl der Kanten in Θ(S, k) ist begrenztPdurch O((c/Θ)d−1 n). Daraus folgt, dass die Anzahl der Kanten in SLS(S, k) durch O( hi=1 (c/Θ)d−1 |Si |) begrenzt ist. Konstruktion von geometrischen Spannern mit geringem Durchmesser 189 Da die Mengen Si durch einen fairen Münzwurf bestimmt wurden, wissen wir, dass ein Punkt aus der Menge Si−1 mit einer Wahrscheinlichkeit von 1/2 in der Menge Si enthalten ist. Die erwartete Anzahl an Punkten in Si beträgt folglich (1/2)|Si−1 |. Aufgrund dieser Beobachtung kann die Gesamtzahl aller Punkte in SLS(S, k) überPeine geometrische Reihe Ph−1 1 der Form k=0 n( 21 )k berechnet werden, deren Grenzwert limi→∞ ik=0 n( 12 )k = n 1−(1/2) = 2n beträgt. Setzt man nun für die Anzahl der Punkte in SLS(S, k) den Wert 2n ein, so beträgt die Anzahl der Kanten in SLS(S, k) mit hoher Wahrscheinlichkeit O((c/Θ)d−1 n). Sollte die Anzahl der Kanten wider Erwarten größer ausfallen, wird die Konstruktion des Skip List Spanners so oft wiederholt, bis die Anzahl der Kanten O((c/Θ)d−1 n) beträgt. Die Schranken für die Konstruktionszeit und den Speicherplatzbedarf werden analog zu der oben gezeigten Schranke für die Anzahl der Kanten bestimmt. 3.2 Ein Algorithmus zur Konstruktion von t-Spanner Pfaden Der Skip List Spanner stellt die für die Konstruktion von t-Spanner Pfaden grundlegende Datenstruktur dar. Im Folgenden wird der Algorithmus skizziert, welcher einen Pfad von einem Punkt p zu einem Punkt q konstruiert. Dass es prinzipiell möglich ist, t-Spanner Pfade im SLS(S, k) zu berechnen, wurde bereits dadurch gezeigt, dass der Skip List Spanner den Θ-Graphen Θ(S, k) enthält. Um die Anzahl der Kanten jedoch zu reduzieren, wird wie folgt vorgegangen: Gestartet wird der Algorithmus bei dem Punkt x = p. Zuerst wird gepüft, ob sich der Punkt x auf Ebene 2 (also in der Menge S2 ) befindet. Ist dem nicht der Fall, wird nun in Ebene 1 eine Kante berechnet, welche sich in grober Richtung zu Punkt q befindet. Um dies zu erreichen, wird der Kegel C aus C so bestimmt, dass q ∈ Cx (was bedeutet, dass sich q im verschobenen Kegel Cx befindet). Nun sei x0 ein Punkt aus Cx ∩ S1 (also allen Punkten aus der Menge S1 , die sich im verschobenen Kegel Cx befinden), welcher zusammen mit x eine Kante (x, x0 ) im Θ-Graphen Θ(S1 , k) ist. x0 wird nun ein Punkt auf dem Pfad von p zu q. Für den weiteren Verlauf wird x := x0 gesetzt. Der Punkt x kennzeichnet also immer den zuletzt hinzugefügten Punkt eines zu berechnenden Pfades von p zu q. Der Pfad wird auf diese Weise solange erweitert bis x = q gilt oder x in der zweiten Ebene des Skip List Spanners enthalten ist (x ∈ S2 ). Sollte x in der zweiten Ebene vorkommen, wird gestartet, einen Pfad von Punkt q zu x zu konstruieren. Der Pfad dorthin wird analog zu dem oben beschriebenen Pfad von p zu x konstruiert: Der zuletzt zum Pfad hinzugefügte Punkt sei hier mit y gekennzeichnet. Der Pfad wird solange erweitert, bis y einem Punkt des bereits konstruierten Pfades von p nach x entspricht oder y in Ebene 2 des Skip List Spanners enthalten ist (y ∈ S2 ). Sollte y einem Punkt p0 des Pfades von p nach x entsprechen, so wird der Pfad von p nach p0 gefolgt vom umgekehrten Pfad von q nach p0 ausgegeben. Der Pfad von p nach p0 ist in Θ(S1 , k) und der Pfad von q nach p0 ist in Θ0 (S1 , k) enthalten. Beide Θ-Graphen sind in SLS(S, k) enthalten. Befindet sich y hingegen auf Ebene 2 des Skip List Spanners, wird mit dem selben Vorgehen ausgehend von Ebene 2, ein Pfad von x nach y berechnet usw. Der in [4] vorgestellte formale Algorithmus entspricht dem hier gezeigten Algorithmus 19. 190 Philipp Wissneth Algorithmus 19 walk(p, q) p0 := p; q0 := q; a := 0; b := 0; r := 0; s := 0; i := 1; /* p0 = p, p1 , . . . , pr , . . . , pa und q0 = q, q1 , . . . , qs , . . . , qb sind Pfade in SLS(S, k), r = min{j : pj ∈ Si }, s = min{j : qj ∈ Si } und pr , pr+1 , . . . , pa , qs , qs+1 , . . . , qb ∈ Si */ stop := false; while stop = false do while pa 6= qb und pa ∈ / Si+1 do C := Kegel aus C, sodass qb ∈ Cpa ; pa+1 := Punkt aus Cpa ∩ Si sodass (pa , pa+1 ) eine Kante aus Θ(Si , k) ist; a := a + 1; /* pa = qb oder pa ∈ Si+1 */ while qb ∈ / {pr , pr+1 , . . . , pa } und qb ∈ / Si+1 do C := Kegel aus C, sodass pa ∈ Cqb ; qb+1 := Punkt aus Cqb ∩ Si sodass (qb , qb+1 ) eine Kante aus Θ0 (Si , k) ist; b := b + 1; /* qb ∈ {pr , pr+1 , . . . , pa } oder pa und qb treten in Si+1 auf */ if qb ∈ {pr , pr+1 , . . . , pa } then l := Index, sodass qb = pl ; Pfad p0 , p1 , . . . , pl , qb−1 , qb−2 , . . . , q0 ausgeben; stop := true; else i := i + 1; r := a; s := b; Lemma 5. Sei k > 8 und Θ = 2π/k. Für jedes Paar von Punkten p und q aus S konstruiert der Algorithmus walk(p, q) im SLS(S, k) einen t-Spanner Pfad von p nach q für ein t = 1/(cos Θ − sin Θ). Beweis. Der Beweis zu Lemma 5 geschieht durch Induktion über die Anzahl der Ebenen des Skip List Spanners. Für den Induktionsanfang wird angenommen, dass der Skip List Spanner SLS(S, k) aus lediglich einer Ebene besteht. Dabei wird das Verhalten während der ersten Iteration der äußeren While-Schleife beobachtet (Eine zweite Iteration wäre in diesem Fall ohnehin nicht möglich, da dort Kanten der Ebene 2 berechnet werden würden, welche logischerweise nicht existieren können). q lC,p a pa+1 pa Abb. 4. Nach Definition des Θ-Graphen muss die Projektion von pa+1 auf den Strahl lC,pa mindestens so nah an pa sein wie die Projektion von q auf lC,pa (d = 2). In der ersten inneren While-Schliefe wird ein Pfad, beginnend mit p = p0 , p1 , p2 , . . . konstruiert. Die Berechnung des Pfades wird beendet, sobald der zuletzt hinzugefügte Punkt dem Punkt q entspricht. Wir betrachten nun für a ≥ 0 die Punkte pa und pa+1 . Da pa einen Konstruktion von geometrischen Spannern mit geringem Durchmesser 191 Nachfolger (pa+1 ) besitzt, ist klar, dass pa 6= q gilt. Sei nun C der Kegel, sodass q im verschobenen Kegel Cpa enthalten ist. Laut Algorithmus ist pa+1 ∈ Cpa und (pa , pa+1 ) eine Kante von Θ(S1 , k) und damit auch eine Kante von SLS(S, k). Des Weiteren gilt laut Definition des Θ-Graphen, dass die Projektion von pa+1 auf den Strahl lC,pa mindestens so nah an pa sein muss wie die Projektion von q auf lC,pa . Abbildung 4 verdeutlicht diesen Zusammenhang. Nach Lemma 3 gilt |pa+1 q| ≤ |pa q| − (cos Θ − sin Θ)|pa pa+1 |. (1) Durch die Monotonieeigenschaften der Cosinus- und Sinusfunktion im Intervall [0, π4 ) folgt |pa+1 q| < |pa q|, (2) womit gezeigt ist, dass bei jeder Iteration der ersten inneren While-Schleife der Abstand zwischen den Punkten pa und q kleiner wird und die Schleife terminiert. Wird angenommen, dass z die Anzahl der durchgeführten Iterationen ist, wurde durch den Algorithmus ein Pfad der Form p = p0 , p1 , p2 , . . . , pz = q konstruiert. Die zweite innere While-Schleife wird nicht ausgeführt, da qb = pz = q Element des konstruierten Pfades ist und so die Abbruchbedingung der Schleife zutrifft. Der Algorithmus terminiert und gibt den konstruierten Pfad von p nach q aus. Um eine Gewichtsbeschränkung des konstruierten Pfades zu erhalten, wird zunächst die Ungleichung (1) umgeformt zu |pa pa+1 | ≤ 1 (|pa q| − |pa+1 q|) = t(|pa q| − |pa+1 q|) cos Θ − sin Θ (3) Das Gewicht des ausgegebenen Pfades ist die Summe der Gewichte der einzelnen Kanten. Unter Zuhilfenahme von (3) kann nun eine Gewichtsbeschränkung des konstruierten Pfades bestimmt werden: z−1 X a=0 |pa pa+1 | ≤ t z−1 X (|pa q| − |pa+1 q|) (4) a=0 Durch Auflösen der Teleskopsumme auf der rechten Seite erhält man z−1 X |pa pa+1 | ≤ t(|p0 q| − |pz q|) = t|pq|, (5) a=0 womit gezeigt ist, dass der Algorithmus für einen Skip List Spanner SLS(S, k) mit einer Ebene einen t-Spanner Pfad von p nach q konstruiert. Der Induktionsanfang ist bewiesen. Ferner konnte hier der in Lemma 1 genannte Wert für t bewiesen werden. Im Folgenden wird ein Skip List Spanner mit h Ebenen betrachtet, wobei h > 1. Wir nehmen an, dass das Lemma 5 für alle Skip List Spanner mit weniger als h Ebenen gilt. Während der ersten Iteration der äußeren While-Schleife wird in der ersten inneren While-Schleife ein Pfad der Form p = p0 , p1 , p2 , . . . , pz konstruiert. Der Punkt pz entspricht 192 Philipp Wissneth entweder dem gesuchten Punkt q (pz = q) oder er ist in der Menge S2 enthalten und damit Element der zweiten Ebene des Skip List Spanners (pz ∈ S2 ). Offensichtlich gilt die Ungleichung (2) auch hier. Für den Fall, dass pz = q gilt, wird der Algorithmus den konstruierten Pfad ausgeben und terminieren. Der Beweis, dass es sich bei der Ausgabe um einen t-Spanner Pfad handelt, ist exakt derselbe wie bereits im Induktionsanfang gezeigt. Für den Fall, dass pz 6= q gilt, muss pz ∈ S2 gelten. In der zweiten inneren While-Schleife wird ein Pfad der Form q = q0 , q1 , q2 , . . . konstruiert. Gemäß Lemma 3 und den Monotonieeigenschaften der Cosinus- und Sinusfunktion im Intervall [0, π4 ) folgt |qb+1 pz | ≤ |qb pz | − (cos Θ − sin Θ)|qb qb+1 | < |qb pz |. (6) Die zweite innere While-Schleife terminiert, wenn der zuletzt hinzugefügte Punkt des qPfades einem Punkt des bereits erstellten p-Pfades entspricht oder in Ebene 2 des Skip List Spanners vorkommt. Durch (6) wurde gezeigt, dass mit jeder Iteration der zweiten inneren While-Schleife die Abstände zwischen qb und pz echt kleiner werden. Folglich terminiert die Schleife. Es sei y die Anzahl der Iterationen bis zum Terminieren der Schleife. Es können nun zwei Fälle unterschieden werden: qy ∈ {p0 , p1 , p2 , . . . , pz } oder qy ∈ S2 . Falls qy ∈ {p0 , p1 , p2 , . . . , pz } sei l so gewählt, dass qy = pl gilt. Der Algorithmus würde dann den Pfad der Form p = p0 , p1 , p2 , . . . , pl = qy , qy−1 , . . . , q0 = q ausgeben. Das Gewicht des Pfades ist bestimmt durch die Summe aller Kantengewichte, welches wiederum kleiner oder gleich der Summe aller Kantengewichte des p- und q-Pfades ist. l−1 X |pa pa+1 | + a=0 ≤ z−1 X |pa pa+1 | + a=0 y−1 X b=0 y−1 X |qb qb+1 | |qb qb+1 | (7) b=0 Analog zu (3) kann (6) umgeformt werden zu |qb qb+1 | ≤ 1 (|qb pz | − |qb+1 pz |) = t(|qb pz | − |qb+1 pz |). cos Θ − sin Θ (8) Unter Zuhilfenahme von (3) und (8) lässt sich nun eine Gewichtsbeschränkung des konstruierten Pfades bestimmen, welche sich durch das Auflösen der Teleskopsummen kürzen lässt: Konstruktion von geometrischen Spannern mit geringem Durchmesser z−1 X |pa pa+1 | + a=0 ≤t z−1 X (|pa q| − |pa+1 q|) + t a=0 y−1 X 193 |qb qb+1 | b=0 y−1 X (|qb pz | − |qb+1 pz |) b=0 = t(|p0 q| − |pz q| + |q0 pz | − |qy pz |) = t(|pq| − |qy pz |) ≤ t|pq| (9) Für den Fall, dass qy ∈ {p0 , p1 , p2 , . . . , pz } gilt, wird folglich ein t-Spanner Pfad konstruiert. Als zweiter und letzter Fall muss noch die Annahme betrachtet werden, dass qy ∈ / {p0 , p1 , p2 , . . . , pz } gilt. Demnach befindet sich qy in der nächsthöheren Ebene des Skip List Spanners (qy ∈ S2 ). Laut Algorithmus wird die aktuell betrachtete Ebene um eins erhöht, was bedeutet, dass nun ein Pfad vom Punkt pz nach qy im Skip List Spanner SLS(S2 , k) berechnet wird. Laut Induktionsannahme konstruiert der Algorithmus einen t-Spanner Pfad von pz nach qy . Das Gewicht des Pfades von pz zu qy ist also begrenzt durch t|pz qy |. Wurde dieser Pfad konstruiert, werden die Teilpfade p = p0 , p1 , . . . , pz und pz , pz+1 , . . . , qy und qy , qy−1 , . . . , q0 = q aneinanderghängt ausgegeben, welche zusammen den Pfad von p nach q beschreiben. Eine Gewichtsbeschränkung des Pfades lässt sich analog zu (9) definieren, wobei hier zusätzlich das Gewicht des von pz nach qy konstruierten Pfades betrachtet wird: z−1 X |pa pa+1 | + t|pz qy | + a=0 ≤t z−1 X a=0 (|pa q| − |pa+1 q|) + t|pz qy | + t y−1 X |qb qb+1 | b=0 y−1 X (|qb pz | − |qb+1 pz |) b=0 = t(|p0 q| − |pz q| + |pz qy | + |q0 pz | − |qy pz |) = t|pq| (10) Für den Fall, dass sich qy in der nächsthöheren Ebene des Skip List Spanners befindet, konstruiert walk(p,q) also ebenfalls einen t-Spanner Pfad. Nachdem die Korrektheit des Algorithmus bewiesen wurde, sollen nun noch Aussagen über zwei wichtige Eigenschaften getroffen werden: Die Laufzeit des Algorithmus und die Anzahl der Kanten des erzeugten t-Spanner Pfades, welche den Durchmesser beschreibt. Für die folgende Analyse beschreibt T die Laufzeit des Algorithmus walk(p,q) und N die Anzahl der Kanten des erzeugten Pfades. Es soll ein Pfad vom Punkt p zum Punkt q erzeugt werden. Da die Punktmengen S1 , S2 , . . . Sh per Zufall durch einen Münzwurf bestimmt wurden, ist 194 Philipp Wissneth zunächst festzuhalten, dass T und N Zufallsvariablen sind und sich folglich nicht deterministisch bestimmen lassen. Der Algorithmus muss als erstes für jeden zum p-Pfad hinzugefügten Punkt pa einen Kegel C bestimmen, sodass sich der gesuchte Zielpunkt qb im verschobenen Kegel Cpa befindet. Analog hierzu muss für jeden zum q-Pfad hinzugefügten Punkt qb die Eigenschaft pa ∈ Cqb gelten. In Kapitel 2 wurde angegeben, dass sich jeder Kegel in C aus d Hyperebenen zusammensetzt und dass C aus O((c/Θ)d−1 ) Kegeln besteht. Bezeichne m die Gesamtzahl aller Hyperebenen, welche die Kegel definieren so gilt m = d|C| = O((c/Θ)d−1 ). Um nun den passenden Kegel bestimmen zu können, wird diese Ansammlung von Hyperebenen in der in [9] beschriebenen Datenstruktur gespeichert. Die Datenstruktur hat einen Speicherplatzbedarf von O(md ) und ermöglicht es, einen zu einem Punkt gehörenden Kegel in Zeit O(log m) zu bestimmen. Da in der Datenstruktur keine verschobenen Kegel gespeichert werden, muss vor jeder Anfrage der Punkt mit dem die Anfrage gestartet wird “normalisiert” werden: Um einen Kegel C zu finden, sodass qb ∈ Cpa gilt, wird die Anfrage mit dem Punkt qb − pa gestartet. Der ausgegebene Kegel ist nun der gesuchte. Die Zeit zum Auffinden eines Kegels ist durch O(log(1/Θ)) beschränkt, da c und d konstante Faktoren sind. Mit Hilfe dieser Beobachtungen kann nun eine generelle Formel für T aufgestellt werden: Der Algorithmus berechnet einen Pfad bestehend aus N Kanten. Für die Bestimmung einer jeden hinzuzufügenden Kante muss zuerst ein passender verschobener Kegel gefunden werden. Dies geschieht in den beiden inneren While-Schleifen. Gesteuert durch die äußere While-Schleife geschieht dies im Worst-Case für alle h Ebenen des Skip List Spanners. Die Laufzeit T ist also bestimmt durch T = O(N log(1/Θ) + h). Da es sich bei T , N und der Anzahl der Ebenen h um Zufallsvariablen handelt, ist deren Erwartungswert von Interesse. Es gilt E(T ) = O(E(N ) log(1/Θ) + E(h)) = O(E(N ) log(1/Θ) + log n), da die erwartete Anzahl an Ebenen des Skip List Spanners (analog zu Skip Listen) logarithmisch zur Gesamtzahl der Punkte in S ist (siehe Kapitel 2). Damit der Erwartungswert der Laufzeit bestimmt werden kann, muss nun noch der Erwartungswert von N bestimmt werden. Um zu bestimmen, wie groß die Anzahl der Kanten eines von walk(p,q) erzeugten Pfades ist, wird im Folgenden die Zahl der in einer Ebene i hinzugefügten Punkte abgeschätzt. Zusammen mit der zu erwartenden Anzahl der Ebenen im Skip List Spanner lässt sich dann eine Aussage über den Durchmesser der erzeugten Pfade treffen. Für die folgende Abschätzung wird angenommen, dass ein Pfad vom Punkt p zu Punkt q erzeugt werden soll. Dabei wird eine feste Ebene i betrachtet, in welcher ein Teilpfad von einem Punkt pr ∈ Si zu einem Punkt qs ∈ Si erzeugt wird. Es gilt 1 ≤ i ≤ h. Es ist zu beachten, dass, sobald die Mengen S1 , . . . , Si und p, q bekannt sind, die Indizes r und s deterministisch bestimmt werden können. Für die folgende Analyse sei angenommen, dass der Münzwurf, welcher die Menge Si+1 bestimmt, noch nicht ausgefürt wurde. Der Pfad p0r = pr , p0r+1 , p0r+2 , . . . , p0m = qs sei definiert als der Pfad, welcher konstruiert werden würde, wenn alle Punkte aus Si nicht in der Menge Si+i vorkommen würden. Des weiteren bezeichne z die Zahl der Punkte, welche in Ebene i zum p-Pfad hinzugefügt wurden. Aufgrund der Tatsache, dass die Mengen S1 , . . . , Sh zufällig bestimmt werden ist offensichtlich, dass es sich bei z um eine Zufallsvariable handelt. Es sei nun l ≥ 0 und z = l. Auf Ebene i wurden dem p-Pfad also l Punkte hinzugefügt. Für den konstruierten p-Pfad gilt offensichtlich p0r = pr , p0r+1 = pr+1 , . . . , p0r+l = p0r+l . Die Konstruktion von geometrischen Spannern mit geringem Durchmesser 195 aktuell hinzugefügten Punkte entsprechen also bis zum l-ten hinzugefügten Punkt denen, wenn keiner der Punkte aus Si in Si+1 enthalten gewesen wäre. Insbesondere gilt für alle a, r ≤ a ≤ r + l − 1, dass p0a ∈ / Si+1 . Daraus lässt sich folgende Aussage treffen: ! r+l−1 ^ P (z = l) ≤ P (p0a ∈ / Si+1 ) (11) a=r Wird nun angenommen, dass der Münzwurf für jeden Punkt p0a erst bei der Anfrage, ob sich p0a auch in Ebene Si+1 befindet, ausgeführt wird, lässt sich eine Aussage über die entsprechende Wahrscheinlichkeit machen. Jeder Punkt aus Si ist mit einer Wahrscheinlichkeit von 1/2 in Si+1 enthalten. Da alle Münzwürfe unabhängig voneinander sind, gilt P (z = l) ≤ r+l−1 Y P (p0a ∈ / Si+1 ) = (1/2)l . (12) a=r Aufgrund der Unabhängigkeit der Münzwürfe ist es bei jedem Wurf gleich wahrscheinlich, dass das Ergebnis “Kopf” bzw. “Zahl” geworfen wird. D.h., dass die Zufallsvariable z geometrisch mit dem Parameter 1/2 verteilt ist. Der q-Pfad wird analog zu dem p-Pfad erstellt. Folglich ist auch eine Zufallsvariable y, welche die Zahl der hinzugefügten Punkte zum q-Pfad beschreibt, geometrisch mit dem Parameter 1/2 verteilt. Angenommen, Mi beschreibt die Zahl der in Ebene i zum p-Pfad hinzugefügten Kanten und Ni die Zahl der in Ebene i zum q-Pfad hinzugefügten Kanten (1 ≤ i ≤ h). Mi und Ni sind Zufallsvariablen. Da die Zahl der zu einem Teilpfad hinzugefügten Punkte der Zahl der hinzugefügten Kanten entspricht, gilt, dass Mi und Ni ebenfalls geometrisch mit dem Parameter 1/2 verteilt sind. Die Erwartungswerte für alle Mi bzw. Ni betragen E(Mi ) = E(Ni ) = 1 1 2 = 2. (13) P Die Gesamtzahl N der Kanten im berechneten Pfad von p nach q beträgt hi=1 (Mi + Ni ). Wie bereits weiter oben festgestellt wurde, beträgt die zu erwartende Anzahl an Ebenen des Skip List Spanners (h) mit hoher Wahrscheinlichkeit log n, weshalb sich folgende Aussage über den Erwartungswert von N treffen lässt: E(N ) = log Xn log Xn i=1 i=1 (E(Mi ) + E(Ni )) = (2 + 2) = 4 log n (14) Da es sich bei den einzelnen Münzwürfen für die Punkte um jeweils voneinander unabgängige Bernoulli-Experimente handelt, lässt sich mit Hilfe der Chernoff-Schranke (vgl. [7]) die Wahrscheinlichkeit einschränken, dass N von seinem Erwartungswert abweicht. Die generelle Aussage der Chernoff-Schranke lautet 196 Philipp Wissneth 2 E(X) ) 2 2 E(X) ). P (X ≥ (1 + )E(X)) ≤ exp(− 3 P (X ≤ (1 − )E(X)) ≤ exp(− (15) Wobei X eine Zufallsvariable oder die Summe über Zufallsvariablen ist und E(X) dessen Erwartungswert. Für die Zufallsvariable N beschreibt die Chernoff-Schranke also 2 4 log n ) 2 2 4 log n P (N ≥ (1 + )4 log n) ≤ exp(− ). 3 P (N ≤ (1 − )4 log n) ≤ exp(− (16) Daraus folgt, dass der tatsächliche Wert für N mit hoher Wahrscheinlichkeit nur gering von dem des Erwartungswertes abweicht. Insbesondere ist die Wahrscheinlichkeit, dass N unter dem Erwartungswert liegt etwas größer als die Wahrscheinlichkeit, dass der tatsächliche Wert für N über dem Erwartungswert von N liegt. Mit Hilfe dieser Beobachtung gilt mit hoher Wahrscheinlichkeit, dass E(N ) = 4 log n = O(log n). Daraus folgt, dass der Durchmesser des Skip List Spanners ebenfalls mit hoher Wahrscheinlichkeit durch O(log n) beschränkt ist. Die erwartete Laufzeit T von walk(p,q) ist mit hoher Wahrscheinlichkeit beschränkt durch E(T ) = O(E(N ) log(1/Θ) + h) = O(log n log(1/Θ) + log n) = O(log(1/Θ) log n). (17) Die Erkenntnisse über die Eigenschaften des Skip List Spanners und den zugehörigen Algorithmus walk(p,q) zur Bestimmung von t-Spanner Pfaden können wie folgt zusammengefasst werden: Theorem 2 (vgl. Theorem 10 in [4]). Sei k > 8 ein ganzzahliger Wert, Θ = 2π/k und S eine Menge von n Punkten im Rd . 1. Der Skip List Spanner SLS(S, k) ist ein t-Spanner für t = 1/(cos Θ − sin Θ). Er enthält eine erwartete Anzahl von O((c/Θ)d−1 n) Kanten für eine Konstante c. 2. Der Skip List Spanner kann in erwarteter Zeit O((c/Θ)d−1 n logd−1 n) mit einem erwarteten Speicherplatzbedarf von O((c/Θ)d−1 n + logd−2 n) konstruiert werden. 3. Die zu erwartende maximale Zeit zum konstruieren eines t-Spanner Pfades von einem beliebigen Punkt aus S zu einem anderen beliebigen Punkt aus S ist beschränkt durch O(log(1/Θ) log n). 4. Der zu erwartende Durchmesser des konstruierten Skip List Spanners ist beschränkt durch O(log n). 5. Sämtliche Beschränkungen gelten mit hoher Wahrscheinlichkeit. Konstruktion von geometrischen Spannern mit geringem Durchmesser 197 4 Zusammenfassung In dieser Ausarbeitung wurde gezeigt, dass t-Spanner mit einem erwarteten Durchmesser von O(log n) für t = 1/(cos Θ −sin Θ) existieren. Es handelt sich dabei um eine randomisierte Datenstruktur, welche auf Skip-Listen und Θ-Graphen basiert. Der sogenannte Skip List Spanner enthält eine erwartete Anzahl von O((c/Θ)d−1 n) Kanten für eine Konstante c. Die Zeit zum Bestimmen eines t-Spanner Pfades ist mit hoher Wahrscheinlichkeit beschränkt durch O(log(1/Θ) log n). Der Algorithmus zum Bestimmen des gesuchten Pfades ist deterministisch, jedoch kann wegen der ihm zugrunde liegenden randomisierten Datenstruktur lediglich eine Aussage über die zu erwartende Laufzeit getroffen werden. Arya, Mount und Smid nennen in [4] einige Konstruktionen von geometrischen Spannern, in welchen t-Spanner Pfade bis zu Ω(n) Kanten enthalten können. Durch den hier mit hoher Wahrscheinlichkeit zu erzielenden Wert von O(log n) ist ein t-Spanner Pfad effizienter zu speichern und durch die vergleichsweise geringe Anzahl an zu besuchenden Knoten und Kanten in bestimmten Anwendungsfällen zu bevorzugen. Um die dem Skip List Spanner zugrunde liegenden Θ-Graphen effizient konstruieren zu können, wurde eine auf orthogonalen Bereichsanfragen von Bereichsbäumen basierende Technik vorgestellt, mit dessen Hilfe es möglich ist, den Skip List Spanner in erwarteter Zeit O((c/Θ)d−1 n logd−1 n) mit einem erwarteten Speicherplatzbedarf von O((c/Θ)d−1 n + logd−2 n) zu konstruieren. Im Vergleich zu ähnlichen Verfahren konnte hier durch das Vorwissen, dass für alle Punkte der Punktmenge S eine Bereichsanfrage gestartet wird, Speicherplatz in Höhe eines Faktors von log n eingespart werden. Literaturverzeichnis 1. J. Ruppert, R. Seidel (1991) Approximating the d-dimensional complete Euclidian graph, Proc. 3rd Canadian Conf. on Computational Geometry 207–210. 2. W. Pugh (1990) Skip Lists: A probabilistic alternative to balanced search trees, Communications of the ACM 33:668–676. 3. S. Arya, M. Smid (1997) Efficient construction of a bounded degree spanner with low weight, Algorithmica 17:33–54. 4. S. Arya, D. M. Mount, M. Smid (1999) Dynamic algorithms for geometric spanners of small diameter: Randomized solutions, Computational Geometry: Theory and Applications 13(2):91–107. 5. M. de Berg, M. van Kreveld, M. Overmars, O. Schwarzkopf (1997) Computational Geometry – Algorithms and Applications. Springer Verlag. 6. R. Klein (1997) Algorithmische Geometrie – Grundlagen, Methoden, Anwendungen. Springer Verlag. 7. K. Mulmuley (1994) Computational Geometry, an Introduction through Randomized Algorithms. Prentice Hall, Englewood Cliffs. 8. A.C. Yao (1982) On constructing minimum spanning trees in k-dimensional spaces and related Problems, SIAM J. Comput. 11:721–736. 9. B. Chazelle, J. Friedman (1994) Point location among hyperplanes and unidirectional ray-shooting, Computational Geometry – Theory and Applications. 4:53–62. Ein einfacher, linearer (1+) - Approximationsalgorithmus für das k-Means Clustering Problem Markus Heberling Universität Paderborn [email protected] Zusammenfassung. k-Means Clustering ist das Auffinden von k Mittelpunkten zu einer Menge von Punkten, so dass die Summe aller Entfernungen von allen Punkten zu ihrem nächsten Mittelpunkt minimal ist. In dieser Ausarbeitung wird ein Algorithmus beschrieben, der eine (1+) - Approximation des k-Means Clusterings in linearer Zeit liefert. Die Idee des Algorithmus ist es, den Mittelpunkt des größten Clusters einer Punktmenge zu approximieren, indem alle Untermengen einer konstanten Größe durchprobiert werden. Um diesen Mittelpunkt können dann Punkte aus der Gesamtmenge weggenommen werden und es kann rekursiv der Mittelpunkt des nächstkleineren Clusters ermittelt werden. 1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 1.1 Unreduzierbarkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 2 1-Means und 2-Means . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 2.1 1-Means . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 2.2 2-Means . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 3 k-Means Näherung in linearer Zeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 3.1 Idee . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 3.2 irred-k-means . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 3.3 k-Means . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 4 Vergleich . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 5 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 1 Einleitung Diese Ausarbeitung beschäftigt sich mit dem Thema k-Means Clustering, und einer linearen Approximation, die in [6] beschrieben ist. Sie baut auf der Proseminar Ausarbeitung von Holger Bürger zum Thema 2-Means auf. Zunächst folgt eine kurze Wiederholung der Problemstellung. P Das k-Means Clusteringproblem ist durch die Formel min( p∈P d(p, C)2 ) definiert. Dabei ist C die Menge der Mittelpunkte und d(p, C) ist die Entfernung von p zum nächsten Punkt aus C. Dies bedeutet, dass jeder Punkt p ∈ P seinem nächsten Mittelpunkt aus C 200 Markus Heberling zugewiesen wird. Somit bilden alle Punkte, die dem gleichen Mittelpunkt zugewiesen sind, einen Cluster. Für variable k und n ist das Problem NP-Schwer. Bei konstanten k kann es in Polynomieller Laufzeit gelöst werden. So wird in [5] ein optimaler Algorithmus beschrieben, der das k-Means Problem in O(nkd+1 ) löst. Einer der meist benutzten Algorithmen zur Approximation des k-Means Problems ist Lloyds Algorithmus [7]. Dabei werden k zufällige Mittelpunkte gewählt. Für jeden Punkt der Gesamtmenge wird der Mittelpunkt mit der kürzesten Distanz bestimmt. Punkte mit dem gleichen Mittelpunkt bilden dann einen Cluster. Für jeden der erhaltenen Cluster wird dann ein neuer Mittelpunkt berechnet und es werden wieder alle Punkte dem am kürzesten entfernten Mittelpunkt zugeordnet. Dies wird solange wiederholt, bis keine Änderung mehr eintritt. Dabei kann man die Laufzeit des Algorithmus nicht abschätzen. Außerdem kann es passieren, dass der Algorithmus in einem beliebig schlechten lokalen Minimum endet. Es lassen sich also weder Aussagen über Genauigkeit noch über das Laufzeitverhalten treffen. Ein häufiger Verwendungszweck des k-Means Algorithmus ist im Data-Mining. Eine gegebene Datenmenge mit verschiedenen Dimensionen soll dabei in Ähnlichkeitscluster unterteilt werden. Mithilfe des k-Means Clusterung können aber auch zum Beispiel Farben in in einem Bild reduziert werden, um das Bild zu komprimieren (Abbildung 1). Dazu werden die RGB oder CMYK Werte der einzelnen Pixel als Dimensionen angesehen. Dazu können dann k Mittelpunkte gefunden werden. Jeder Pixel wird dann durch die Farbwerte seines zugehörigen Mittelpunktes ersetzt. Anstatt z.B. 24Bit/Pixel benötigt man bei einer Reduzierung auf 32 Farben nur noch 5Bit/Pixel. Dazu kommt dann noch ein Index von 32*24Bit. Diese Farbreduzierung ist sehr schnell und liefert relativ gute Ergebnisse. Zur weiteren Geschwindigkeitsverbesserung kann das Berechnen des Clusters auch auf eine Untermenge aller Pixel angewendet werden. Abb. 1. Bildkompression mit k=32[3] (1+) - k-Means - Approximation 201 Eine lineare Annäherung für k = 2 wurde im Kapitel von Holger Bürger bereits beschrieben. Der Algorithmus für das k-Means Problem basiert hierauf. Ziel ist es für das k-Means Problem einen Näherungsalgorithmus zu beschreiben, der in Laufzeit O(nd) eine Näherung liefert, die maximal um einen konstant gewählten Faktor vom Optimum abweicht. In 2 wird ein 3-Means Clustering gezeigt. Dabei sind die Sterne die Clustermittelpunkte. Abb. 2. 3-Means Beispiel 1.1 Unreduzierbarkeit Im weiteren Verlauf wird der Begriff der Reduzierbarkeit bzw. Unreduzierbarkeit benötigt. Definition 1. Ein Problem ist (k, ))-unreduzierbar, wenn gilt ∆k−1 (P ) ≤ (1 + 32)∆k (P ) Wenn wir für ein Problem also anstatt der k-Means Lösung eine (k-1)-Means Lösung finden können, die Nahe an der optimalen k-Means Lösung liegt, so können wir das k- 202 Markus Heberling Means Problem auf ein einfacheres (k-1)-Means Problem reduzieren. Ist dies nicht der Fall, so ist das Problem unreduzierbar. 2 1-Means und 2-Means Kurz zur Wiederholung sind hier die Konzepte für 1-Means und 2-Means aufgeführt. Die Beweise dazu finden sich in der Ausarbeitung von Holger Bürger. 2.1 1-Means Die optimale Lösung des 1-Means Problem ist der Mittelpunkt der gegebenen Punktmenge. Durch Random-Sampling kann in konstanter Zeit ein Mittelpunkt angenähert werden. Dazu werden einige Punkte der Originalmenge zufällig ausgewählt, und es wird für diese Untermenge der Mittelpunkt bestimmt. Verschiedene mögliche Ergebnisse sind in Abbildung 3 dargestellt. Wenn man dabei m = 2/ zufällige Punkte auswählt, erhält man mit der Wahrscheinlichkeit 1/2 eine (1 + )-Approximation des 1-Means Problems. Abb. 3. Random Sampling (1+) - k-Means - Approximation 203 2.2 2-Means Für das 2-Means Problem benötigen wir zunächst das Superset Sampling Lemma: Lemma 1 (Superset Sampling Lemma). Es gilt )∆1 (P 0 ) mit konstanter Wahrscheinlichkeit. min S 0 :S 0 ⊂S,|S 0 |= 2 ∆(P 0 , c(S 0 )) ≤ (1 + Dieses Lemma sagt aus, dass wir für eine Untermenge P 0 von P eine gute Approximation erhalten, obwohl P 0 noch nicht bekannt ist. Dazu sei |P 0 | ≥ β|P |, wobei β zwischen 0 und 1 4 liegt. Dann können wir von P eine zufällige Menge S der Größe β nehmen. Für alle mögli2 0 chen Untermengen S der Größe von S können wir nun den Mittelpunkt c(S 0 ) berechnen. Nach Lemma 1 ist einer dieser Mittelpunkte eine gute Annäherung an den Mittelpunkt von P 0. Wir nehmen an die beiden optimalen Mittelpunkte seien c1 und c2 und die dazugehörigen Cluster P1 und P2 . Es gelte P1 ≤ P2 , dann können wir von P eine Menge S der Größe 1 samplen. Wenn wir von S nun alle Mittelpunkte aller Untermengen der Größe 2 ermitteln ist nach Lemma 1 eines davon eine gute Annäherung an c1 . Wir nennen diesen Mittelpunkt c01 . Um den Punkt c01 können wir nun alle Punkte entfernen, die einen Abstand kleiner als t/4 zu c01 haben. t ist der Abstand der beiden optimalen Mittelpunkte c1 und c2 . Wenn die Punkte entfernt sind kann im zweiten Schritt durch erneute Anwendung des Superset Sampling Lemmas der Mittelpunkt c02 bestimmt werden. Da das Lemma jeweils eine Menge von Punkten zurück gibt, wird der zweite Schritt für jedes Element der ersten Menge durchgeführt. Es wird dann zum Schluss das beste Ergebnis zurückgeliefert. Zu beachten ist, dass der Wert t nicht bekannt ist. Es werden daher verschiedene Werte für t ausprobiert. Dies wird in der 2-Means Ausarbeitung näher beschrieben. 3 k-Means Näherung in linearer Zeit 3.1 Idee Die Grundidee zur Lösung des k-Means Problems ist die selbe wie beim 2-Means Problem. Wir wollen rund um einen gefundenen Mittelpunkt, Punkte aus der Gesamtmenge entfernen, so dass die Gesamtpunktmenge kleiner wird und in der verbliebenen Punktmenge ein anderer Cluster größer ist. Dies können wir dann für alle Cluster machen und so die Punktmenge immer weiter verkleinern und jeweils den Mittelpunkt des größten Clusters in der verbliebenen Menge suchen. Dazu suchen wir mittels Superset Sampling zunächst den Mittelpunkt des größten Clusters. Um diesen Mittelpunkt können wir nun alle Punkte entfernen, die in einem Radius von t/4 um diesen Punkt liegen. t/4 ist dabei der Abstand zwischen dem optimalen Mittelpunkt dieses Clusters und dem optimalen Mittelpunkt, der am nächsten zu ihm liegt. Da die optimalen Clustermittelpunkte nicht bekannt sind, muss t/4 wie beim 2-Means Verfahren angenähert werden. Sobald die Punkte entfernt sind kann man in der verbliebenden Punktmenge den nächst größten Cluster suchen (Abbildung 4). Dabei ist zu beachten, dass das Superset Sampling nicht genau einen Mittelpunkt zurück liefert, sondern eine Menge von Punkten, von denen einer eine gute Annäherung zum richtigen Mittelpunkt ist. Wir führen 204 Markus Heberling den 2. Schritt also nicht nur für einen Punkt aus sondern für jeden Punkt dieser Menge. Dies wiederholen wir k-mal, so dass wir für jeden der k Mittelpunkte eine Annäherung erhalten. Als Ausgabe liefern wir dann die beste Clusterung, die wir ermittelt haben. t t t/4 Abb. 4. 3-Means Beispiel 3.2 irred-k-means Wir gehen zunächst davon aus, das das gegebene Problem k-unreduzierbar ist. Zunächst sei der Algorithmus angegeben: Funktionsweise Der Algorithmus kombiniert das Random-Sampling (Zeile 6) und das verkleinern der Punktmenge (Zeile 10). Die erste Rekursion in Zeile 9 führt dazu, dass der nächst kleinere Cluster gefunden wird. Die zweite Rekursion in Zeile 9 ist die Verkleinerung der Punktmenge. Beim (1+) - k-Means - Approximation 205 Algorithmus 20 Irred-k-Means(Q, m, k, C, α, Sum) Vorbedingung: Q: Verbliebende Punkt Menge, m: Anzahl noch zu findender Cluster, k: Gesamtanzahl Cluster, C Menge der k − m bereits gefundenen Mittelpunkte, α: Approximationsfaktor, Sum: Kosten der Clustering von P − Q zu C 1: if m = 0 then 2: Ordne alle Punkte in Q ihrem jeweiligen nächsten Mittelpunkt zu 3: Sum = Sum+Clustering Kosten von Q 4: return Clustering 5: else 6: Erstelle ein Random Sampling der Größe O(k/α2 ) von Q 7: for alle Untermengen S 0 der Größe O(1/α) von S do 8: Finde den Mittelpunkt c von S 0 S 9: Finde das Clustering irred-k-Means(Q, m − 1, k, C c, α, Sum) 10: Betrachte die Punkte in Q in aufsteigender Entfernung von C 11: U seien die ersten |Q|/2 Punkte dieser Sequenz 12: Ordne alle Punkte in U ihrem jeweiligen nächsten Mittelpunkt aus C zu 13: Sum = Sum+Clustering Kosten von U 14: Finde das Clustering irred-k-Means(Q − U, m, k, C, α, Sum) 15: return Clustering mit den minimalen Kosten 2-Means Clustering war die Punktmenge, die entfernt werden kann als Ball der Größe t/4 um den ersten gefunden Cluster definiert. Wobei t der Abstand der beiden optimalen Mittelpunkte c1 , c2 ist. Beim k-Means Clustering können wir t definieren als den Abstand des optimalen Mittelpunkts ci zum nächsten anderen optimalen Mittelpunkt. Wie beim 2-Means Clustering wissen wir vorab nicht, wie groß dieser Abstand ist. Deshalb benutzen wir die gleiche Technik um trotzdem die entsprechenden Punkte entfernen zu können. Dabei nehmen wir jeweils die Hälfte der Punkte, die näher an den bereits gefunden Clustern liegen und berechnen ein Clustering für P ohne diese Punkte. Da dies rekursiv geschieht bis wir nur noch einen Punkt haben, ist eines dieser Clusterings das Clustering, bei dem genau die Punkte des Balls mit dem Radius t/4 um ci entfernt worden sind. Da wir das beste Clustering nehmen, erhalten wir als Rückgabe genau dieses Clustering. Korrektheit Theorem 1. Angenommen eine Punktmenge P ist (k, α)-unreduzierbar. dann liefert der Algorithmus Irred-k-means(P, k, k, ∅, α, 0) mit der Wahrscheinlichkeit γ k eine Lösung des k-Means Problems mit den Kosten (1 + α)∆k (P ). dabei ist γ eine von k unabhängige Konstante. Beweis. Wir betrachten eine optimale k-Means Lösung für die Eingabemenge P . c1 , . . . , ck seien die Mittelpunkte, die P in die Partitionen P1 , . . . , Pk aufteilen. Die einzige Zufallsquelle in unserem Algorithmus ist das Superset-Sampling-Lemma (Lemma 1). Dieses Lemma liefert aber nur mit einer gewissen Wahrscheinlichkeit das gewünschte Ergebnis. Wir nehmen fürs erste an, dass das Lemma immer das gewünschte Ergebnis liefert, und berechnen hinterher für welche Wahrscheinlichkeit unser Algorithmus erfolgreich ist. Für die Eingabe (P, k, k, ∅, α, 0) wird der Algorithmus Irred-k-means mehrmals rekursiv Aufgerufen. Sei C die Menge aller Aufrufe von Irred-k-means mit der Eingabe (P, k, k, ∅, α, 0). Ci sei die Menge der Aufrufe, in denen die Anzahl der bereits gefundenen Mittelpunkte C die Größe i hat. Für alle i soll folgende Invariante gelten: 206 Markus Heberling 1. Sei C = {c01 , . . . , c0i }, dann gilt für j = 1, . . . , i, ∆(Pj , c0j ) ≤ (1 + α)∆(Pj , cj ) 2. Die Menge P − Q ist eine Untermenge von P1 ∪ . . . ∪ Pi Wenn wir zeigen können, dass die Invariante für i = k gilt, haben wir gezeigt, dass der Algorithmus korrekt arbeitet. Für i = 0 ist die Invariante erfüllt. Wir zeigen jetzt mittels Induktion, dass die Invariante für i + 1 gilt, wenn sie für i gilt. Da die Invariante für i gilt, gibt es Parameterlisten in Ci , für die die Invariante gilt. Von diesen Listen wählen wir die Liste (Q, m, k, C, α, Sum), für die |Q| minimal ist. Wir betrachten das Paar von Mittelpunkten der Mengen cl ∈ {c1 , . . . , ci } und cr ∈ {ci +1, . . . , ck } mit dem kürzesten Abstand von einander. Sei t = d(cl , cr ) Lemma 2. Sei S die Menge von Punkten B(c01 , t/4) ∪ . . . ∪ B(c0i , t/4)), also die Punkte, die höchstens t/4 von {c01 , . . . , c0i } entfernt sind. Dann ist S in P1 ∪ . . . ∪ Pi enthalten und P − S enthält höchstens |Pi+1 |/α Punkte von P1 ∪ . . . ∪ Pi . Beweis. Wir nehmen an, dass Pj einen Punkt von S enthält, j > i. Wir sagen Pj enthalte einen Punkt x ∈ B(c0q , t/4), q ≤ i. Behauptung. d(cq , c0q ) ≥ t/4. Beweis. Wir nehmen das Gegenteil an. Dann ist d(cq , x) < t/2. x ist aber seinem nächsten Mittelpunkt zugeordnet, also d(cj , x) ≤ d(cq , x) < t/2. Dann gilt d(cj , cq ) < t, was ein Widerspruch ist. t u Wir wissen das ∆(Pq , c0q ) ≤ (1 + α)∆(Pq , cq ) ist. Aber durch die Gleichung (2)1 wissen wir das ∆(Pq , c0q ) = ∆(Pq , cq ) + |Pq |d(cq , c0q )2 ist. Wir wissen also: |Pq |d(cq , c0q )2 ≤ α∆(Pq , cq ) (1) Es gilt d(cq , cj ) ≤ d(cq , c0j ) + d(cq , x) + d(x, cj ) und d(x, cj ) ≤ d(x, cq ) ≤ d(x, c0 q) + d(cq , c0q ). Wir erhalten also d(cq , cj ) ≤ 2d(c0q , x) + 2d(cq , c0q ). Zusammen mit dem Claim von oben erhalten wir, d(cq , cj ) ≤ 4d(cq , c0q ). Angenommen wir würden alle Punkte von Pq dem Mittelpunkt cj zuordnen. Dann erhalten wir als Kosten: ∆(Pq , cj ) = ∆(Pq , cq ) + |Pq |d(cq , cj )2 ≤ ∆(Pq , cq ) + 16|Pq |d(cq , c0q )2 ≤ (1 + 16α)∆(Pq , cq ) Die letzte Ungleichung folgt von Gleichung 1. Aber dies widerspricht der Bedingung, das P (k, α)-unreduzierbar ist. Also ist S in P1 ∪ . . . ∪ Pi enthalten. Angenommen P −S enthält mehr als Pl /α Punkte von P1 ∪. . .∪Pi . In diesem Fall werden diese Punkte Mittelpunkten zugewiesen, die mindestens eine Entfernung von t/4 haben. Es 2 |P | l sind. Dies bedeutet, folgt, dass die Kosten der optimalen Lösung ∆k (P ) mindestens t16α 2 t |Pl | ≤ 16α∆k (P ). Wenn wir nun aber alle Punkte in Pl cr zuweisen, dann erhöhen sich die Kosten maximal um 16α∆k (P ), was bedeuten würde, dass P (k, α)-reduzierbar ist, was ein Widerspruch ist. t u 1 Definiert in der Ausarbeitung von Holger Bürger (1+) - k-Means - Approximation 207 Sei S die Punktmenge B(c01 , t/4) ∪ . . . ∪ B(c0i , t/4) und P 0 = P − S. Wir wissen, dass Pi+1 ∪ . . . ∪ Pk in P 0 ∩ Q enthalten ist. Behauptung. |Pi+1 | ≥ αk |P 0 |. Beweis. Wegen Lemma 2 gibt es höchstens |P i + 1|/α Elemente von P1 ∪ . . . ∪ Pi in P 0 . Also gilt |P 0 | ≤ |Pi+1 |/α + |Pi+1 | + . . . + |Pk | ≤ |Pi+1 |/α + k|Pi+1 | ≤ αk |P i + 1| t u Es folgt, dass |P i + 1| ≥ αk |P 0 ∩ Q|. Wenn wir also P 0 kennen würden, dann könnten wir mit Lemma 1 einen Punkt c0i+1 berechnen der eine gute Approximation zu ci+1 ist, in dem wir O(k/α2 ) Punkte von P 0 ∩ Q samplen. Leider kennen wir P 0 nicht. Lemma 3. |P 0 ∩ Q| ≥ |Q|/2. Beweis. Wir nehmen das Gegenteil an: |P 0 ∩ Q| ≤ |Q|/2. Behauptung. Wir betrachten die Punkte in Q aufsteigend sortiert nach der Entfernung von C. U seien die ersten |Q|/2 Punkte. Dann enthält U keinen Punkt aus P 0 ∩ Q. Beweis. Sei x ∈ P 0 und y ∈ P − P 0 , dann behaupten wir, dass y näher zu C ist als x. Wegen der Definition von P 0 gibt es einen Mittelpunkt c, für den gilt, dass d(c, y) ≤ t/4. Wäre x näher an C als y, dann gäbe es einen Mittelpunkt in C, dessen Abstand zu x höchstens t/4 beträgt. Aber dann gilt x ∈ P − P 0 , ein Widerspruch zu x ∈ P 0 . u t P 0 ∩Q ist also eine Untermenge von Q−U . da Pi+1 ∪. . .∪Pk in P 0 ∩Q enthalten ist (Lemma 2), folgt, dass Pi+1 ∪ . . . ∪ Pk eine Untermenge von Q − U ist. Daher ist die Parameterliste (Q − U, C, k, m, α, Sum) in Ci . dies ist ein Widerspruch dazu, dass (Q, C, k, m, α, Sum) in Ci ist. Dies beweist das Lemma. u t Es wurde also gezeigt, dass die Invariante für alle i gilt und somit der Algorithmus das korrekte Ergebnis liefert. Wahrscheinlichkeit Wir hatten bisher eine Wahrscheinlichkeit für das gewünschte Ergebnis des Superset Sampling Lemmas mit 1 angenommen. Das Superset Sampling Lemma 1 liefert das gewünschte Ergebnis jedoch nur mit einer konstanten Wahrscheinlichkeit kleiner 1. In jedem Durchlauf der Rekursion in Zeile 9 wird m um 1 verkleinert. Also sind in jeder Abfolge von Rekursionsaufrufen höchstens k Aufrufe des Samplings. Es wurde eben gezeigt, dass es eine Parameter Liste Ck gibt, für die C eine Menge von Mittelpunkten enthält, die nah an den optimalen Mittelpunkten liegen. Wenn wir uns nun die Abfolge von Aufrufe anschauen, die zu dieser Parameter Liste geführt haben, sehen wir, dass wir k Aufrufe des Samplings haben. Jeder dieser Aufrufe liefert das gewünschte Ergebnis mit konstanter Wahrscheinlichkeit γ. Die Wahrscheinlichkeit, dass wir genau diese Parameter Liste erhalten ist also γ k . 208 Markus Heberling Laufzeit Theorem 2. Der Algorithmus irred-k-Means, aufgerufen mit den Parametern (P, m, k, C, α, 0), O(1) hat eine Laufzeit von O(2(k/α) ), wobei n = |P | ist. Beweis. Sei T (n, m) die Laufzeit des Algorithmus mit der Eingabe (Q,m,k,C, α,Sum), wobei n = |Q| ist. T (n, 0) = O(nd), da in diesem Fall nur der erste Fall in Zeile 1 ausgeführt wird und das Zuordnen aller Punkte zu ihrem Mittelpunkt O(nd) Zeit benötigt. T (n, 0) = O(nd) (2) (k/α)O(1) In Zeile 7 erhalten wir u(k, α) = O(2 ) Samples. Das Zuordnen der Mittelpunkte in Zeile 8 benötigt O(d) Schritte. In Zeile 10 des irred-k-Means-Algorithmus werden die |Q|/2 Punkte mit der geringsten Entfernung zu ihren jeweiligen Mittelpunkten berechnet. Wenn man dies wie hier angegeben zunächst durch Sortierung und dann Auswahl der Punkte macht, erhält man dort eine Laufzeit von O(n∗log n+n). Dies widerspricht der Behauptung, dass der gesamte Algorithmus eine lineare Laufzeit erreicht. Die Auswahl der kleinsten k Punkte kann aber auch in linearer Zeit geschehen, wie in [1] gezeigt wird. Wir erhalten also für die Zeilen 10 bis 13 eine Laufzeit von O(nd) Für den allgemeinen Fall erhalten wir also die rekursive Gleichung T (n, m) = O(u(k, α))T (n, m − 1) + T (n/2, m) + O((n + u(k, α))d) Diese Gleichung lässt sich zu T (n, k) = O(2k/α t u O(1) (3) dn) auflösen. 3.3 k-Means Um eine gute Lösung auch für reduzierbare Probleme finden zu können, werden wir den Algorithmus irred-k-means für alle i = 1 . . . k durchlaufen (Algorithmus 21) und das Minimum als Ergebnis ausgeben. Dies erhöht die Laufzeit um den Faktor k, bleibt also immer noch linear in der Menge der Punkte. Algorithmus 21 k-Means(P, k, ) Vorbedingung: P : Punktmenge, k: Gesamtanzahl Cluster, : Approximationsfaktor 1: for i = 1 . . . k do 2: Finde das Clustering irred-k-Means(P, i, i, ∅, /64k, 0) 3: return Clustering mit den minimalen Kosten Es bleibt also nur noch zu zeigen, dass der Algorithmus korrekt arbeitet. Sei i der größte Index, für den P (i, α)-unreduzierbar ist. Daraus folgt ∆i ≤ (1 + 32α)∆i+1 (P ) ≤ . . . (1 + 32α)k−1 ∆k (P ). Weiterhin wissen wir, dass Irred-k-means(P, i, i, ∅, α, 0) eine Menge C mit i Mittelpunkten liefert, für die gilt ∆(P, C) ≤ (1+α)∆i (P ). Also bekommen wir ein Ergebnis mit Kosten von höchstens (1 + 32α)k ∆k (P ). Dabei ist (1 + 32α)k = (1 + /2k)k ≤ 1 + . Der Algorithmus liefert also eine (1 + )-Approximation des k-Means Problems. (1+) - k-Means - Approximation 209 4 Vergleich Im Vergleich mit anderen Näherungsverfahren, hat dieser Algorithmus den Vorteil, lineare Laufzeit in der Menge der Punkte zu haben. Allerdings sind die konstanten Faktoren sehr hoch. Das bedeutet, dass der Algorithmus erst bei sehr großen Eingabemengen schneller ist als andere Algorithmen. Gerade bei Erhöhung der Wahrscheinlichkeit steigt die Laufzeit exponentiell an. Ein Vergleich mit den Algorithmen von Inaba [5], Matousek [8], de la Vega [2] and Har-Peled [4] ist in Abbildung 5 dargestellt. Inaba (exact) Matousek de la Vega Har-Peled Kumar, Sabharwal, Sen (this) Zeit inf 1e+300 1e+250 1e+200 1e+150 1e+100 1e+50 1 100 0 1000 2000 3000 4000 5000 6000 7000 8000 9000 n 10000 1 10 k Abb. 5. Vergleich verschiedener k-Means Algorithmen In Abbildung 6 zeigt die Algorithmen mit den Parametern k=2, e=0.9, d=2. Es ist zu erkennen, dass der lineare Algorithmus ab einer Eingabegröße von ca. 3 ∗ 1021 besser abschneidet als der genaue Algorithmus. Hier ist auch klar der lineare Verlauf zu sehen. Die anderen Algorithmen sind in dieser Grafik nur am unteren Rand zu erkennen. Wenn man sich nun aber die Algorithmen mit den gleichen Parametern mit Logarithmischer Darstellung der y-Achse ansieht, dann fällt auf, dass die anderen Näherungsverfahren deutlich unter dem exakten und dem linearen Verfahren liegen. (Abbildung 7). Für höhere Dimensionen sieht es für diesen Algorithmus wieder besser aus, da die Dimension nur linear eingeht (Abbildung 8). Aber auch hier gibt es eine bessere Alternative. Bei höheren k (Abbildung 9) und kleineren (Abbildung 10) sind die anderen Algorithmen jedoch wieder deutlich besser. 210 Markus Heberling 1.2e+108 Inaba (exact) Matousek de la Vega Har-Peled Kumar, Sabharwal, Sen (this) 1e+108 Zeit 8e+107 6e+107 4e+107 2e+107 0 0 5e+20 1e+21 1.5e+21 2e+21 2.5e+21 3e+21 3.5e+21 4e+21 n Abb. 6. Vergleich der Laufzeit bei Änderung der Größe der Punktmenge n 1e+120 Inaba (exact) Matousek de la Vega Har-Peled Kumar, Sabharwal, Sen (this) 1e+100 Zeit 1e+80 1e+60 1e+40 1e+20 1 0 5e+20 1e+21 1.5e+21 2e+21 2.5e+21 3e+21 3.5e+21 4e+21 n Abb. 7. Vergleich der Laufzeit bei Änderung der Größe der Punktmenge n (Zeit-Achse logarithmisch) (1+) - k-Means - Approximation 211 inf Inaba (exact) Matousek de la Vega Har-Peled Kumar, Sabharwal, Sen (this) 1e+300 1e+250 Zeit 1e+200 1e+150 1e+100 1e+50 1 0 100 200 300 400 500 600 700 800 900 1000 d Abb. 8. Vergleich der Laufzeit bei Änderung der Dimensionen d inf Inaba (exact) Matousek de la Vega Har-Peled Kumar, Sabharwal, Sen (this) 1e+300 1e+250 Zeit 1e+200 1e+150 1e+100 1e+50 1 10 20 30 40 50 60 70 80 k Abb. 9. Vergleich der Laufzeit bei Änderung der Anzahl Cluster k 90 100 212 Markus Heberling inf Inaba (exact) Matousek de la Vega Har-Peled Kumar, Sabharwal, Sen (this) 1e+300 1e+250 Zeit 1e+200 1e+150 1e+100 1e+50 1 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 e Abb. 10. Vergleich der Laufzeit bei Änderung der Genauigkeit 5 Fazit Insgesamt ist zu sagen, dass dieser Algorithmus zwar eine lineare Laufzeit hat, durch die hohen konstanten Faktoren jedoch oft andere Näherungen, oder sogar der genaue Algorithmus schneller sind. k In [9] werden drei weitere Algorithmen mit sehr guten Laufzeiten von O( k dn), O(k 3 n2 log n) und O(k 5 log3 kd) beschrieben. Diese Algorithmen liefern allerdings keine (1+) Approximation, sondern sind in dieser Beziehung schlechter. Offen bleibt, ob es möglich ist die Performance weiter zu steigern, indem zum Beispiel für kleinere Teilprobleme innerhalb dieses Algorithmus einer der anderen Algorithmen benutzt wird, ohne dass dabei die Gesamtgenauigkeit verloren geht. Literaturverzeichnis 1. Manuel Blum, Robert W. Floyd, Vaughan R. Pratt, Ronald L. Rivest, and Robert Endre Tarjan. Time bounds for selection. J. Comput. Syst. Sci., 7(4):448–461, 1973. 2. Wenceslas Fernandez de la Vega, Marek Karpinski, Claire Kenyon, and Yuval Rabani. Approximation schemes for clustering problems. In STOC, pages 50–58. ACM, 2003. 3. Alessandro Giusti. Clustering colors in an image. http://www.leet.it/home/lale/clustering. 4. Sariel Har-Peled and Akash Kushal. Smaller coresets for k-median and k-means clustering. Discrete & Computational Geometry, 37(1):3–19, 2007. 5. Mary Inaba, Naoki Katoh, and Hiroshi Imai. Applications of weighted voronoi diagrams and randomization to variance-based k-clustering: (extended abstract). In SCG ’94: Proceedings of the tenth annual symposium on Computational geometry, pages 332–339, New York, NY, USA, 1994. ACM. 6. Amit Kumar, Yogish Sabharwal, and Sandeep Sen. A simple linear time (1 + ) - approximation algorithm for k-means clustering in any dimensions. In FOCS ’04: Proceedings of the 45th Annual IEEE Symposium (1+) - k-Means - Approximation 213 on Foundations of Computer Science (FOCS’04), pages 454–462, Washington, DC, USA, 2004. IEEE Computer Society. 7. S. Lloyd. Least squares quantization in pcm. IEEE Transactions on Information Theory, 28:129–137, 1982. 8. Jirí Matousek. On approximate geometric k-clustering. Discrete & Computational Geometry, 24(1):61–84, 2000. 9. Mingjun Song and Sanguthevar Rajasekaran. Fast k-means algorithms with constant approximation. In Xiaotie Deng and Ding-Zhu Du, editors, ISAAC, volume 3827 of Lecture Notes in Computer Science, pages 1029–1038. Springer, 2005. Peer-to-Peer Netzwerke: Skip-Graph Marc Borowski Universität Paderborn Zusammenfassung. In dieser Ausarbeitung wird die Datenstruktur Skip-Graph vorgestellt. Diese ist in der Lage Daten verteilt auf Knoten eines Peer-to-Peer Netzen zu speichern und zu suchen. Dabei werden die Hauptanforderungen bei P2P Netze, wie Dezentralisierung, Fehlertoleranz, Skalierbarkeit und Lastverteilung berücksichtigt. Gegenüber alternativen Lösungen bietet der Skip-Graph eine sehr hohe Ausfallsicherheit der Datenstruktur bei jeder Art von Ausfällen einzelner Peers und eröffnet zudem weitere Möglichkeiten, wie eine Bereichssuche. 1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 1.1 1.2 1.3 1.4 Eigenschaften von Peer-to-Peer Netzwerken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 Existierende Lösungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 Verteilte Hashtabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 2 Die Datenstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 2.1 Skip-Liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 2.2 Skip-Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 3 Operationen auf einem Skip-Graph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 3.1 3.2 3.3 3.4 Die Suche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 Einfügen neuer Peers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 Entfernen von Peers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 Operationen bei mehrfachem gleichzeitigen Zugriff . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 4 Qualitätsanalyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 4.1 Fehlertoleranz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 4.2 Auslastung der Peers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 5 Varianten und Erweiterungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 5.1 Mehrere Nachfolger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 5.2 SkipNet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 5.3 Expander Graphen in Skip-Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232 6 Zusammenfassung und Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 216 M. Borowski 1 Einleitung Die Verbreitung von Peer-to-Peer Netzwerken (P2P) hat in den letzten Jahren stark zugenommen. Die Verwendung kostengünstiger Massencomputer ermöglicht große finanzielle Einsparungen gegenüber dem Betrieb großer Serverarchitekturen. 1.1 Eigenschaften von Peer-to-Peer Netzwerken Heutige P2P-Anwendungen werden insbesondere durch drei wichtige Eigenschaften beschrieben: Client- und Serverfunktionalität: In einem P2P-Netzwek kann jeder Knoten im Kontext einer Anwendung Daten speichern, senden und empfangen. Er ist damit in der Lage, sowohl Client- als auch Serverfunktionalität zu leisten. Im idealen Fall sind alle Knoten gleichberechtigt und gleichwertig. Direkter Austausch zwischen Peers: Wenn zwei Knoten eines Netzwerks direkt miteinander verbunden sind, können sie in Echtzeit miteinander interagieren. Es gibt keine zentrale Instanz, die die Kommunikation verzögert oder filtert. Dabei ist es unerheblich welche Daten zu welchem Zweck ausgetauscht werden. Autonomie: Den Knoten eines P2P-Netzwerkes kommt dabei vollkommene Autonomie im Sinne der (Selbst-) Kontrolle ihrer eigenen Aktivitäten zu, d.h. sie allein legen fest, wann und in welchem Umfang sie ihre Ressourcen anderen zur Verfügung stellen. Als Folge dieser Autonomie ist nicht sichergestellt, dass ein Knoten dem Netz ständig zur Verfügung steht. Das Netzwerk muss also tolerieren, dass die Knoten nicht permanent online sind. 1.2 Existierende Lösungen Es gibt viele verschiedene Ansätze, wie Daten in einem P2P Netz bereitgestellt und gefunden werden können. P2P Architekturen können dabei in zentrale und dezentrale Architekturen unterteilt werden. Bei zentralen P2P-Netzwerken ist ein zentraler Server erforderlich, auf dem gespeichert ist, welcher User welche Daten zum Tausch bereitstellt. Nun richtet das Filetauschprogramm des Users seine Suchanfrage direkt an diesen Server und erhält von dem wiederum die Suchergebnisse zurück. Hierbei werden die Suchergebnisse erheblich schneller geliefert als beim dezentralen P2P. Wird nun ein File geladen, geschieht dies allerdings nun direkt vom anderen User. Diese Technik hat aber den Nachteil, dass das File-Sharing-Programm im Falle eines Verbotes abgeschaltet werden kann. Dies kann dann ganz leicht durch ein Abschalten der Server bewerkstelligt werden. Napster Napster ist kein reines P2P-System, da ein zentraler Datenbank-Server Suchanfragen verwaltet. Sobald sich ein Peer in das Napster-Netzwerk einloggt, werden vom Napster-Server P2P: Skip-Graph 217 napster.com S S P P S P Peer S Server R Response Q Query S P R P Download Q P P Abb. 1. Napster die Dateien registriert, die der Anwender zur Verfügung stellt. Bei einer Suchanfrage liefern die Napster-Server eine Liste von Peers, die die gewünschte Datei zum Downloaden bereitstellen. Der Anwender kann dann eine direkte, serverlose Verbindung zu den Anbietern aufbauen und die Dateien beziehen. Die Server stellen damit den Flaschenhals des Netzwerkes dar: Die maximale Anzahl von gleichzeitigen Suchanfragen ist durch die Hardware begrenzt und ein Ausfall führt zum Zusammenbruch des ganzen Netzes. Gnutella P P P D Peer Q Query R Response D File Download R P P R P Q Q P P Q Q Abb. 2. Gnutella Gnutella wurde im März 2000 vom WinAmp-Entwickler Nullsoft herausgegeben und war nur kurze Zeit - bis zur Übernahme via Nullsoft durch AOL - erhältlich. Gnutella ist ein Protokoll für den Datenaustausch in dezentralen Netzwerken. Netzwerke die auf der Gnutella-Technologie basieren, kommen damit ohne zentrale Instanzen aus. Alle Rechner im Netz fungieren deshalb gleichzeitig sowohl als Server, als auch als Client. Sie 218 M. Borowski werden deshalb auch als Servents bezeichnet. Suchanfragen funktionieren hier nach dem „Schneeballprinzip“: Eine Suchanfrage wird an alle direkt verbundenen Peers weitergeleitet. Diese leiten die Anfrage wiederum an benachbarte Peers weiter, bis eine zuvor bestimmte Suchtiefe erreicht wird. Positive Suchergebnisse werden dann über die Route der eingehenden Anfrage zurück an den Anfrager gesendet, so dass dieser die gewünschte Datei direkt von dem Anbieter herunterladen kann. Durch das Fehlen einer zentralen Komponente ist eine Überwachung oder Abschaltung von Gnutella-basierten Netzwerken kaum möglich. Das ist der wichtigste Unterschied zu Napster. Außerdem beschränkt sich Gnutella, anders als Napster, nicht nur auf MP3-Dateien sondern bietet allgemeines File-Sharing an. Freenet Freenet ist ein dezentrales geschlossenes Netzwerk zum Speichern und Austausch von Informationen, welches ohne zentrale Instanz auskommt. Entwickelt wurde Freenet von Ian Clarke mit dem Ziel, ein Netzwerk zu schaffen, in dem Informationen anonym bezogen werden und auf Anforderung zur Verfügung gestellt werden können. Die Dateien werden zu diesem Zweck verschlüsselt auf den PCs der teilnehmenden Peers gespeichert. Nur der Herausgeber der Informationen ist in der Lage diese zu verändern. Die Peers wissen dabei nicht, welche Daten auf ihrer Festplatte abgelegt werden. Nutzer dieses Systems Nutzer dieses System müssen lediglich eine kleine Software installieren, die als Server und Client funktioniert. Jeder (der sich darauf versteht) kann Client oder Serverprogramme für Freenet schreiben. Freenet basiert auf einem offenen Protokoll. Autoren und Leser von Informationen bleiben anonym, wenn sie es wünschen. Informationen werden in einer Weise in Freenet verteilt, dass es schwer zu beurteilen ist, wo die Information gespeichert ist. Jeder Computerbesitzer kann Informationen veröffentlichen. Dafür benötigt er weder einen Domainnamen, noch gekauften Speicherplatz auf einem Webserver. Sein eigener Computer wird zum Webserver. Welche Informationen des eigenen Computers der Nutzer freigibt, entscheidet er selbst. Freenet arbeitet mit einer fehlertoleranten, anpassbaren, verteilten Suchmaschine (FASD). FASD arbeitet mit Schlüsseln für Metadaten, das ist eine bewertete Liste, welche den Inhalt eines Dokumentes im darunterliegenden Netzwerk beschreibt. Obwohl FASD dezentral arbeitet, ist diese Technik in der Lage so effektiv wie eine zentrale Suchmaschine zu arbeiten. Wuala Einen ähnlich Ansatz verfolgt auch das an der ETH Zürich entwickelte Wuala. Das erst vor kurzen veröffentlichte System fragmentiert Dateien mit einem Reed-Solomon-Code. Diese Fragmente sind redundant, sodass nur ein Teil der Fragmente zur Wiederherstellung der vollständigen Datei benötigt wird. Die Fragmente werden anschließend auf Knoten des P2P Netzes verteilt. Daten, die nur privat oder einer geschlossenen Benutzergruppe zur Verfügung stehen sollen werden zuvor mit AES verschlüsselt. Die Daten werden auf den Knoten, wie in einer verteilten Hashtabelle gespeichert. Knoten kennen dabei nur ihre direkten Nachbarn. Eine Suche erfolgt, indem die Suchanfrage immer zu einem Knoten weitergeleitet wird, dessen Schlüssel eine größere Übereinstimmung mit dem Ziel hat. Zur Optimierung des Netzes speichert jeder Knoten auch weitere zufällige P2P: Skip-Graph 219 Verbindungen, die er aufgrund von Routinginformationen aus vorhergehenden Suchanfragen erzeugen hat. 1.3 Verteilte Hashtabellen Es gibt viele Topologieansätze von P2P Netzwerken, die auf verteilten Hashtabellen (DHT) aufbauen. Ihnen gemein ist die Methode, die Daten vorher durch die Anwendung einer Hashfunktion auf den Schlüssel auf die Peers zu verteilen. Anschließend wird über die physikalische Netzstruktur ein virtuelles Netz aufgebaut, dass das effiziente Auffinden der Schlüssel ermöglicht. Verteilte Hashtabellen dienen zur gleichmäßigen Verteilung von Datenobjekten auf die Knotenmenge. Der Speicherort soll dabei mit möglichst geringen Aufwand schnell und effizient gefunden werden. Der Begriff Content-Addressable Network (CAN) [Rat00] bezeichnet eine Variante des ortsunabhängigen Routing mithilfe eines geometrischen Ansatzes. Jeder Knoten ist für einen Teilbereich der gesamten Hashtabelle verantwortlich (Zone). Diese hat mehrere Dimensionen und jeder Knoten kennt die physikalische Adresse seiner Nachbarn in dieser räumlichen Datenstruktur. Eine Suchanfrage kann so immer zu einen Nachbarn weitergeleitet werden, der eine geringere Distanz zu der Zielzone hat. Das Einfügen neuer Knoten verursacht eine Teilung einer bestehenden Zone, wodurch ein hierarchischer Suchbaum entsteht. Am MIT wurde Chord [SMK01] als Algorithmus für eine verteilte Hashtabelle entwickelt. Alle Rechner wenden die Hashfunktion auf ihre IP-Adresse an und bilden einen Datenring in aufsteigender Sortierung ihrer gehashten IP-Adresse. Alle Datenschlüssel werden auf dem Datenring verteilt und auf den Rechner gespeichert, der dem Schlüssel nachfolgt. Da jeder Rechner seinen Nachfolger kennt ist ein Auffinden der Daten garantiert. In der in [SMK01] beschriebenen erweiterten Variante, dem skalierten Routing, werden zur Minimierung der Laufzeit der Operationen jedoch außer dem direkten Nachfolger noch weitere Zeiger auf andere Knoten gespeichert, die in der sogenannten Fingertabelle zusammengefasst werden. Die Entfernung der in der Tabelle gespeicherten Nachbarn nimmt exponentiell zu um einen größeren Folgebrereich zu adressieren. Somit ist der i-te Eintrag der Fingertabelle der 2i−1 Nachbar auf dem Ring in Uhrzeigerrichtung. In dieser Variante besitzt jeder Knoten zudem noch einen Zeiger auf seinen Vorgänger. Damit ist eine Suche mit der Laufzeit O(log n) möglich. Chord zeichnet sich wegen der Hashfunktion durch eine gute Lastverteilung aus. Zudem steigen die Routingkosten nur logarithmisch an, weshalb dieses Verfahren gut Skalierbar ist. 1.4 Ausblick Ein neue Möglichkeit Peers zu vernetzen zeigt der Skip-Graph. Ziel der Entwicklung dieser Datentruktur ist es den Zusammenhang der Daten nicht zu zerstören, wie es bei verteilten Hashtabellen geschieht. Die Funktionsweise des von James Aspnes und Gauri Shah [AspnesS2003] entwickelten Ansatzes zur Speicherung der Daten in einem P2P-Netz wird in 220 M. Borowski den folgenden Kapiteln erläutert. Zudem wird die Laufzeit für die verschiedenen Operationen und die Eignung für ein P2P-Netz untersucht. Zum Schluss werden die Laufzeiten mit anderen Architekturen verglichen. 2 Die Datenstruktur Verteilte Hashtabellen (DHT) ermöglichen eine gute Lastverteilung auf einem Peer-to-Peer Netz und garantieren eine gute Suchzeit von O(log n) bei einem Speicherverbrauch von ebenfalls O(log n). Auch das Einfügen neuer Schlüssel oder deren Löschung ist effizient möglich. Allerdings nutzen sie nicht die Eigenschaft der räumlichen Nähe von Daten aus. Zudem ist ihre gute Ausfallsicherheit nur bei einem gleichmäßig verteiltem Ausfall der Knoten gegeben. Diese Nachteile sollen durch eine andere Datenstruktur behoben werden. 2.1 Skip-Liste William Pugh veröffentlichte im Jahre 1990 eine Datenstruktur namens Skip-Liste [PUGH90], die auf parallelen verketteten Listen aufbaut und bei der Effizienz mit einem binären Suchbaum vergleichbar ist. Er verkettet alle Elemente in aufsteigender Reihenfolge miteinander. Abb. 3. Verwendet man nur alle Listen, die den Startknoten enthalten, so erhält man eine Skip-Liste Hieraus wählt er mit einer bestimmten Wahrscheinlichkeit p zufällig einige Elemente aus und verkettet diese Elemente erneut in einer Liste. Dies führt er so fort, bis nur noch 2 Elemente in einer Liste enthalten sind. Suchen, einfügen und löschen ist ein einer Skip-Liste mit einer Laufzeit von O(log n) möglich. 2.2 Skip-Graph James Aspnes und Gauri Shah stellen in ihrer Ausarbeitung Skip Graphs [AspnesS2003] eine Datenstruktur vor, die den Ansatz der Skip-Listen verallgemeinert. Ihr Ziel ist es eine Datenstruktur für Peer-to-Peer-Netze zu entwickeln, die das Hinzukommen neuer Peers bzw. den Ausfall vieler Peers verkraften kann ohne den Zusammenhang der Daten zu verlieren. Auf Ebene 0 sind alle Knoten in einer doppelt verketteten Liste miteinander verbunden. Im Unterschied zu Skip-Listen können in jeder anderen Ebene mehrere verkettete Listen vorhanden sein. Jeder Knoten ist einer der Listen einer Ebene zugeordnet, bis die Höhe P2P: Skip-Graph 221 ausreicht, sodass er eindeutig adressiert werden kann. Formell wird die Zugehörigkeit eines Knoten x zu den Listen durch den Mitgliedsvektor m(x) beschrieben. Da ein Knoten im Skip-Graph nichts über die Größe des Adressraumes weiß, wird m(x) als unendliches langes Wort über einem endlichen Alphabet σ definiert. Abb. 4. Beispiel eines Skip-Graphen mit 5 Schlüsseln Im folgenden Beispiel betrachten wir das Alphabet {0, 1}. Bei einem Skip-Graphen befinden sich alle Knoten auf Ebene 0 in einer doppelt-verketteten Liste. Auf Ebene 1 existieren zwei doppelt-verkettete Listen. Jeder Knoten wird zufällig auf einer der Listen verteilt. Die aufsteigende Sortierung der Liste muss dabei erhalten bleiben. In Ebene 2 wird jeder Knoten aus einer der Listen aus Ebene 1 wieder zufällig auf zwei neue Listen aufgeteilt, sodass es insgesamt 4 Listen auf Ebene 2 gibt. Diese Aufteilung wiederholt sich solange bis nur noch ein Knoten in einer Liste vorhanden ist. In der Abbildung 4 wird dieses Beispiel graphisch veranschaulicht. Durch diesen Aufbau eines Skip-Graphen ist dieser äquivalent zu einer Sammlung von Skip-Listen. Jeder Skip-Graph beschreibt deshalb einen Trie von Skip-Listen {Sw } (Abbildung 5). Falls |w| ≥ i, bedeutet die Schreibweise w|i im folgenden der Prefix von w mit der Länge i. Lemma 1. Sei {Sw } ein Skip Graph mit dem Alphabet Σ. Für ein z ∈ Σ ∞ ist die Sequenz S0 S1 . . . mit Si = Sz|i eine Skip-Liste mit dem Parameter p = |Σ|−1 . Beweis. Die Liste S0 entspricht der Basisliste S aller Knoten auf Ebene 0. Per Induktion von i lässt sich zeigen, dass ein Knoten x in Si enthalten ist, wenn die ersten i-Stellen seines Mitgliedsverktors denen des Vektors z entsprechen (m(x)|i = z|i). Die Wahrscheinlichkeit, dass der Knoten x in der von der Skip-Liste benutzten Liste eine Ebene höher enthalten ist, entspricht der Wahrscheinlichkeit, dass m(x)|(i + 1) = z|(i + 1) gilt. Dies ist aber gleich der Wahrscheinlichkeit p = |Σ|−1 , da die Zugehörigkeit des Knoten x von der Wahl jedes anderen Knoten unabhängig ist. Damit erfüllt die Sequenz S0 S1 . . . die Anforderung einer Skip-Liste. 222 M. Borowski Abb. 5. Verwendet man nur alle Listen, die den Startknoten enthalten, so erhält man eine Skip-Liste 3 Operationen auf einem Skip-Graph In diesem Kapitel werden die verschiedenen möglichen Operationen auf einen Skip-Graphen vorgestellt und ihre Laufzeit analysiert. Ein Skip-Graph ist definiert über einem endlichen Alphabet Σ. Damit wird jede Liste in der nächsten höheren Ebene in maximal |Σ| Listen unterteilt. Die Menge Σ ∗ enthält alle endlichen Wörter dieses Alphabets, die Menge Σ ∞ aller unendlich langen Wörter. Für eine Wort w ∈ Σ ∗ enthält die Liste Sw alle Knoten, bei denen w ein Präfix ihres Mitgliedvektors m(x) ist. Sw befindet sich auf der Ebene i = |w|, wobei w = w0 w1 w2 . . . wi−1 gilt. 3.1 Die Suche In einem Skip-Graphen funktioniert die Suche ähnlich derer in Skip-Listen. Die Suche startet in der Liste der höchsten Ebene des Knotens. Ist der gesuchte Schlüssel größer als der eigene Schlüssel wird er mit dem rechten Nachbar in der Liste verglichen. Ist dieser kleiner oder gleich dem gesuchten Wert, wird die Suche dort fortgesetzt. Anderenfalls wird der Schlüssel mit den rechten Nachbarn der Liste einer Ebene tiefer verglichen. Ist der gesuchte Knoten gefunden oder die Ebene 0 erreicht bricht die Suche ab. Falls der gesuchte Schlüssel zu Beginn der Suche kleiner als der Startschlüssel ist, werden die Schlüssel der linken Nachbarn zum Vergleich herangezogen. Listing 1. Suchen in einem Skip-Graphen 1 s u c h e ( StartKnoten s , S u c h s c h l ü s s e l k , Ebene e ) 2 3 4 F a l l s d i e s e r Knoten dem S u c h s c h l ü s s e l k e n t s p r i c h t Melde e s an den StartKnoten s 5 6 7 8 9 10 11 Fa l l s Suchschlüssel k k l e i n e r aktuellem S c h l ü s s e l S o l a n g e Ebene e > 0 F a l l s S c h l ü s s e l d e s r e c h t e n Nachbarn k l e i n e r k Sende S u c h a n f r a g e an i h n w e i t e r S e t z e Suche a u f Ebene e−1 f o r t F a l l s Suchschlüssel k größer aktuellem S c h l ü s s e l P2P: Skip-Graph 12 13 14 15 223 S o l a n g e Ebene e > 0 F a l l s S c h l ü s s e l d e s l i n k e n Nachbarn k l e i n e r k Sende S u c h a n f r a g e an i h n w e i t e r S e t z e Suche a u f Ebene e−1 f o r t 16 17 18 F a l l s a k t u e l l e Ebene e < 0 Sende M i s s e r f o l g d e r Suche an s Abb. 6. Die Suche benutzt nur Knoten, die auch in der Skip-Liste des Startknoten B enthalten sind. Lemma 2. Die Such-Operation in einem Skip-Graphen S mit n Knoten benötigt eine erwartete Anzahl von O(log n) Nachrichten und O(log n) Zeit. Beweis. Sei z der Knoten an dem die Suche startet und Σ das Alphabet des Mitgliedvektors m(z). Nach Lemma 1 ist jedes Element der Sequenz Sm(z) = S0 , S1 , S2 , ... eine Skip-Liste. Eine Suche im Skip-Graphen S durchläuft die gleichen Elemente, wie eine Suche in der Skip-Liste Sm(z) . [PUGH90] zeigt das die durchschnittliche Anzahl von Elementen O(log n log1 1 ) mit p = p 1 |Σ|−1 beträgt und in jeder Ebene durchschnittlich auf 1−p Knoten gesucht wird. Damit ergibt sich die erwartete Anzahl von Nachrichten verbunden mit der benötigten Zeit: 1 = O(log n) O log n (1) (1 − p) log p1 Aus dem Ergebnis ist ersichtlich, dass bei einem kleinen Alphabet, also einem großen p, die Suchzeit abnimmt, aber stattdessen die Anzahl der Ebenen zunimmt. Damit müssen jedoch mehr Nachbarknoten in jedem Knoten gepeichert werden. Deshalb muss hier eine Balance zwischen Suchzeit und Speicherverbrauch gefunden werden. Bereichssuche Im Gegensatz zu vielen anderen Netzwerktopologien ist es durch die Grundordnung im SkipGraph möglich Bereichsanfragen zu stellen. Sind in den Knoten z.B. die Domainpfade als 224 M. Borowski Schlüsselwerte abgelegt, so ist z.B. eine Suche nach allen Schlüsseln unterhalb der Domaine de.upb möglich. Hierbei wird zunächst nach einem Knoten des Bereichs gesucht, der die Suche anschließend in seiner Umgebung broadcastet. 3.2 Einfügen neuer Peers Eine Grundvoraussetzung für P2P Netzwerke ist, dass neue Peers mind. einen Peer des existierenden Netzwerkes kennen müssen. Ist dies der Fall, kann der neue Peer dort mit einer Suche nach sich selbst starten und damit seinen Vorgänger und Nachfolger in der Liste der Ebene 0 finden. Abb. 7. Ein neuer Peer stellt zunächst eine Suchanfrage nach sich selbst um seine Nachbarn auf Ebene 0 zu finden. Nachdem sich der neue Peer in die Liste eingefügt hat, sucht er auf Ebene 0 anhand des Mitgliedvektors nach beiden Seiten nach seinem Nachbarn auf höheren Ebenen und fügt sich ebenfalls in diese Listen ein. Lemma 3. Ohne gleichzeitigen Zugriff benötigt das Einfügen einen Knoten in einem SkipGraphen S mit n Knoten O(log n) Nachrichten und O(log n) Zeit. Beweis. Bei einem festen Alphabet mit p = |Σ| Elementen verwendet das Einfügen auf Ebene 0 eine Such-Operation nach 2 O(log n) Nachrichten und Zeit. Bei der Suche der Nachbarn für jede andere Ebene werden durchschnittlich p1 Knoten durchlaufen. Die Anzahl der Ebenen im Skip-Graphen ist O(log n). Damit ergibt sich eine erwartete Anzahl benötigter Nachrichten: log Xn 1 1 O(log n) + O = O(log n + log n) (2) p p 0 = O(log n) (3) P2P: Skip-Graph 225 Abb. 8. Der eingefügte Knoten sucht durch Vergleichen des Mitgliedschaftsvektors seiner Nachbarn, seine Nachbarn auf höherer Ebene. 3.3 Entfernen von Peers Das Löschen von Knoten ist eine einfache und schnelle Operation. Zunächst entfernt sich der Peer von allen Listen der Ebenen gößer 0 - dies kann parallel erfolgen. Anschließend entfernt er sich auch aus der Liste von Ebene 0. Listing 2. Suchen in einem Skip-Graphen 1 l ö s c h e ( Knoten u ) 2 3 4 Für a l l e Ebenen > 0 Lösche u aus d e r L i s t e 5 6 Lösche u aus d e r L i s t e a u f Ebene 0 Lemma 4. Ohne gleichzeitigen Zugriff benötigt die Lösch-Operation in einem Skip-Graphen O(log n) Nachrichtne und O(1) Zeit. Beweis. Wir nehmen an, dass die Lösch-Operation in einer verketteten Liste O(1) Nachrichten und Zeit braucht. Da dies in allen Liste bis auf Ebene 0 parallel geschehen kann, benötigen wir nur O(1) Zeit. Bei der Anzahl der Nachrichten müssen wir die Anzahl der Listen, die gleich der Höhe des Skip-Graphen ist, berücksichtigen: log Xn 0 O(1) = O(log n) (4) 226 M. Borowski 3.4 Operationen bei mehrfachem gleichzeitigen Zugriff Da jeder Peer sich selbst verwaltet, ist ein kontrollierter Zugriff von mehreren Peers auf den Skip-Graphen nicht möglich. Die vorgestellten Algorithmen stellen jedoch sicher, dass zu jedem Zeitpunkt die Liste auf Ebene 0 korrekt ist. Damit ist gegeben, dass auch mehrfache gleichzeitige Operationen korrekt durchgeführt werden. Die Listen höherer Ebenen dienen nur zur effizienteren Suche der Knoten und beeinträchtigen deshalb die Funktionalität des Skip-Graphen nicht. 4 Qualitätsanalyse Im vorherigen Kapitel wird die Effizienz und Korrektheit der Operationen auf einem Skip-Graphen gezeigt. Entwickelt wurde diese Datenstruktur für den Aufbau eines P2PNetzwerkes. Hier ergeben sich jedoch viele Fehlerquellen, die die Qualität des Netzes beeinträchtigen. Im folgenden wird deshalb die Güte eines Skip-Graphen mit dem Alphabet {0, 1} für P2P-Netze untersucht. 4.1 Fehlertoleranz Eine große Herausforderung beim Design eines P2P-Netzes ist die Eigenschaft, dass sich die Topologie durch das Hinzufügen und Entfernen von Peers ständig ändern kann. Es kann nicht davon ausgegangen werden, dass jeder Peer, der das Netzwerk verlässt, vorher ordnungsgemäß die Lösch-Operation ausführt. Die Robustheit des Skip-Graphen ergibt sich deshalb aus dem Verhältnis von ausgefallenen Peers zu denen, die dadurch den Zusammenhang zum Netzwerk verloren haben. Randomisierter Ausfall von Peers Zunächst nehmen wir an, dass jeder Knoten mit der gleichen Wahrscheinlichkeit ausfallen kann. [AspnesS2003] zeigen in ihren Simulationen, dass bis du einer Ausfallwahrscheinlichkeit von 60% fast alle Knoten in der großen Zusammenhangskomponente verbleiben. Erst bei größeren Werten werden viele Knoten isoliert, wenn ihre gesamte Nachbarschaft ausfällt. Dies bedeutet, dass ein P2P Netz, dass auf einem Skip-Graphen aufbaut, sehr robust gegenüber zufälligen Fehlern ist. Ungünstige Ausfälle von Peers Neben dem Zufälligen und damit gleichmäßig verteilten Ausfall von Peers interessiert bei der Robustheit von Skip-Graphen auch der Ausfall größerer benachbarter Bereiche. Aufgrund der Sortierung der Peers im Skip-Graphen kann der Ausfall eines Rechners oder physikalischen Netzes den Ausfall großer benachbarter Knoten zur Folge haben. Im folgenden P2P: Skip-Graph 227 versuchen wir deshalb eine Kombination von Peers zufinden, deren Ausfall den Zusammenhang zerstört. Hierzu untersuchen wir den Expansionsgrad vom Skip-Graphen G. Der Expansionsgrad von einer Menge Knoten A ⊆ G ist definiert als |δA|/|A|, wobei |δA| die Anzahl der Knoten ist, die zu A benachbart, aber selbst nicht in A enthalten sind. Abb. 9. Beispiel für ein Set A und der damit erzeugten Menge δA Der Expansionsgrad des Graphen G ist der minimale Expansionsgrad aller Teilmengen A mit 1 ≤ |A| ≤ n2 . Fallen alle Knoten von A aus, haben alle Knoten von δA fehlerhafte Kanten. Im Folgenden wird deshalb eine untere Schranke für den Expansionsgrad bestimmt. Die Menge δ` A ⊂ G enthält alle Knoten, die nicht in A liegen, aber durch eine Kante auf Ebene ` mit einem Knoten aus A benachbart sind. Damit gilt: [ δA = δ` A (5) ` |δA| ≥ max` |δ` A| (6) Lemma 5.Die Anzahl der Sets A mit |A| = m < n und |δ0 A| < s ist kleiner als: Ps−1 m+1 n−m−1 r=1 r r−1 Beweis. Zuerst werden alle Knoten von 1 bis n durchnummeriert und ein Bit-Vektor x = x1 x2 . . . xn defininert, wobei gilt: ( 1, falls Knoten i ∈ A xi = 0, sonst Damit sind alle Knoten, die durch eine 0 repräsentiert werden und zu einer 1 benachbart sind, in δA enthalten. Um sicher zu stellen, dass der Bit-Vektor immer mit einer 1 sowohl beginnt als auch aufhört, wird ein weiterer Vektor x0 = 1x1 definiert. Dieser Vektor besteht alternierend aus Einser- und Nuller-Folgen, wobei die Anzahl der Nuller-Folgen r um eins kleiner als die der Einser-Folgen (r + 1) ist. Da A eine echte Teilmenge ist (A ⊂ G), ist 228 M. Borowski Abb. 10. Beispiel für ein Set A und der dazugehörigen Teilmenge δ0 A mit |δ0 A| = 2 und r = 2 mind. eine 0 im Bit-Vektor enthalten. Jede Nuller-Folge enthält einen oder zwei Knoten aus δA: r ≤ |δ0 A| ≤ 2r (7) 0 Nun Summieren wir die Anzahl der Bit-Vektoren x auf, die n − m Nullen enthalten und n−m−1 aus r Nuller-Intervallen bestehen. Es gibt Möglichkeiten n − m Nullen auf die r r−1 Nuller-Intervalle zu verteilen. Für die m + 2 Einser gibt es m+2−1 r+1−1 Möglichkeiten sie auf r +1 Intervalle verteilt zu werden. Beide Verteilungen sind voneinander unabhängig, deshalb ergibt sich als obere Schranke: s−1 X m+2−1 n−m−1 r=1 r+1−1 r−1 = s−1 X m+1 n−m−1 r=1 r−1 r (8) Nun können wir mit hoher Wahrscheinlichkeit zeigen, dass für alle Ebenen ` > 0 |δ` A| selten klein sein wird. Lemma 6. Sei A eine Teilmenge mit m ≤ n/2 Knoten in einem Skip-Graph S mit n m ` Knoten. Dann gilt für jede Ebene ` > 0: P [|δ` A| ≤ 31 · 2` ] < 2 b 22·2` c 32 3 Beweis. Wenn für ein b ∈ Σ ` ein Knoten u ⊂ S existiert, sodass auch ein Knoten v ⊂ S −A mit b = m(u)|h = m(v)|h existiert, dann gibt es ein Knotenpaar v 0 ∈ A und v 0 ∈ S − A, die benachbart sind. Da diese Paare verschieden für unterschiedliche b sind, können wir eine untere Schranke für δ` A berechnen. Sei T (A) die Menge von bs, für die A einen Knoten aus Sb enthalten, Dann gilt: X 2 ` P [T (A) ⊆ B] P |T (A)| < · 2 ≤ 3 2 ` B⊂S,|B|=b 3 ·2 c ≤ 2` b 23 · 2` c |A| 2 3 (9) P2P: Skip-Graph 229 und für die restliche Menge S − A: |S−A| 2 2` 2 P |T (S − A)| < · 2` ≤ 3 b 23 · 2` c 3 (10) Da beide Mengen T (A) und T (S − A) mind. zwei Drittel aller b enthalten, muss die Schnittmenge mind. ein Drittel der b enthalten: |A| |S−A| ! 2` 2 1 ` 2 ≤ P |T (A) ∩ T (S − A)| < · 2 + 2 ` 3 b3 · 2 c 3 3 ` |A| ≤ 2 b 22·2` c 23 (11) 3 Damit gibt es nicht genug Teilmengen A ⊂ G mit kleinem |δ0 A|, damit die Wahrscheinlichkeit, dass eine Teilmenge auch ein kleines |δ` A| hat, groß genug ist. 4.2 Auslastung der Peers Bei einem Skip-Graph kann gezeigt werden, dass die Auslastung von Peers bei einer hohen Last Suchanfragen an ein bestimmtes Element mit der Distanz stark abnimmt. Die Wahrscheinlichkeit, dass die Suche einen bestimmten Knoten zwischen den Startknoten und dem Zielknoten benutzt, ist umgekehrt proportional zur Distanz des Knotens zum Ziel. Hierbei ist jedoch die Gleichverteilung des Mitgliedsvektors entscheident. Unglücklicherweise kann es sein, dass ein Knoten durch ungünstige Mitgliedsvektoren immer schnell zu einen Suchpfad führt, der einen Knoten in der Nähe eines sehr populären Knoten beinhaltet. Zudem wird für den Startknoten angenommen, dass er immer einen zufälligen Mitgliedvektor hat. Theorem 1. Gegeben sei ein Skip Graph S mit dem Alphabet {0, 1}. Bei einer Suche von s nach t ist die Wahrscheinlichkeit für einen Knoten u mit s < u < t und dem Abstand d 2 nach t, dass der Suchpfad u durchläuft kleiner als d+1 . Beweis. u íst im Suchpfad von s nach t enthalten, wenn es keinen Knoten zwischen u und t gibt, der in einer höheren Ebene in einer gemeinsammen Liste mit s enthalten ist. Es existieren d + 1 Knoten in diesen Interval. Sei T eine Zufallsvariable, die alle Knoten der höchsten Ebene enthält. 230 M. Borowski Abb. 11. u ist im Suchpfad von s1 nach t enthalten. Im Suchpfad von s2 nach t nicht. P (u ∈ T ) = d+1 X k=1 P (|T | = k) k d+1 (12) E(|T |) d+1 |T |−1 X n 1 |T | + E(k) /(d + 1) = |T | k 2 −1 k=1 |T |−1 X n 1 n |T | + = |T | E(1) + 2 P (k) /(d + 1) 1 k 2 −1 k=2 |T |−1 X n 1 2 n P (1) + 2 P (k) /(d + 1) = |T | 1 k 2 −1 = (13) (14) (15) (16) k=2 |T |−1 X n 2 = |T | P (k)/(d + 1) 2 − 1 k=1 k (17) = 2P (|T |)/(d + 1) 2 ≤ d+1 Der letzte Schritt ergibt sich, da P (n) mit P (0) = 0, P (1) = 1 und P (n) = kein Wert größer 1 ist. (18) (19) 1 2n −1 Pn−1 k=1 n k P (k) 5 Varianten und Erweiterungen Von der in den vorigen Kapiteln vorgestellten Datenstruktur Skip-Graph gibt es einige Variationen, die im folgenden vorgestellt werden. P2P: Skip-Graph 231 Abb. 12. Erwartete und simulierte Nachrichtenlast in einen Skip-Graph mit 131072 Knoten und den Zielknoten 76539 (aus [AspnesShah]) 5.1 Mehrere Nachfolger James Aspnes zeigt in seiner Ausarbeitung [AspnesShah], dass es sinnvoll sein kann, statt nur eines Nachbarn in jeder Ebene mehrere Nachfolger zu speichern. Bei einer Ausfall- Abb. 13. Anzahl der fehlgeschlagenen Suchläufe in einen Skip-Graph mit 131072 Knoten und 10000 Nachrichten. Jeder Knoten hat bis zu 5 Nachfolger auf jeder Ebene (aus [AspnesShah]) wahrscheinlichkeit von 60% für jeden Knoten ist eine Suche im vorgestellten Skip-Graphen praktisch nicht mehr möglich. Speichert man aber zusätzlich immer die nächsten 5 Nachfol- 232 M. Borowski ger auf jeder Ebene, so ist eine Suche in mehr als 23 der Fälle weiterhin erfolgreich möglich. Der Speicherbedarf ändert sich hierbei nur um einen konstanten Faktor (siehe Abbildung 13). 5.2 SkipNet An der Universität von Washington in Seattle und bei Microsoft wurde unabhängig von der Entwicklung des Skip-Graphen eine sehr ähnliche Struktur für P2P-Netzwerke entwickelt. Harvey et al. [Harvey03] beschreibt eine Datenstruktur, die auf einfach, zirkular verketteten Listen aufbaut. Die Operationen sind wie beim Skip-Graphen implementiert, nur dass im Abb. 14. Aufbau eines SkipNet nach [Harvey03] SkipNet die Rechner einer Domain als ein Knoten auftauchen. Die einzelnen Daten werden innerhalb einer Domain wieder mittels der verteilten Hashtabelle aufgeteilt. Der Vorteil der zirkulären Listen ist die gleichmäßigere Auslaustung der Peers. [AspnesShah] zeigt jedoch auf, dass es bei Linkfehlern sehr schwer ist, die Struktur wieder zu reparieren. 5.3 Expander Graphen in Skip-Graphen J. Aspnes und U. Wieder [AspnesWieder2005] zeigen, dass in einen Skip-Graph mit hoher Wahrscheinlichkeit ein 4-regulärer Expander enthalten ist. Dies führt zu den Ergebnis, dass der Expansiongrad nicht wie vorher gezeigt Ω(1/ log n), sondern sogar Ω(1) ist und damit jede Teilmenge, die weniger als die Hälfte der Knoten (m < n/2) enthält Ω(m) Nachbarn hat. Damit ist die Fehlertoleranz besser als zuvor angenommen. Es kann gezeigt werden, dass bei einem Ausfall einer konstanten Anzahl von Knoten immer noch eine konstante Anzahl in einem Graphen verbleibt. P2P: Skip-Graph 233 6 Zusammenfassung und Fazit In dieser Ausarbeitung wurde die Datenstruktur des Skip-Graphen und einige Variationen vorgestellt. Sie ermöglicht die verteilte Datenspeicherung und bietet gegenüber dem gebräuchlichen DHT-Verfahren einige wichtige Vorteile. Im Vergleich mit CAN und Chord wird eine bessere Performance erreicht. Die Laufzeiten für das Erreichen von Knoten ist gleich, jedoch benötigt das Einfügen neuer Knoten mit O(log2 n) mehr Zeit als im Skip-Graphen mit O(log n). Zudem sind Skip-Graphen auch robuster, da sie im Gegensatz zu verteilten Hashtabellen auch bei gezieltem ungünstigen Löschen von Knoten nur begrenzt Schaden nehmen. Ein weiterer großer Vorteil von SkipGraphen ist aufgrund ihrer Sortierung die Möglichkeit einfach Bereichsanfragen zu stellen. Es existiert aber derzeit noch kein in der Praxis verwendetes P2P-Netz, das auf einem SkipGraph aufbaut. Alle getroffenen Annahmen sind aufgrund von Simulationen entstanden. Es wird sich deshalb noch zeigen müssen, ob sich P2P-Netze basierend auf Skip-Graphen durchsetzen können. Literaturverzeichnis AspnesS2003. J. Aspnes and G. Shah 2003. Skip graphs. Fourteenth Annual ACM-SIAM Symposium on Discrete Algorithms, Jan 2003, 384-393 AspnesShah. J. Aspnes and G. Shah. Skip graphs. ACM Journal AspnesWieder2005. J. Aspnes and U. Wieder 2005. The expansion and mixing time of skip graphs with applications. SPAA ’05: Proceedings of the seventeenth annual ACM symposium on Parallelism in algorithms and architectures, 2005, 126-134 Harvey03. J.A. Harvey, M.B. Jones, S. Saroiu, M. Theimer and Alec Wolman SkipNet: A Scalable Overlay Network with Practical Locality Properties NaorWieder06. M. Naor and U. Wieder. Novel Architectures for P2P Applications: the Continuous.Discrete Approach MahlSchindel07. Peter Mahlmann und Christian Schindelhauer Peer-T to-Peer-Netzwerke: Algorithmen und Methoden. Springer-Verlag Berlin, 1. auflage, Jul.2007, ISBN 3540339914 PUGH90. Pugh, W. 1990. Skip Lists: A Probabilistic Alternative to Balanced Trees. Communications of the ACM 33,6 (June), 668-676 Groli07. Dominik Grolimund. 2007. P2P Online Storage Web 2.0 Expo Berlin, 2007 Rat00. S. Ratnasamy, P. Francis, M. Handley, R. Karp and S. Shenker. A Scalable ContentAddressable Network. Proceedings of ACM SIGCOMM 2001, 161-172 Schoder02. Detlef Schoder, Kai FischbachPeer-to-Peer(2002) Springer Verlag SMK01. Stoica, Morris, Karger, Kasshoek, Balakrishnan Chord: A scalable Peer-To-Peer lookup service for internet applications. Proceesings of the 2001 ACM SIGCOMM Conference, 2001, 149-160 OReilly01. Peer to Peer oder das Netz als Computer Ein Kommentar von Tim O’Reilly 2001 O’Reilly verlag Napster. @web(1999-2008) Napster - P2P Filesharing - MP3 Suche ohne Suchmaschinen Freenet. @web(1999-2008) Freenet - statt Suchmaschinen - p2p Filesharing Gnutella. @web(1999-2008) Gnutella - P2P Filesharing - MP3 Suche ohne Suchmaschinen Wuala. @web(2006-2008) Wua.la - Ihre kostenlose Online-Festplatte Herwig. Björn A.Herwig, Seminar Internet Computing Peer-to-Peer Networking PCWELT0803. PC-WELT : Peer-to-Peer-Netze (27. AUGUST 2003) Kinetische Datenstrukturen für zweidimensionale Probleme Sabine Naewe Universität Paderborn [email protected] Zusammenfassung. In meiner Seminararbeit werde ich mich mit kinetischen Datenstrukturen für zweidimensionale Probleme beschäftigen. Das Vorgehen hierbei werde ich am Beispiel zweier grundlegender Probleme erläutern, welche repräsentative Beispiele für Bewegungsprozesse sind. Das Problem der konvexen bzw. oberen Hülle von n Punkten gehört zur Kategorie der Umfangsprobleme, während das Problem des dichtesten Paares zur Kategorie der Nähe- und Schnittprobleme gehört. Für beide Probleme werden als erstes kinetische Datenstrukturen entwickelt und diese dann für die Bewegung der Elemente modifiziert. 1 Einführung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 2 Die konvexe Hülle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 2.1 2.2 2.3 2.4 Berechnung der oberen Hülle zweier Ketten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 Analyse des Beweisschemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 Aktualisierung der konvexen Hülle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 Divide and Conquer Algorithmus für die obere Hülle . . . . . . . . . . . . . . . . . . . . . . . . . 241 3 Dichtestes Paar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244 3.1 Statischer Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 3.2 Die Bewegung der Elemente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 4 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 1 Einführung In meiner Seminararbeit werde ich die Idee einer kinetischen Datenstruktur für zwei zweidimensionale Probleme vorstellen. Kinestische Datenstrukturen sind ein Konzept zur Berechung bestimmter Attribute von kontinuierlichen Modellen, wobei sie diese während der betrachteten Zeitspanne aufrechterhalten. Eine Einführung in dieses Thema liefert [5]. Die Arbeit gliedert sich in zwei nicht aufeinander aufbauende Abschnitte. Der erste Abschnitt erläutert eine kinetische Datenstruktur für das Problem der konvexen Hülle einer zweidimensionalen Punktmenge. Im zweiten Abschnitt wird dann eine Datenstruktur für das Problem des dichtesten Paares einer zweidimensionalen Menge vorgestellt. 236 Sabine Naewe 2 Die konvexe Hülle In diesem Abschnitt betrachtet wir nun das Problem der konvexen Hülle. Gegeben seien n Punkte im zweidimensionalen Raum. Gesucht ist nun die konvexe Hülle dieser n Punkte. Definition 1. Die konvexe Hülle einer n−elementigen Menge ist definiert als die kleineste konvexe Menge, welche die n Punkte enthält. Dabei heißt eine Menge M konvex, falls gilt: ∀ a, b ∈ M : ∀ t ∈ [0, 1] : ta + (1 − t)b ∈ M Anschaulich enthält eine konvexe Menge M für jedes Paar von Elementen aus M auch die Strecke zwischen diesen beiden Punkten. Sie wird durch ihre Eckpunkte beschreiben. Eine konvexe Hülle kann man in obere und untere Hülle aufteilen. Um die obere Hülle zu berechnen, werden als erstes alle Punkte nach ihrer x-Koordinate lexikographisch sortiert. Danach durchläuft man die Punkte im mathematisch positiven Sinne und verbindet alle geordneten Punkte. Ergibt sicht dabei eine Einbuchtung nach innen, werden die inneren Punkte entfernt. Eine innere Einbuchtung wird hierbei durch einen Winkel repräsentiert, welcher kleiner als 180 ist. Die untere Hülle erhält man analog. Um nun die konvexen Hülle zu berechnen, benutzt man einen Divide and Conquer Ansatz. Dabei wird zufällig unsere Ausgangsmenge in etwa zwei gleich große Untermengen geteilt, von denen man nun rekursiv die konvexe Hülle berechnet. Anschließend mischen wir diese beiden Ergebnisse, um die konvexe Hülle der gesammten Menge zu bekommen. Bei diesem Vorgang betrachtet man die parallelen Tangenten der beiden Hüllen um die endgültige Menge zu bekommen. In dieser Arbeit berechnen wir nur die obere konvexe Hülle und benutzten die duale Transformation um einem Punkt (p, q) die Linie y = px + q zuzuordnen, da es einfacher ist den Algorithmus für Linien zu beschreiben. Im dualen Raum ist es nun das Ziel, die obere Hülle einer Familie von Linien zu erhalten. Dabei können sich die Parameter der Linien kontinuierlich aber vorhersehbar ändern. Um dieser Bewegung Rechnung zu tragen, wird der Divide and Conquer Algorithmus modifiziert, indem man die obere konvexe Hülle der Untermengen berechnet. Der entscheidene Punkt ist hierbei die Berechnung der oberen Hülle aus den oberen Hüllen von zwei Untermengen. Dafür betrachten wir die Linien als konvexe, stückweise definierte lineare Funktionen. 2.1 Berechnung der oberen Hülle zweier Ketten Im Folgenden befinden wir uns im Dualen und betrachten die duale Tranformation der Ausgangsmenge. Wir definieren in unserem Algorithmus eine konvexe, stückweise definiert lineare Funktion als doppeltverkettete Liste mit Ecken und Kanten, welche von von links nach rechts geordnet ist. Diese Darstellung nennen wir eine Kette. In diesem Abschnitt betrachen wir nun zwei Untermengen als blaue und rote Kette und erläutern eine kinetische Datenstruktur, um die lila Menge zu erhalten, welche die obere Hülle der roten und blauen Kette darstellt. Um den Algorithmus darstellen zu können, definieren wir im nächsten Absatz hierfür wichtige Mengen und Begriffe. Da wir bei diesem Problem die Hauptaufmerksamkeit auf die Kanten richten werden , bezeichen wir die Kanten mit Kleinbuchstaben und nennen die Ecke zwischen den Kanten a und b die Ecke ab. Eine Konfiguration bezeichnet nun Kinetische Datenstrukturen für zweidimensionale Probleme 237 eine Darstellung aller Ecken und Kanten, so dass beide Ketten konvex sind. Für eine Ecke ab bezeichnen wir die Kante der anderen Kette, welche darüber oder darunter liegt, als rivalisierende Kante (engl.: contender edge ) und kennzeichnen sie mit ce(ab). Jeder Knoten hat dann einen Zeiger auf die rivalisierende Kante. Wir kennzeichnen mit χ( ) die Farbe (rot oder blau) einer Ecke oder Kante. Schließlich bezeichnen wir mit ab.prev bzw. ab.next die blaue oder rote Ecke, welche auf der linken bzw. rechten Seite von ab am nächsten bei ab liegt. Diese Ecke kann leicht durch das Vergleichen der x-Koordinaten der benachbarten Ecke in der Kette von ab mit einer der Eckpunkte der rivalisierenden Kante von ab berechnet werden. Um die rote und blaue Kette in einem Mischdurchlauf miteinander vergleichen zu können, benötigen wir zwei verschiedene Typen von Zertifikaten: Die x-Zertifikate definieren die horizontale Ordnung der Ecken, während die y-Zertifikate die vertikale Ordnung in Hinsicht auf die rivalisierende Kante untersucht. Wir bezeichnen diese mit <x bzw. <y . Wenn wir alle diese Vergleiche aber als Zertifikate behandeln, ist die erhaltende kinetische Datenstruktur nicht mehr lokal, da eine gegebene Kante die rivalisierende Kante von O(n) vielen Ecken der anderen Hülle sein kann. Deswegen definieren wir eine alternative Menge von Zertifikaten, welche auch Vergleiche zwischen Linienpaaren bzgl. der Steigung, mit <s gekennzeichnet, enthalten. Dadurch kann dann überprüft werden, ob der Winkel zwischen zwei Linien kleiner als 180 ist. Mit diesen drei Arten von Zertifikaten kann die Anzahl der Zertifikate erheblich einschränkt werden. Name x[ab] Vergleich [ab <x cd] Bedingung cd = ab.next χ(ab) 6= χ(cd) yli[ab] [ab <y or >y ce(ab)] b ∩ ce(ab) 6= ∅ yri[ab] [ab <y or >y ce(ab)] a ∩ ce(ab) 6= ∅ yt[ab] [ce(ab) <y ab] a <s ce(ab) <s b slt[ab] [a <s ce(ab) ce(ab) <y ab srt[ab] [ce(ab) <s b] sl[ab] [b <s ce(ab)] b <s ce(ab) ab <y ce(ab) χ(ab) 6= χ(ab.next) sr[ab] [ce(a) <s a] ce(ab) <s a ab <y ce(ab) χ(ab) 6= χ(ab.prev) Tabelle 1. Zertifikate für die obere Hülle zweier Ketten In Tabelle 2.1 werden die modifizierten Zertifikate definiert. Die erste Spalte enthält den Namen der Zertifikate, die zweite enthält den Vergleich, welchen dieses Zertifikat garantiert und die dritte Spalte enthält zusätzliche Bedingungen für das Zertifikat, damit es in der kinetischen Datenstruktur enthalten ist. Die erste Zeile definiert ein Zertifikat mit Namen x[ab]. Dieses existiert nur in der Datenstruktur, wenn ab und cd Nachbarn sind und in unterschiedlichen Ketten liegen (Bedingung). Um dies zu überprüfen, müssen die x-Koordinate der Ecken ab und cd miteinander verglichen werden. Die Ungleichung muss nun nach t gelöst werden, um den ersten Zeitpunkt zu berechnen, an dem das Zertifikat seine Gültigkeit verliert, also der Knoten cd nicht mehr der rechte Nachbar von ab ist. 238 Sabine Naewe Das Zertifikat x[..] definiert die exakte x-Ordnung der Knoten, während die Zertifikate yli[..] und yri[..] den Schnitt zweier Kanten in verschiedenen Ketten darstellt. Wenn eine Kante nicht in der oberen Hülle liegt, ordnen die Zertifikate seine Steigung in die Folge aller Kantensteigungen ein. Entweder geschieht dies mit den drei tangetialen Zertifikaten yt[..], slt[..] und srt[..] oder das Zertifikat sl[..] bzw. sein symmetrisches Zertifikat sr[..] zeigt, dass keine Tangente vorhanden ist. Abhängig von den Positionen der roten und blauen konvexen Ketten werden in Abbildung 1 verschiedene Zertifikate benutzt um die Überschneidungsstruktur (oberer Fall) oder das Nichtüberschneiden (mittlerer und unterer Fall) zu zertifizieren. Die Pfeile zeigen dabei die Vergleiche zwischen Ecken oder Kanten an. Schließlich benötigen wir noch Abstandszertifikate zwischen den beide Kanten am linken bzw. rechten Rand der Kette. Abb. 1. Darstellung der modifizierten Zertifikate 2.2 Analyse des Beweisschemas In diesem Abschnitt beweisen wir die Lokaltität des Beweisschemas und ihre korrekte Berechnung der oberen Hülle. Lemma 1. Die Lokaltität des obrigen Beweisschemas hat Komplexität O(1). Beweis. Sei a eine beliebige Kante. Wir müssen nun die Anzahl der Zertifikate berechnen, in denen a im Gültigkeitsbeweis des Schemas vorkommt. Ohne Beschränkung der Allgemeinheit kommt a in einem Zertifikat vor, da einer der Eckpunkte in einem Zertifkat vorhanden ist. Jede Ecke kann höchsten in zwei x[..] Zertifikaten vorkommen, da jede Ecke jeweils Kinetische Datenstrukturen für zweidimensionale Probleme 239 nur einen rechten und linken Nachbarn besitzt. Außerdem kann er nur in jeweils einem der anderen Zertifikattypen vorkommen. Deswegen müssen wir nur die Anzahl der Zertifikate berechnen, in denen a als rivalisierende Kante vorkommt. Wenn a im Schnitt mit der anderen Kette liegt, kann die Kante als rivalisierene Kante in den Zertifikaten yli[..] und yri[..] liegen. Diese Konstellation kann nur zweimal auftreten, da a nach Definition der oberen Hülle höchstens zweimal von der anderen Kette geschnitten werden kann. Wenn a nicht von der anderen Kette geschnitten wird, kann a in höchstens zwei Dreiergruppen der tangentialen Zertifikate vorkommen. Das eine Zertifikat gilt, wenn a über einem Teil der andere Kette liegt und das andere, wenn sie unter einem Teil der anderen Kette liegt. Schließlich nehmen wir an, dass a die rivalisierene Kante von vielen Ecken ist. Dann haben diese Knoten alle die gleiche Farbe. Damit können nur der linkeste und der rechteste Knoten a als rivalisierende Kante in sl[..] oder sr[..] enthalten. So besitzt die Lokalität des Beweisschemas Komplexität O(1). t u Lemma 2. Die Menge der obigen Zertifikate beschreiben die obere Hülle. Beweis. Sei Π ein Konfiguration mit der Zertifikatenmenge L und Π 0 ein andere Konfiguration, in der diese Zertifikate gültig sind. Wir zeigen, dass die obere Hülle von Π 0 die gleichen Ecken enthält wie die obere Hülle von Π. Die x-Zertifikate beweisen die Korrektheit der Zeiger der rivalisierenden Kanten. Jeder Knoten, welcher in einem y-Zertifikat in L enthalten ist, befindet sich nach Voraussetzung auch in Π 0 und in Π. Es bleibt zu zeigen, dass Ecken ohne y-Zertifikate nicht nur in Π 0 oder Π liegen. Sei S eine maximale Menge von benachbarten Ecken ohne y-Zertifikate in L. Ohne Beschränkung der Allgemeinheit nehmen wir an, dass die rote Kette in diesem Teilabschnitt von Π unter der blauen Kette liegt. Sei 4(x) die Differenz zwischen der roten und blauen Steigung bei x in Π. Diese Funktion steigt bei roten Ecken und fällt bei blauen Ecken. Sie ändert nicht ihr Vorzeichen bei einer roten Ecke von S, da dies ein yt[..] Zertifikat in L bedeuten würde. So ist 4(x) in dem Intervall von S positiv bis zu einer bestimmten blauen Ecke und ab dann negativ. Wenn nun a die rivalisierende Kante dieser Ecke ist, existieren sl[..] Zertifikate zu der linken Kante des linken Endpunktes von a und sr[..] Zertifikate zu der rechten Kante des rechten Endpunktes von a. Diese Zertifikate garantieren, dass die rote Kette auf dem Interval von S über der blauen Kette bleibt. t u 2.3 Aktualisierung der konvexen Hülle Das letzte Lemma zeigt, dass die obrige Liste der Zertifikate ausreichend ist, um die obere Hülle zu erhalten. Um eine kinetische Datenstruktur zu erhalten, speichern wir alle Zertifikate in einer globalen Queue, in der diese nach ihrem Fälligkeitsdatum gespeichert sind. Wenn das erste Ereignis in der Queue eintritt, müssen wir die Liste der Zertifikate aktualisieren. Die Algorithmen für diese Veränderungen sind für jeden Ereignistyp im Folgenden dargestellt. Die graphische Darstellung einer Veränderungen wird in Abbildung 2 gezeigt. 240 Sabine Naewe Dabei fehlen drei Fälle. Es fehlen die gespiegelten Fälle von Fall 1 und Fall 3, und die Ereignisse, welche von den x-Zertifikaten abhängen. Abb. 2. Darstellung einiger Ereignisse Algorithmus 22 Ereignis: Ungültigkeit von yli[ab] 1: Lösche yri[ab.next], yli[ab]; 2: if ∃ yri[ab] then 3: Lösche yli[ab.prev], yri[ab]; 4: Erzeuge slt[ab], srt[ab], yt[ab]; 5: Hole ce(ab) von der Ausgabe; 6: else 7: Erzeuge yri[ab], yli[ab.prev]; 8: Füge a hinzu oder hole b aus der Ausgabe; Als Beispiel betrachten wir den Fall, dass das Zertifikat yt[ab], welches dem Fall 4 in Abbildung 2 entspricht, nicht mehr gültig ist. In diesem Fall bewegt sich eine rote Kante über eine blaue Ecke. Als erstes löschen wir die drei Zertifikate, welche beweisen, dass die rote Kante über der blauen liegt (letzter Fall in Abbildung 1). Dann fügen wir die Zertifikate Kinetische Datenstrukturen für zweidimensionale Probleme 241 Algorithmus 23 Ereignis: Ungültigkeit von yt[ab] 1: 2: 3: 4: Lösche yt[abt], slt[ab], srt[ab]; Erzeuge yt[ab], yri[ab.next]; Erzeuge yri[ab], yli[ab.prev]; Füge ce(ab) zur Ausgabe hinzu; Algorithmus 24 Ereignis: Ungültigkeit von slt[ab] 1: 2: 3: 4: 5: 6: Lösche slt[ab], srt[ab], yt[ab]; cd ← ab.prev; if d = a then Erzeuge slt[cd], srt[cd], yt[cd]; {z.B. gleiche Farbe} else Erzeuge sl[cd]; Algorithmus 25 Ereignis: Ungültigkeit von sl[ab] 1: 2: 3: 4: 5: 6: 7: Lösche sl[ab]; cd ← ab.prev; if χ(cd) 6= χ(ab) then Erzeuge slt[cd], srt[cd], yt[cd]; else if ce(cd) 6= cd(ab) then Erzeuge sr[cd]; hinzu, welche die zwei neuen Schnitte darstellen. Schließlich fügen wir die neue Kante der oberen Hülle zur Ausgabe hinzu. Die zu den Zertifikaten yri[ab], sr[ab] und srt[ab] symmetrischen Ereignisse sind die Zertifikaten yli[ab], sl[ab] und slt[ab]. Im Allgemeinen muss die Ausgabe geändert werden, falls sich ein y-Zertifikat ändert. Dabei werden entweder zwei Nachbarecken zu einer einzigen oder eine Ecke wird umgekehrt zu zwei verschiedenen Ecken, welche nun benachbart sind. Um dies rekuriv zu konstruieren, benötigen wir eine Möglichkeit lokale Strukturveränderungen in der Eingabe behandeln zu können. Damit erreichen wir, dass wir nur lokale Veränderungen vornehmen müssen und verringern die Laufzeit. Wenn nun zum Beispiel die Kante b zwischen den Kanten a und c verschwindet, existieren die Ecken ab und bc nicht mehr. Dafür entsteht nun die Ecke ac. Kurz bevor dieser Fall eintritt, kann b keine rivalisierende Kante zu einem anderen Knoten sein. Damit muss nur eine konstante Menge von Zertifikaten verändert oder gelöscht werden. Diese enthalten in der Klammer ihres Namens ab oder bc und enthalten nun stattdessen ac. Im umgekehrten Fall erscheint eine Kante b und teilt damit eine Ecke ac in zwei Ecken ab und bc. Damit müssen nur die Zertifikate mit ac im Namen geändert werden. Ein Steigungsvergleich zwischen b und der rivalisierenden Ecke von ac erfordert die Entscheidung, welcher der neuen Knoten die, falls vorhandenen, tangentialen Zertifikate erhalten muss. 2.4 Divide and Conquer Algorithmus für die obere Hülle In diesem Abschnitt wollen wir nun eine Struktur vorstellen, die eine Punktmenge und ihre Teilmengen verwaltet, um optimal die konvexe Hülle der Gesamtmenge berechnen zu können. Um diesen Divide and Conquer Ansatz umzusetzten, betrachten wir als erstes einen binären Baum. Ein Knoten ist nun dafür verantwortlich, die obere konvexe Hülle 242 Sabine Naewe Algorithmus 26 Ereignis: Ungültigkeit von x[ab, cd] 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: Lösche x[ab, cd]; Erzeuge x[cd, ab]; if ∃ x[cd, cd.next] then Lösche x[ab.prev, ab]; else Erzeuge x[ab.prev, cd]; if ∃ x[cd, cd.next] then Lösche x[cd, cd.next]; else Erzeuge x[ab, cd.next]; cd.prev ← ab.prev; ab.next ← cd.next; cd.next ← ab; ab.prev ← cd; ce(ab) ← d; ce(cd) ← a; /* Aktualisierung der Überschneidungszertifikate /* if ∃ yri[ab] then Lösche yri[ab]; Erzeuge yri[cd]; if ∃ yli[cd] then Lösche yli[cd]; Erzeuge yli[ab]; /* Aktualisierung der Steigungszertifikate, wenn ab unter cd ist /* if ab <y d then if ∃ yt[cd] then Lösche slt[cd], srt[cd], yt[cd] if ∃ sl[ab] then Lösche sl[ab]; if χ(ab) 6= χ(cd) & b <s d then Erzeuge sl[ab]; if χ(cd.prev) 6= χ(cd) & cd.prev <y ce(cd.prev) & a <s c then Erzeuge sl[cd.prev]; else if ∃ sr[ab] then if a <s d then Lösche sl[cd.prev]; Erzeuge slt[cd], srt[cd], yt[cd]; else Aktualisiere sr[ab] mit dem Punkt des neuen cd(ab); /* Analog für cd liegt unter ab/* der beiden Untermengen, die sich in den Kinderknoten befinden, zu berechnen. Wenn sich in einem der Kinderknoten etwas ändert, muss auch der Elternknoten neue Berechnungen durchführen und gibt wiederum seine neue Ausgabe an seinen Elternknoten weiter. So erhält man schließlich in der Wurzel die obere konvexe Hülle der Gesamtmenge. Diese Struktur besitzt Lokalität O(log n) und Antwortzeit O(log2 n). Analog zur Tournament Datenstruktur in [5] anaysieren wir die Effizienz unser Datenstruktur, indem wir die Zeit als eine zusätzliche statische Dimension betrachten. Dann betrachten wir jedes Ereignis als Element einer drei-dimensionalen Struktur mit bekannter worst-case Komplexität. Die erste Version unseres Problems ist für diesen Analyseansatz schlecht geeignet, da die statische Struktur der konvexen Hülle während der Berechnung Kinetische Datenstrukturen für zweidimensionale Probleme 243 nicht der konvexen Hülle der Trajektorien der eigentlichen Punkte entspricht. Andererseits entspricht die obere Hülle unser betrachteten Struktur genau der oberen Hülle der Fläche der eigentlichen Linien. Deswegen können wir auf bereits bewiesene Resultate für die obere Hülle von algebraischen Flächen zurückgreifen [1]. Sie liefern eine nahezu quadratische Komplexität. Agarwal, Schwarzkopf und Sharir haben bewiesen, dass die Oberfläche der Projektionen von zwei oberen Hüllen nahezu quadratische Komplexität hat [1]. Damit erhält man eine scharfe Grenze für die Anzahl der Ereignisse infolge von x-Zertifikaten. Theorem 1. Die kinetische Datenstruktur zur Erhaltung der konvexen Hülle besitzt O(n2+ε ) Effizienz für jedes ε > 0 in einem (δ, n)-Szenario. Dabei hängt die Konstante in der ONotation von δ und ε ab. Beweis. Ein (δ, n)-Szenario ist ein Szenario mit n Elementen, bei dem die Trajektorie eines Objektes ein Vektor von Polynomen in t mit Grad kleiner δ bildet [5]. Sei n die Anzahl der roten und blauen Linien in dem Berechnungsbaum. Als erstes betrachtet man die Ereignisse, welche mit einem speziellen Knoten des Berechnungsbaumes verknüpft sind. Dabei sei die Zeit die statische dritte Dimension. Dann beschreibt eine Linie, deren Parameter polynomiale Funktionen abhängig von der Zeit sind, eine algebraische Fläche im Dreidimenisionalen. Die Familie der blauen (bzw. roten) Linien wird dann als Familie von bivariaten algebraischen Funktionen betrachtet. Wenn man nun die beiden oberen Hüllen und ihre gemeinsame Hülle betrachtet, sieht man, dass ein violetter Knoten in dem zugeordneten Maximierungsdiagramm einem Vorzeichenwechsel in einem y-Zertifikat entspricht. Ein monochromatischer Knoten entspricht dann dem Erscheinen bzw. Verschwinden einer Kante, was durch einen Nachfahren ausgelöst wird. Da unsere Flächen algebraisch einen begrenzeten Grad haben, besitzt ihr Maximierungsdiagramm Komplexität O(n2+ε ) für jedes ε > 0 (Theorem 2.7 [1]). Damit wird die Anzahl der Ereignisse abhängig von dem Vorzeichenwechsel der y-Zertifikate durch diese Schranke begrenzt. Nun betrachten wir die Ereignisse, die von der Neuordnung der x−Koordinaten von zwei Knoten mit verschiedenen Farben abhängen. Wir nennen diese im folgenden x-Ereignisse. Im dreidimensionalen wird dann ein blauer Hüllenknoten zu einer Kante des blauen Maximierungsdiagramms. Damit entspricht ein x-Ereignis einem Punkt (x, t), über dem sich eine Kante befindet, die sowohl in der blauen als auch in der roten Hülle enthalten ist. Das heißt, jedes x-Ereignis ist mit einem bichromatischen Knoten auf der Oberfläche des Maximierungsdiagramms der roten und blauen oberen Familie verbunden. Wenn wir n bivariate algebraische Flächen mit begrenzeten Grad haben, ist die Komplexität also O(n2+ε ) für jedes ε > 0 (Theorem 2.8) [1]. Damit haben wir höchstens so viele x-Ereignisse. Schließlich liegt jedes Paar von Linien für eine konstante Anzahl von Zeitpunkten parallel zueinander. Damit ergeben sich O(n2 ) Steigungs-Ereignisse, welche mit dem bis jetzt betrachteten Knoten verknüft sind. Wenn wir nun wieder den gesamten Berechnunsbaum betrachten, erhalten wir zusammenfassend die Ereignisanzahl C(n). Diese erfüllt die Rekurrenzgleichung C(n) = 2C( n2 ) + O(n2+ε ). Damit ergibt sich C(n) = O(n2+ε ). t u Im schlimmsten Fall ändert sich die konvexe Hülle von n Punkten mit linearem oder höherem Grad Ω(n2 ) Mal; damit ist diese kinetische Datenstruktur effizient. Insgesamt ist diese Datenstruktur für die konvexe Hülle nicht sehr hilfreich, solange man keine Datenstruktur für die Anfragen benutzt. Diese kann man aber leicht erhalten, indem 244 Sabine Naewe man die gegebenen Ecken und Kanten nicht in einer doppelt verketteten Liste sondern in einem dynamischen binären Baum speichert. Dadurch wird die Effizienz nicht verändert, aber die Anfragen nach der Lage eines Punktes verbessert sich. 3 Dichtestes Paar Als nächstes betrachten wie das Problem des dichesten Paares. Bei diesem Problem ist wieder eine Menge M mit n Punkte gegeben. Gesucht wird nun ein Paar von Punkten x, y ∈ M mit: ∀ a, b ∈ M : |x − y| ≤ |a − b|. Es ist ziemlich einfach eine kinetische Datenstruktur zu finden, welche dieses Problem löst. Man erzeugt eine Prioritätsschlange, welche alle möglichen Abstände zwischen je zwei Punkten aus M enthält. Das Problem hierbei ist, dass diese kinetische Datenstruktur weder lokal noch kompakt ist, da jeder Punkt in O(n) vielen Zertifikaten enthalten ist. Um nun eine kompakte kinetische Datenstruktur zu erhalten, betrachten wir als erstes einen effizienten Algorithmus, welcher das dichteste Paar einer Punktemenge berechnet. Ein klassischer Divide and Conquer Algorithmus hierfür ist der von Shamos [4]: Man teilt die Menge der Punkte in zwei annähernd gleich große Mengen und berechnet rekurisiv die kleinsten Abstände δL und δR . Dann betrachtet man alle Paare von Punkten, welche einen Abstand kleiner oder gleich δ = min(δL , δR ) von der vertikalten Linie x = x0 zwischen den beiden Teilmengen besitzen (Abbildung 3). Wenn man nun zulässt, dass sich die Punkte auch bewegen können, benötigt man für jeden Punkte p auf der linken Seite ein Zertifikat der Form [xp < x0 − δ] oder umgekehrt. Wenn dann ein Punktepaar δ viele Veränderungen durchführen würde, müssten alle Zertifikate der obrigen Form aktualisiert werden und das können O(n) viele sein. Deswegen hätte die daraus resultierende kinetische Datenstruktur eine so große Antwortzeit, so dass sie in diesem Fall nicht sinnvoll ist. Abb. 3. Algorithmus für das dichteste Paar Dieses Beispiel zeigt, dass nicht alle Algorithmen auf die Möglichkeit der Bewegung erweitert werden können. Bis jetzt wurde für keinen bekannten Algorithmus für das dichteste Paar eine Erweiterung auf die Bewegung der Elemente gefunden. In diesem Abschnitt erläutern wir nun einen neuen statischen Algorithmus für die Berechnung des dichtesten Paares einer Menge von Punkten in der Ebene. Er basiert auf dem Kinetische Datenstrukturen für zweidimensionale Probleme 245 plane sweep paradigm bzw. ebenen Durchlaufmodell. Dannach betrachten wir die Erweiterung für sich bewegende Punkte. Jedes Element besitzt dann eine Position, welche eine kontinuierliche Funktion in Abhängigkeit von der Zeit ist. Dann benötigen wir einige Datenstrukturen um den Verlauf zu speichern. Für diese Datenstrukturen zeigen wir dann, dass sie während der Bewegung der Elemente aufrechterhalten werden können. Damit erhalten wir einen Algorithmus, welcher unsere Anforderungen erfüllt. 3.1 Statischer Algorithmus Der statische Algorithmus für das Problem des dichtesten Paares basiert auf der Idee der Teilung des Raumes um einen Punkt in sechs 60 Gebiete. Trivialerweise ist der nächste Nachbar jedes Punktes der nächste der nächsten Nachbarn in den sechs Gebieten. Wir werden zeigen, dass eine auf eindimensionalen Projektionen basierende approximative Definition des nächsten Nachbarn in jedem Gebiet ausreichend ist, um das dichteste Paar zu finden. Mit dieser Definition können wir dann die Nachbarn effizient berechnen und später die Bewegung der Objekte in den Algorithmus einbringen. In diesem Abschnitt betrachten wir eine Menge S von Elementen in einer festen Konfiguration. Um die Notation zu vereinfachen, unterscheidet man nicht zwischen den Elementen und ihrer Position in der Konfiguration. Wir bezeichen den Abstand zwischen zwei Punkten p und q mit d(p, q). Nun definieren wir drei verschiedene Ordnungen auf S. Für die erste Ordnung projektieren wir die Punkte orthogonal auf die x−Achse. Die hierauf geltende Ordnung bezeichnen wir als die x-Ordnung. Für die zweite Ordnung projektieren wir die Punkte orthogonal auf eine orientierte Linie, welche mit der x-Achse einen 60 Winkel bildet. Wir definieren als die +60 Ordnung die Ordnung der orthogonalen Projektion auf ihrer Position auf einer orientierten Linie. Analog definieren wir die −60 Ordnung. Für diese drei Ordnungen schreiben wir <0 , <+ , <− . Die Annahme einer beliebigen Lage bedeutet, dass kein Element bezüglich dieser drei Ordnungen gleich einem anderen Element ist und dass keine zwei Paare von Elementen die gleiche Distanz besitzten. Mit diesen Annahmen sind diese Strukturen und das dichteste Paar eindeutig definiert. Im Folgenden leiten wir nun eine notwendige und hinreichende Bedingung für das dichteste Paar her. Dafür benötigen wir im Folgenden einige Sätze und Definitionen. Lemma 3. Sei T ein gleichseitigen Dreieck, u einer der Begrenzungsknoten und v ein Punkte auf der Begrenzungskante gegenüber von u. Dann gilt für jeden Punkt w im Inneren von T: d(w, v) < d(u, v) Beweis. Sei a die Länge einer Seite von T und b = d(u, v). Die Begrenzungskante, welche v enthält, besitzt zwei Endknoten. Sei z der Knoten, welcher von den beiden weiter von v entfernt liegt. Dann können wir schreiben d(v, z) = a2 + c für ein c mit 0 ≤ c ≤ a2 . Mit dem Satz von Pythagoras gilt b2 = c2 + 34 a2 und damit: a a a2 (b − (c + ))(b + (c + )) = b2 − c2 − ac − 2 2 4 a2 = − ac 2 ≥0 246 Sabine Naewe Dann gilt b ≥ c + a2 . Der Kreis mit dem Mittelpunkt v und dem Radius d(u, v) enthält alle drei Knoten der Begrenzung von T und damit alle alle inneren Punkte von T . t u Wir definieren den dominierenden Keil eines Elements p als den nach rechts erweiterten Keil, welcher durch die Linien durch p, die mit der x− Achse einen 30 bzw. −30 Winkel bilden, begrenzt wird. Wir bezeichnen ihn mit Dom(p). Ein Element q liegt in Dom(p), genau dann wenn p <− q und p <+ q gelten. Mit der Bedeckung eines Elementes q bezeichnen wir das am weitesten rechts liegende Element, welches q in seinem dominierenden Keil enthält und bezeichnen sie als Cover(q). Damit die Bedeckung immer definiert ist, fügen wir ein Element (−∞, 0) hinzu. Die Kandidatenmenge eines Elementes p, bezeichnet mit Cands(p), bezeichne die Menge von Elementen, dessen Bedeckung p ist und das von diesen am weitesten links liegende Element, bezeichnet mit lcand(p), nennen wir den linken Kandidaten von p. Ein Paar (p, lcand(p)) heißt ein Kandidatenmenge. Sie werden in Abbildung 4 dargestellt. Abb. 4. Darstellung von U pT arget(p), lcand(p), Cands(p), M axima(p) Lemma 4. Sei S eine Menge von Elementen in beliebiger Lage. Wenn (p, q) das dichteste Paar in S ist und q ∈ Dom(p) gilt, ist q der linke Kandidat von p. Beweis. Den Beweis führen wir indirekt. Als erstes nehmen wir an, dass p nicht die Bedeckung von q sein. Das bedeutet, dass eine anderes Element r ∈ S rechts von p liegt und damit q ∈ Dom(r) gilt. In diesem Fall liegt r im Inneren eines gleichseitigen Dreiecks. Dieses Dreieck hat q als rechte Ecke und p liegt auf der linken Begrenzungslinie (Abbildung 5 a). Lemma 3 widerspricht dann der Annahme, dass (p, q) das dichsteste Paar ist. Also gilt p = cover(q). Nun nehmen wir an, dass ein Punkt q 0 ∈ S ∩ Dom(p) existiert, welcher links von q liegt. Dann liegt q 0 in Inneren eines gleichseitigen Dreiecks mit p als linker Ecke und q liegt auf der rechten Begrenzungslinie. Dann gilt mit Lemma 3, dass d(q, q 0 ) < d(p, q). Das widerspricht wieder (p, q) als dichtestes Paar. Damit ist q der linke Kandidat von p (Abbildung 5 b). t u Nun haben wir nur noch n Kandidatenpaare für eine Menge mit n Elementen. Wir bezeichnen diese Elementenpaare verbunden der 0 Richtung. Um nun das dichteste Paar zu finden, definieren wir analog die obrigen Definitionen für die Richtungen +60 und −60. Dabei ist der dominierende Keil verbunden mit einem der Winkel 4 einfach der Keil, welchen man nach den obrigen Definitionen erhält, wenn wir die Fläche mit −4 um den Ursprung drehen. Kinetische Datenstrukturen für zweidimensionale Probleme 247 Abb. 5. Wenn (p, q) das dichteste Paar ist und q ∈ Dom(p), dann ist p die Bedeckung von q (a); q der linke Kandidat von p (b). Korollar 1. Das dichteste Paar einer n−elementigen Menge S in beliebiger Lage ist eines der höchstens 3n Kandidatenpaare, welche mit den drei Richtungen 0, +60, −60 verbunden sind. Beweis. Sei (p, q) das dichteste Paar der Menge S, wobei p links von q liegt. Die drei dominierenden Keile von p spannen die ganze rechte Halbebene von der Vertikalen durch p auf. Damit liegt q in einem dieser Keile. Mit dem Lemma 4 folgt, dass (p, q) ein Kandidatenpaar für diese Richtung ist. t u Für ein gegebenes Element p bezeichnen wir nun mit Sp die Menge aller Elemente zu seiner rechten Seite. Die Elemente aus Sp , dessen Bedeckung nicht in Sp liegt, wird mit Maxima(p) bezeichnet. Diese Menge wird in Abbildung 4 dargestellt. Proposition 1. Wenn q, r ∈ Cands(p), dann gilt: q <+ r ⇔ r <− q ⇔ q <y r Beweis. Nach Voraussetzung liegen q und r nicht im dominierenden Keil des anderen. Damit liegt r entweder unter oder über dem doppelten Keil, welcher durch die 30 und −30 Linien durch p begrenzt wird. Falls ein Punkt über oder unter einem anderen liegt, sind die Ordnung <+ und <− die entgegengesetze Ordnung der anderen. Damit ist die Ordnung <+ die gleiche wie die y-Ordnung. u t Der dominierende Keil von p teilt M axima(p) in drei Mengen. Die zentrale Menge in dem dominierenden Keil enthält die Kandidaten von p. Das niedrigste Element in der Menge über Dom(p) wird als oberes Ziel von p mit U pT arget(p) bezeichnet. Analog bezeichnet man das größte Element in der Menge unter Dom(p) als unteres Ziel mit LowT arget(p) bezeichnet. Das obere Ziel ist genau der linke Kandidat von p in Richtung +60 (Abbildung 4). Widerum fügt man Markierungen für −∞ und +∞ hinzu, damit die beiden Ziele wohldefiniert sind. Proposition 2. Wenn U pT arget(q) = U pT arget(r) und q <0 r gilt, folgt q <− r. Wenn LowT arget(q) = LowT arget(r) und q <0 n r, gilt q <+ r. Beweis. Wir beweisen nur die erste Behauptung. Die zweite Behauptung folgt dann analog. Sei P das gemeinsame obere Ziel von q und r. Wir nehmen an, dass q links von r liegt. Wenn r <− q, dann liegt r über dem dominierenden Keil von q. Da aber r unter p liegt, kann p nicht oberes Ziel von q sein. Das ist ein Widerspruch zur Voraussetzung. Also gilt q <− r. t u 248 Sabine Naewe Nun skizzieren wir den statischen Algorithmus zur Berechnung aller Kandidatenpaare in Richtung 0 aus der Menge S. Dabei fügen wir die Elemente von rechts nach links ein und speichern die Menge M axima(p) in einem binären Baum Maxima. Dabei sortieren wir die Elemente nach der ansteigenden y-Koordinate bzw. äquivalenterweise durch die 60 oder −60 Ordnung. Dieser Baum wird für jedem Knoten mit einem Feld erweitert. Dieses enthält das linkeste Element in dem Unterbaum, welcher diesen Knoten als Wurzel hat. Dieses Feld wird später für die Bewegung benötigt. Im statischen Fall ändert sich die Laufzeit nicht wesentlich ohne dieses Feld, da man auch alle Elemente aus Cands(p) betrachten kann. Der dazu gehörige Algorithmus wird unten dargestellt. Algorithmus 27 Berechnung aller Kandidatenpaare in 0 Richtung 1: 2: 3: 4: 5: 6: Initialisiere Maxima mit ∅ Für jeden Punkte p ∈ S von rechts nach links: (a) Finde U pT arget(p) und LowT arget(p) in Maxima (b) Setze Cands(p) = M axima ∩ Dom(p) (c) Setze lcand(p) als das linkeste Element von Cands(p) (d) Ersetze die Elemente aus Cands(p) durch p in Maxima Man sieht, dass dieser plane sweep Algorithmus mit Laufzeit O(n log n) implementiert werden kann. Das Sortieren zur Vorbereitung des Durchlaufs benötigt O(n log n). Man speichert Maxima in einer erweiterten balancierten binären Baumstruktur, welche Einfügen, Suchen, Löschen, Trennen und Verbinden in logarithmischer Zeit unterstützt [1]. Die Berechnung von Cands(p) erfordert zwei O(log n) Suchen in Maxima, falls Cands(p) eine fortlaufende Untermenge von Maxima ist. Das Herausnehmen von Cands(p) aus Maxima und Einfügen von p auf diese Plätze benötigt O(log n) für jedes Element p. Dabei muss das Feld des linkesten Elements aktualisiert werden. Insgesamt beträgt die Laufzeit O(n log n). Der gleichen Algorithmus wird dann für die Flächen rotiert um 60 und −60 verwendet um alle Kandidatenpaare aus Korollar 1 zu bekommen. Aus diesen Paaren kann man in linearer Zeit das dichsteste Paar berechnen. So erhält man das dichteste Paar mit worstcase Laufzeit O(n log n). Der Algorithmus zur Berechnung der Kandidatenpaare benötigt nur Vergleiche in den drei Richtungen 0, 60 und −60. Damit sind die Bedeckung, das Ziel und der linke Kandidat für jeden Punkt durch die Ordnung entlang dieser drei Richtungen definiert. Wir sprechen von allen diesen Attributen als die Kegelstruktur von S. Proposition 3. Die folgende Menge von Zertifikaten auf einer Menge S reicht aus um die Kegelstruktur und das dichsteste Paar von S zertifizieren. 1. Zertifikate zur Bestätigung der 0 Ordnung auf S 2. Zertifikate zur Bestätigung der 60 Ordnung auf S 3. Zertifikate zur Bestätigung der −60 Ordnung auf S 4. Zertifikate zur Bestätigung der Ordnung der Kandidatenpaaren aus S. Diese Beweisstruktur hat lineare Größe und O(log n) Lokalität. Beweis. Die Gültigkeit des Beweises ist durch die Korrektheit des Algorithmus gegeben. Nun betrachten wir die Lokalität. Jedes Element kommt höchstens in zwei Zertifikaten in der geordneten Liste vor. Außerdem ist jedes Element für jede Richtung in höchstens zwei Kinetische Datenstrukturen für zweidimensionale Probleme 249 Kandidatenpaaren enthalten. Das eine Paar enthält noch seinen linken Kandidaten. Das anderen enthält zusätzlich das Element zu dem das Ausgangselement der linke Kandidat ist. Daher erscheint ein Element in der Kanditatenpaarordnung in O(1) Blättern und in O(log n) inneren Knoten. Damit hat die Beweisstruktur O(log n) Lokalität. t u 3.2 Die Bewegung der Elemente Im vorherigen Abschnitt haben wir uns mit einer Struktur beschäftigt, welche das dichteste Paar einer Menge berechnet. Im folgenden betrachten wir nun, wie sich die Struktur ändern muss, wenn ein Zertifikat verfällt und zählen dabei die worst case Anzahl von Ereignissen, die in unserem polynomiellen Bewegungsmodell auftreten können. Im [5] wurde die Aktualisierung des Wettbewerbes zwischen Kandidatenpaaren betrachtet. Nun müssen wir die Kegelstruktur aktualisieren, wenn sich die Ordnung zweier Elemente auf einer der drei betrachteten Richtungen ändert. Wenn zwei Elemente ihre Plätze tauschen, kann dies höchstens eine Veränderung in der Bedeckung von O(n) vielen Elementen ändern. Genauso kann eine Veränderung in der 60 Ordnung höchstens linear viele Veränderungen von Zielen mit sich bringen. Um nun eine ansprechbare kinetische Datenstruktur zu bekommen, stellt man die Ziele und Bedeckungen implizit in drei verschiedenen Binärbäumen dar. 1. Cands(p) enthält alle Kandidaten von p. Diese werden nach ihrer y−Ordnung sortiert. Die Folge dieser Elemente wird nun in einem balancierten Binärbaum gespeichert. Dieser unterstützt Suchen und Aktualisieren. Zusätzlich bekommt jeder Knoten einen Zeiger auf seinen Elternknoten in dem Baum und auf die Wurzel dieses Baumes. Damit kann man für jedes Element q ∈ S seine Bedeckung in O(log n) finden. Außerdem kennt jeder Knoten seinen in x-Ordnung in seinem Unterbaum am weitesten links liegendes Element. Damit speichert die Wurzel von Cands(p) lands(p). Die Korrektheit des Elternzeigers kann in einer Standardbaumaktualisierungsoperation mit dem gleichen asymptotischen Aufwand wie das Feld des linkesten Kandidaten erhalten bleiben. Dieses Feld muss immer überprüft werden, falls sich die x-Ordnung ändert. 2. Hitsu (p) enthält alle Elemente, welche p als ein oberes Ziel besitzten. Sie werden nach der −60 Ordnung sortiert und in einem balancierten Binärbaum gespeichert. Dabei besitzt jeder Knoten einen Zeiger auf seinen Elternknoten und auf p in der Wurzel, so dass für jedes Element das obere Ziel in logarithmischer Zeit gefunden werden kann. 3. Analog enhält Hitsl (p) alle Elemente, für die p ein unters Ziel ist. Mit diesen Datenstrukturen kann nun die Bewegung der Elemente simuliert werden, wobei wir die Maxima Datenstruktur selbst nicht mehr benutzen. Der statische Algorithmus ist nützlich, um diese Datenstrukturen nach dem Verfall eines Ereignisses in O(n log n) zu erzeugen, wobei die beiden Hits Strukturen taktweise nach jedem gefundenen Ziel aufgebaut werden können. Um nun die Arbeitsweise dieser Datenstrukturen zu verdeutlichen, betrachten wir als erstes den Algorithmus, welcher Cands(), Hits() und lands() aktualisiert, wenn zwei Elemente p und q bzgl. der x-Ordnung ihre Positionen tauschen. Ohne Beschränkung der Allgemeinheit liegt p links von q und im Augenblick des Wechsels unter q. 250 Sabine Naewe 1: /*Schritt 1*/ 2: if q = U pT arget(p) then 3: (a) Hole aus Cands(q) die Elemente von Dom(p) und füge sie zur Spitze von Cands(p) hinzu. 4: (b) Sei w = LowT arget(q). Lösche q aus Hitsl (w) und füge es in Hitsl (p) hinzu. 5: (c) Sei v, falls vorhanden, das neue Bodenelement von Cands(q) oder sonst das obere Ziel von q. Lösche p aus Hitsu (q) und füge es in Hitsu (v) ein. 6: /*Schritt 2*/ 7: Sei p0 = Cover(p) und q 0 = cover(q). 8: if p0 = q 0 then 9: Aktualisiere lcand(p0 ) beginnend beim gemeinsamen Vorgänger von p und q im Baum für Cands(p0 ). Abb. 6. Ein x-Ereignis und die Veränderung von Cands Abbildung 6 verdeutlicht diesen Algorithmus. Dabei gilt, dass sich die Kegelstruktur ändert, falls q ein Ziel von p ist und sich ihre x-Koordinaten vertauschen. Dabei werden die Elemente aus Maxima(q) in Dom(q) ∩ Dom(p) von Cands(q) nach Cands(p) verschoben. Das Element p bekommt ein neues Ziel; der neue Punkt der Linie zwischen dem Abschnitt von p und seinem Ziel liegt in Dom(q). Ebenfalls bekommt q p als ein Ziel. Diese Veränderung geschieht in Schritt 1. Wir defininieren nun das Maximumdiagramm alsSdie Vereinigung aller Punkte, welche auf dem Rand von Dom(p) liegen und die nicht in q∈M axima(p) Dom(q) vorhanden sind. Die einzigen sich ändernden Kanten im Maximumdiagramm sind dann die, welche sich rechts von p und q erstrecken. Für Elemente rechts oder links von p, q ändert sich kein Ziel. Damit aktualisiert Schritt 1 auch das Maximumdiagramm. Wenn weder p noch q Ziel des anderen sind, ändert sich das Maximumdiagramm nicht und Cands() und Hits() Felder müssen nicht verändert werden. Ein lcand() Feld muss hingegen immer verändert werden. Falls p, q ∈ Cands(u) für ein u, muss sichergestellt werden, dass das Feld für den linkesten Kandidaten im Binärbaum für Cands(u) aktualisiert wird. Dafür wird jeder Vergleich von p und q in diesem Baum neu bewertet. Dadurch kann sich lcand(u) verändern. Dies geschied in Schritt 2. Jeder Schnitt des Algorithmus kann in logarithmischer Zeit durchgeführt werden. Dies gilt auch für Schritt 1(a), da Cands(q) nach der −60 Ordnung sortiert ist. Die Neuterminierung der modifizierten Zertifikate für die geänderte Ordnung benötigt ebenfalls logarithmische Zeit. Der folgende Pseudoalgorithmus aktualisiert das zugehörige Feld, wenn zwei Elemente p und q ihre Positionen in der +60 Ordnung von S wechseln. Während dieses Wechsels bildet die Linie durch p und q einen −30 Winkel mit der x-Achse. Ohne Beschränkung der Allgemeinheit nehmen wir an, dass p links und überhalb von q liegt. Dann können zwei verschiedene Fälle auftreten. Entweder kommt q zu Dom(p) dazu oder q verlässt diese Menge. Kinetische Datenstrukturen für zweidimensionale Probleme 251 Im ersten Fall kommt q zur Menge Dom(p) dazu. Dann wird die Datenstruktur wir folgt aktualisiert: 1: if q = LowT arget(p) then 2: (a) Sei v = Cover(q). Lösche q aus Cands(v) und füge es in Cands(p) ein. 3: (b) Sei t das linkeste Element in Hitsu (q), welches rechts von p liegt. Falls nicht vorhanden, setzte t gleich dem linkestes Ziel von q. Lösches p aus Hitsl (q) und füge p zu Hitsl (t) hinzu. 4: (c) Lösche die Untermenge aus Hitsu (q), dessen Elemente links von t (somit auch links von p) liegen füge sie an das Ende von Hitsu (p). Im zweiten Fall verlässt q die Menge Dom(p). Der hierzu gehörige Pseudocode vertauscht nur die Aktionen des ersten Falles: 1: if q ∈ Cands(p) then 2: (a) Sei t = LowT arget(q). Lösche p aus Hitsl (t) und füge es in Hitsl (q) ein. 3: (b) Lösche aus Hitsu (p) die Elemente kleiner als q bzgl. <− und füge sie am Anfgang von Hitsu (q) ein. 4: (c) Sei v das neue rechteste Element von Hitsu (p). Falls Hitsu (p) leer ist, sei v die Bedeckung von p. Lösche q aus Cands(p) und füge q zu Cands(v) hinzu. Diese Fälle werden in Abbildung 7 dargestellt. Von (a) nach (b) verdeutlicht den ersten Fall, während (b) nach (a) darstellt. Abb. 7. Ein 60 Ereignis Im ersten Fall kommt q zur Menge Dom(p) hinzu. Wenn q nicht das kleinste Ziel von p ist, gilt q 6∈ M axima(p) und damit verändert der Wechsel von p und q in der +60 Ordnung die Kegelstruktur nicht. Somit muss die Datenstruktur nicht verändert werden. Falls aber q das kleinste Ziel von p ist, verändert sich die Kegelstruktur. Dies geschieht aber nur in der Nähe von p und q. Ihr Wechsel verändert nicht die Ziele der Elemente rechts von p, nur das kleinste Ziel von p muss aktualisiert werden. Dies geschied in Schritt (b). Die Elemente links von p, welche q als ihr oberes Ziel haben, müssen p als ihr neues Ziel speichern. Diese Elemente liegen alle in Hitsu (q). Diese Aktualisierung geschied in Schritt (c). Von den Mengen Cands() änderts dich nur die Menge Cands(p), da q zu dieser Menge hinzukommt (Schritt (a)). Die Felder für die linkesten Elemente werden während den Veränderungen in den binären Bäumen der Mengen Cands() aktualisiert und bleiben damit korrekt. Die Listen der Mengen Cands() und Hits() reichen aus um die kombinatorische Struktur des Maximumdiagramms darzustellen. Damit ist dieses korrekt, solange die Mengen korrekt sind. 252 Sabine Naewe Im zweiten Fall sind die Wechsel im Maximumdiagramm genau umgekehrt zu denen im ersten Fall. Die Aktualisierung geschied genau umgekehrt zu der ersten Prozedur. Die hierbei benutzten Operationen sind alle in logarithmischer Zeit möglich. Dies gilt auch für den Schritt (b) im ersten Fall, da die Elmente aus Hitsu (q) in der x-Ordnung geordnet sind. Die Anzahl sich hierbei wechselnder Zertifikate beträgt O(1). Sie können in logarithmischer Zeit in der Ereignisschlange aktualisiert werden. Somit kann das gesuchte Element in logarithmischer Zeit gefunden werden. Das letzte Element unserer kinetischen Datenstruktur ist der kinetische Wettbewerb der 3n vielen Abständen, welche zu den (p, lcand(p)) Paaren gehören. Damit bekommen wir 3n zusätzliche Zertifikate zu unserer Datenstruktur. Die Wurzel unseren Baumes für diesen Wettbewerb enthält zu jeder Zeit das dichteste Paar. Dabei muss man beachten, dass wenn sich lcand(p) ändert, dies zu einer Unstetigkeit des zugehörigen Abstandes im kinetischen Wettbewerb führt. Insgesamt bekommen wir nun eine Datenstruktur, welche auf einem dynamischen Szenario arbeitet. Theorem 2. Die kinetische Datenstruktur für das dichteste Paar hat eine Effizienz von O(nλ2δ+2 (n) log2 n) in einem dynamischen (δ, n, m) Szenario. Beweis. Ein (δ, n, m) Szenario ist ein dynmisches Szenario, bei dem maximal n Objekte gleichzeitig sichtbar sein können und es m verschiedene Bewegungsabschnitte gibt. Auf diesen sind die Trajektorien wieder Polynome in t vom Grad kleiner als δ [5]. Ein Ereignis in der Kegelstruktur ist der Wechsel der Ordnung zweier Elemente entlang einer der drei Ordnungen. Ein Paar von Elementen kann seine Ordnung höchstens δ mal wechseln. Es gibt O(n2 ) solcher Ereignisse, welche wie vorher gesehen in O(log n) ablaufen. Das Quadrat des Abstandes zweier Elemente ist eine ganzrationale Funktion mit Grad 2δ. Damit ist das für den kinestischen Wettbewerb erzeugte Szenario ein dynamisches (2δ, n, n2 ) Szenario und hat damit Effizienz O(nλ2δ+2 (n) log2 n) (Lemma 3.8) [1]. t u Damit haben wir eine kinetische Datenstruktur für das dichsteste Paar. Sie ist linear, hat konstante Lokalität und O(log2 n) Antwortzeit, und fast optimale Effizienz und erfüllt damit unsere gewünschten Eigenschaften. 4 Zusammenfassung In diesem Kapitel haben wir nun am Beispiel der kinetischen Datenstruktur für die konvexe Hülle und die des dichstesten Paares einer Menge kinetische Datenstrukturen für zweidimensionale Probleme betrachtet. Das Vorgehen und die Analyse dieser beiden wichtigen geometrischen Probleme lässt sich nun auf andere Problem übertragen und anwenden. Mit ihnen lassen sich auch effiziente Algorithmen für Probleme in höheren Dimensionen finden. Somit stellen die kinetischen Datenstrukturen ein vielseitiges Hilfsmittel für viele Basisprobleme dar. Literaturverzeichnis 1. Julien Basch, 1999, Kinetic Data Structures, Seite 41-62 Kinetische Datenstrukturen für zweidimensionale Probleme 253 2. Dietrich Travkin, 2003, Kinetische Datenstrukturen, Seite 1-10 3. Leonidas J. Guibas, 1997, Kinetic Data Structures: A State of the Art Report, Seite 7-8 4. F. P. Preparata und M. I. Shamos, 1985, Computational Geometry: An Indroduction, Springer-Verlag, 1st ed. 1985. Corr. 5th printing edition (August 6, 1993), New York, NY 5. Peter Kling, 2007, Eine Einführung in kinetische Datenstrukturen, Technical report, University of Paderborn Dynamische Steinerbäume Holger Hagedorn Universität Paderborn, [email protected] Zusammenfassung. Diese Ausarbeitung beschreibt das Problem Dynamic Steiner Tree (DST). Praktische Anwendungen finden sich in Netzwerken, in denen sich die Menge der über Router zu verbindenden Rechner im Laufe der Zeit verändern. Im Teilproblem DST-N dürfen keine existierenden Verbindungen verändert werden. Hierfür zeigen wir, dass die Worst-Case Performanz für jeden Algorithmus mindestens 21 log n mal die Kosten einer optimalen Lösung beträgt mit n als Anzahl der Rechner. Weiterhin präsentieren wir einen Greedy-Algorithmus, der maximal die zweifachen Kosten dieser Schranke verursacht. Letztlich wird noch ein Ausblick auf Ergebnisse für das Teilproblem DST-R gegeben, in dem Veränderungen an bestehenden Verbindungen erlaubt sind. 1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 1.2 Definitionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256 1.3 Kompetitive Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 2 DST-N . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 2.1 Add Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258 2.2 Dynamischer Greedy-Algorithmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 2.3 Remove Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 3 DST-R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 4 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 1 Einleitung 1.1 Motivation Stellen wir uns ein Netzwerk von Rechnern vor. Ein paar Arbeitsrechner sind dafür vorgesehen miteinander verbunden zu werden und Daten auszutauschen. Unser Ziel ist es die Arbeitsrechner so miteinander zu verbinden, dass die zu übertragenden Daten möglichst schnell übermittelt werden. Dazu können die restlichen Rechner im Netzwerk als Router benutzt werden. Überträgt man dieses Problem auf einen gewichteten Graphen als das Netzwerk, so hat man eine gewisse Teilmenge der Knoten gegeben, die man mit einem Baum verbinden möchte. Dies könnte man über einen Spannbaum lösen, wie in Abbildung 256 Holger Hagedorn 1 (a) für drei Knoten gezeigt. Allerdings kann es eine günstigere Verbindung geben, sofern man noch andere Knoten des Graphen mit einbezieht. Der entstehende Baum wird Steinerbaum genannt und ist in Abbildung 1 (b) dargestellt. Ein Steinerbaum ist also eine Verallgemeinerung des Spannbaums. In vielen Netzwerken sind aber die Arbeitsrechner nicht statisch, sondern es werden immer wieder welche hinzugefügt und entfernt. Wir befinden uns damit also im Gebiet der Online-Algorithmen. Dieses sogenannte Dynamic Steiner Tree (DST) Problem wird von Imase und Waxman [1] vorgestellt. Dabei gibt es zwei verschiedene Teilprobleme. Im ersten Fall können beim Hinzufügen und Entfernen von Knoten die bestehenden Verbindungen nicht geändert werden. Im zweiten Fall sind solche Veränderungen erlaubt, allerdings wird die Anzahl derer beschränkt. Wir werden in diesem Abschnitt zunächst die beiden Teilprobleme formal definieren und daraufhin die kompetitiven Analyse als Technik vorstellen, mit der wir die Performanz von Online-Algorithmen analysieren können. In Abschnitt 2 befassen wir uns mit dem ersten Teilproblem. Dort zeigen wir erst eine untere Schranke für alle Algorithmen die nur Knoten ins Netzwerk hinzufügen. Dann stellen wir einen Greedy-Algorithmus für das Problem vor und beweisen seine Performanz. Zuletzt zeigen wir noch, dass im Fall wo auch Knoten aus dem Netzwerk entfernt werden können, keine obere Schranke existiert. In Abschnitt 3 geben wir einen kurzen Überblick über die Ergebnisse zum Teilproblem in dem Veränderungen zugelassen sind. 1.2 Definitionen Wir bezeichnen mit G = (V, E) einen ungerichteten und zusammenhängenden Graphen. Dabei steht V (G) für die Knotenmenge und E(G) für die Kantenmenge. Der Grad deg(v) eines Knoten v ist definiert als die Anzahl inzidenter Kanten. Ein Teilgraph G0 von G wird mit G0 ⊆ G notiert bzw. mit G0 ⊂ G für einen echten Teilgraphen. Ein einfacher Pfad in einem Graphen ist ein Pfad in dem jeder Knoten nur einmal vorkommt. Mit dist : V × V → R+ wird ein kürzester Weg zwischen zwei Knoten bezeichnet. Weiterhin gibt es zu jedem Graphen eine Kostenfunktion cost : E → R+ . Eine Instanz I des Problems DST besteht aus einem Graphen G, der Kostenfunktion cost und einer Folge von Anfragen σ = {σ0 , . . . , σK } mit σi = (vi , ρi ) wobei vi ∈ V und ρi ∈ {add, remove}. Definition 1 (Steinerbaum). Gegeben ein zusammenhängender, ungerichteter Graph G = (V, E), eine Gewichtsfunktion cost : E → N+ und eine Menge von Terminalen S ⊆ V . Ein Steinerbaum T = (V 0 , E 0 ) ist ein zusammenhängender Teilbaum von G, in dem S ⊆ V 0 gilt. (a) (b) Abb. 1. Beispiel für (a) einen Spannbaum auf drei Knoten und (b) einen Steinerbaum auf denselben Knoten Dynamische Steinerbäume 257 Bei einem minimalen P Steinerbaum (man spricht auch von dem Steinerbaum-Problem ST) gilt zusätzlich, dass e∈E 0 cost(e) minimal ist. Bei dem korrespondierenden Online-Problem Dynamic Steiner Tree verändert sich die Menge der Terminale. Si beschreibt dabei die Terminale zum Zeitpunkt i. Wir definieren nun die beiden Ausprägungen dieses Problems. Definition 2 (DST-N). Gegeben sei eine Instanz I = (G, cost, σ). Das Problem DST-N (Nonrearrangeable Dynamic Steiner Tree) besteht darin, eine Folge von Bäumen (Ti )0≤i≤K zu finden, so dass P eine Funktion cost(Ti ) für alle 0 ≤ i ≤ K minimiert wird. In diesem Fall ist cost(Ti ) = e∈E(Ti ) cost(e). Dabei müssen folgende Bedingungen eingehalten werden: 1. Jeder Baum Ti ist ein Steinerbaum auf Si . 2. Falls σi eine add-Anfrage ist, dann muss Ti−1 ⊆ Ti gelten. 3. Falls σi eine remove-Anfrage ist, dann muss Ti ⊆ Ti−1 gelten. Definition 3 (DST-R). Gegeben sei eine Instanz I = (G, cost, σ). Das Problem DST-R (Rearrangable Dynamic Steiner Tree) besteht darin, eine Folge von Bäumen (Ti )0≤i≤K zu finden, so dass eine Funktion cost(Ti ) für alle 0 ≤ i ≤ K minimiert wird. Dabei müssen die folgenden Bedingungen eingehalten werden: 1. Jeder Baum Ti ist ein Steinerbaum auf Si . 2. Die Anzahl der Änderungen dürfen eine obere Schranke B nicht überschreiten. Offensichtlich ist in der letzteren Version die Einschränkungen um Ti aus Ti−1 zu konstruieren relaxiert. Zusätzlich sind allerdings die Anzahl der Veränderungen um von Ti−1 nach Ti zu gelangen beschränkt. Die Anzahl der Änderungen im Schritt i werden mit αi bezeichnet und entsprechen der Anzahl der Zusammenhangskomponenten in Ti−1 ∩ Ti abzüglich eins. 1.3 Kompetitive Analyse Wir führen in diesem Kapitel eine Analysetechnik für Online-Algorithmen ein, die Optimierungsprobleme lösen (vgl. [3]). In unserem Fall haben wir ein Minimierungsproblem vorliegen, denn wir wollen mit Hilfe eines Algorithmus A einen Steinerbaum für eine gegebene Instanz I = (G, cost, σ) von DST erzeugen, der möglichst geringe Kosten hat. Wir bezeichnen dabei mit A(Si ) die Kosten cost(Ti ) des Baumes, den A für Si generiert hat. Weiterhin bezeichne OP T (Si ) die Kosten eines minimalen Steiner-Baumes auf Si . Im allgemeineren Fall sprechen wir von einem unter Betrachtung stehenden OnlineAlgorithmus A und einem optimalen Offline-Algorithmus OP T . Optimal bedeutet, dass er unter allen möglichen Instanzen I eine der Lösungen liefert, die geringstmögliche Kosten verursacht. Im Vergleich zu Offline-Algorithmen, wo die Eingabegröße bekannt ist, sind bei Online-Algorithmen zu Beginn des Berechnungsvorgangs nicht alle Eingabedaten verfügbar. Die Eingabedaten werden vielmehr zur Laufzeit ergänzt. Dies ist durch die Eingabefolge σ ausgedrückt. Berechnungen von A dürfen zum Zeitpunkt i immer nur von der Anfrage σi abhängen. Es stellt sich nun die Frage, wie wir die Güte solcher Online-Algorithmen analysieren können. Die klassische Worst-Case Analyse mit dem O-Kalkül versagt an dieser Stelle, da die Eingabegröße nicht verfügbar ist. Daher hat sich eine Analysetechnik durchgesetzt, die kompetitive Analyse genannt wird. Die Idee dahinter ist, dass man einen Online-Algorithmus 258 Holger Hagedorn A gegen einen Gegner antreten lässt (daher kompetitiv). Der Gegner stellt Anfragen σi immer gerade so, dass die Lösung die A produziert möglichst hohe Kosten hat. Das Verhältnis, wie schlecht A dabei abschneidet, wird gemessen indem man die Lösung von A der Lösung von OP T gegenüber stellt. Definition 4 (c-Kompetitivität). Sei A ein Online-Algorithmus und OP T ein optimaler Offline-Algorithmus. A ist c-kompetitiv, genau dann wenn gilt: ∃a ≥ 0 : ∀0 ≤ i ≤ K : A(σi ) ≤ c · OP T (σi ) + a c wird hierbei kompetitiver Faktor genannt. Wenn a = 0 dann ist der Algorithmus strikt c-kompetitiv. Eine alternative (vielleicht intuitivere) Definition des kompetitiven Faktors die sich auch oft in der Literatur wiederfindet ist c = max 0≤i≤K A(σi ) . OP T (σi ) (1) Angewendet auf das Problem DST-N lässt sich dies auch formulieren als A(I) = max 0<i≤K A(Si ) . OP T (Si ) (2) Die Worst-Case Performance Ratio von A für alle Instanzen I (mit |I| als maximaler Größe des Terminal-Sets) beträgt CA (n) = sup {A(I) | I ist Instanz mit |I| = n} . 2 DST-N In diesem Abschnitt betrachten wir das Problem DST-N, also den Fall ohne Änderungen an bestehenden Verbindungen. Wir konzentrieren uns zunächst nur auf add -Anfragen und zeigen hierfür eine untere Schranke. Danach geben wir den Greedy-Algorithmus DGA an und beweisen seine Kompetitivität. Zum Schluss betrachten wir den allgemeinen Fall in dem auch remove-Anfragen zugelassen sind. Hierfür wird gezeigt, dass es keine obere Schranke für beliebige Algorithmen gibt. 2.1 Add Requests Dieser Unterabschnitt behandelt DST-N ausschließlich für add -Anfragen. Um eine untere Schranke für diesen Fall herzuleiten, definieren wir zunächst eine spezielle Form von Graphen. Definition 5 (P-Graph). Ein P-Graph Gk = (Vk , Ek ) mit k ∈ N und einer konstanten Kostenfunktion ck : Ek → R+ ist wie folgt rekursiv definiert: 1. G0 enthält zwei Knoten v0 , v1 ∈ V0 (Level 0 Knoten) die über eine Kante verbunden sind und es gilt c0 = 1. Dynamische Steinerbäume 259 2. ∀0 < i ≤ k : Für alle Kanten (u, v) ∈ E(Gi−1 ) wird ein eindeutiges Paar von Knoten α, β (Level i Schwestern) eingeführt. Die Kante (u, v) wird durch die zwei Pfade (u, α, v) und (u, β, v) ersetzt. Der resultierende Graph ist Gi . Jede Kante von Gi besitzt Gewicht ci = 2−i . Abbildung 2 verdeutlicht die rekursive Konstruktion für die Graphen G0 , . . . , G3 . In G1 sind exemplarisch die hinzugefügten Knoten α und β benannt. Man beachte auch die sich mit jedem Schritt halbierende Kostenfunktion. Eine wichtige Beobachtung ist, dass die Kosten eines einfachen Pfades von v0 nach v1 immer 1 betragen. Auf einem P-Graph kann weiterhin eine spezielle Form der Adjazenz definiert werden. Definition 6 (i-Adjazenz). Zwei Knoten u, v ∈ Vk eines P-Graphen Gk sind i-adjazent, 0 ≤ i ≤ k, wenn es einen Pfad von u nach v gibt, so dass gilt: 1. Level von u und v ist höchstens i. 2. Auf dem Pfad gibt es nur Verbindungsknoten mit Level echt größer als i. Ein Beispiel für i-Adjazenz in einem G3 ist in Abbildung 3 gegeben. Exemplarisch sind hier je ein Pfad für 1-, 2- und 3-adjazente Knoten eingezeichnet. Man erkennt weiterhin, dass es nur beschränkte Möglichkeiten für i-adjazente Knoten gibt. In diesem Graphen können 1-adjazente Knoten nur von Level 1 nach 0, 2-adjazente nur von Level 2 nach 1 oder 0, und 3-adjazente nur von Level 3 nach 2, 1 oder 0 verbunden werden. Die einzigen Knoten die 0-adjazent sein können sind v0 und v1 . Überdies folgt aus der Definition sofort, dass i-adjazente Knoten in einem P-Graphen Gk mit k > i im P-Graphen Gi adjazent sind. Lemma 1. Für alle P-Graphen Gi mit i ≥ 2 gilt: 1. Jeder Knoten x auf Level i ist adjazent zu genau zwei Knoten, nämlich Knoten v auf Level i − 1 und Knoten u auf Level j mit 0 ≤ j < i − 1. Weiterhin hat x einen Schwesterknoten y auf Level i der ebenfalls zu u und v adjazent ist. 2. Für alle Knoten v auf Level i−1 gilt, dass sie immer adjazent sind zu genau vier Knoten auf Level i die aus zwei Schwesterpaaren bestehen. Level v0 0 3 2 3 α β 1 3 2 3 0 v1 G0 c0 = 1 G1 c1 = G2 1 2 c2 = G3 1 4 Abb. 2. Beispiel für P-Graphen c3 = 1 8 260 Holger Hagedorn Level v0 0 1-adjazent 3 2-adjazent 2 3-adjazent 3 1 3 2 3 0 v1 G3 , c3 = 1 8 Abb. 3. Beispiel für i-Adjazenz Daraus folgt, dass für Graphen Gk mit k ≥ i die Bedingungen 1 und 2 erhalten bleiben, wenn man das Wort adjazent durch i-adjazent ersetzt. Beweis. Das Lemma kann leicht per vollständiger Induktion bewiesen werden. Induktionsanfang ist bei i = 2. Für einen G2 stimmt die Behauptung, was sich leicht anhand Abbildung 2 nachprüfen lässt. Nehmen wir nun an, die Behauptung gelte für i. Wir zeigen, dass die Behauptung dann auch für i + 1 gilt. In Abbildung 4 sehen wir auf der linken Seite einen Ausschnitt aus einem Graphen Gi . Der Knoten x auf Level i hat genau wie verlangt einen Schwesterknoten y und zwei adjazente Knoten u und v. Per Definition eines P-Graphen werden nun um Gi+1 zu erzeugen für jede Kante zwei Knoten α und β eingefügt. Diese befinden sich auf Level i + 1. Diese Transformation ist auf der rechten Seite in Abbildung 4 Level u u α = x0 y x y0 = β v0 = x j (0 ≤ j < i − 1) i+1 i i+1 i−1 v Schritt i Schritt i + 1 Abb. 4. Induktionsschritt Dynamische Steinerbäume 261 zu sehen. Wenn wir uns nun wieder einen Knoten als neues x0 herausnehmen (im Beispiel α), dann hat dieser wiederum einen Schwesterknoten y 0 (im Beispiel β) und ist zu zwei Knoten u0 und v 0 verbunden. Im Beispiel gilt u0 = u und der Knoten liegt damit zwangsläufig auf Level j mit 0 ≤ j < (i + 1) − 1. Weiterhin wird aus dem alten x das neue v 0 , welches auf Level i = (i + 1) − 1 liegt. Damit gilt Behauptung 1 des Lemmas. Behauptung 2 gilt ebenfalls, da v 0 zu genau vier Level i = (i + 1) − 1 Knoten adjazent ist, von denen je zwei Geschwister sind. Anhand der Abbildung lässt sich erkennen, dass alle Eigenschaften nicht nur für die betrachteten x0 und y 0 gelten, sondern für alle neu eingeführten Knoten α und β. t u Definition 7 (k-Sequenz). Für einen P-Graphen Gk wird eine Folge N = (N0 , . . . , Nk ) k-Sequenz genannt, wenn es einen Pfad p gibt der v0 und v1 verbindet und für alle 0 ≤ i ≤ k gilt: Ni = {v ∈ V (p) | v ist auf Level i} Als Beispiel für eine k-Sequenz nehmen wir einen P-Graphen G3 an und es sei ein Pfad gegeben als (v0 , a, b, c, d, e, f, g, v1 ). Dann ist die korrespondierende 3-Sequenz dazu: N = ({v0 , v1 }, {d}, {b, f }, {a, c, e, g}) An diesem Beispiel lässt sich auch leicht erkennen, dass für i ≥ 1 immer |Ni | = 2i−1 gilt. Eine weitere Folgerung aus der Definition ist, dass der von N induzierte Pfad immer die Kosten 1 hat. Definition 8 (Minimale Baum-Sequenz). Gegeben sei eine k-Sequenz N für einen PGraphen Gk . Eine Folge T̂ = (T̂0 , . . . , T̂k ) wird minimale Baum-Sequenz genannt und induktiv definiert wie folgt: 1. T̂0 ist ein beliebiger Steinerbaum für N0 und kein T̂00 ⊂ T̂0 ist Steinerbaum für N0 . 2. ∀0 < i ≤ k : T̂i−1 ⊆ T̂i und T̂i ist Steinerbaum für Ni und kein T̂i0 ⊂ T̂i ist Steinerbaum für Ni . Offensichtlich ist T̂0 immer ein einfacher Pfad zwischen v0 und v1 . Mithilfe dieser und der vorherigen Definition können wir jetzt ein Lemma formulieren, welches eine untere Schranke für Algorithmen angibt, die minimale Baum-Sequenzen erzeugen. Ein beliebiger Algorithmus A erzeugt T̂i immer basierende auf dem Wissen über T̂i−1 und Ni . Es kann gezeigt werden, dass Knotenmengen Ni existieren, die immer die Kosten von A mindestens auf die Größe der unteren Schranke treiben. Wegen der Restriktion von σ auf eine k-Sequenz existiert immer ein minimaler Steinerbaum mit Kosten 1, nämlich ein einfacher Pfad von v0 nach v1 . Lemma 2. Sei A ein Algorithmus für DST-N, der für alle Instanzen I = (Gk , cost, σ) eine minimale Baum-Sequenz T̂ konstruiert. Dann existiert eine Folge von Anfragen auf Gk , die einer k-Sequenz N entspricht, so dass für alle 0 ≤ i ≤ k gilt: 1 cost(T̂i ) ≥ 1 + i . 2 (3) 262 Holger Hagedorn Beweis. Das Lemma wird per vollständiger Induktion über i für alle T̂i mit 0 ≤ i ≤ k bewiesen. Wir konstruieren dazu eine Eingabe σ, die einer k-Sequenz N entspricht, so dass Ungleichung (3) gilt. Der Induktionsanfang ist bei i = 0 und i = 1. Für i = 0 gilt die Behauptung, da N0 nach Definition nur die Knoten v0 und v1 beinhaltet, die über einen einfachen Pfad T̂0 mit Kosten 1 im Graphen Gk verbunden werden können (vgl. Abbildung 2). N0 bildet somit den Präfix einer k-Sequenz und Ungleichung (3) gilt. Für N1 bleiben uns nun zwei Knoten auf Level 1 zur Auswahl. Wenn wir den Knoten nehmen, der nicht auf dem Pfad T̂0 liegt, dann ergibt sich für T̂1 ein Baum mit Kosten cost(T̂1 ) ≥ 1, 5 und Ungleichung (3) gilt. Natürlich existiert auch ein Pfad mit Kosten 1 über den neuen Knoten, aber da per Definition T̂0 ⊆ T̂1 gelten muss, kann dieser von A nicht gewählt werden. Da der Pfad mit Kosten 1 für N0 und N1 existiert (unabhängig von T̂0 und T̂1 ), bilden (N0 , N1 ) einen Präfix einer k-Sequenz. Als Induktionsvoraussetzung nehmen wir an, dass Ungleichung (3) für alle j mit 0 ≤ j ≤ i − 1 gilt und (N0 , . . . , Ni−1 ) der Prefix einer k-Sequenz ist. Der Induktionsschritt geht nun von i − 1 nach i. Wieder wird ein Gegner angenommen, der immer unter Erhalt einer k-Sequenz auf den Algorithmus A reagiert und Knoten so setzt, dass die gewünschten Kosten verursacht werden. Der Algorithmus A hat also einen Baum T̂i−1 erzeugt, der Gegner wählt nun eine Folge von Anfragen Ni gerade so, dass A nur einen Baum T̂i erzeugen kann, der mindestens die gewünschten Kosten hat. Per Widerspruch können wir beweisen, dass zu jedem Knoten v ∈ Ni−1 nur höchstens ein Knoten pro i-adjazentem Schwester-Paar in T̂i−1 enthalten ist. Dazu betrachten wir einen Knoten v ∈ Ni−1 . Dieser ist nach Lemma 1 (2) i-adjazent zu genau vier Knoten auf Level i, aufgeteilt auf zwei Schwesterpaare. Angenommen T̂i−1 würde beide Knoten eines Level i Schwesterpaares enthalten. Dann müsste T̂i−1 entweder einen Zyklus enthalten, was aber der Minimalität dieses Steinerbaums widersprechen würde. Oder aber es gäbe einen Blattknoten z ∈ T̂i−1 , der sich auf einem Level größer als i − 1 befinden würde. Da Nj (0 ≤ j ≤ i − 1) nach Definition nur Knoten der Level 0 bis i − 1 enthält, gilt z 6∈ Nj . D.h. z könnte auch weggelassen werden, also ist wiederum die Minimalitätsbedingung verletzt. Damit kann es in T̂i−1 zu jedem Knoten v ∈ Ni−1 nur höchstens einen Knoten pro i-adjazentem SchwesterPaar geben. Um die Anfrage Ni zu bilden, wählen wir nun für jedes v ∈ Ni−1 jeweils einen der noch nicht in T̂i−1 enthaltenen i-adjazenten Schwesterknoten x aus (vgl. Abbildung 5). Nach I.V. gibt es einen Pfad mit Kosten 1, der alle Knoten aus jedem Nj , 0 ≤ j ≤ i − 1 enthält. In der Abbildung würde dieser Pfad durch u und v verlaufen. Also existiert auch ein Pfad über x, da alle weiteren Knoten die zwischen u und v liegen einen Level größer als i besitzen und also nicht aus (N0 , . . . , Ni−1 ) stammen. Damit gilt die k-Sequenz Eigenschaft auch mit dem neuen Knoten x ∈ Ni . Nach Lemma 1 (1) ist jeder Level i Knoten i-adjazent zu einem Knoten auf Level i − 1. Daraus folgt, dass in Ni alle Knoten des Levels i auf diesem Pfad enthalten sind. Somit ist auch (N0 , . . . , Ni−1 , Ni ) Präfix einer k-Sequenz. Kommen wir nun zu den Kosten des von A generierten Baumes T̂i . Die Anzahl der Knoten in Ni−1 beträgt genau 2i−2 . Da zu jedem dieser Knoten zwei Knoten auf Level i verbunden werden, sind insgesamt genau 2i−1 Knoten in Ni enthalten. Die kürzeste Verbindung dieser Knoten aus Ni mit den Knoten aus T̂i−1 entspricht einer Kante im Gi bzw. einem korrespondierenden Pfad im Gk . Per Definition des P-Graphen hat eine solche Verbindung Kosten 2−i . Dynamische Steinerbäume 263 ··· v ∈ Ni−1 Level i − 1 ··· .. . .. . Level > i ··· T̂i−1 63 x y ∈ T̂i−1 Level i ··· .. . .. . Level > i ··· Level j, 0 ≤ j < i − 1 u ··· Abb. 5. Ausschnitt des Induktionsschritts =⇒ I.V. 1 1 1 cost(T̂i ) ≥ cost(T̂i−1 ) + (2i−1 · 2−i ) ≥ 1 + (i − 1) + = 1 + i 2 2 2 Damit ist insgesamt das Lemma bewiesen. t u Theorem 1. Sei A ein beliebiger Algorithmus für DST-N. Dann existiert eine Instanz I = (G, cost, σ), so dass gilt ∀0 < i ≤ K : A(Si ) 1 ≥ 1 + blog(|Si | − 1)c . OP T (Si ) 2 (4) Diese Schranke gilt insbesondere, wenn wir uns auf das Hinzufügen von Knoten beschränken. Beweis. Die Idee hinter dem Beweis ist, dass wir uns eine k-Sequenz auf einem P-Graphen konstruieren, so dass Lemma 2 zur Ungleichung (4) umformuliert werden kann. Wir definieren uns dazu eine Instanz I = (Gk , ck , σ) von DST-N mit σi = (ui , add) für alle 0 ≤ i ≤ K = 2k . Dabei gilt u0 = v0 , u1 = v1 und für i > 1 gilt ui ∈ Nj mit j = dlog ie für eine k-Sequenz N . Diese entspricht genau der k-Sequenz, die wir als Eingabe für den Algorithmus A aus Lemma 2 benötigen. Zuerst verdeutlichen wir warum σ durch diese Definition einer k-Sequenz N entspricht. Man kann leicht nachrechnen, dass nach allen 2i add -Anfragen die Knoten für Ni vollständig sind. Insbesondere brauchen wir also K = 2k add -Anfragen um eine k-Sequenz zu erhalten. σ entspricht also einer k-Sequenz N . Damit gilt auch die Ungleichung (3). Lemma 2 gilt allerdings nur im Bereich zwischen 0 und k. Darum ersetzen wir das i in (3) durch log(i), denn log(2k ) = k. Wir runden diesen Wert zusätzlich ab, da wir nach Lemma 2 nur für eine j-Sequenz mit j = dlog ie die untere Schranke für die Kosten garantieren können. Nun haben wir immer noch eine Abhängigkeit von i, wir wollen die Ungleichung aber abhängig machen von der Menge der Terminale Si . Da |Si | − 1 = i, kann dies leicht ersetzt werden. Damit gilt insgesamt die Ungleichung (4) und das Theorem ist bewiesen. u t 264 Holger Hagedorn Algorithmus 28 DGA Input: (G, cost, σ) Output: (Ti )0≤i≤K 1: T0 ← ({v0 }, ∅) 2: S0 ← {v0 } 3: i ← 1 4: for i ≤ K do 5: if σi is add request then 6: pi ← Shortest path from vi to Ti−1 7: Ti ← Ti−1 ∪ pi 8: Si ← Si−1 ∪ {vi } 9: else if σi is remove request then 10: Ti ← Ti−1 11: Si ← Si−1 \ {vi } 12: while ∃w ∈ V (Ti ) \ Si : deg(w) = 1 do 13: Ti ← Ti \ w 2.2 Dynamischer Greedy-Algorithmus Der Online-Algorithmus DGA (Dynamic Greedy Algorithm) berechnet eine Lösung für das Problem DST-N mit einem Greedy-Ansatz. Im wesentlichen verbindet er neue Knoten mit dem nächstgelegenen Knoten des aktuellen Steinerbaumes. Algorithmus 28 beschreibt die Details in Pseudocode. Wir zeigen als nächstes, dass DGA strikt dlog |Si |e-kompetitiv ist. Ein wesentlich einfacherer Beweis als der im Paper von Imase und Waxman stammt von Bartal [2]. Theorem 2. Sei I = (G, cost, σ) eine beliebige Instanz des Problems DST-N mit Anfragen σ = σ0 , . . . , σK und Terminalen Si zum Zeitpunkt i. Wenn alle Anfragen in der Form σi = (vi , add) sind, dann gilt: ∀1 ≤ i ≤ K : DGA(Si ) ≤ dlog |Si |e OP T (Si ) (5) Beweis. Sei I = (G, cost, σ) eine Instanz von DST-N und Ti∗ der minimale Steinerbaum, der alle Knoten in Si spannt. Weiterhin sei Hi ein minimaler Kreis über alle Knoten in Si . Abbildung 6 illustriert diesen Zusammenhang. Der Kreis ist von oben beschränkt durch das zweifache des optimalen Steinerbaumes, also cost(Hi ) ≤ 2 · cost(Ti∗ ) . Diese obere Schranke ergibt sich aus dem Kreis der entsteht, wenn man einfach an einem beliebigen Knoten von Ti∗ startet und einmal aussen an dem ganzen Baum entlanggeht. Dabei muss jede Kante einmal in Hin- und einmal in Rückrichtung passiert werden, was die zweifachen Kosten verursacht. Natürlich kann Hi aber auch andere Kanten verwenden und daher günstiger sein. Betrachten wir zwei beliebige adjazente Knoten u, v ∈ Hi , wobei v nach u hinzugefügt wurde. Die Kosten für das Hinzufügen von v sind maximal die Kosten des Pfades zwischen u und v im Kreis Hi , da alle benachbarten Knoten in Hi durch einen kürzesten Pfad verbunden sind. Wir teilen nun alle Knoten entlang des Kreises Hi in b|Si |/2c Paare von adjazenten Knoten auf (vgl. Abbildung 6). Dabei können die Paare gerade so gewählt werden, dass die Dynamische Steinerbäume 265 akkumulierten Kosten ihrer verbindenden Kanten nur halb so groß sind wie die des gesamten Kreises. Daraus folgt, dass die Kosten dieser Paare auch nur maximal so hoch sein können, wie die von Ti∗ . Angewendet auf DGA befinden wir uns also in der Situation, in der jeweils genau einer der Knoten eines solchen Knotenpaares gegeben ist und der zweite als add -Anfrage hinzugefügt wird. Die Kosten die DGA für diese halbe Menge der Terminale verursacht sind folglich höchstens so teuer wie die Kosten von Ti∗ , also DGA(b|Si |/2c) ≤ OP T (Si ) . Wichtig zu beachten ist dabei, dass diese halbe Menge der Terminale nicht zwingend der Suffix der Anfragen σ sein muss, sondern nur paarweise die zuletzt hinzugefügten Knoten betrachtet werden. Entfernen wir nun diese zuletzt hinzugefügten Knoten, dann können wir die übrig gebliebenen wiederum zu einem minimalen Kreis verbinden und in adjazente Knotenpaare aufteilen. Die Kosten von DGA entsprechen wiederum maximal den Kosten von Ti∗ . Dies wird sukzessive so fortgeführt bis nur noch ein Knoten übrig bleibt. Die Frage ist nun also, wie oft wir diese Aufteilung vornehmen müssen – wie oft wir also maximal die Kosten von Ti∗ beanspruchen. Dazu können wir die obige Ungleichung als eine Rekurrenzgleichung auffassen. Nach Auflösen ergibt sich, dass wir dlog |Si |e mal die Menge der Terminale wie beschrieben aufteilen müssen. Daraus folgt die Ungleichung (5) und das Theorem ist bewiesen. t u 2.3 Remove Requests Bislang haben wir nur add -Anfragen betrachtet. Wenn jetzt noch zusätzlich removeAnfragen hinzukommen, dann kann gezeigt werden, dass im Worst-Case die Kosten eines Algorithmus A für DST-N unbeschränkt sind. Die Kosten sind dann abhängig von der Anzahl der Terminale. Theorem 3. Sei A ein Algorithmus für DST-N. Für alle Paare M, l ∈ N+ gibt es eine Instanz (G, cost, σ) von DST-N und ein j ∈ N+ , so dass Ti∗ Hi v u Abb. 6. Der minimale Steinerbaum Ti∗ (schwarze Linien), der minimale Kreis Hi (graue Linien) und dessen Aufteilung in b|Si |/2c Paare von adjazenten Knoten (fett gestrichelte Linien). 266 Holger Hagedorn 1 1 1 1 1 1 1 1 Abb. 7. Spezieller Graph in dem |V | = 2M + 4 gilt, hierbei für M = 6. Die hellen Knoten bilden einen Kreis C mit M + 2 Knoten. A(Si ) ≥ M · OP T (Si ) (6) für alle j < i ≤ j + l unabhängig von der Anzahl der Terminale in Si . Beweis. Wir betrachten folgenden gewichteten Graphen G = (V, E) mit |V | = 2M + 4. Hierin befindet sich ein Kreis C mit M + 2 Knoten in dem alle Kanten das Gewicht 1 haben. Die restlichen M + 2 Knoten sind jeweils durch genau eine Kante mit Gewicht zu einem der Knoten in C verbunden. Ein Beispiel dieses Graphen für M = 6 findet sich in Abbildung 7. Für einen Algorithmus A werden nun mit den ersten M + 2 Anfragen die Knoten des Kreises hinzugefügt. Also gilt für alle 0 ≤ i ≤ M + 1, dass σi = (qi , add). Da immer der nächstliegende Knoten hinzugefügt wird, ist der vom Algorithmus A erstellte Steinerbaum TM +1 ein Pfad, der bis auf eine Kante dem Kreis C entspricht. Die Knoten dieses Pfades seien der Reihe nach durchnummeriert mit q0 , . . . , qM +1 . Die Kosten entsprechen genau cost(TM +1 ) = M + 1. In den nächsten M Schritten wird immer wieder ein Knoten mit Kantengrad zwei aus dem Kreis entfernt. Formal gilt also für alle M +2 ≤ i ≤ 2M +2, dass σi = (vi , remove) und deg(vi ) = 2. Der Algorithmus A wird die aus der Menge der Terminale entfernten Knoten trotzdem weiter benutzen, da er nach Definition von DST-N nur Kanten löschen, aber keine neuen einfügen darf. Daraus folgt, dass TM +1 = TM +2 = . . . = T2M +1 . Nach entfernen der Knoten sind nur noch gerade die zwei Knoten in der Menge der Terminale übrig, die zuvor die Start- und Endknoten des Pfades TM +1 waren, also S2M +1 = {q0 , qM +1 }. Da TM +1 = T2M +1 ist, gilt cost(T2M +1 ) = M + 1. Allerdings wäre ein optimaler Steinerbaum lediglich die Verbindung der zwei Knoten q0 und qM +1 durch deren verbindende Kante und somit OP T (S2M +1 ) = 1. An dieser Stelle gilt also die Ungleichung (6). Um diese Eigenschaft aufrecht zu erhalten, werden nun für alle σi mit i > 2M + 2 immer alternierend ein Knoten hinzugefügt und entfernt. Dieser Knoten ist genau einer der Knoten, die durch eine Kante mit Gewicht mit q0 , qM +1 ∈ T2M +1 verbunden sind. Der Wert von kann beliebig klein gemacht werden, so dass M + 1 + ≥ M · (1 + ) gilt. Somit gilt nach jedem Schritt die Ungleichung 6 und das Theorem ist bewiesen. t u Dynamische Steinerbäume 267 3 DST-R In diesem Abschnitt werden wir aus Platzgründen nur einen kurzen Überblick über die Ergebnisse in [1] zum Problem DST-R geben. Zur Erinnerung, der Unterschied zu DSTN war, dass nun Änderungen in existierenden Verbindungen zulässig sind. Die Anzahl der Änderungen ist aber beschränkt. Falls die Anzahl nicht beschränkt ist, dann ist das Problem in jedem Schritt äquivalent zum statischen Steinerbaum-Problem ST. Für DST-R gibt es eine Klasse von Algorithmen, die δ-Kanten-beschränkte Algorithmen genannt werden. Jeder spezifische Algorithmus (EBA(δ)) ist bestimmt durch eine positive reelle Zahl δ ≥ 1. Doch bevor wir etwas über diese Algorithmen aussagen können, benötigen wir die folgenden zwei Definitionen. Definition 9 (δ-Kanten-beschränkt). Seien u, v ∈ T und T ist ein Baum. Falls u und v die folgende Bedingung erfüllen, werden sie als δ-Kanten-beschränktes Paar bezeichnet. Für ein beliebiges e ∈ p(u, v, T ) gelte cost(e) ≤ δ · dist(u, v) (7) mit p(u, v, T ) als Menge von Kanten auf dem Pfad zwischen u und v in T . Weiterhin wird T als δ-Kanten-beschränkter Baum bezeichnet, wenn jedes Knotenpaar in T δ-Kantenbeschränkt ist. Definition 10 (Erweiterungsbaum). Für eine Knotenmenge S wird ein Baum T als Erweiterungsbaum bezeichnet, falls er die folgenden Eigenschaften erfüllt: • S ⊆V. • Für einen beliebigen Knoten x ∈ V \ S ist deg(x) > 2 in T . Der Algorithmus EBA(δ) basiert auf dem Algorithmus M ST A [4], der einen minimalen Spannbaum approximiert. Er liefert für eine gegebene Knotenmenge einen Spannbaum, der nie höhere Kosten hat als das Zweifache vom Optimum. Für DST-R jedoch verursacht er unter Umständen sehr viele Änderungen von Verbindungen. Die von M ST A generierten Spannbäume sind 1-Kanten-beschränkte Bäume, daher kann ein δ-Kanten-beschränkter Baum als eine Generalisierung davon verstanden werden. Die nun folgenden Theoreme sind Folgerungen aus Lemmas, die diese Schranken für δ-Kanten-beschränkte Bäume und Erweiterungsbäume zeigen. Da EBA(δ) solche Erweiterungsbäume für jedes Si berechnet, gelten die Schranken auch für die von diesem Algorithmus erzeugten Lösungen. Theorem 4. Für einen beliebigen von EBA(δ) erstellten Baum Ti gilt, dass er ein δKanten-beschränkter Erweiterungsbaum für Si ist und für alle 0 ≤ i ≤ K gilt weiterhin cost(Ti ) ≤ 2δ · M ST A(Si ) ≤ 4δ · OP T (Si ) . (8) Theorem 5. Falls alle σi auf add-Anfragen beschränkt sind, dann genügt jeder von EBA(δ) erzeugte Baum Ti der folgenden Ungleichung: cost(Ti ) ≤ δ · M ST A(Si ) ≤ 2δ · OP T (Si ) . (9) 268 Holger Hagedorn Als letztes stellen wir noch eine obere Schranke für die Gesamtanzahl von Änderungen für EBA(δ) vor. Dabei bezeichne Ka die Anzahl add -Anfragen und Kr die Anzahl removeAnfragen. Theorem 6. Sei I = (G, cost, σ) eine beliebige Instanz. Falls δ ≥ 2, dann ist die obere Schranke für die totale Anzahl an Änderungen die von EBA(δ) benötigt werden gegeben durch K X p 1 αi ≤ Ka ( 4Ka − 3 − 3) + Kr . (10) 2 i=0 4 Fazit In dieser Ausarbeitung haben wir zwei Ausprägungen des Problems Dynamic Steiner Tree vorgestellt. Für DST-N konnten wir zeigen, dass es im allgemeinen Fall unbeschränkt ist. Lässt man jedoch nur das Hinzufügen von Knoten zu, so gibt es eine obere Schranke. Wir haben den Greedy-Algorithmus DGA vorgestellt, dessen Worst-Case Performanz innerhalb dem zweifachen des optimalen Falles liegt. Weiterhin haben wir für DST-R den Algorithmus EBA(2) vorgestellt, dessen Performanz im achtfachen des Optimums liegt. Literaturverzeichnis 1. Imase M, Waxman BM (1991) Dynamic Steiner Tree Problem. SIAM J. Disc. Math. Vol. 4 No. 3:369– 384 2. Bartal Y (1994) Competitive Analysis of Distributed On-line Problems – Distributed Paging. Ph.D. Thesis, Tel-Aviv University, Tel-Aviv 3. Borodin A, El-Yaniv R (1998) Online Computation and Competitive Analysis. Cambridge University Press, New York 4. Kou L, Markowsky G, Berman L (1977) A fast algorithm on Steiner trees. Acta Inform. 3:141–145 Approximationen und Alternativen für Aspektgraphen David Schmelter Universität Paderborn Zusammenfassung. Ein wesentliches Problem bei der Verwendung von Aspektgraphen ist ihre Komplexität, sowohl was die Größe, als auch den Konstruktionsaufwand betrifft. Dies macht eine praktische Verwendung bereits für 3D Szenen mit wenigen hundert Polygonen unmöglich. In dieser Arbeit werden daher sowohl Approximationen (im Wesentlichen der Finite-Resolution Aspect Graph) als auch Alternativen (im Wesentlichen das Visibility Skeleton) für Aspektgraphen betrachtet, denen eine gewisse Praxisrelevanz zugeschrieben werden kann. Der Finite-Resolution Aspect Graph bietet für den Fall der orthografischen Projektion ein Verfahren, das einen Aspektgraphen mit geringerer Komplexität im Vergleich zum klassischen Aspektgraphen ermöglicht. Allerdings leidet dieses Verfahren unter einem hohen Konstruktionsaufwand, was eine praktische Verwendung bereits für einfache Szenen verwehrt. Mit dem Visibility Skeleton existiert eine interessante Alternative für Aspektgraphen, mit der eine Reihe unterschiedlicher Anfragen auch für nicht-triviale 3D Szenen effizient beantwortet werden können. 1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 1.1 Approximationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270 1.2 Alternativen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 1.3 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 2 Finite-Resolution Aspect Graphs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273 2.1 2.2 2.3 2.4 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 Konstruktion des Finite-Resolution Aspect Graphs . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 Anwendungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 3 Visibility Skeleton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 3.1 3.2 3.3 3.4 3.5 3.6 Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 Definitionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 Datenstruktur des Visibility Skeletons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 Konstruktion des Visibility Skeletons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 Anwendungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 4 Zusammenfassung und Diskussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 Literaturverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 270 David Schmelter 1 Einleitung Viele Verfahren in der Computergrafik (beispielsweise globale Beleuchtungsverfahren wie Radiosity) benötigen detaillierte Information über globale Sichtbarkeiten von Objekten. Mit Aspektgraphen [8] existiert eine Datenstruktur, mit der diese Informationen exakt für jeden Punkt einer dreidimensionalen Szene gespeichert und abgefragt werden können. Die Kosten für die Erzeugung machen eine praktische Verwendung des Aspektgraphen bereits für Szenen mit wenigen hundert Polygonen allerdings unmöglich (unter Annahme perspektivischer Projektion ist die maximale Größe des Aspektgraphen für n Polygone O(n9 ), die Konstruktionszeit beträgt O(n9 log n)). Es gibt unterschiedliche Ansätze, um diesem Problem zu begegnen. Zum einen wurden Approximationen für Aspektgraphen entwickelt. Darüber hinaus gibt es alternative Verfahren, die sich auf eine etwas andere Weise dem Sichtbarkeitsproblem nähern. In dieser Arbeit werden sowohl unterschiedliche Approximationen (Finite-Resolution Aspect Graphs, Scale Space Aspect Graphs und Weighted Aspect Graphs) als auch alternative Verfahren (das Visibility Skeleton und der 3D Visibility Complex) vorgestellt und untersucht. Der Schwerpunkt soll hierbei auf Verfahren mit einer gewissen Praxisrelevanz liegen. Wir werden sehen, dass hierfür Aspektgraphen mit endlicher Auflösung (Finite-Resolution Aspect Graphs) und das Visibility Skeleton in Frage kommen. 1.1 Approximationen In diesem Abschnitt wird zunächst ein kurzer Überblick über die im vorherigen Abschnitt bereits erwähnten Approximationen für Aspektgraphen gegeben. Finite-Resolution Aspect Graphs Bei der Konstruktion von Aspektgraphen wurde bisher eine Kamera bzw. Projektion mit unendlicher Auflösung angenommen. Typischerweise besitzt eine reale Kamera aber nur eine endliche Auflösung. Daraus resultiert, dass in einem Aspektgraphen Details berücksichtigt werden, die vom Betrachter gar nicht unterschieden werden können. Abbildung 1 verdeutlicht dies an einem Beispiel: Auf der linken Seite der Abbildung ist eine Kante und ein Vertex in einer Projektion mit unendlicher Auflösung dargestellt. In diesem Fall ist der Abstand beider Elemente erkennbar. Auf der rechten Seite der Abbildung ist die gleiche Projektion mit endlicher Auflösung dargestellt. In diesem Fall scheinen sich beide Elemente zu berühren, der Abstand ist für einen Betrachter nicht erkennbar. Abb. 1. Projektion mit unendlicher Auflösung (links) und endlicher Auflösung (rechts). Nach [11] Approximationen und Alternativen für Aspektgraphen 271 Shimshoni und Ponce haben in [11] einen Algorithmus zur Konstruktion eines Aspektgraphen für den Fall einer orthografischen Projektion vorgestellt, der die Einschränkung endlicher Auflösung einer realen Kamera berücksichtigt. Dieser Aspektgraph speichert Aspekte eines Objekts mit endlicher anstatt unendlicher Auflösung. Shimshoni und Ponce gehen davon aus, dass ein solcher Aspektgraph eine relativ geringe Komplexität besitzt und die entsprechenden Aspekte dennoch genug Details, z.B. zur Objekterkennung, enthalten. Hierzu wurde der Schwellenwert eingeführt. Beispielsweise können zwei Vertexe unterschieden werden, wenn sie in einer Projektion mit endlicher Auflösung mindestens um den Wert voneinander entfernt sind. Da der Algorithmus zur Konstruktion des Finite-Resolution Aspect Graphs vollständig implementiert wurde, wird dieses Verfahren in dieser Arbeit in Kapitel 2 näher untersucht. Scale Space Aspect Graphs Der von Eggert et al. in [6] vorgestellte Scale Space Aspect Graph kann in gewissem Sinne als eine Verallgemeinerung des Finite-Resolution Aspect Graphs aufgefasst werden. Man kann sich vorstellen, dass die Komplexität eines Aspektgraphen mit endlicher Auflösung immer mehr abnimmt, je größer der Schwellenwert gewählt wird. Die Idee ist, durch den ScaleParameter σ mit einem stetigen Wertebereich zu ersetzen um so einen Aspektgraphen mit beliebig anpassbarer Komplexität zu erhalten. Für σ = 0 entspricht der Finite-Resolution Aspect Graph einem klassischen Aspektgraphen mit unendlicher Auflösung. Wird σ stetig erhöht erhält man schließlich einen Aspektgraphen mit nur einem Aspekt. In [6] geht es in erster Linie darum, unterschiedliche Interpretationen von Scale-Parametern zu identifizieren und zu untersuchen. Die Arbeit liefert allerdings keinen Algorithmus zur Konstruktion des Scale Space Aspect Graphs, bleibt also auf theoretischer Ebene und wird daher im Kontext dieser Ausarbeitung nicht weiter betrachtet. Weighted Aspect Graphs Arie stellt in [1] eine weitere Möglichkeit vor, um Aspektgraphen zu vereinfachen bzw. zu approximieren. Er gibt eine Wahrscheinlichkeit (bzw. das Gewicht) für ein Element eines Objektes an, mit der dieses Element im Bildraum sichtbar ist. Abbildung 2 zeigt zur Verdeutlichung einen Würfel unter orthografischer Projektion. Die markierte Fläche a ist exakt in der oberen Halbkugel von S 2 sichtbar. Somit ist das Gewicht dieser Fläche 12 . Die Idee von Arie ist, für jeden Knoten des Aspektgraphen ein solches Gewicht zu berechnen. Aspekte mit einem relativ niedrigen Gewicht können als unwichtig aufgefasst und aus dem Aspektgraphen entfernt werden. Auch diese Arbeit bleibt allerdings auf theoretischer Ebene. 1.2 Alternativen In diesem Abschnitt wird ein kurzer Überblick über alternative Verfahren bzw. Datenstrukturen, die Informationen über globale Sichtbarkeiten zur Verfügung stellen, gegeben. 272 David Schmelter a Abb. 2. Würfel unter orthografischer Projektion Visibility Skeleton Das Visibility Skeleton [5] ist eine im Jahr 1997 von Frédo Durand, George Drettakis und Claude Puech vorgestellte Datenstruktur, die exakte, globale Sichtbarkeitsinformationen einer 3D Szene in Form einer Graphstruktur enthält. Verschiedene Verfahren, die Informationen über globale Sichtbarkeiten benötigen (z.B. Verfahren zum Occlusion Culling oder globale Beleuchtungsverfahren wie Radiosity) können diese Informationen effizient über das Visibility Skeleton abfragen. Da das Visibility Skeleton für unterschiedliche Anwendungen genutzt werden kann, wird es von den Autoren auch als multi-purpose Tool beworben. Das Visibility Skeleton enthält im Gegensatz zu Aspektgraphen allerdings keine Informationen über die unterschiedlichen Aspekte eines Objekts, eignet sich also nicht zur Objekterkennung. Wie auch der Finite-Resolution Aspect Graph wurde das Visibility Skeleton vollständig implementiert und wird in Kapitel 3 näher betrachtet. 3D Visibility Complex Der 3D Visibility Complex [3] ist eine im Jahr 1996 ebenfalls von Frédo Durand, George Drettakis und Claude Puech vorgestellte Datenstruktur die, ebenso wie das Visibility Skeleton, alle globalen Sichtbarkeitsinformationen einer 3D Szene enthält. Die nulldimensionalen und eindimensionalen Elemente des 3D Visibility Complex1 , sind die gleichen wie die des Visibility Skeletons (Hierdurch erklärt sich auch der Name Visibility Skeleton: Das Visibility Skeleton ist gewissermaßen das Skelett des 3D Visibility Komplex). Darüber hinaus enthält der 3D Visibility Complex Elemente mit zwei, drei und vier Dimensionen. Diese höher dimensionalen Elemente können für einige spezifische Berechnungen, z.B. zur Berechnung von Aspekten oder dynamische Updates, verwendet werden. Darüber hinaus macht die Verwendung des 3D Visibility Complex für spezielle Szenen Sinn, in denen Gitter hintereinander ausgerichtet und leicht gedreht sind (also viele Sichtbarkeitswechsel vorliegen). Im Gegensatz zum Visibility Skeleton ist der 3D Visibiliy Complex kompliziert zu implementieren und zu verwenden, da eine vierdimensionale Aufteilung der 3D Szene konstruiert werden muss. Tatsächlich wurden die in [3] vorgestellten Konzepte zum Zeitpunkt 1 Diese Elemente werden ausführlich in Abschnitt 3.1 vorgestellt Approximationen und Alternativen für Aspektgraphen 273 der Veröffentlichung noch nicht implementiert. Aus diesem Grund wird auch der 3D Visibility Complex mit Bezug zu praxisrelevanten Arbeiten in dieser Ausarbeitung nicht näher betrachtet. 1.3 Zusammenfassung Es gibt sowohl eine Reihe von Approximationen für Aspektgraphen, als auch alternative Verfahren, die sich auf eine etwas andere Art und Weise dem Problem der globalen Sichtbarkeit nähern. Wirkliche Praxisrelevanz haben von den vorgestellten Ansätzen aber nur Aspektgraphen mit endlicher Auflösung (Finite-Resolution Aspect Graphs) und das Visibility Skeleton. Aus diesem Grund werden diese beiden Arbeiten in dieser Ausarbeitung näher betrachtet. 2 Finite-Resolution Aspect Graphs Der Finite-Resolution Aspect Graph wurde 1997 von Shimshoni und Ponce in [11] vorgestellt und ist ein Aspektgraph für den Fall einer orthografischen Projektion, dem ein Bildbereich mit endlicher Auflösung zugrunde liegt. Mit dem Finite-Resolution Aspect Graph sollen die folgenden beiden Probleme gelöst werden: 1. Ein wesentliches Problem von Aspektgraphen ist ihre Komplexität: Für eine Szene mit n Polygonen besitzt ein Aspektgraph unter Annahme einer orthografischen Projektion eine Größe von O(n6 ) (vgl. [8]). Aus diesem Grund können Aspektgraphen mit unendlicher Auflösung nur bei sehr einfachen Objekten verwendet werden. Die Idee ist, durch Annahme einer Kamera mit endlicher Auflösung einen Aspektgraphen mit relativ geringer Komplexität zu erhalten. 2. In einem klassischen Aspektgraphen mit unendlicher Auflösung werden keine Aspekte gespeichert, die exakt an einem Sichtbarkeitswechsel auftreten, da diese Bereiche in der Theorie im VSP unendlich klein sind. In der Praxis treten diese Situationen allerdings häufig auf, da unterschiedliche Details eines Objekts aufgrund einer realen Kamera mit endlicher Auflösung im Bildbereich häufig verwaschen. Abbildung 3 zeigt hierfür ein Beispiel. Die grundsätzliche Idee ist, Aspekte dahingehend zu vereinfachen, dass unterschiedliche Details (z.B. Vertexe, Kanten, etc.), die im Bildraum weniger als um den Schwellenwert voneinander entfernt sind, vereinigt werden (vgl. Abbildung 3). Die Hoffnung liegt in der Entstehung eines Aspektgraphen mit relativ geringer Komplexität. Hierzu ist es notwendig, einige Besonderheiten bzgl. der Sichtbarkeitswechsel zu betrachten, wie wir im nächsten Abschnitt sehen werden. <ε Abb. 3. Links: Aspekt eines Objekts unter Annahme unendlicher Auflösung. Rechts: Der gleiche Aspekt unter Annahme endlicher Auflösung. 274 David Schmelter Die Autoren stellen in [11] einen vollständig implementierten Algorithmus zur Konstruktion des Finite-Resolution Aspect Graphs vor. Die Konstruktion erfolgt im Wesentlichen mit den folgenden Schritten: 1. Zunächst werden die kritischen Kurven (engl.: critical curves, vgl. [11]) berechnet, die aufgrund von Sichtbarkeitswechseln bei Annahme einer orthografischen Projektion entstehen. Diese Sichtbarkeitswechsel unterscheiden sich von denen klassischer Aspektgraphen, wie wir im folgenden Abschnitt sehen werden. 2. Im Anschluss daran werden die Schnittpunkte dieser kritischen Kurven berechnet. 3. Die kritischen Kurven und ihre Schnittpunkte werden im nächsten Schritt als Eingabe für einen Plane-Sweep Algorithmus benötigt, der den Sichtraum in nicht-kritische Regionen, also einen VSP, unterteilt. Das Resultat ist ein Aspektgraph bzw. VSP mit zunächst unendlicher Auflösung. 4. Jede dieser berechneten Regionen bzw. Aspekte wird nun vereinfacht, indem verschiedene Details (Vertexe, Kanten, etc.) die weniger als voneinander entfernt sind, vereinigt werden. 5. Dadurch, dass die einzelnen Aspekte vereinfacht werden, kann es passieren, dass adjazente Aspekte isomorph sind. Aus diesem Grund ist es notwendig, in einem dritten und letzten Schritt isomorphe Aspekte zu vereinigen. Wir werden sehen, dass der entstandene Finite-Resolution Aspect Graph eine geringere Größe als sein Pendant mit unendlicher Auflösung haben kann. Das große Problem ist allerdings, dass der Konstruktionsaufwand bereits für sehr einfache Objekte unter Umständen derart groß ist, dass die Konstruktion eines Aspektgraphen mit endlicher Auflösung nicht immer möglich ist. Im nächsten Abschnitt werden zunächst einige Grundlagen erläutert, die zum Verständnis des Algorithmus erforderlich sind. Hierzu gehören insbesondere einige Besonderheiten bzgl. der Sichtbarkeitswechsel, die bei Annahme einer Kamera mit endlicher Auflösung beachtet werden müssen. 2.1 Grundlagen In diesem Abschnitt werden einige Grundlagen, insbesondere zu Sichtbarkeitswechseln im Falle endlicher Auflösung, vermittelt. Insgesamt werden bei einer orthografischen Projektion unter Annahme endlicher Auflösung drei Arten von Sichtbarkeitswechseln unterschieden: VV, EV und EEE Sichtbarkeits-Ereignisse. Diese Ereignisse unterscheiden sich von denen im Falle unendlicher Auflösung, vereinfacht gesagt führen sie zu zusätzlichen kritischen Kurven im Sichtraum. Dies wird am Beispiel eines VV Sichtbarkeitswechsels verdeutlicht. Ein VV Ereignis tritt ein, sobald zwei Vertexe p und q exakt um den Wert voneinander entfernt sind (siehe Abbildung 4 (a)). Diese Bedingung führt zu exakt zwei gegenüberliegenden kritischen Kreisen im Sichtraum (vgl. Abbildung 4 (b)). Zur späteren Berechnung des VSPs ist eine explizite Darstellung dieser kritischen Kreise erforderlich. Am Beispiel des VV Sichtbarkeitswechsels wird diese Darstellung exemplarisch betrachtet: Sei v die Blickrichtung des Betrachters und p sowie q = p+u1 die beiden Vertexe, die ein VV Ereignis hervorrufen. Das Ereignis tritt genau dann ein, wenn θ = arcsin( |u1 | ) gilt. In diesem Fall ist der erste kritische Kreis, abhängig vom Winkel α, durch v(α) = Approximationen und Alternativen für Aspektgraphen p 275 p q q ε (a) (b) u3 d v θ p u1 α • q=p+u1 u2 (c) Abb. 4. VV Sichtbarkeitswechsel unter Annahme endlicher Auflösung u1 +d(cos αu2 +sin αu3 ), α ∈ [0, 2π] gegeben (vgl. Abbildung 4 (c)), mit d = |u1 | tan θ. u1 , u2 und u3 bilden eine orthonormale Basis des R3 . Der entgegengesetzte Kreis ist entsprechend durch −v(α) gegeben. Ähnliche kritische Kurven existieren für VE und EEE Ereignisse. Abbildung 5 (a) zeigt ein Beispiel für ein VE Ereignis unter Annahme endlicher Auflösung. Der Sichtbarkeitswechsel tritt ein, sobald der Vertex v auf dem abgerundeten Rechteck liegt, das die Kante e in einem Abstand von umschließt. (b) zeigt ein Beispiel für ein EEE Ereignis. Es tritt ein, wenn der Abstand der beiden Schnittpunkte zwischen den Kanten e1 und e3 sowie e2 und e3 exakt beträgt. In [11] werden, ähnlich zu VV Sichtbarkeitswechseln, explizite Darstellungen der entsprechenden kritischen Kurven für VE und EEE Ereignisse eingeführt. Auf eine detaillierte Beschreibung dieser Darstellungen wird aus Gründen der Übersichtlichkeit an dieser Stelle verzichtet. e1 v ε ε e ε (a) e3 e2 (b) Abb. 5. Beispiele für Sichtbarkeitswechsel unter Annahme endlicher Auflösung. (a) VE Ereignis (b) EEE Ereignis 276 David Schmelter 2.2 Konstruktion des Finite-Resolution Aspect Graphs 322 In diesem Abschnitt wird die Konstruktion des Finite-Resolution Aspect Graphs am Beispiel des in Abbildung 6 (a) dargestellten L-förmigen Objekts betrachtet. (c) zeigt die durch die im vorigen Abschnitt vorgestellten Sichtbarkeitswechsel unter Annahme endlicher Auflösung induzierten kritischen Kurven dieses Objekts. Anstatt einer Kugel mit unendlichem Radius wird ein Würfel zur Repräsentation des Sichtraums verwendet. Dies ermöglicht die Konstruktion eines VSPs mit Hilfe eines Plane-Sweep Algorithmus. (d) zeigt schließlich den fertigen Finite-Resolution Aspect Graph. Teil (b) der Abbildung zeigt der Vollständigkeit halber die induzierten kritischen Kurven unter Annahme unendlicher Auflösung. Hierbei fällt auf, dass im Falle endlicher Auflösung wesentlich mehr kritische Kurven existieren, was, wie wir später sehenIEEE werden, ein wesentliches Problem dieses Verfahrens ist. TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE, VOL. 19, NO. 4, APRIL (a) (b) (c) 1997 (d) Abb. 6. Beispielszene: (a) L-förmiges Objekt (b) die entsprechenden kritischen Kurven im Falle unendlicher Fig. 18. An L-shaped object and its aspect graph. (a) The object. (b) The infinite-resolution visual event curves. (c) The finite-resolution visual (c) kritische Kurven im Falle endlicher Auflösung (d) Aspektgraph mit endlicher Auflösung. event Auflösung curves. (d) The finite-resolution aspect graph. Quelle: [11] Berechnung der kritischen Kurven und ihrer Schnittpunkte Mit Hilfe der in Abschnitt 2.1 vorgestellten parametrisierten Darstellung der VV, VE und EEE Sichtbarkeitswechsel werden zunächst die kritischen Kurven und ihre Schnittpunkte berechnet. Die Berechnung der Schnittpunkte erfolgt mittels homotopischer Fortsetzung [7]. Abbildung 6 (c) zeigt eine Projektion der kritischen Kurven für das in (a) dargestellte Objekt. VSP Konstruktion mit Plane-Sweep Algorithmus Die zuvor berechneten kritischen Kurven und ihre Schnittpunkte dienen als Eingabe für einen Plane-Sweep Algorithmus. Abbildung 7 dient zur Illustration und zeigt ein einfaches Fig. 19. A series offür aspects obtained sweeping through adjacent views in the aspect graph. Beispiel eine Seiteby des Würfels, der den Sichtraum repräsentiert: Dargestellt sind drei kritische Kurven in Form von durchgezogenen, schwarzen Linien. Dielines. Schnittpunkte die-shown as heavy The aspect graph to [8]). For the finite-resolution aspect graph we have cho- curves are shown Kurven grün hervorgehoben, orange. Zusätzlich zu Schnitt- und Fig. 20c contains 357 regions. to be smaller sind than the length of edges of the ihre object.Endpunkte sen eser One of the problems with aspect is that as The visual event curves of the finite-resolution aspect graph Endpunkten sind ihre Extremal-Punkte in Bezug auf die main Sweep-Richtung blau graphs markiert. are shown in Fig. 18c. These curves bound 377 different re- the object gets more complex the aspect graph itself beSchnitt-, End- und Extremal-Punkte werden im Folgenden als kritische Punkte bezeichnet. gions. The aspect graph is shown in Fig. 18d: Adjacent re- comes unmanageably complex. At the resolution used in kritischen werden anhandand dertheSweep-Richtung und von oben nach untenbysorFig. 18, this problem is certainly not solved our apgionsDie yielding the samePunkte aspect have been merged, proach,werden since the finite-resolution is larger resulting regions are shown in different shades of gray. Punkt tiert117und abgearbeitet. An jedem kritischen vertikale Linien aspect zu dengraph beiden Fig. 19 shows the qualitatively different aspects obtained by making a continuous sweep across some of the regions of the aspect graph. This sweep is indicated by the black diagonal line in Fig. 18d. The viewing direction corresponding to each aspect is indicated by a small circle. The aspects in Fig. 19 have been rendered by merging features than the infinite-resolution one. As e grows larger, or object features get smaller, some of the aspect graph features disappear: Fig. 21 shows the finite-resolution visual event curves of an object and the aspect graph for which some of the edges are shorter than e. The aspect graph is considerably more simple than the previous one; in fact, the features Approximationen und Alternativen für Aspektgraphen 277 entsprechenden kritischen Kurven berechnet (in der Abbildung als gepunktete vertikale Linien dargestellt). Zusammen mit den kritischen Kurven induzieren diese vertikalen Linien Regionen. Zwei Regionen, deren gemeinsame Grenze eine vertikale Linie ist, gehören zur gleichen nicht-kritischen Region des VSPs, repräsentieren also einen Aspekt (an dieser Stelle noch mit unendlicher Auflösung). In Abbildung 7 sind die entsprechenden Aspekte durch unterschiedliche Grautöne hervorgehoben. Zusätzlich liefert der Plane-Sweep Algorithmus eine Blickrichtung für jede dieser Regionen. Die so berechneten nicht-kritischen Regionen bzw. Aspekte mit unendlicher Auflösung und ihre entsprechenden Blickrichtungen dienen als Eingabe für Schritt 4 des Algorithmus zur Konstruktion des Finite-Resolution Aspect Graphs. Sweep Richtung Abb. 7. Beispiel zur Verdeutlichung des Plane-Sweep Algorithmus zur Konstruktion des VSPs mit unendlicher Auflösung Vereinfachung der Aspekte Im nächsten Schritt wird jeder der zuvor berechneten Aspekte vereinfacht. Hierzu wird ein Aspekt mit Hilfe der zuvor berechneten Blickrichtung in den Sichtraum projeziert. Details (z.B. Vertexe), die weniger als voneinander entfernt sind, werden vereinigt. Das Resultat dieses Schritts ist ein Aspektgraph, der Aspekte mit endlicher Auflösung enthält. Vereinigung von isomorphen Aspekten Unter Umständen ist es möglich, dass nach dem vorigen Schritt einige adjazente Aspekte isomorph sind. Dies kann passieren, wenn unterschiedliche Ereignisse den gleichen vereinfachenden Effekt auf zwei adjazente Aspekte bewirken. Abbildung 8 zeigt hierfür ein Beispiel. Auf der linken Seite der Abbildung ist zunächst ein Aspekt mit unendlicher Auflösung dargestellt. Die obere und untere Kante der Vertexe p und q sind weniger als voneinander entfernt. Der entsprechende Aspekt mit endlicher Auflösung ist rechts dargestellt. In der Mitte der Abbildung ist ein weiterer Aspekt mit unendlicher Auflösung dargestellt. In diesem Fall sind die Vertexe p und q selbst weniger als voneinander entfernt, was den gleichen Aspekt mit endlicher Auflösung impliziert. Im letzten Schritt zur Konstruktion des Finite-Resolution Aspect Graphs werden daher adjazente Aspekte, die isomorph sind, vereinigt. Das Resultat ist der fertige FiniteResolution Aspect Graph (vgl. Abbildung 6 (d)). 278 David Schmelter Laut Shimshoni und Ponce trägt dieser letzte Schritt im Wesentlichen zur geringeren Komplexität eines Aspektgraphen mit endlicher Auflösung gegenüber einem Aspektgraphen mit unendlicher Auflösung bei. q <ε q p <ε p Abb. 8. Unterschiedliche Ereignisse bewirken auf zwei adjazente Aspekte den gleichen vereinfachenden Effekt. Quelle: [11] Laufzeit und Komplexität Für eine Szene mit n Polygonen wird die Größe des Finite-Resolution Aspect Graphs in [11] mit O(n8 ) angegeben. Der Konstruktionsaufwand für einen Aspektgraphen der Größe m, der im Wesentlichen durch den letzten Schritt, also die Vereinigung isomorpher, adjazenter Aspekte entsteht, beträgt O(m · n4 ), insgesamt also O(n12 ) (vgl. [9]). 2.3 Anwendungen In diesem Abschnitt werden einige Beispielszenen vorgestellt und diskutiert, die in [11] untersucht wurden. Die erste Szene haben wir in Abbildung 6 bereits kennen gelernt. Das erste wesentliche Ziel von Shimshoni und Ponce war es, die Komplexität von klassischen Aspektgraphen in den Griff zu bekommen. Für die in Abbildung 6 verwendete Szene und Auflösung konnte dieses Problem nicht gelöst werden, der entstandene Finite-Resolution Aspect Graph ist komplexer als sein klassisches Gegenstück. Abbildung 9 zeigt eine weitere Beispielszene mit einem Objekt, das aus drei orthogonalen „Streben“ besteht. In diesem Fall wurde die Auflösung so gewählt, dass sich der Aspekt des dargestellten Objekts zu drei Linien vereinfacht (vgl. (b)). Der in (c) gezeigte klassische Aspektgraph besteht aus 120 Regionen. Für den Fall endlicher Auflösung existieren 5060 Regionen, die in (d) dargestellt sind. Nachdem adjazente, isomorphe Aspekte vereinigt wurden, ergibt sich der in (e) dargestellt Finite-Resolution Aspect Graph, der aus lediglich 20 Regionen besteht. 324 IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE, VOL. 19, NO. 4, APRIL 1997 (a) (b) (c) (d) (e) Abb. legs 9. Eine Beispielszene. [11] Fig. 22. An object consisting of three orthogonal and itsweitere aspect graph. (a) The object. Quelle: (b) Its finite-resolution aspect. (c) The infinite-resolution visual event curves. (d) The finite-resolution visual event curves. (e) The finite-resolution aspect graph. (a) (b) (c) Approximationen und Alternativen für Aspektgraphen 279 Abbildung 10 (a) zeigt eine Szene mit einem einfachen nicht konvexen Objekt, (b) die kritischen Kurven bei unendlicher Auflösung. In diesem Fall war es aufgrund des hohen Konstruktionsaufwands nicht möglich, die für den Algorithmus zur Erstellung des FiniteResolution Aspect Graphs benötigten kritischen Kurven unter Annahme endlicher Auflösung zu generieren. an diesem Ansatz: (d)Dieses Beispiel verdeutlicht das wesentliche Problem (e) Die Komplexität eines Finite-Resolution Aspect Graphs mag in der Tat geringer sein als Fig. 23. All qualitatively different finite-resolution aspects of an object consisting of three orthogonal legs. (a) All three legs are visible in the finiteresolution aspect. (b) One of the legs isGegenstücks. foreshortened to Die a point in the finite-resolution aspect.sind (c) Two legsUmständen appear as one aber line in the finitedie seines klassischen Kosten zur Berechnung unter resolution aspect. (d) Two legs are close to each other but the width of the combined feature is more than e and therefore they appear as a region bereits für Szenen mit wenigen Polygonen derart hoch, dass ein Aspektgraph mit endlicher in the finite-resolution aspect. (e) One of the legs is close to the other two legs but they are not close to each other causing all three of them to appear as aAuflösung region in the finite-resolution aspect. erst gar nicht generiert werden kann. (a) (b) Fig. 24. A very non-convex object and its10. infinite-resolution event curves. (a) The object. (b) The infinite-resolution visual event curves. Abb. Beispielszenevisual mit einem nicht konvexen Objekt. Quelle: [11] 2.4 Zusammenfassung Das wesentliche Problem von klassischen Aspektgraphen ist ihre Größe, die eine praktische Verwendung unmöglich macht. Mit dem Finite-Resolution Aspect Graph existiert eine Approximation, die dieses Problem teilweise löst. Das Problem bei dem Ansatz von Shimonshi und Ponce liegt allerdings in der aufwendigen Konstruktion, die bereits für relativ einfache Szenen fehlschlägt (vgl. Abbildung 10). 3 Visibility Skeleton Das Visibility Skeleton ist eine im Jahr 1997 von Frédo Durand, George Drettakis und Claude Puech vorgestellte Datenstruktur, die exakte globale Sichtbarkeitsinformationen einer 3D Szene enthält. Verschiedene Verfahren, die Informationen über globale Sichtbarkeiten benötigen (z.B. Verfahren zum Occlusion Culling oder globale Beleuchtungsverfahren wie Radiosity) können diese Informationen effizient über das Visibility Skeleton abfragen. Da das Visibility Skeleton für unterschiedliche Anwendungen genutzt werden kann, wird es von den Autoren auch als multi-purpose Tool beworben. Es zeichnet sich im Gegensatz zu klassischen Aspektgraphen durch eine gewisse Praxisrelevanz aus: In [5] wird gezeigt, dass die Komplexität des Visibility Skeletons für Testszenen mit etwas über 1000 Polygonen beherrschbar bleibt, sowohl was die Konstruktionszeit als auch die Größe des Visibility Skeletons angeht. 280 David Schmelter Um Informationen über globale Sichtbarkeiten effizient abfragen zu können, werden im Visibility Skeleton alle Sichtbarkeitswechsel einer 3D Szene gespeichert. Ein Sichtbarkeitswechsel (auch Line Swath) ist über eine dreidimensionale Fläche definiert, die durch exakt drei Polygonkanten gebildet wird (man spricht hier auch von Generator-Kanten). Die direkte Konstruktion dieser Sichtbarkeitswechsel ist allerdings sehr aufwendig. Aus diesem Grund betrachtet man Schnitte von Line Swaths, also Linien im dreidimensionalen Raum. Diese Linien werden maximal freie Liniensegmente oder auch MFLs (engl. Extremal Stabbing Line) genannt und sind durch exakt vier Generator-Kanten definiert. Das Visibility Skeleton einer 3D-Szene ist ein aus diesen maximal freien Liniensegmenten und Sichtbarkeitswechseln aufgebauter Graph. Zum besseren Verständnis werden die zentralen Elemente des Visibility Skeletons - maximal freie Liniensegmente und Sichtbarkeitswechsel - im Folgenden anhand von einigen Beispielen verdeutlicht um im Anschluss daran zu einer präzisen Definition dieser zentralen Elemente und des Visibility Skeletons zu kommen. 3.1 Grundlagen Abbildung 11 zeigt ein Beispiel für einen sogenannten EV Sichtbarkeitswechsel. Bewegt sich der Standpunkt des Betrachters von links nach rechts (verdeutlicht durch den oberen Teil der Abbildung), erscheint der Vertex v nicht länger über dem Boden, sondern über einem Polygon, das von der Kante e begrenzt wird. Es tritt also eine Änderung in der Topologie der Sichtbarkeit ein. Die Topologie ändert sich im Beispiel immer dann, wenn v und e auf einer Sichtlinie des Betrachters liegen. Die Menge aller Sichtlinien, die v und e schneiden, bildet den in der Abbildung blau dargestellten ev Line Swath mit einem Freiheitsgrad über die Kante e. ev ist also eine eindimensionale Fläche2 (auch: 1D Element), die durch drei Generator-Kanten gebildet wird: Die beiden Polygonkanten des Vertex v und die Kante e. Abbildung 12 zeigt einen Sichtbarkeitswechsel, der aus drei unabhängigen GeneratorKanten gebildet wird, also einen EEE Line Swath. Wie zu erkennen ist, ist die durch einen Sichtbarkeitswechsel gebildete Fläche nicht notwendigerweise eben. v e1 e2 e3 e ev Abb. 11. EV Line Swath. Quelle: [5] 2 e1e2e3 Abb. 12. EEE Line Swath. Quelle: [5] Die Dimension bezieht sich hierbei auf den Freiheitsgrad über die Kante e Approximationen und Alternativen für Aspektgraphen 281 Neben EV und EEE Line Swaths können noch Fv (für Face Vertex) und Fe (für Face Edge) Sichtbarkeitswechsel unterschieden werden. Tabelle 1 gibt eine Übersicht über die unterschiedlichen Ausprägungen von Sichtbarkeitswechseln und ihrer Generator-Elemente. Bezeichnung EV EEE Fv Fe Generator-Elemente Eine Kante, ein Vertex Drei Kanten Erläuterung Ein Vertex wird durch zwei Kanten definiert (siehe Abbildung 11) Entspricht der Definition eines Sichtbarkeitswechsels (siehe Abbildung 12) Ein Polygon (Face), Ein Polygon wird durch mind. zwei Kanten ein Vertex definiert, der entsprechende Vertex dieses Polygons durch eine weitere Kante. Eine Polygon, eine Ähnlich zu Fv: Ein Polygon wird durch mind. Kante zwei Kanten definiert, die dritte Kante stammt von einem anderen Polygon. Tabelle 1. Übersicht der möglichen Sichtbarkeitswechsel (nach [10]) Abbildung 13 zeigt ein Beispiel für ein VEE MFL. e1 e2 v (in der Abbildung rot dargestellt) wird durch den Schnitt der beiden EV Line Swaths e1 v und e2 v gebildet, also insgesamt durch vier Generator-Kanten (e1 e2 v ist somit zu e1 v und e2 v adjazent). Ein MFL ist somit eindeutig definiert und besitzt keinen Freiheitsgrad. Es besitzt also keine Dimensionen und wird im Folgenden als 0D Element bezeichnet. Abbildung 14 zeigt ein E4 MFL, das durch die vier voneinander unabhängigen Kanten e1 , e2 , e3 und e4 gebildet wird. e1 v e1 e2 e1e2v e2v e1v Abb. 13. VEE Extremal Stabbing Line. Quelle: [5] e2 e3 e4 Abb. 14. E4 Extremal Stabbing Line. Quelle: [5] Neben VEE und E4 Extremal Stabbing Lines existieren noch eine Reihe weiterer Ausprägungen. Tabelle 2 gibt eine Übersicht über die möglichen Ausprägungen von maximal freien Liniensegmenten und ihrer Generator-Elemente. Das Visibility Skeleton ist ein durch MFLs und Line Swaths aufgebauter Graph. Die Knoten dieses Graphen sind die maximal freien Liniensegmente. Eine Kante im Graphen ist ein Sichtbarkeitswechsel, der adjazent zu den beiden entsprechenden Knoten ist. Abbildung 15 zeigt zur Verdeutlichung einen Ausschnitt des Visibility Skeletons für das bereits aus Abbildung 13 bekannte Beispiel mit dem MFL e1 e2 v. Teil (a) der Grafik zeigt den Knoten 282 David Schmelter Bezeichnung VV VEE EVE Fvv FvE FEE EFE FF E4 Generator-Elemente zwei Vertexe, die nicht zum selben Polygon gehören ein Vertex, zwei Kanten ein Vertex, zwei Kanten zwei Vertexe eines Polygons, die keine gemeinsame Kante besitzen ein Vertex eines Polygons und eine Kante, die die Ebene des Polygons schneidet 1 Polygon und zwei Kanten, die die Ebene des Polygons schneiden 1 Polygon und zwei Kanten, die die Ebene des Polygons schneiden zwei Polygone, wobei sich die Ebenen der Polygone gegenseitig schneiden vier Kanten Erläuterung Ein Vertex wird durch jeweils zwei Kanten definiert Vgl. Abbildung 13 Analog zu VEE, allerdings schneidet das MFL die Generator Kanten in der Reihenfolge EVE Das MFL ist eine Diagonale des Polygons MFL liegt in der Ebene des Polygons und schneidet ein Vertex des Polygons sowie eine Kante MFL liegt in der Ebene des Polygons und schneidet zwei Kanten Analog zu FEE, allerdings schneidet das MFL die Generator Kanten in der Reihenfolge EFE Das MFL ist die durch die Ebenen der beiden Polygone gebildete Schnittgerade Vgl. Abbildung 14 Tabelle 2. Übersicht der möglichen maximal freien Liniensegmente (nach [10]) e1 e2 v des Visibility Skeletons, der dem MFL e1 e2 v entspricht. Er ist adjazent zu den Kanten e1 v und e2 v, die den zu dem MFL adjazenten Sichtbarkeitswechseln e1 v und e2 v entsprechen. Der Übersichtlichkeit halber sind nicht alle adjazenten Sichtbarkeitswechsel dargestellt. Teil (b) zeigt den Knoten e1 e2 v mit den vollständigen adjazenten Sichtbarkeitswechseln: • e01 v entsteht durch die Sichtlinien, die auf das durch die Kante e2 begrenzte Polygon treffen. • e3 e1 e2 und e4 e1 e2 sind die durch die Generator Kanten e1 und e2 sowie e3 bzw. e4 induzierten Sichtbarkeitswechsel. Bisher wurde lediglich die Konstruktion von Sichtbarkeitswechseln beschrieben. Die eigentlich wichtigste Information, nämlich die Sichtbarkeit welcher Extremal-Elemente durch einen Sichtbarkeitswechsel beschrieben wird, wurde noch nicht betrachtet. Abbildung 16 verdeutlicht, was unter einem Extremal-Element verstanden wird. Dargestellt sind die beiden rot hervorgehobenen MFLs Nstart und Nend . Nstart ist durch die Generator-Elemente v, e1 und e3 definiert, Nend durch v, e1 und e2 . Die beiden MFLs definieren somit den Sichtbarkeitswechsel ve1 . Die Extremal-Elemente eines Sichtbarkeitswechsel sind die Elemente einer Szene, die als nächstes „vor“ der ersten bzw. als nächstes „hinter“ der letzten GeneratorKante geschnitten werden. Im Beispiel sind dies für den Sichtbarkeitswechsel ve1 also die Polygone Fup und Fdown . Da Sichtbarkeitswechsel durch MFLs begrenzt werden, können 2 1 e e2v e1 e2 e1 e1'v 3 e1'v e4 v e3 e1e2v e2v e 1v e2 e1 e4 v e1v e e1e2v 283 e Approximationen und Alternativen für Aspektgraphen e 3e 1e 2 e1v e e v e 2v 1 2 e4e1e2 e2 e1e2v e v e1v 2 (a) (b) Abb. 15. (a) Das Beispiel aus Abbildung 13 mit entsprechendem Knoten des Visibility Skeletons (Sichtbarkeitswechsel unvollständig). (b) Das gleiche Beispiel mit vollständigen Sichtbarkeitswechseln. Nach [5] die Extremal-Elemente eines Sichtbarkeitswechsel direkt aus den Extremal-Elementen der begrenzenden MFLs abgelesen werden. Dadurch, dass MFLs Linien im dreidimensionalen Raum sind, ist die Berechnung ihrer Extremal-Elemente leicht mit Ray-Casting Verfahren möglich. Fup v Nend Nstart e2 e1 e3 Fdown Abb. 16. Extremal-Elemente Fup und Fdown der MFLs Nstart und Nend . Quelle: [5] Aus diesen Überlegungen folgt die grundsätzliche Idee des Visibility Skeletons: Durch Berechnung aller MFLs inkl. ihrer Extremal-Elemente und Zuordnung der adjazenten Sichtbarkeitswechsel können alle Sichtbarkeitsbeziehungen in einer 3D-Szene mit Hilfe einer Graphstruktur beschrieben werden. 3.2 Definitionen Nachdem eine kurze Übersicht über den Aufbau des Visibility Skeletons und seiner Bausteine (maximal freie Liniensegmente und Sichtbarkeitswechsel) gegeben wurde, werden die folgenden Definitionen deutlich: 284 David Schmelter Definition 1 (Maximal freies Liniensegment). Gegeben seien vier Polygonkanten e1 bis e4 . Ein maximal freies Liniensegment ist definiert als die Linie, die jede dieser Vier Kanten schneidet. Ein maximal freies Liniensegment ist somit eine Linie ohne Freiheitsgrade, also ein Element mit 0 Dimensionen (auch 0D Element). Definition 2 (Sichtbarkeitswechsel). Gegeben sei ein maximal freies Liniensegment l. Ein Sichtbarkeitswechsel ist definiert durch die Oberfläche, die durch die Menge aller Schnittlinien dreier Polygonkanten ei von l aufgespannt wird, sofern die Schnittbedingung exakt einer Kante von l aufgehoben ist. Ein Sichtbarkeitswechsel ist also durch eine Oberfläche mit einem Freiheitsgrad über eine Kante eines maximal freien Liniensegments definiert. Er besitzt somit einen Freiheitsgrad, entspricht also einem Element mit 1 Dimension (auch 1D Element). Definition 3 (Visibility Skeleton). Das Visibility Skeleton ist ein ungerichteter Graph. Die Knoten dieses Graphen entsprechen maximal freien Liniensegmenten, eine Kante zwischen zwei Knoten entspricht einem zu beiden Knoten adjazenten Sichtbarkeitswechsel. 3.3 Datenstruktur des Visibility Skeletons Nachdem Sichtbarkeitswechsel und maximal freie Liniensegmente im Kontext des Visibility Skeletons definiert wurden, werden Ausschnitte einer möglichen (vereinfachten) Datenstruktur zur Implementierung des Visibility Skeletons betrachtet. Listing 1 zeigt die Klasse N ode, die einen Knoten im Graphen des Visibility Skeletons darstellt und einem MFL entspricht. In einem Knoten werden die folgenden Informationen gespeichert: Eine Liste der zu diesem MFL adjazenten Sichtbarkeitswechsel (Paramter adjacentArcs) sowie die beiden Extremal-Elemente, die dieses MFL begrenzen (Parameter Fup und Fdown ). Listing 2 zeigt die Klasse Arc, die eine Kante im Visibility Skeleton repräsentiert und einem Sichtbarkeitswechsel entspricht. In einer Kante werden die folgenden Informationen gespeichert: Der Start- und Endknoten, also die beiden MFLs, die diesen Sichtbarkeitswechsel begrenzen (Parameter Nstart und Nend ) sowie wiederum die beiden Extremal-Elemente dieses Sichtbarkeitswechsels (Parameter Fup und Fdown , vgl. auch Abbildung 16). Für jede Ausprägung von Sichtbarkeitswechseln (EV, EEE, Fv und Fe) existieren entsprechende Klassen, die die Klasse Arc erweitern. Listing 3 zeigt ein Beispiel für einen EV Sichtbarkeitswechsel. Zusätzlich zu den Start- und Endknoten sowie den Extremal-Elementen werden in der Klasse EV die Generator-Elemente des Sichtbarkeitswechsels gespeichert, im Beispiel also die Kante e und der Vertex v. Listing 4 zeigt die Klasse V isibilitySkeleton, die das eigentliche Visibility Skeleton repräsentiert. Für jede Ausprägung von Sichtbarkeitswechseln (EV, EEE, Fv und Fe) existiert ein zweidiemensionales Array von binären Suchbäumen. Im Beispiel sind die beiden Arrays für EV und EEE Sichtbarkeitswechsel dargestellt. Das Array eines Sichtbarkeitswechsels wird über die beiden Extremal-Elemente indiziert. Somit existiert für jede Kombination von Extremal-Elementen genau ein binärer Suchbaum. Auf diese Art und Weise sind die Sichtbarkeitsinformationen einer 3D Szene für eine Kombination von Extremal-Elementen effizient abrufbar. Approximationen und Alternativen für Aspektgraphen 1 2 3 4 c l a s s Node { L i s t <Arcs> a d j a c e n t A r c s Face Fup , Fdown } 1 2 3 4 Listing 1. Klasse Node 2 3 4 c l a s s EV : c h i l d o f Arc { Edge e Vertex v } Listing 3. Klasse EV c l a s s Arc { Node N s t a r t , Nend Face Fup , Fdown } Listing 2. Klasse Arc 1 1 285 2 3 4 5 class VisibilitySkeleton { t r e e <EV>ev [ Fup ] [ Fdown ] t r e e <EEE>e e e [ Fup ] [ Fdown ] ... } Listing 4. Klasse VisibilitySkeleton 3.4 Konstruktion des Visibility Skeletons Nachdem das Visibility Skeleton und seine Elemente definiert und eine Datenstruktur vorgestellt wurde, wird seine Konstruktion betrachtet. Algorithmus 29 verdeutlicht die prinzipielle Konstruktion. Der Algorithmus ist anhand von Definition 1 aufgebaut und betrachtet der Übersichtlichkeit halber keine Sonderfälle wie VV, VEE o.a. MFLs. Die Konstruktion ist prinzipiell einfach: In einer äußeren Schleife werden zunächst alle Knoten des Visibility Skeletons erzeugt. Für jede Kombination G von vier Kanten der Szene wird überprüft, ob diese Kanten ein gültiges MFL bilden (Zeilen 1 und 2). Vier Kanten bilden ein gültiges MFL, wenn eine Linie l exisitiert, die diese Kanten schneidet und l zwischen der ersten und letzten Kante keine weiteren Elemente der Szene schneidet. Diese Überprüfung kann durch einfache Ray-Casting Abfragen erfolgen. Wurde ein gültiges MFL gefunden, werden die entsprechenden Extremal-Elemente berechnet und ein neuer Knoten in das Visibility Skeleton eingefügt (Zeilen 3 und 4). Die Erzeugung aller adjazenten Sichtbarkeitswechsel eines MFLs L erfolgt direkt nach dessen Erzeugung (Zeile 5): Für jede dreielementige Teilmenge A ⊂ L, die einen zu L adjazenten Sichtbarkeitswechsel definiert, wird überprüft, ob im Visibility Skeleton bereits ein Sichtbarkeitswechsel A0 mit den gleichen Extremal-Elemente wie A vorhanden ist (Zeile 6). Ist dies der Fall, wird der bestehende Sichtbarkeitswechsel A0 mit A verschmolzen (Zeile 7). Ansonsten wird eine neue Kante in das Visibility Skeleton eingefügt (Zeile 9). Algorithmus 29 Konstruktion des Visibility Skeletons 1: for all Kombinationen von Generator-Kanten G = {g0 , g1 , g2 , g3 } do 2: if G bildet ein gültiges maximal freies Liniensegment L then 3: Berechne Extremal-Elemente von L 4: Füge L in Visibility Skeleton ein 5: for all Sichtbarkeitswechsel A = {gi0 , gi1 , gi2 } adjazent zu L do 6: if Visibility Skeleton enthält Sichtbarkeitswechsel A’ mit denselben Generator-Kanten wie A then 7: Verschmelze A mit A’ 8: else 9: Füge A in das Visibility Skeleton ein 286 David Schmelter Abbildung 17 veranschaulicht die Konstruktion an einem Beispiel. In einem ersten Schritt seien die Kanten der Vertexe v und ve als mögliche Generator-Kanten eines MFLs ausgewählt worden. Diese Kanten bilden das gültige MFL vve ; vve wird somit in das Visibility Skeleton eingefügt. Ein möglicher adjazenter Sichtbarkeitswechsel ve ist durch den Vertex v und die Kante e definiert. Im Visibility Skeleton ist zu diesem Zeitpunk noch kein Sichtbarkeitswechsel mit den gleichen Generator-Kanten vorhanden. Aus diesem Grund wird ve einfach zum Visibility Skeleton hinzugefügt, das nun die Struktur wie in Abbildung 17 (a) besitzt. Die weiteren zu vve adjazenten Sichtbarkeitswechsel werden der Übersichtlichkeit halber an dieser Stelle nicht weiter betrachtet. Als nächstes seien die Generator-Kanten des Vertex v, Polygons f und e ausgewählt worden. Diese Kanten bilden das gültige MFL f ve, das somit in das Visibility Skeleton eingefügt wird. Ein möglicher adjazenter Sichtbarkeitswechsel von f ve ist wiederum ve. Da im Visibility Skeleton bereits ein Sichtbarkeitswechsel enthalten ist, wird f ve über ve mit vve verbunden. Das Visibility Skeleton hat nun die in Abbildung 17 (b) gezeigte Struktur. Nun seien die Generator-Kanten des Vertex v sowie e3 und e ausgewählt worden. Diese Kanten bilden das gültige MFL ve3 e, das in das Visibility Skeleton eingefügt wird. Erneut ist ve ein zu ve3 e adjazenter Sichtbarkeitswechsel. Da im Visibility Skeleton sowohl der Startals auch der Endknoten von ve bereits gesetzt ist, wird ve gesplittet. Der Zielknoten von vve ist zunächst undefiniert, ve verbindet die beiden MFLs ve3 e und f ve (vgl. Abbildung 17 (c)). Im letzten Schritt seien die Generator-Kanten des Vertex v sowie e2 und e ausgewählt worden. Diese Kanten bilden das gültige MFL ve2 e. Erneut ist ve adjazent zu ve2 e. ve2 e wird über ve mit vve verbunden. Das Visibility Skeleton besitzt nun die in Abbildung 17 (d) dargestellte Struktur. Insgesamt können also die folgenden Operationen beim Einfügen von Sichtbarkeitswechseln in das Visibility Skeleton unterschieden werden (Zeilen 7 und 9 in Algorithmus 29): • Add: Ein neuer Sichtbarkeitswechsel wird in das Visibility Skeleton eingefügt (vgl. Abbildung 17 (a)). • Merge: Ein bestehender Sichtbarkeitswechsel wird mit einem neuen vereinigt (vgl. Abbildung 17 (b)). • Split: Ein bestehender Sichtbarkeitswechsel wird gesplittet (vgl. Abbildung 17 (c)). Zum Schluss dieses Abschnitts wird die Laufzeit des vorgestellten Algorithmus und die Komplexität des Visibility Skeletons untersucht. Behauptung (Größe des Visibiliy Skeletons). Für eine Szene mit n Polygonen beträgt die theoretische Größe des Visibility Skeletons im Worst-Case O(n4 ). Beweis. Der Beweis ist recht trivial: Jedes Quadrupel von Kanten kann theoretisch ein gültiges MFL bilden. Behauptung (Konstruktionszeit des Visibiliy Skeletons). Für eine Szene mit n Polygonen beträgt die theoretische Konstruktionszeit des Visibility Skeletons im Worst-Case O(n5 ). Beweis. Auch dieser Beweis ist einfach: Es existieren O(n4 ) Kombinationen von Kanten, die potentiell ein gültiges MFL bilden können. Für jede dieser Kombinationen muss überprüft werden, ob sie eine gültige MFL bildet. Hierzu muss die gesamt Szene mittels Ray-Casting Approximationen und Alternativen für Aspektgraphen v v f e e ve ve ? ? ve vve ? ? ?? v f f e2 e3 e ve ve ? ? ? ve fve (b) e vve ve ? v ? ? ? vve ? ? (a) e3 287 ? ve3e ? ? (c) ? ? ? ve fve ?? ? ? ? ? vve ve ve e ? ? ? ? ve3e 2 ? ? ? ve ? ? fve ?? (d) Abb. 17. Erzeugung der Kanten des Visibility Skeletons. Quelle: [5] Verfahren auf Verdeckungen überprüft werden. Somit ergibt sich eine Komplexität von O(n5 ). Laut Durand, Drettakis und Puech werden diese Worst-Cases allerdings nur in bestimmten Szenen erreicht. Für die in [5] untersuchten Testszenen ergab sich eine durchschnittliche Konstruktionszeit von O(n2.4 ). 3.5 Anwendungen Nachdem die Konstruktion des Visibiltiy Skeletons vorgestellt wurde, werden einige Anwendungen betrachtet, für die das Visibility Skeleton eine effiziente Datenstruktur zur Verfügung stellt. In [5] werden im Wesentlichen drei Anwendungen vorgestellt: • Bei globalen Beleuchtungsverfahren wie Radiosity wird zur Berechnung der FormFaktoren häufig die Information benötigt, welche Teile einer Fläche von einem bestimm- 288 David Schmelter ten Punkt einer 3D Szene aus gesehen sichtbar sind. Diese Information kann mittels dem Visibility Skeleton effizient abgefragt werden. • Eine weitere Anwendung des Visibility Skeletons ist die Berechnung von sogenannten Discontinuity Meshes, die zur Berechnung von Schatten und Halbschatten eingesetzt werden können. Zur Berechnung von Discontinuity Meshes ist allerdings eine kleine Erweiterung am Visibility Skeletons nötig. Hierbei handelt es sich um das Array DM (i, j), in dem alle Sichtbarkeitswechsel zwischen zwei Polygonen fi und fj abgelegt werden. Die Verwaltung dieses Arrays ist in konstanter Zeit möglich. • Als dritte und letzte Anwendung wird die Berechnung von exakten Blockern vorgestellt. Eine Liste von exakten Blockern enthält die exakte Menge von Objekten, die eine Fläche von einer bestimmten Betrachterposition aus gesehen verdecken. Auch zur Berechnung von exakten Blockern wird das Array DM (i, j) verwendet. In dieser Arbeit geht es in erster Linie darum, die vielfältigen Einsatzmöglichkeiten des Visibility Skeletons zu motivieren und weniger darum, diese Anwendungen sehr detailliert zu betrachten. Aus diesem Grund wird im Folgenden exemplarisch vorgestellt, wie mit Hilfe des Visibility Skeletons berechnet werden kann, welche Teile einer Fläche von einer bestimmten Betrachterposition sichtbar sind. Auf Details zur Berechnung von Discontinuity Meshes oder exakten Blockerlisten wird verzichtet und auf [5] verwiesen. Abbildung 18 zeigt hierfür ein Beispiel. (a) zeigt eine Stadtszene. Die blau umrandeten Flächen des grünen Untergrunds sind vom dem gelben Vertex des dargestellten Flugzeugs nicht sichtbar. (b) zeigt ein Zimmer. Die blau umrandeten Flächen des Fußbodens sind vom gelben Vertex der dargestellten Lampe ebenfalls nicht sichtbar. Diese Informationen können mit dem Visibility Skeleton wie folgt berechnet werden: Um die globale Sichtbarkeit eines Vertex v in Bezug zu einer Fläche f zu bestimmen, werden zunächst alle EV Sichtbarkeitswechsel berechnet, die zu f in Beziehung stehen. Diese Abfrage kann erfolgen, indem die entsprechenden Suchbäume des Visiblity Skeletons mit f als Extremal-Element abgefragt werden. Für jeden dieser Sichtbarkeitswechsel wird überprüft, ob er mit dem Vertex v in Beziehung steht. Die Menge der so erhaltenen EV Sichtbarkeitswechsel sind exakt diejenigen, die die Sichtbarkeitsgrenzen von f , ausgehend von v, definieren. Die Abfragezeiten für die dargestellten Szenen betrugen für Abbildung 18 (a) 1.2 ms (312 Polygone) und für Abbildung 18 (b) 1.5 ms (1488 Polygone). Somit eignet sich das Visibility Skeleton also durchaus für Echtzeitanwendungen in diesem Anwendungsbereich. 3.6 Zusammenfassung Das Visibility Skeleton ist eine interessante Alternative zu Aspektgraphen, mit dem eine Reihe von Anwendungen, die Informationen über globale Sichtbarkeiten benötigen, effizient realisiert werden können. Es besticht durch seine Einfachheit: Zur Konstruktion werden nur Standard-Verfahren aus der Computergrafik, beispielsweise Ray-Casting, benötigt. Das Visibility Skeleton wurde vollständig implementiert und konnte für die in [5] untersuchten Testszenen trotz seiner zunächst eher schlechten Worst-Case Komplexität erfolgreich eingesetzt werden. Im Gegensatz zu klassischen Aspektgraphen ist es also auch für relativ komplexe Szenen praktisch einsetzbar. Approximationen und Alternativen für Aspektgraphen (a) 289 (b) Abb. 18. (a) Teile des Untergrunds, die von dem gelben Vertex des Flugzeugs aus sichtbar sind (b) Teile des Fußbodens, die von dem gelben Vertex einer Lampe aus sichtbar sind. Quelle: [5] 4 Zusammenfassung und Diskussion In dieser Arbeit wurden sowohl Approximationen (im Wesentlichen der Finite-Resolution Aspect Graph) als auch Alternativen für Aspektgraphen (im Wesentlichen das Visibility Skeleton) vorgestellt und untersucht. Für den Fall einer orthografischen Projektion existiert mit dem Finite-Resolution Aspect Graph eine Approximation für Aspektgraphen, die vollständig implementiert wurde. Obwohl die Größe eines Aspektgraphen mit endlicher Auflösung je nach Auflösung drastisch kleiner als im unendlichen Fall sein kann, muss die praktische Relevanz dieses Verfahrens bezweifelt werden: • Einerseits funktioniert das vorgestellte Verfahren nur für den Fall einer orthografischen Projektion. • Andererseits versagt es bereits für relativ einfache Szenen aufgrund des hohen Konstruktionsaufwands. Mit dem Visibility Skeleton existiert eine interessante (und vollständig implementierte) Alternative zu Aspektgraphen, mit der eine Reihe unterschiedlicher Anfragen an eine 3D Szene beantwortet werden können. Im Gegensatz zum Finite-Resolution Aspect Graph wurde gezeigt, dass es auch für nicht triviale Szenen mit mehreren tausend Polygonen erfolgreich eingesetzt werden kann. Eine Objekterkennung wie mit Aspektgraphen ist mit dem Visibility Skeleton allerdings nicht möglich. Literaturverzeichnis 1. Arie, Jezekiel Ben (1990) Probabilistic Models of Observed Features and Aspects with Application to Weighted Aspect Graphs. Pattern Recognition Letters, Volume 11, Issue 6 2. Durand, Frédo; Drettakis, George; Puech, Claude (1999) Fast and Accurate Hierarchical Radiosity Using Global Visibility. ACM Transactions on Graphics (TOG), Volume 18, Issue 2, S. 128–170 3. Durand, Frédo; Drettakis, George; Puech, Claude (1996) The 3D visibility complex: a new approach to the problems of accurate visibility. Proceedings of the eurographics workshop on Rendering techniques ’96, S. 245–256 4. Durand, Frédo; Drettakis, George; Puech, Claude (2002) The 3D Visibility Complex. ACM Transactions on Graphics (TOG), Volume 21, Issue 2, S. 176–206 290 David Schmelter 5. Durand, Frédo; Drettakis, George; Puech, Claude (1997) The Visibility Skeleton: A Powerful And Efficient Multi-Purpose Global Visibility Tool. SIGGRAPH ’97: Proceedings of the 24th annual conference on Computer graphics and interactive techniques, S. 89–100 6. Eggert, D. W.; Bowyer, K. W.; Dyer, C. R.; Christensen, H. I.; Goldgof, D. B. (1993) The Scale Space Aspect Graph. IEEE Transactions on Pattern Analysis and Machine Intelligence, Volume 15, Issue 11, S. 1114–1130 7. Morgan, A. P. (1987) Solving Polynomial Systems Using Continuation for Scientific and Engineering Problems. Prentice-Hall, Englewood Cliff, NJ 8. Plantinga, Harry; Dyer, Charles R. (1990) Visibility, Occlusion, and the Aspect Graph. International Journal of Computer Vision, Volume 5, Issue 2, S. 137–160 9. Schiffenbauer, Robert D. (2001) A Survey of Aspect Graphs. Polytechnic University of Brooklyn 10. Schröder, Axel (2003) Globale Sichtbarkeitsalgorithmen. Dissertation, Philipps-Universität Marburg 11. Shimshoni, Ilan; Ponce, Jean (1997) Finite-Resolution Aspect Graphs of Polyhedral Objects. IEEE Transactions on Pattern Analysis and Machine Intelligence, Volume 19, Issue 4, S. 315–327