Rheinische Friedrich-Wilhelms-Universität Bonn Institut für Informatik I Jasmin Kreutz Kürzeste Pfade in löchrigen Polygonen 1. Januar 2009 Seminararbeit im Wintersemester 08/09 Zusammenfassung Wir haben uns im Rahmen des Seminars Algorithmische Geometrie / Algorithmische Bewegungsplanung im WS 2008/2009 mit dem Thema Kürzeste Pfade in löchrigen Polygonen befasst. Dabei beschäftigen wir uns mit dem aunden von kürzesten Pfaden in löchrigen Polygonen P und n P , wobei h die Anzahl der disjunkten Hindernispolygone in P ist. Vorgestellt wird ein die Gesamtzahl aller Ecken aus Weg zur Berechnung, basierend auf dem Ansatz des schon bekannten Algorithmus von Chen et al [1]. Der hier vorgestellte Algorithmus hat den Vorteil, dass die Berechnungszeit an die Anzahl der Hindernisse gebunden ist. Diese Seminararbeit basiert auf einem Auszug Shortest Path Queries in Polygonal Domains [2] von Hua Guo, Anil Maheshwari und Jörg-Rüdiger Sack 2008. Inhaltsverzeichnis 1 Motivation 2 2 Grundlagen 2 2.1 Allgemeine Denitionen . . . . . . . . . . . . . . . . . . . . . 3 2.1.1 Trichter . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.2 Voronoidiagramm eines löchrigen Polygons . . . . . . . 4 2.1.3 Sanduhren . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.1.4 Shortest Path Map . . . . . . . . . . . . . . . . . . . . 4 2.1.5 Skelettgraph . . . . . . . . . . . . . . . . . . . . . . . 4 2.1.6 Lokaler kürzester Pfad . . . . . . . . . . . . . . . . . . 5 3 Verfahren 3.1 3.2 5 Ansätze für SSQ . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.1.1 Hershberger und Suri . . . . . . . . . . . . . . . . . . . 5 3.1.2 Kapoor et al 5 . . . . . . . . . . . . . . . . . . . . . . . Ansätze für APQ . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.2.1 Chen et al . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.2.2 Chiang und Mitchell . . . . . . . . . . . . . . . . . . . 6 4 Grundlagen des Algorithmus 6 4.1 Zerlegungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 4.2 Lokal kürzester Weg . . . . . . . . . . . . . . . . . . . . . . . 8 4.3 Kritische Stelle . . . . . . . . . . . . . . . . . . . . . . . . . . 8 5 Algorithmus 9 5.1 Vorbereitung . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 5.2 Weiterführende Ideen . . . . . . . . . . . . . . . . . . . . . . . 10 5.3 Anfrage 11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 Motivation Wir werden uns mit der Frage nach der ezienten Suche von kürzesten Wegen in löchrigen Polygonen befassen. Ein löchriges Polygon kann man sich dabei wie den Grundriss eines abgeschlossenen Raumes mit diversen Hindernissen vorstellen. Ein gutes Beispiel hierfür wäre ein Museum. Säulen und Ausstellungsstücke kann man hier als Hindernisse betrachten, während ein Besucher sich nicht auf festgelegten Wegen, wie in einem Straÿennetzwerk bewegen muss, sondern die ganze Restäche zur Verfügung hat. Es ist einerseits interessant, den kürzesten Weg zwischen zwei beliebigen Punkten zu berechnen, um eziente Führungen zu planen. Jedoch kann es auch von Interesse sein, die kürzesten Wege von einem festgelegten Punkt wie beispielsweise der Information zu den verschiedenen Attraktionen herauszunden. Da wir von vielen verschiedenen Voraussetzungen ausgehen können, gibt es auch verschiedene Lösungsverfahren. Die Kriterien zur Unterscheidung werden im Folgenden kurz angedeutet. Diese sind die Vorbereitungszeit, also die benötigte Berechnungsdauer der Hilfsstruktur, der Speicherbedarf dieser Suchstruktur und abschlieÿend die Schnelligkeit, mit der eine gestellte Anfrage beantwortet werden kann. Somit ist ein ezienter Algorithmus von den Spezikationen des Problems abhängig. Es mag durchaus Situationen geben, in denen ein langsamerer Algorithmus mit geringem Speicherbedarf und kurzer Vorbereitungszeit einem schnelleren mit langer Vorbereitungzeit und hohem Speicheraufwand vorgezogen wird. 2 Grundlagen In vielen Gebieten beschäftigt man sich mit der Suche nach dem kürzesten Pfad. Damit weiter gehend darauf eingegangen werden kann, benötigen wir jedoch einige Grundlagen: Denition 1 Punkten u und Als kürzesten Pfad versteht man einen Weg zwischen zwei v, welcher um Hindernisse herum führt und eine minimale euklidische Länge besitzt. Ein kürzester Pfad von u nach v wird mit des kürzesten Pfades ist die Distanz von u π(u, v) bezeichnet. Die Länge v und wird mit dist(u, v) und benannt. Dabei werden drei unterschiedliche Ansätze betrachtet. • SPQ (single-pair-query) Bezeichnet eine Anfrage nach dem kürzesten Pfad zwischen zwei vor der Berechnung der Queryanfrage festgelegten Punkten 2 u und v. • SSQ (single-source-query) Bezeichnet eine Anfrage nach dem kürzesten Pfad von einem vorher festgelegten Startknoten bei wird u u zu einem beliebigen Endknoten v. Da- vor der Berechnung der Vorverarbeitung festgelegt um die Suchstrukturen aufzubauen, welche es ermöglichen, eine Anfrage zu v schnell zu beantworten. • APQ (all-pairs-query) Bezeichnet eine Anfrage nach dem kürzesten Pfad zwischen zwei beliebigen Punkten u und v. Die Berechnung der Vorverarbeitung benötigt somit keine Anfragepunkte mehr. Kürzeste Pfade sind nicht immer eindeutig. In Umgebungen mit Hindernissen kann es vorkommen, dass zwei oder mehr kürzeste Pfade gleicher Länge existieren (Abbildung 1). Hier ist der obere Pfad von u nach v genauso lang wie der untere Pfad und beide Pfade sind die kürzesten. Im Inneren eines einfachen Polygons ist der kürzeste Pfad Abbildung 1: gleichlange kürzeste Pfade jedoch immer eindeutig, da dort keine Hindernisse vorkommen, die auf mehrere Arten umlaufen werden können. Im Folgenden gehen wir von löchrigen Polygonen und der Suche nach SSQ und APQ aus. 2.1 Allgemeine Denitionen In einigen der im folgenden Kapitel kurz vorgestellten Algorithmen werden Verfahren zur Vorbereitung angewendet, die vielleicht nicht jedem bekannt sind. Daher versuchen wir eine kurze Einführung in die wichtigsten Methoden und Hilfsmittel zu geben. 2.1.1 Trichter Ein Trichter bildet sich aus den kürzesten Pfaden zwischen einem Punkt s und einer diagonalen oder l = pi pj eine Diagonale P , nn wird die Vereinigung der kürzesten Wege f (s, l) = π(s, pi ) ∪ π(s, pj )Trichter genannt. Ein Trichter ist oen, wenn sich π(s, pi ) und π(s, pj ) nur in einem Punkt s berühren. Wenn sich die kürpolygonalen Kante. Sei in zesten Pfade in mehr als einem Punkt überschnei- Abbildung 2: geschlossener Trichter den, so wird der Trichter als geschlossen bezeichnet (Abbildung2). 3 2.1.2 Voronoidiagramm eines löchrigen Polygons P werden Besitzer S genannt. Dabei ist S = {v1 , v2 , ..., vn ; e1 , e2 , ..., en }. Jedem dieser Besitzer kann eine eindeutige Zelle zugeordnet werden. In der Zelle zu Si liegt jeder Punkt dieser Zelle näher an Si als an jedem anderen Element aus S . Kanten und Ecken aus 2.1.3 Sanduhren Eine Sanduhr bildet sich aus den kürzesten Pfaden zwischen zwei Diagonalen. Seien li = pi pi+1 , lj = pj pj+1 zwei P , die Vereinigung H(li , lj ) = π(pi , pj ) ∪ π(pi+1 , pj+1 ) Diagonalen in wird Sanduhr genannt. Eine Sanduhr wird als oen bezeichnet, falls und π(pi+1 , pj+1 ) π(pi , pj ) Abbildung 3: Sanduhr keine gemeinsamen Segmente besitzen, andernfalls gilt sie als geschlossen (Abbildung 3). 2.1.4 Shortest Path Map Vom Startpunkt aus wird eine Welle losgeschickt, diese breitet sich kreisförmig aus und bildet die erste Zelle der SPM. Ein kürzester Pfad zu einem Punkt innerhalb dieser Zelle wird auf direktem Weg erreicht, da Start- und Zielpunkt Sichtkontakt zueinander besitzen. Wenn die Welle auf eine Hindernisecke trit, so bildet sich von dieser Ecke des Hin- Abbildung 4: SPM dernisses eine neue Welle aus. Diese erzeugt die nächste Zelle in der SPM. Jeder Weg vom Start zu einem Punkt dieser Zelle führt folglich über den Eckpunkt des Hindernisses. Zur Berech- O(nlog 2 n) Zeit und O(nlogn) Platz benötigt. Jedoch Algorithmus im Mittel mit O(nlogn) Zeit und O(nlogn) Platz nung wird im worstcase kommt der aus (Abbildung 4). 2.1.5 Skelettgraph G = (V, E) auf P bildet sich aus dem Voronoidiagramm P . Dabei werden von dem Diagramm alle Kanten, die inzident zu P sind, weggelassen. Inzident bedeutet hierbei, dass die Voronoikante P berührt. Ein Skelettgraph von 4 2.1.6 Lokaler kürzester Pfad Wir triangulieren P. Seien u und v Anfragepunkte, so ist π(u, v) ein Pfad P in einer eindeutigen Reihenfolge. Es existiert also ein Pfad zwischen u und v , auf dem Skellettgraph. Dieser schneidet die Kanten der Triangulation von der die Diagonalen in eine Folge zerteilt. Als lokal kürzesten Pfad bezeichnen wir den Pfad mit minimaler euklidischer Länge, der die Folge von Diagonalen in genau der selben Reihenfolge schneidet. 3 Verfahren 3.1 Ansätze für SSQ 3.1.1 Hershberger und Suri Hershberger und Suri [2] entwickelten einen Algorithmus zur Berechnung einer SPM (shortest path map). Diese Karte bietet alle kürzesten Wege in P von einem bestimmten Startpunkt aus. Im Mittel werden zur Berechnung O(nlogn) Platz und O(nlogn) Zeit benö- tigt. Abfragen eines bestimmten Pfades werden mit dem Dijkstra Algorithmus in O(nlogn) beantwortet. 3.1.2 Kapoor et al Kapoor et al [3] erstellten einen Algorithmus mit Hilfe von Sichtbarkeitsgraphen. Dafür berechneten sie zuerst die Triangulation der Fläche punkt u und Zielpunkt v P. Start- müssen nun in einem der Dreiecke liegen oder auf dem Rand eines solchen. Sollten sie in demselben Dreieck liegen, ist der kürzeste Pfad eine direkte Verbindung der beiden Punkte. Nun werden alle Eckpunkte des Dreiecks von gesetzt, ebenso mit v. u mit diesem in Verbindung Danach wird der duale Graph der Triangulation er- zeugt. In diesem können alle Knoten mit Grad eins gelöscht werden, sofern sie nicht u oder v beinhalten. Wird nun ein kürzester Weg von u nach v gesucht, so kann über die Triangu- lation eine Sanduhr gebildet werden. Alle Punkte auf den beiden Endgraden haben ihren kürzesten Weg durch die Trichter. Mit Hilfe der Sichtbarkeitsgraphen kann dann eine SPM in der Zeit von O(n + h2 logn) berechnet werden. 3.2 Ansätze für APQ 3.2.1 Chen et al P mit einer Vorbereitungszeit von O(n2 logn) 2 und einem Platzbedarf von O(n ) eine APQ in O(min(Qa , Qb )logn) berechnet werden kann. Hierbei ist Qa die Anzahl der sichtbaren Knoten von a und Qb die Anzahl der sichtbaren Knoten von b. Chen et al [4] zeigten, dass in 5 3.2.2 Chiang und Mitchell Chiang und Mitchell [5] entwickelten einen Algorithmus, der zwar eine Vorer- O(n11 ) besitzt, dafür eine beliebige arbeitungszeit und einen Platzbedarf von O(logn) beantwortet. Eine weitere O(n10 logn) Platz und O(n10 logn) Zeit 2 in einer Zeit von O(log n). Anfrage im Bestfall in Abart dieses Al- gorithmus benötigt und beantwortet eine Anfrage dafür 4 Grundlagen des Algorithmus Nun zu dem Ansatz im nächsten Kapitel, mit dem sich diese Ausarbeitung hauptsächlich befassen soll. Der Trick ist hier Reduktion. Während ein Punkt Umgebung von P u überall in der freien liegen kann, müssen die kürzesten Wege über die Ecken der Hindernisse laufen, sofern sich Start- und Zielpunkt (v ) nicht direkt sehen. Daher wird in der Vorbereitung für jedes das löchrige Polygon P n eine SPM erzeugt. Ebenfalls wird mit einer ganz speziellen Zerlegung in eine Menge von Dreiecken und einfachen Polygonen aufgeteilt. Der Vorteil an diesem Verfahren ist, dass die Zerlegung eindeutig und der reduzierte Skelettgraph statisch ist. Diese Berechnungen bilden eine Datenstruktur der Gröÿe O(n2 ) in O(n2 logn) Zeit. Zum Lösen einer Anfrage benötigt dieses Verfahren in Abhängigkeit von der Anzahl der Hindernisse eine Zeit von O(hlogn). Um den Algorithmus besser zu verstehen, müssen wir vorher auf einige Besonderheiten des Algorithmus eingehen. Wichtig ist die Art der Zerlegung, das Wissen um den lokalen kürzesten Pfad und um die kritischen Stellen. Abbildung 5: links: das Voronoidiagramm von SP 6 P, rechts: der Skelettgraph 4.1 Zerlegungen VP Zuerst erzeugen wir das Voronoidiagramm von P (Abbildung 5). Wir gehen davon aus, dass die Hindernisse in allgemeiner Lage liegen. Daher haben wir im Voronoidiagramm keine Knoten mit einem Grad gröÿer als 3. Danach wird durch Löschung inzidenter Kanten zu VP aus P der Skelettgraph SP gebildet (Abbildung 5). Alle Knoten des Skelettgraphen können nun Grad 1-3 enthalten. Im trivialen Fall hat P keine Hindernisse, dann ist das Problem auf kürzeste Pfade in einfachen Polygonen zu reduzieren. Im Normalfall muss mindestens ein Hindernis in P existieren. Damit gibt es in SP wenigstens einen Kreis um dieses Hindernis herum. Damit ist der Graph zusammenhängend, und es muss folglich ein Weg zwischen zwei beliebigen Knoten des Skelettgraphen SP existieren. u Wenn wir nun einen Pfad zwischen zwei Punkten und v so können wir diesen auf einen Pfad zwischen zwei Punkten dem Skelettgraphen zurückführen. Dabei ist su Skelettgraphen mit dem kleinsten Abstand zu Nun erstellen wir aus dem Skellettgraph SP P aus su suchen, und sv auf der Punkt auf der Kante des u, selbiges gilt für sv v. GP und den reduzierten Skelletgraph (Abbildung 6). Dabei werden alle Knoten und dazu gehörenden Kanten des Skelettgraphen mit Grad 1 entfernt, übrig bleiben somit noch Knoten mit Grad 2 oder 3. Nun werden alle Knoten vom Grad 2 durch eine einzige Kante ersetzt. Etwas ausführlicher: a, b, c Knoten, (a, b), (b, c) Kanten und hat b den Grad 2, also nur a c als Nachbarn, so wird eine Kante (a, c) eingefügt und anschlieÿend sowohl Knoten b wie auch die Kanten (a, b) und (a, c) gelöscht. Sind und Somit bleibt nur noch ein Graph, der aus Knoten des Grades 3 besteht. Da wir h Hindernisse haben und dieser reduzierte Skelettgraph um jedes dieser Hindernisse einmal herumläuft, existieren also Abbildung 6: links: der reduzierte Skelettgraph gung von P in P0 7 GP h+1 Flächen. Zu jedem von P, rechts: die Zerle- x aus dem reduzierten Skelettgraph GP existiert ein Dreieck, welches x assoziierten Besitzern aus P gebildet werden kann. Jeder Knoten hat genau drei Besitzer, über diese wird ein Dreieck gebildet, ohne dabei GP zu schneiden. Das Polygon P wird somit in eine Menge aus Dreiecken und 0 einfachen Polygonen zerlegt. Die Zerlegung wird im Folgenden P genannt Knoten mit den zu (Abbildung 6). Alle Kanten zwischen zwei Dreiecken oder zwischen einem Dreieck und einem Polygon werden Gates genannt. Die komplette Zerlegung geht in einer Zeit von O(n). 4.2 Lokal kürzester Weg Wir nehmen u und v als zwei Anfragepunkte in P . In der Zerlegung von P aus 4.1 liegen diese Punkte entweder in einem Dreieck oder in einem einfachen Polygon su R(i). SP reduziert. su nach sv existieren. Legen wir den Skelettgraph SP über das Voronoidiagram VP , so existiert auf der linken und der rechten Seite von SP eine eindeutige Abfolge von Voronoizellen. Sei φ(su , sv ) der Weg mit dem kürzesten euklidischen Abstand und sv Diese Punkte werden wie in 4.1 beschrieben auf die Punkte auf dem Skelettgraphen Es können mehrere Pfade von über derselben Abfolge von Voronoizellen, so ist es ein lokal kürzester Pfad. Die Ecken des Pfades auf dem Skelettgraphen werden mit den Ecken auf dem lokal kürzesten Pfad assoziiert. Jeder Knoten des Pfades kann nur seine direkten Nachbarn sehen. 4.3 Kritische Stelle Eine kritische Stelle ist der letzte sichtbare Knoten von zesten Weges. Ein Punkt v v entlang eines kür- kann mehrere kritische Stellen besitzen, diese sind die Ecken aus P. Angenommen, wir haben eine Orientierung von πφ (u, v) gegeben. Wenn sich beide Punke gegenseitig sehen, so ist die direkte Verbindung zwischen u u und v der kürzeste globale Weg. Andernfalls wird der letzte von sichtbare Knoten als kritische Stelle bezeichnet. Hierdurch teilt sich die Sequenz der assoziierten Knoten in zwei geordnete Folgen, in die Folge der Knoten, die von v aus sichtbar sind und in die Folge der Knoten, die von v aus nicht sichtbar sind. Klar ist, dass eine solche kritische Kante selbst beim trivialen Fall existieren v die kritische Stelle zu u und umgekehrt. Andernfalls Weg zwischen u und v möglich. muss, in diesem Fall ist wäre kein kürzester 8 5 Algorithmus Nun zum Algorithmus, dieser soll in Zeit Datenstruktur bilden, mit der eine APQ O(n2 logn) und Platz O(n2 ) eine in O(hlogn) beantwortet werden kann. 5.1 Vorbereitung Wir gehen davon aus, dass u und v sich nicht gegenseitig sehen, da der kür- zeste Pfad sonst eine direkte Verbindung wäre. Die Menge der kritischen Stellen für u soll Cu sein und Ein kürzester Pfad von kritische Stelle aus Cu u Cv die Menge der v muss folglich nach kritischen Stellen für in u v. starten und über eine laufen. Dann führt er weiter und kommt schlieÿlich Cv zum Ziel v . Für jede kritische Stelle c ∈ Cu ∪ Cv berechnen wir mit der passenden SPM die Entfernung dist(c, u) und dist(c, v). Damit ist dist(c, u) + dist(c, v) die Länge eines Pfades über c. Der kürzeste Weg dist(u, v) ist damit das Minimum aller Pfadlängen für alle c ∈ Cu ∪ Cv über eine kritische Stelle aus dist(u, v) = minc∈Cu ∪Cv (dist(u, c) + dist(c, v)) Es ist ausreichend nur eine der beiden Mengen Cu und Cv zu betrachten, da es einerlei ist, ob alle Präxe des lokalen kürzesten Pfades gesucht werden, der u verlässt oder alle Suxe der lokalen kürzesten Pfade, die v erreichen. Cmin ist nun die kleinere der beiden Mengen Cu und Cv , dann gilt dist(u, v) = minc∈Cmin (dist(u, c) + dist(c, v)) Der Einfachheit halber gehen wir weiter davon aus, dass Cu Cmin im Folgenden sei. Wir wenden den Algorithmus 5.1 an. Dieser benötigt keine Eingaben von Anfragepunkten sonder nur die Polygonszene, daher reicht es uns, diesen einmal anzuwenden. Der Algorithmus zerlegt die Szene, so dass spätere Anfragen schnell bearbeitet werden können, da bei neuen Anfragen auf die schon gespeicherte Datenstruktur zurück gegrien wird. VP , der Skelettgraph SP , der re0 duzierte Skelettgraph GP , die Zerlegung P , die einfachen Polygone R(l1 , l2 ), Damit wurden nun das Voronoidiagramm die Hierarchie der Sanduhren HH(R), die Sanduhren lich die pointlocation Struktur berechnet. Dies alles in O(n2 ) Platz und O(n2 logn) 9 Zeit. H(l1 , l2 ) und schlieÿ- Algorithmus 5.1 APQ PD Preprocessing(P ) Input: ein löchriges Polygon mit h Hindernissen und n Ecken Output: Datenstruktur für APQ(P ) 1. ∀v ∈ P berechne SPM(v ) VP von P . VP . 4. berechne den reduzierten Skelettgraph GP auf SP . 0 5. berechne die Zerlegung P von P . 6. berechne/speichere für alle einfachen Polygone R(l1 , l2 ) Gates l1 und l2 eine Hierarchie der Sanduhren, HH(R). 7. speichere H(l1 , l2 ) 2. berechne/speichere Voronoidiagramm 3. berechne den Skelettgraph SP aus in P0 mit den 8. berechne eine pointlocation Struktur basierend auf der Triangulation (Punkt 5). 5.2 Weiterführende Ideen In der Vorverarbeitung wurden viele Strukturen erstellt, diese greifen bei einer Anfrage ineinander und reduzieren den Zeitaufwand erheblich. Beim eigentlichen Anfrageteil, der im wesentlichen aus der Verkettung von Trichtern besteht, werden zusätzlich noch für die beiden Anfragepunkte u und v Listen oener und geschlossener Trichter geführt. Fo (u) ist die Menge der oenen Trichter zwischen Fc (u) die Fc (v) sind verarbeitung berechneten Nachbargates, Trichter von u zu den Gates. Fo (v) und u und den in der Vor- Menge der geschlossenen die Trichtermengen für v zu den angrenzenden Gates. Der Anfragealgorithmus arbeitet über die Struktur von oenen Trichtern in alle Richtungen, bis er entweder eine Lösung errechnen konnte oder aber keine oenen Trichter in den Listen Fo (u) und Fo (v) mehr existieren. Was bedeutet, dass es keine weiteren Wege mehr gibt und alles schon berechnet wurde. In diesem Algorithmus ist die Trichterstruktur ein BST oder auch balanzierter binärer Baum (engl. balanced binary search tree). Bei der Trichterverkettung können zwei Fälle auftreten. Benden wir uns in einem einfachen Polygon, so besitzt dieses dank unserer Zerlegung genau zwei Gates. Sind wir in einem Dreieck, dann können entweder zwei oder drei Gates vorhanden sein. Zwei Gates, wenn das Dreieck nicht direkt durch einen Punkt des reduzierten Skelettgraphen gebildet wurde, drei, wenn das Dreieck zu einem Punkt des reduzierten Skelettgraphen gehört. Zur Erläuterung: u ein einfaches Polygon R(l1 , l2 ), f (u, l1 ) mit der Sanduhr H(l1 , l2 ) des Polygons. den Trichter f (u, l2 ). Liegt angrenzend an unserem Eingabepunkt so verketten wir den Trichter Als Ergebnis bekommen wir 10 u ein Dreieck ∆l1 , l2 , l3 , dann f (a, l1 ) mit ∆l1 , l2 , l3 . Hier kann es zu einem Trichtersplit kom- Liegt angrenzend an unseren Eingabepunkt verketten wir men, dabei teilt sich der Trichter nun in zwei verschiedene Richtungen auf. Einmal verketten wir es zu l2 und einmal zu l3 , somit besitzen wir nun zwei Endtrichter. Die Berechnung der neuen Trichter nennt sich ziehen. Als Ergebnis bekommen wir die zwei neuen Trichter f (a, l2 ) und f (a, l3 ). Um Trichter nicht doppelt zu benutzen wird ein DAG (directed azyclic graph) erzeugt. Dieser bildet sich aus dem reduzierten Skelettgraphen GP . Jede Kante wird gerichtet, um die Abhängigkeiten der Trichter zu repräsentieren. Jeder Knoten von GP speichert einen Pointer, der auf das Gate zeigt, welches vom Trichter besucht wurde. Somit repräsentiert eine gerichtete Kante (u(l1 ), v(l2 )) eine Trichterverket- tung von Gate l1 zu Gate l2 . Um dies zu berechnen, wird eine Folge von nutzbaren Knoten erzeugt. Dabei gilt: zwei Knoten v1 (l1 ) wenn sie zu einem Dreieck v2 (l2 ) sind Geschwister ∆(l, l1 , l2 ) in P 0 gehören. und mit dem Vater u(l), Um herauszunden, welche Knoten markiert werde müssen, testen wir für jeden Knoten, ob dessen Vater- und Geschwisterknoten schon markiert wurden, , Falls dem so ist wird auch dieser Knoten markiert. Wenn alle Knoten getestet sind und keine Veränderung der Folge mehr auftritt, startet die Trichterverkettung. Wird ein Trichter verkettet, so wird der dazugehörige Knoten aus der Folge entfernt. Solange die Folge noch nicht leer ist, wird der Trichter weiter verkettet. Die besondere Grundidee dieses Algorithmus besteht darin, dass nur O(1) Trichter für jedes Gate propagiert werden. Zur weiteren Berechnung hier noch ein Algorithmus zur Erkennung der pas- Cmin oder dist(a, b) ausgeben. In diesem Algorithmus wird O(h) mal konkatiniert, O(1) mal für jedes Gate und O(h) mal für das ziehen. Die Anzahl der Iterationen ist durch O(h) begrenzt. Jede Iteration benötigt dabei im worstcase eine Zeit von O(logn). senden kritischen Stellen. Er soll als Ausgabe entweder die Menge aber die Distanz Die Berechnung eines kürzesten Pfades dauert somit im worstcase eine Zeit von O(hlogn). 5.3 Anfrage u und v in Form dist(u, v) ausgeben. Mit der Hilfestruktur zur Pointlocation ndet er zuerst das Dreieck fu zu u und fv zu v . Als nächstes wird in der Zerlegung P 0 nach den Regionen R(u) und R(v) gesucht, welche u und v enthalten. Der Anfragealgorithmus bekommt die zwei Anfragepunkte eines Tupels (u, v) als Eingabe und soll die Distanz Es muss nicht unterschieden werden, ob Punkte im Inneren oder auf den Rändern der Regionen liegen. Wenn Punkte auf den Rändern oder aber direkt auf Diagonalen liegen dann wird der Punkt einer der beiden Nachbarregio- 11 nen zugeordnet. Hier können zwei Fälle auftreten. Fall 1. Die Regionen R(u) dies bedeutet, dass und u R(v) sind identisch, v entweder im sel- und ben Dreieck oder aber im selben einfachen Polygon liegen. Sollten sie sich im selben Dreieck der Zerlegung P0 benden, dann ist der kürzes- te Pfad die direkte Verbindung von Dann kann die Distanz dist(u, v) u und v. Abbildung 7: R(u)=R(v) ohne groÿen Aufwand berechnet und ausgegeben werden. Sollten beide Punkte in einem einfachen Polygon liegen, so wird geprüft, ob sie sich sehen. Ist dies der Fall, wird ebenfalls die Distanz dist(u, v) berech- net und ausgegeben. Interessanter ist der Fall, wenn sie sich innerhalb des Polygons nicht sehen. Dann muss der kürzeste Pfad über eine Ecke des Polygons laufen. Seien nun lu und lv die Diagonalen, welche u und v am nächsten liegen. Nun verkettet der Algorithmus den Trichter f (u, lu ) mit der Sanduhr H(lu , lv ) und weiter mit dem Trichter f (lv , v) (Abbildung 7). Die resultierende Sanduhr H(u, v) ist geschlossen, da sich die Punkte nicht direkt sehen konnten. Fall 2 Hier liegen u und v in unterschiedlichen Regionen. Diese können entweder zwei Dreiecke, zwei einfache Polygone oder aber ein Dreieck und ein Polygon sein. Zur Vereinfachung sei Wenn schen i i i ∈ {u, v}. nun ein Dreieck ist, so berechnet der Algorithmus alle Trichter zwi- l1 f (i, l2 ) . und seinen angrenzenden Gates liefert als Teilergebnis Sollte es sich bei f (i, l1 ) R(i) und und aus der Region R(i). Er um eine einfaches Polygon handeln, so werden erst die beiden Diagonalen gefunden, die dem Punkt li1 und li2 H(l2 , li2 ) zwischen l2 i am nächsten liegen. Diese H(l1 , li1 ) werden mit bezeichet. Danach werden die Sanduhren und den Gates l1 und l2 und den Diagonalen berechnet. Dabei ist es egal, ob es sich bei R(i) um ein Dreieck oder um ein einfaches Polygon handelt, es werden in beiden Fällen Trichter berechnet. Diese Trichter werden auf Oenheit geprüft. Da führt der Algorithmus drei Hilfsstrukturen mit sich. Eine Liste für oene Trichter geschlossene Trichter Fc (i) Fo (i), eine Liste für und einen DAG, in dem die oenen Trichter ver- waltet werden können. Falls die resultierenden Trichter oen sind, so fügt der Algorithmus sie der Menge der oenen Trichter der Menge der geschlossenen Trichter Nun muss noch der DAG D(i) Fo (i) hinzu, andernfalls Fc (i). aktualisiert werden. Schlieÿlich wird der Al- 12 Algorithmus 5.2 FindMinCriticalSites (u, v), die Menge der oenen und geschlossen TrichFo (u), Fc (u), Fo (v), Fc (v), die DAGs der oenen Trichter D(u), D(v) 0 und die Zerlegung P . Output: entweder die Menge der kritischen Stellen Cmin oder die Distanz von u und v dist(u, v). Cmin sei leer. while Fo (u), Fo (v) sind nicht leer do Input: ein Anfragepaar ter 2.1 es fallen für jedes nutzbare Gate lu zwei Fälle an if lu if inzident zu einem Nachbardreieck v if v then then berechne dist(u, v) ∆lu , l1 , l2 ist then ist in lu , l1 , l2 u sieht end if end if und gebe es aus. ziehe einen Trichter oder aber zwei Trichter, diese bilden neue Endtrichter für die beiden Gates l1 und l2 . end if if lu inzident zu einem einfachen Polygon ist then if R enthält v then H(lu , lv1 ) in R propagiere den Endtrichter von lu und die assoziierte Sanduhr nach lv1 mittels Verkettung von H(lu , lv1 ) identiziere die Sanduhr if der Trichter ist oen if u sieht berechne end if end if end if then v dist(u, v) then und gebe es aus. verkette den oenen Trichter nach end if v. 2.2 verkette den Endtrichter von lu und die assoziierte Sanduhr zu allen Nachbargates. Falls der Trichter sich schlieÿt, dann ziehe einen neuen Endtrichter. lösche alle geschlossenen Trichter aus Fo (u) und Fo (v) und D(v) 2.2 für v aktualisiere den DAG wiederhole 2.1 und end while Fo (u) leer sein. Für jeden Trichter in Fc (u) sammle den ersten Knoten speichere ihn in Cmin . Gebe Cmin zurück. lasse und 13 gorithmus FindMinCriticalSites mit Fo (i) und Fc (i) aufgerufen. Dieser Al- gorithmus kann wie oben beschrieben entweder die Distanz dist(u, v) als Ergebnis liefern, dann können wir diese direkt ausgeben, oder er liefert uns die Menge der kritischen Stellen Cmin . Wenn wir Cmin bekommen haben, werden über die SPMs alle möglichen Wege berechnet. Danach wird das Minimum dieser Wege gesucht, der kürzeste Weg ist nun gefunden. Literatur [1] D.Z. Chen, O. Daescu, and K.S. Klenk. On geometric path query problems, 1997. [2] H. Guo, A. Maheshwari, and J.R. Sack. Shortest path queries in polygonal domains, aaim 2008. [3] S. Kapoor, S.N. Maheshwari, and J.S.B. Mitchell. An ecient algorithm for euclidean shortest paths among polygonal obstacles in the plane., 1997. [4] J. Hershberger and S. Suri. An optimal algorithm for euclidean shortest paths in the plane, siam journal on computing vol28, 1999. [5] Y.J. Chiang and J.S.B Mitchell. Two-point euclidean shortest path queries in the plane., 1999. 14