Effiziente Online-Erforschung eines unbekannten, stark zusammenhängenden Graphen Alexander Nofftz 16. November 2005 Zusammenfassung Seminarvortrag zum Paper »Exploring an Unknown Graph Efficiently« von Rudolf Fleischer und Gerhard Trippen [1] im Wintersemester 2005/06 am Institut für Informatik der Rheinischen Friedrich-Wilhelms-Universität Bonn. Inhaltsverzeichnis 1 Einleitung 1 2 Problemstellung 2 3 Grundidee 2 4 Der Algorithmus 4 5 Analyse 9 6 Abschlussbemerkungen 11 1 Einleitung Die Erforschung einer unbekannten Umgebung ist ein fundamentales Problem der Online-Bewegungsplanung. Hierbei wird eine komplette Karte der Umgebung erstellt. Als Online-Problem ist vor allem der kompetitive Faktor für die Analyse interessant, der angibt, um welchen Faktor der zurück gelegte Weg maximal im Vergleich zum optimalen Weg sein kann, der erstellt werden kann, wenn der Graph vorher bekannt ist. Während die Offline-Lösung für einen gerichteten oder ungerichten Graphen in polynomieller Zeit gefunden werden kann (»Chinese Postman Problem« [2]), ist bereits die Offline-Suche in Graphen mit sowohl gerichteten, als auch ungerichteten Kanten NP-vollständig [3]. Das Online-Problem lässt sich im ungerichteten Graphen mittels einfacher Tiefensuche lösen, die hier optimal 2-kompetitiv ist [4]. Derselbe kompetitive Faktor wird auch in einem gerichteten Eulergraphen1 erreicht (siehe unten). 1 Ein Graph ist eulersch, wenn es einen Rundweg gibt, der jede Kante genau einmal besucht. 1 Für Nicht-Eulergraphen ist die Problemstellung komplexer. Damit überhaupt online ein Weg gefunden werden kann, muss der Graph zumindest stark zusammenhängend sein, man also von jedem Knoten aus den Startknoten erreichen können. Anderfalls kann es vorkommen, dass man bei der Erforschung in einer »Sackgasse« landet und von dort nicht mehr wegkommt. Hauptsächlich hängt der kompetitive Faktor von der minimalen Zahl d der Kanten ab, die dem Graphen fehlen, um eulersch zu sein. Verschiedene Arbeiten zu diesem Problem wurden veröffentlicht, deren Faktor jedoch alle in dΩ(d) liegt. Der hier vorgestellte Algorithmus ist der erste, der einen poly(d)kompetitiven Faktor aufweist. 2 Problemstellung Gegeben sei ein unbekannter, stark zusammenhängender Graph G = (V, E), dessen Knoten und Kanten (und deren Kardinalität) bis auf den Startknoten s unbekannt sind, d.h. wir kennen nichts von G außer den Knoten s und der Zahl der in ihm entspringenden Kanten. Das Defizit d sei die minimale Anzahl der Kanten, die fehlen, um diesen Graphen eulersch zu machen. Ein Knoten mit mehr ausgehenden als eingehenden Kanten nennen wir Quelle, einen Knoten mit mehr eingehenden als ausgehenden Kanten Senke. Eine Kante ist besucht worden, sobald wir sie das erste Mal traversieren. Eine Traversierung ist nur vom Beginn zum Ende der Kante möglich; wir können ohne Traversierung nicht festellen, auf welchen Knoten die Kante zeigt. Anders ausgedrückt: Es ist immer nur bekannt, wie viele Kanten aus einem Knoten herausführen und ob diese schon besucht worden sind. Wohin sie führen oder ob und wie viele Kanten auf den Knoten selbst zeigen ist unbekannt. Wenn ein Knoten keine unbesuchten, ausgehenden Kanten mehr aufweist, nennen wir ihn abgearbeitet. Falls wir einen Knoten erreichen, der keine unbesuchten, ausgehenden Kanten mehr aufweist, sind wir stecken geblieben und müssen unsere Position wieder relokieren, um zu einem bekannten Knoten zurückzukehren und von dort einen neuen Weg zu suchen. Diese Relokierungskosten sind die Hauptkosten des Algorithmus, da diese Wege je nach Startposition und Position der Senke sehr lang sein können. Unser Ziel ist also, diese Wege so gering wie möglich zu halten. 3 Grundidee Bei einem Eulergraphen ist der Online-Algorithmus recht einfach: Beginnend vom Startknoten wird solange entlang bisher unbesuchter Kanten traversiert, bis in einem Knoten schließlich keine mehr gefunden wurde. Da dies ein Eulergraph ist, müssen wir wieder den Beginn dieses Pfades erreicht und einen Kreis geschlossen haben. Nun wird der Kreis ein zweites Mal besucht und der Algorithmus für jede unbesuchte Kante auf den Knoten dieses Weges rekursiv neu gestartet. Sobald wir bei dieser zweiten Traviersierung wieder beim Startpunkt angekommen sind, haben wir den gesamten Graphen erkundet (siehe Abb. 1). Da wir jede Kante nur zweimal benutzen, ist dieser Algorithmus 2-kompetitiv. Man kann zeigen, dass dieser Algorithmus optimal ist. Diese Idee wird beim Algorithmus für stark zusammenhängende Graphen aufgegriffen. Bei solchen nicht eulerschen Graphen wird der Startknoten eines neu zu erforschenden Pfades eine neue Quelle des aktuell bekannten Untergraphen und jeder Knoten, bei dem wir stecken bleiben, ist entweder eine neu entdeckte Senke oder eine 2 Abbildung 1: Greedy-Algorithmus für Eulergraphen. Links: Beginnend vom Startknoten s werden willkürlich Kanten traversiert und damit fünf Knoten in der angegebenen Reihenfolge besucht, bis wir wieder s erreichen. Mitte: Der zuvor erkundete Kreis wird nun ein zweites Mal besucht. Da direkt der erste Knoten unbesuchte Kanten aufweist, wird er hier rekursiv neu gestartet und über bisher unbesuchte Kanten vier Knoten besucht. Rechts: Auch hier wird der Kreis ein zweites Mal besucht. Da inzwischen alle Kanten von s besucht wurden, wird erst im zweiten Knoten v eine unbesuchte Kante entdeckt und auch hier wieder der Algorithmus neu gestartet. Nach dem Besuchen von vier weiteren Knoten ist der gesamte Graph erkundet. Quelle des bereits bekannten Untergraphen. Dadurch sind zu jeder Zeit gleich viele Quellen und Senken bekannt (wobei mehrfache Quellen und Senken entsprechend oft gezählt werden). Der Algorithmus speichert eine Zuordnung zwischen den Quellen und Senken als Token. Jeder Senke wird ein Token zugeordnet, das diese anfangs eindeutig beschreibt (etwa die Zahlen 1, . . . , d, da es nicht mehr Token als das Defizit d geben kann). Die einzigen Möglichkeiten, stecken zu bleiben, wären beim Schließen eines Kreises (wie im Algorithmus für Eulergraphen) oder bei einem Knoten mit einem Token. Im ersteren Fall können wie im Euler-Algorithmus fortfahren und einen neuen Pfad erkunden. Im zweiten Fall werden wir das Token aktivieren und es zum Startknoten des Pfades verschieben, den wir gerade besucht haben, bevor wir stecken geblieben sind, um uns zu merken, dass es eine »Sackgasse« war (siehe Abb. 2). Abbildung 2: Stecken bleiben und Relokation. Beim Verfolgen des Pfades P wird der Knoten v erreicht. Dieser wurde zuvor schon über den Pfad P1 erreicht und dann über die einzige ausgehende Kante bei P2 wieder verlassen. Da diese Kante schon besucht ist, handelt es sich offensichtlich um eine Senke, da wir stecken geblieben sind. Somit wird der Knoten mit einem Token τ markiert und eine Relokation entlang P2 zum Startknoten s durchgeführt. Anschließend kann ein neuer Pfad P3 erkundet werden. Die Zusammenfügung aller Pfade, die ein Token τ aktivieren, – also der Pfad vom aktuellen Knoten des Token bis zu seiner Senke – wird als Pτ bezeichnet. Anfangs ist Pτ ein leerer Pfad. Dem entsprechend bezeichnet τP das Token am Startknoten eines 3 Pfades P (falls sich dort eines befindet). Obwohl der gesamte Graph G stark zusammenhängend ist, muss dies zu Beginn für den bereits erforschten Untergraphen nicht gelten, da man beim Erkunden eines Pfades etwa auch in einer Senke stecken bleiben könnte (siehe Abb. 3). Albers und Henzinger stellten ein Verfahren vor, mit dem zu Beginn erst einen Kreis C0 gesucht wird, der s enthält [5]. Dies führt zu einem weiteren Faktor d2 in der Kompetitivität, da der Algorithmus d-mal an unterschiedlichen Startknoten mit einem kompetitiven Faktor von d gestartet werden muss, denn wir haben noch keinen stark zusammenhängenden Untergraphen. Trotzdem werden wir diese Annahme machen, damit wir s von jedem Token erreichen können, das wir entdecken könnten. Abbildung 3: Warum wird ein Anfangskreis benötigt? Links: Bei einer Erkundung de Pfades nach dem Eulergraphen-Algorithmus wurde von s ausgehend erst der Knoten v erreicht. Anschließend wurde in w willkürlich die untere Kante gewählt, die wieder zu v zurückführt. Hier bleiben wir stecken, da die einzige ausgehende Kante schon besucht worden ist. Die zweite Kante von w ist unbekannt, daher gibt es keinen bekannten Weg mehr. Rechts: Hier ist der Anfangskreis s, v, w, s bekannt. Wenn wir nun genau wie eben denselben Kanten folgen und in v stecken bleiben, wissen wir nun, wie wir über den bekannten Weg zu s zurückkehren können. 4 Der Algorithmus Der Graph wird in Cluster unterteilt, die einen stark zusammenhängenden Untergraphen von G darstellen. Somit können die Cluster unabhängig vom Rest von G erforscht werden, auch wenn sie sich möglicherweise überlappen. Wenn wir gerade Cluster K bearbeiten und dabei einen neuen Cluster L anlegen, nennen wir L einen Untercluster von K. Außerdem ist L ein Sohn von K im Clusterbaum S. Jeder Cluster K besitzt einen Anfangskreis CK . Der Wurzelcluster K0 von S besitzt den Anfangskreis C0 mit dem Startknoten s (siehe Abb. 4). Jedem Cluster K ordnen wir ferner einen Tokenbaum TK zu, dessen Wurzel der Anfangskreis CK des Clusters ist (auch wenn dieser kein Token darstellt). Den Tokenbaum von K0 bezeichnen wir als T0 . Für jedes Token existiert ein Knoten in einem der Tokenbäume. Außerdem existiert für jeden Cluster ein so genannter Clusterknoten in irgend einem Tokenbaum als Platzhalter für die in diesem Cluster enthaltenen Token. Wenn wir beim Verfolgen eines Pfades Pτ ein Token π aktivieren, das sich in denselben Tokenbaum befindet, dann wird τ zum Besitzer des Tokens π, das entsprechend als Sohn in den Baum eingefügt wird. Somit repräsentiert der Tokenbaum eine Besitzer-Relation: ein Knoten ist der Besitzer all seiner Söhne. Die Söhne werden je- 4 Abbildung 4: Unterteilung des Graphs G in Cluster und Clusterbaum S weils von links nach rechts in der Reihenfolge abgespeichert, in der sie im Pfad des Vaterknotens erscheinen. Falls π zu einem anderen Tokenbaum als τ gehören sollte, kann π nicht direkt τ als Sohn zugeordnet werden, sondern es müssen verschiedene Fälle unterschieden werden, die etwa zur Erzeugung oder Zerstörung eines Clusters führen können. Mehr dazu später. Die Zahl der Token in einem Clusterknoten ist das Gewicht eines solchen Knotens. Ein Clusterknoten ist mit seinem Vater immer durch eine Kante verbunden, deren Länge gleich dem Gewicht des Knotens ist. Ferner wird festgelegt, dass ein Tokenpfad Pτ immer aus einem noch nicht fertig bearbeiteten Teil, gefolgt von einem abgearbeiter Teil besteht, wobei beide Teile leer sein können. Da der abgearbeitete Teil für den Algorithmus oder die Analyse nicht interessant ist, werden wir von nun an mit dem Tokenpfad Pτ nur den noch nicht beendeten Teil des Pfades bezeichnen. Folgedessen ist ein Token abgearbeitet, wenn sein Tokenpfad leer ist. Wenn wir einen Pfad – hier die aktuelle Kette genannt – abzuarbeiten beginnen, werden wir ihn immer komplett abarbeiten, bevor irgend etwas anderes getan wird. Wenn wir also beim Erforschen eines neuen Pfades stecken bleiben, kehren wir wieder zur aktuellen Kette zurück und arbeiten sie weiter ab. Ein Cluster ist abgearbeitet, wenn alle Knoten seines Tokenbaums abgearbeitet sind, andernfalls ist er aktiv. Die Cluster werden rekursiv abgearbeitet. Wenn also ein neuer Cluster L erzeugt wird, während am Cluster K gearbeitet wird, wird nach dem Beenden der aktuellen Kette (in K) mit der Bearbeitung von L fortgefahren und die Bearbeitung von K erst fortgesetzt, wenn L abgearbeitet ist. Dies führt dazu, dass in S immer exakt die Cluster auf dem rechtesten Pfad von der Wurzel aktiv sind, während alle anderen Knoten bereits abgearbeitet sind. Beim Beginn der Abarbeitung eines neuen Clusters K wird der Tokenbaum TK in Breitensuche bearbeitet. Üblicherweise ist der Anfangskreis CK – also die Wurzel von TK – zumindest noch teilweise nicht abgearbeitet, sodass dies die erste Kette ist, die beim Erreichen von K bearbeitet wird. Ist τ dann das nächste Token in TK nach Reihenfolge der Breitensuche, dann wird Pτ zur aktuellen Kette, die als nächstes bearbeitet wird. Danach wird mit dem rechten Nachbarn von τ fortgefahren, oder dem Token am weitesten links auf der nächsten Ebene, falls τ das rechteste Token auf seiner Ebene war. TK kann dynamisch wachsen, während K bearbeitet wird, jedoch nur auf Ebenen unter der Ebene der aktuellen Kette (wegen dem Gewicht und der Länge 5 der Kanten von Clusterknoten im Tokenbaum). Die Kanten eines Clusters werden als heimisch, adoptiert oder vererbt klassifiziert. Wenn ein Cluster K erzeugt wird, erbt er die Kanten auf seinem Anfangskreis CK von seinem Vatercluster. Eine Kante ist in einem Cluster K heimisch, wenn sie zuerst beim Aktivieren eines Tokens, dessen Tokenknoten dann nach TK verschoben wurde, besucht wurde. Es können auch Token ausgelöst werden, die in einem anderen Cluster als dem aktuell bearbeiteten liegen. Nur aktive Cluster können neue heimische Kanten erhalten, und Kanten werden immer bei der Bearbeitung des Clusters abgearbeitet, in dem sie heimisch sind. Wenn ein Cluster abgearbeitet wurde, werden all seine heimischen Kanten vom Vatercluster adoptiert. Ein Token π ist ein Ahn eines Tokens τ , wenn es einen Cluster L gibt, in dem π und τ Elemente sind, und π (oder ein Clusterknoten, der π enthält) auf dem Pfad von der Wurzel nach τ (oder einem Clusterknoten, der τ enthält) liegt. Nach dieser Definition ist auch jeder direkter Vorgänger eines Knotens in einem Tokenbaum ein Ahn. Anders herum ist ein Ahn nicht unbedingt ein direkter Vorgänger, da er auch in einem anderen Cluster liegen kann. Sei nun K der momentan bearbeitete Cluster. Um die aktuelle Kette C = Pτ abzuarbeiten, relokieren wir zum Knoten, der aktuell das Token τ hält, und bewegen uns entlang C. Immer wenn ein unbeendeter Knoten v entdeckt wird, erkunden wir zunächst einen neuen Pfad P , indem wir immer unbesuchte, ausgehende Kanten besuchen, bis wir in einem Knoten w stecken bleiben. Dabei sind drei Fälle zu unterscheiden: 1. Wenn v = w unterbrechen wir C in v und fügen P in C ein, danach wird die Bearbeitung in C fortgesetzt, wobei zunächst die Knoten in P abgearbeitet werden (siehe Abb. 5). Dies ist dieselbe Vorgehensweise wie im Greedy-Algorithmus für Eulergraphen. Abbildung 5: Ein gefundener Kreis in v wird in C eingebaut 2. Wenn v 6= w und w ein Token π besitzt, das kein Ahn von τ ist (falls w mehrere solche Token besitzt, wählen wir willkürlich eins) – also der Tokenpfad Pπ bisher von dem aktuellen Pfad unabhängig war –, dann erweitern wir den Tokenpfad Pπ , indem der neue Pfad P vorne angehängt und π nach v verschoben wird (siehe Abb. 6). Somit wurde der Tokenpfad bis zur aktuellen Kette verlängert. Beim Aktualisieren des Tokenbaums kann es zu verschiedenen Fällen kommen. Sei L der weiteste Vorgänger (in S) des aktuellen Clusters K, in dem sowohl π als auch τ Elemente sind. Wenn τ ein aktives Element von L ist, sei zτ der Knoten τ in L; andernfalls sei zτ der τ enthaltende Clusterknoten in L. Wenn π ein aktives Element von L ist, dann verschiebenen wir in TL den Knoten π zusammen mit seinem Unterbaum als einen neuen Sohn unter zτ ; andernfalls sei zπ der π enthaltende Clusterknoten in L, der einem Unterknotem L entspricht. Wir zerstören Lπ, indem wir die Token und Tokenpfade in Lπ so neu anordnen, dass π die Wurzel des Tokenbaums von Lπ wird (anstatt des Anfangskreises). 6 Abbildung 6: Der Tokenpfad von π, der in w startet, wird um P verlängert und das Token nach v verschoben; C wird der neue Besitzer von π Dann können wir diesen neuen Tokenbaum als neuen Sohn unter zτ verschieben. Alle heimischen Kanten von Lπ werden von L adoptiert (siehe Abb. 7). In allen Fällen wird, falls zτ ein Clusterknoten ist, als zusätzliche Information im Knoten π der wahre Eigentümer abgelegt (falls der Untercluster zτ später zerstört werden muss, siehe Abb. 7). Die Zerstörung von Lπ ist nötig, weil der Tokenpfad Pπ den Anfangskreis D von Lπ gekreuzt hat, als Lπ erzeugt worden ist. Daher können wir den Kreis D in Pπ einfügen und einen neuen Tokenbaum T für Lπ mit Wurzel π erstellen, indem wir den Unterbaum mit Wurzel π abschneiden und alle Söhne von D als Söhne unter π einfügen. Anschließend kann der Knoten D gelöscht werden. Dies klappt, weil es immer einen Pfad von D zu jedem Element von Lπ gibt, der nur Kanten von Lπ (und dessen rekursiven Unterclustern) verwendet. Falls zπ Söhne haben sollte, müssen diese ebenfalls in T eingefügt werden, indem sie als Söhne ihrer Besitzer abgelegt werden. Anschließend kann nach v zurückgekehrt und das Abarbeiten der aktuellen Kette C fortgesetzt werden. 3. Wenn v 6= w und w ein Token π besitzt, das ein Ahn von τ ist (falls w mehrere solcher Token aufweist, wählen wir willkürlich eins), können wir nicht einfach den Unterbaum ab π unter τ hängen, denn wir haben gerade einen Kreis geschlossen, da es einen Weg von π nach τ und von τ nach π gibt. Stattdessen muss ein neuer Cluster erstellt oder der aktuelle Cluster erweitert werden. Es kann auch vorkommen, dass π = τ ist. Auch hier sind einige Fälle zu unterscheiden. Wenn π Ahn von τ in TK ist, dann wurde gerade ein Kreis D, der v und w enthält, geschlossen. Der Teil von D von w nach v besteht aus Kanten, die aus den Anfangsteilen aller Tokenpfade 7 Abbildung 7: Zerstörung eines Clusters Oben: Die Zahlen 1, . . . , 7 stehen für die Token τ1 , . . . , τ7 . Da τ6 und τ7 Pfaden außerhalb von Lπ entsprechen, sind sie keine Elemente von Lπ , sondern Elemente von L und Söhne des Clusterknotens zπ (der auch π enthält) in einem Vorgängercluster L. Ein neuer Pfad P von irgendwo außerhalb von Lπ aktiviert π in Lπ . vπ ist die Position von π zu dem Zeitpunkt, als Lπ mit dem Anfangskreis D (fett) erzeugt worden ist. Unten: π wurde zum Startpunkt von P verschoben und Lπ wurde so umgeordnet, dass er einen neuen Baum T mit der Wurzel π enthält. Man beachte, dass dieser Baum nun auch die Token τ6 und τ7 enthält. Zuletzt wurde T als neuer Sohn von zτ in TL eingefügt. der Vorgänger von τ bis π bestehen (siehe Abb. 8). Diese Pfade können verkürzt werden, indem wir die entsprechenden Token entlang D zu den Knoten verschieben, der ursprünglich das nächste Token besaß. Dadurch beginnen nun alle Tokenpfade von D. Nun kann ein neuer Untercluster L mit dem Anfangskreis CL = D erstellt werden, in dessen Tokenbaum alle Token von L Söhne von D werden (diese liegen alle auf dem Pfad von π nach τ in TK ). Nun wird der Unterbaum ab π abgeschnitten und durch einen neuen Clusterknoten KL ersetzt, der alle Token von L enthält. Die Kante, die diesen neuen Knoten mit TK verbindet, hat die gleiche Länge wie das Gewicht des Knotens (die Anzahl der enthaltenen Token). Somit liegt er auf derselben Ebene wie zuvor τ . Wenn irgendeins der Token von L Söhne in TK hatte, die keine Elemente von L geworden sind, verschieben wir diese Unterbäume als Söhne unter KL . Der Grund dafür besteht darin, dass diese Unterbäume Tokenpfaden entsprechen, die nicht in L enden, sodass es sinnvoller ist, diese Pfade in K und nicht in L abzuarbeiten (um die Zurücksetzungskosten zu begrenzen). Diese Beschreibung ging davon aus, dass keiner der Knoten in TK zwischen π und τ ein Clusterknoten ist. Wenn es Clusterknoten auf dem Pfad gibt, müssen 8 Abbildung 8: Erstellung eines Clusters Oben: Der neue Pfad P , der an v beginnt, aktiviert das Token π, das ein Vorgänger von τ in TK ist. Unten: π und τ werden aus TK entfernt. Außerdem wird ein Untercluster L mit dem Anfangskreis D = (w, τ2 , τ5 , z, v, w) (fett) erzeugt. Der Clusterknoten KL in TK hat das Gewicht 4. Das Token τ6 befindet sich nicht im neuen Cluster, da kein Teil des Tokenpfades im Anfangskreis vorhanden ist. wie im 2. Fall diese Cluster zunächst zerstört werden, bevor der neue Untercluster erzeugt werden kann. Bevor die Verarbeitung rekursiv im neuen Untercluster L fortgesetzt werden kann, muss zunächst die aktuelle Kette C (im aktuellen Cluster K) beendet werden, d. h. wir kehren zu v zurück. Wenn wir dabei ein Token aktivieren, das ein Ahn von KD oder eines in KD enthaltenen Tokens ist, muss L erweitert werden. In diesem Fall wird die Kette, die gerade das Token ausgelöst hat, so erweitert, dass sie nun in CL startet, also wird sie nun einen Teil von C enthalten. Man beachte, dass diese Kanten zuvor in K entdeckt worden sind, also dort heimisch sind, aber nun heimisch in L statt K werden. Das ist dasselbe, als was passieren würde, wenn eine neue Kette Pτ2 beim Bearbeiten von D in L entdeckt werden würde. 5 Analyse Zur Analyse der vollständigen Zurücksetzungskosten zählen wir, wie oft eine Kante beim Relokieren der Position benutzt werden kann. 9 Lemma 1. Zu jeder Zeit hat jeder Tokenbaum TK maximal d Ebenen unter der Wurzel und jede Ebene enthält maximal d Knoten. Beweis. Es kann maximal d Token geben. Lemma 2. Wenn gerade ein Knoten in der Ebene h bearbeitet wird, dann sind alle Knoten in höheren Ebenen als h bereits abgearbeitet worden. Anders ausgedrückt: Es wird nie ein nicht beendeter Knoten in eine Ebene höher als h verschoben. Beweis. Die Länge der Kanten, mit denen Clusterknoten mit ihren Vätern verbunden werden, beträgt immer die Anzahl ihrer enthaltenen Token. Lemma 3. Ein Cluster kann maximal O(d3 ) Untercluster besitzen. Beweis. Nach Lemma 1 und 2 werden maximal d2 Ketten abgearbeitet. Wenn eine Kette abgearbeitet wurde, kann diese höchstens einen neuen Untercluster erzeugt haben. Dieser Untercluster kann maximal d − 1 mal erweitert worden sein. Lemma 4. Ein Cluster kann nur heimische oder adoptierte Kanten von seinem Vater erben. Beweis. Die Kanten des Anfangskreises werden immer vom Vater geerbt, aber nie von einem Untercluster. Lemma 5. Eine Kante kann in maximal O(d3 ) Clustern heimisch, geerbt oder adoptiert sein. Beweis. Eine Kante e kann nur in einem Cluster heimisch sein. e kann nur adoptiert werden, wenn ihr Cluster beendet oder zerstört wird. Wenn alle Token eines Clusters K in einen Untercluster L verschoben werden, kann K nicht mehr zerstört werden. Sobald L abgearbeitet oder zerstört worden ist, ist K ebenfalls abgearbeitet, also adoptiert K die Kanten von L, wird sie aber nicht mehr für Zurücksetzungen in K verwenden. Damit muss jedes Mal, wenn e von einem aktiven Cluster adoptiert wird, dieser Cluster mehr Token als der letzte Cluster besitzen. In jeden dieser d Cluster kann e von maximal O(d2 ) Unterclustern geerbt werden, weil sich eine Kante immer nur in einem Untercluster in jeder der d Ebenen des Tokenbaums befinden kann, der dann maximal d − 1 mal erweitert werden kann. Laut Lemma 4 kann die Kante niemals ein zweites Mal von irgend einem Untercluster geerbt werden. Lemma 6. Zurücksetzungen in Unterclustern nicht mitgezählt, reichen maximal O(d3 ) Zurücksetzungen, um einen Cluster abzuarbeiten. Beweis. Der Tokenbaum wird mittels Breitensuche bearbeitet. Es kann d2 Zurücksetzungen geben, nachdem eine Kette abgearbeitet wurde. Während eine Kette bearbeitet wird, können maximal d unterschiedliche Token aktiviert werden. Es kann passieren, dass dasselbe Token mehrfach aktiviert wird, wodurch es entlang der aktuellen Kette verschoben wird. Die Kosten all dieser Zurücksetzungen sind jedoch dieselben, als wenn wir das Token nur einmal am Ende ausgelöst hätten. Damit kann es maximal d3 Zurücksetzungen geben, wenn man beim Erkunden eines neuen Pfades stecken geblieben ist. Nach Lemma 3 müssen wir außerdem die Position in und von O(d3 ) Unterclustern relokieren. 10 Lemma 7. Jede Kante wird in maximal O(d6 ) Zurücksetzungen verwendet. Beweis. Dieser folgt im Groben Lemma 5 und 6, bis auf die Verlagerungen, bei denen ein Token außerhalb der aktuellen Kette aktiviert wird. In diesem Fall müssen wir einen Pfad im Clusterbaum herab folgen, um zur aktuellen Kette zurückzukehren. Allerdings kann dies nur einmal für jedes Token passieren, denn danach ist das Token im aktuellen Cluster und wir können lokal relokieren (wofür wir die Kosten bereits gezählt haben). All diese Zurücksetzungen führen dann zu einem Inorder-Durchlauf des Clusterbaums, also wird jede Kante in jedem Cluster nur eine konstante Anzahl oft besucht. Da eine Kante nach Lemma 5 in O(d3 ) Clustern vorkommen kann und wir d Token haben, wird jede Kante maximal O(d4 ) mal für diese Zurücksetzungen benutzt. Theorem 1. Der Algorithmus ist O(d8 )-kompetitiv. Beweis. Die Annahme, dass immer ein stark zusammenhängender Untergraph bekannt ist, kostet einen weiteren kompetitiven Faktor von O(d2 ) [5]. 6 Abschlussbemerkungen Zwar stellt dieser Algorithmus der erste poly(d)-kompetitive Algorithmus für das Erforschen von stark zusammenhängenden Graphen dar, jedoch ist der Grenze von O(d8 ) sehr hoch und kann eventuell verbessert werden. So ist etwa das d2 für die Startphase möglicherweise zu hoch, da einige der Kosten bereits in anderen Teilen der Analyse berücksichtigt wurden. Außerdem erscheint Lemma 5 sehr pessimistisch zu sein, denn wenn ein Cluster erweitert wird, führt das nicht unbedingt zu zusätzlichen Kosten bei einer Kante, da man den Cluster einfach vergrößern und fortfahren könnte, als wäre nichts passiert. Ebenso scheint das Zerstören eines Clusters, nachdem ein Element daraus aktiviert wird, sehr unnatürlich zu sein. Literatur [1] Rudolf Fleischer, Gerhard Tripper: Exploring an Unknown Graph Efficiently. Proceedings of the 13th Annual International Symposium on Algorithms (ESA 2005), Mallorca, Spain, Oct 3-6, 2005. [2] J. Edmonds, E. L. Johnson: Matching, Euler tours and the Chinese postman. Mathematical Programming, 5:88–124, 1973. [3] C. H. Papadimitriou: On the complexity of edge traversing. Journal of the ACM, 23(3):544–554, 1976. [4] X. Deng, C. H. Papadimitriou: Exploring an unknown graph. Journal of Graph Theory, 32:265–297, 1999. [5] S. Albers, M. R. Henzinger: Exploring unknown environments. SIAM Journal on Computering, 29(4):1164–1188, 2000. 11