Pebble Game Markus Pullmann Matrikelnummer: 4005600 Prüfungsnummer: 80447 Ausarbeitung zum Thema „Pebble Game“ aus dem Buch „Perlen der theoretischen Informatik“ von Uwe Schöning im Rahmen des Seminars „Ausgewählte Kapitel der Informatik“ im WS 08/09 am Lehrstuhl Prof. Dr. Rainer Schrader. 29. Januar 2009 2 Pebble Game Einführung Das Pebble Game ist ein Spiel auf einem gerichteten, azyklischen Graphen. Ziel ist es mit möglichst wenig Murmeln gleichzeitig im Graphen einen Ausgangsknoten zu erreichen. Dabei gelten folgende drei Regeln: 1. 2. 3. Ein Eingangsknoten kann jederzeit mit einer Murmel (Pebble) versehen werden. Wenn alle Vorgänger eines Knoten k mit einer Murmel markiert sind, so darf auf k eine Murmel gelegt werden. Es darf zu jedem Zeitpunkt eine Murmel von einem Knoten entfernt werden. Als ein weiteres Ziel kann man die Minimierung der benötigten Züge ansehen. Es kann ein Zielkonflikt entstehen, da die minimale Anzahl an Zügen nicht auch die Verwendung von möglichst wenigen Murmeln impliziert. Wenn dieser Konflikt auftritt, spricht man von einem Time-Space Trade-Off. Das Pebble Game dient als Modell für Abläufe im PC, die man als Maschinenmodell darstellen kann. Dabei stellen die Kanten im Graphen die Reihenfolge bestimmter Operationen dar. Diese Reihenfolgevorschrift muss eingehalten werden um ein Ergebnis zu bekommen. Die Knoten stellen auszuführende Operationen und das Ergebnis ein Register dar. Jedes Zwischenergebnis muss gespeichert werden und solange vorgehalten werden bis eine nachfolgende Operation es benutzt hat oder es muss neu berechnet werden für diese Operation. Übersetzt man die Regeln des Pebble Game erhält man folgende Regeln: 1. 2. 3. Jederzeit darf eine Zahl aus dem Speicher in ein Register geladen werden. Immer wenn für eine Rechenoperation alle Operanden in Registern bereitstehen, kann man die Operation im Rechenwerk ausführen und das Ergebnis im Register ablegen. Jederzeit kann ein Register freigegeben werden. Übertragen auf das Maschinenmodell hat man als Ziel eine Lösung zu finden, die sowohl wenig Zeit braucht (möglichst wenig Operationen ausführt und dennoch vollständig ist), als auch möglichst wenige Register braucht. Pyramiden Wenn ein Graph den Aufbau einer Pyramide Pk hat kann man folgende Zusammenhänge feststellen: |Knoten| = π π=1 π = π! = π π+1 2 2 = Ρ²(π 2 ) P1 |Kanten| = π² − π = Ρ²(π ) Wobei k die Anzahl der Knoten ist, die keinen Vorgänger haben. P2 P3 P4 6 4 5 1 2 3 Für P1 braucht man genau eine Murmel um den Graphen durch zu pebbeln. Für P2 braucht man 3. Zuerst setzt man jeweils eine Murmel auf die unteren beiden Knoten und danach auf den oberen. Für P3 braucht man 4 Murmeln. Erst werden die Knoten 1(#1) und 2(#2) mit einer Murmel besetzt. Dann wird Knoten 4(#3) besetzt. Nun wird die Murmel von 1(#2) entfernt und auf 3(#3) gesetzt. Danach wird auf Knoten 5(#4) eine Murmel gesetzt. Die Murmeln werden anschließend von 2(#3) und 3(#2) entfernt. Schließlich wird auf Knoten 6(#3) wieder eine Murmel gesetzt. Man braucht k+1 Murmeln um einen Graphen in pyramidischer Form durch zu pebbeln. Wie viele Murmeln man braucht, hängt also von dem Eingangsgrad des Graphen direkt ab. 29.1.2009 Ausgewählte Kapitel der Informatik Markus Pullmann 3 Pebble Game Beweis, dass jede Murmelstrategie auf Pyramiden k+1 Murmeln braucht: Für den Fall P3 ist im Beispiel gezeigt, dass eine Verbesserung nicht mehr möglich ist. Jetzt betrachtet man den Fall k>3: Wenn es eine Pebblestrategie für den Knoten v gibt, die nur mit k Knoten auskommt, dann muss diese Strategie auch eine Teilstrategie für v1 enthalten. Nach der vorher stehenden Erkenntnis werden dazu aber alle k Murmeln gebraucht und somit kann auf v2 keine Murmel liegen. Dasselbe gilt für v1, wenn man die Teilstrategie für v2 anwendet. Auf v1 wird die Murmel entfernt und man muss wieder die Teilstrategie für v1 anwenden. Pk: v V1 V2 Pk-1 => Es kann also keine Strategie existieren, die mit k Murmeln auskommt für k>1. Beliebige Graphen Jeder Graph mit einem beschränkten Eingangsgrad d>2 und Murmelbedarf m(n) kann in einen Graphen mit höchstens 2n Kanten, dem Eingangsgrad 2 und demselben oder kleineren Murmelbedarf m(n) überführt werden. Dafür ersetzt man jede d-fache Eingangsverzweigung durch einen Binärbaum mit d Eingangsknoten. d=3 n=3 m(n) = 4 d=4 n=4 m(n) = 3 n=4 m(n) = 5 n=6 m(n) = 4 Zerlegung eines Graphen mit Eingangsgrad von 2 in zwei Teilgraphen Jeder gerichtete Graph mit n Kanten und Eingangsgrad 2 kann so in 2 Teilgraphen G1 und G2 zerlegt werden, dass die Kantenzahl von G1 zwischen n/2 und n/2+2 liegt und das es nur Kanten von G1 nach G2 gibt, aber nicht von G2 nach G1. G1 und G2 werden dazu wie folgt aufgebaut: G1 ist zu Beginn leer und in G2 = G. Es werden nach und nach alle Knoten deren Vorgänger bereits in G 1 liegen von G2 nach G1 geschoben. Dabei werden ihre Eingangskanten mit nach G1 geschoben. Dies wird solange ausgeführt, bis die Kantenanzahl von G1 n/2 erreicht oder überschreitet. Die maximale Anzahl an Kanten n/2+2 wird erreicht, wenn beim letzten verschieben beide Kanten zu G1 geschoben werden. Die Kanten von G1 nach G2 werden A genannt. In dem folgenden Beispiel sind die Knoten in G1 grau, die Knoten in G2 weiß und die Kanten A gestrichelt: G=G2 G1 29.1.2009 G2 G1 G1 G2 G1 G2 G2 Ausgewählte Kapitel der Informatik Markus Pullmann 4 Pebble Game G1 G2 G1 G2 Algorithmus zum Pebbeln eines Graphen Jeder Graph lässt sich mit π 1. 2. 3. π log π Murmeln pebbeln durch folgende Strategie (Anzahl Murmeln = P(n)): Wenn der Graph G klein genug ist, so pebble den gewünschten Knoten direkt, sonst nach 2, 3 oder 4 π π = π 1 πüπ π ≤ π0 Wenn der zu pebbelnde Ausgangsknoten in G1 liegt, so wende das Verfahren rekursiv auf G1 an π π π ≤π +2 2 2π Wenn der zu pebbelnde Ausgangsknoten in G2 liegt und A klein ist (|π΄| ≤ ), so pebble jeden log β‘ (π) einzelnen Vorgängerknoten von A-Kanten durch rekursives Anwenden des Algorithmus auf G1. Lasse die Murmeln auf diesen Vorgängerknoten liegen, entferne alle weiteren Murmeln und starte dann rekursiv eine Murmelstrategie für v auf G2. 2π π π π ≤ +π +2 +1 log π 2 4. Wenn der zu pebbelnde Ausgangsknoten v in G2 liegt und A groß ist (d.h. π΄ > 2π log β‘ (π) ), so starte rekursiv eine Murmelstrategie für v auf G2. Und jedesmal, wenn hierbei ein Eingangsknoten von G2 gepebbelt werden soll, dessen Vorgängerknoten in G1 liegen, so schiebe an dieser Stelle eine Pebblestrategie für diesen Vorgängerknoten ein, die durch rekursives Anwenden des Algorithmus auf G1 gewonnen wird. π 2π π π π ≤π − +π +2 +1 2 log π 2 In den folgenden beiden Beispielen ist der zu pebbelnde Knoten schwarz und die Knoten auf denen Murmeln liegen sind quergestreift dargestellt. Beispiel 1: Fall 1: Der zu pebbelnde Knoten (schwarz) hat keinen Eingangsknoten, so dass er direkt gepebbelt werden kann. Beispiel2: G1 G2 Fall 2: Der zu pebbelnde Knoten (schwarz) liegt in G1. Also wird das Verfahren nun rekursiv auf G1 angewandt. 29.1.2009 Ausgewählte Kapitel der Informatik Markus Pullmann 5 Pebble Game G‘1 G‘2 G‘‘1 Nochmals Fall 2. G‘‘2 Fall 3: Der zu pebbelnde Knoten liegt in G‘‘2 und |A| ist kleiner gleich 2n/log(n) (2≤4/log(2)). Pebble jeden Vorgänger dieses Knoten aus G‘‘1 und lasse nur auf diesen Murmeln liegen und pebble dann G‘‘2. G‘‘1 ist nun gepebbelt. In diesem Fall ist es sehr einfach, da der Graph G‘‘1 sehr klein ist und nach einer Aufteilung in G‘‘‘1 und G‘‘‘2 jeweils direkt mit Fall 1 gepebbelt werden kann. Jetzt kann G2 gepebbelt werden. Dort kann direkt wieder Fall 1 angewendet werden, da G‘‘2 klein genug ist. G‘‘1 pebbeln trivial Fall 4 wird in diesen beiden Beispielen nicht verwendet. Fall 4 kann durch geschickte Konstruktion von G1 und G2 zumindest in kleinen Graphen mit Eingangsgrad 2 umgangen werden, wenn man voraussetzt, dass alle Graphen mit Eingangsgrad höher als 2 in Graphen mit Eingangsgrad 2 überführt werden. Nachfolgend ein Beispiel wie ein Graph geschickt bzw. ungeschickt überführt werden kann und somit Fall 4 notwendig werden kann, da |A|>2n/log(n) gelten kann. Ich habe dafür Schritte zusammengefasst, damit das Beispiel nicht zu umfangreich wird. Zuerst die ungeschickte Variante: |A| = 4 Die geschickte Variante (der Anfang ist gleich): |A| = 2, bei gleichen 29.1.2009 2π log π Ausgewählte Kapitel der Informatik = 7.35, πüπ π = 14 Markus Pullmann 6 Pebble Game Aus diesem Beispiel lässt sich ersehen, dass wenn man eine solchen Graphen mit Eingangsgrad 256 (510 Kanten) nimmt, man 2∗510 log 510 = 113.4 erhält. Aber bei ungeschickter Konstruktion hat man ein |A| von 128. Das ist größer als 113.4. Also kommt Fall 4 zur Anwendung. Es bleibt die Frage offen, ob man durch geschickte Konstruktion von G1 und G2 der (vollständigen, sowie unvollständigen) Pyramide immer auf Fall 4 verzichten kann – wie ich vermute. Ein Beispiel für das Eintreten von Fall 4 lässt sich leicht zeigen, für einen Graphen mit Eingangsgrad 1. Die Formel |π΄| ≤ 2π log π π 2π 2 log π lässt sich in diesem Fall umstellen zu ≤ π 2π 2 log π bzw. − 1 ≤ . Hier kann man eine Fallunterscheidung machen, in n gerade und n ungerade: n gerade π 2π ≤ |βΆ2 2 π 4 ≤ log π π log π n ungerade π 2π −1≤ | βΆ 2, 2 −1 | βΆ π, 2 4 ≥ log π Das gilt für alle geraden n kleiner gleich 16. Ab 18 wird also Fall 4 verwendet. 4 = π −1 2 4π π 2 −2π log π ≥ −1 log π π−2 π nlog 2−2 log π ≥ π 2 −2π 2 log π ∗ (π2 − 2π , βΆ π 4 ≥ log π − π Das gilt für alle ungeraden n kleiner gleich 17. Ab 19 wird also Fall 4 verwendet. (Anschaulicher) Beweis, dass der Murmelbedarf P(n) des Pebblealgorithmus nicht n/logn überschreitet (obere Grenze): π ππ π πππ. ππππ π’ππ: π π ≤ πüπ ππππ ππππππππ‘π πππßπ πΎπππ π‘πππ‘π π log π log π , wenn der Graph klein genug ist braucht man nur eine Murmel. π π π πππ πππππππ ππππππ π Fall 1: π π = π 1 ≤ Fall 2: π π ≤ π π 2 ππ log π +2 ≤π π +2 2 π log +2 2 ≤π π log π (einsetzen von π 2 + 2 in P(n) für n) π Es wird nur noch G1 gepebbelt. Für G1 braucht man maximal + 2 pebble. Veranschaulichung: 2 |Kanten G1| = 8, |Kanten G2| = 6, |Gesamtkanten| = 14 Murmelanzahl beim Pebbeln (Reihenfolge des Pebbelns): unten links unten Mitte oben unten rechts 1,2,3,1 2,3,4,2 3,1 2,3,4,2 π 14 2 2 4 ist das Maximum. Das ist ≤ + 2 = Fall 3: π π ≤ 2π log π +π π 2 +2 ≤ 2π log π +π π +2 2 π log +2 2 ≤π π log π +2=9 , πüπ π ≥ 9 π’ππ πππßπ π Zuerst werden alle Vorgänger vom Knoten in G 1 gepebbelt. Das ist Fall 2. Nach entfernen aller nicht mehr gebrauchten Pebbels bleiben dann nur noch |A| Pebbles übirg. Dann wird G2 gepebbelt. π π +2 2 π log +2 2 =π 14 +2 2 14 log +2 2 = π ∗ 2.81, das ist kleiner gleich als die benötige Pebbleanzahl 1,2,3,1 – 2 – 3, schon bei c=1.05. Ingesamt werden also 4+3=7 Pebbles gebraucht, was ≤ π 29.1.2009 π log π =9∗ Ausgewählte Kapitel der Informatik 14 log 14 =33.1 ist. Markus Pullmann 7 Pebble Game Fall 4: π π ≤ π π 2 − 2π log π +π π 2 +2 +1≤ π π 2π − 2 log π π 2π log − 2 πππ π +π π +2 2 π log +2 2 +1 ≤ ππ log π Zwischen den Graphen G1 und G2 ist die Kantenmenge A. Diese muss nicht komplett gepebbelt werden, sondern es wird immer nur ein Knoten nach Bedarf gepebbelt (laut Algorithmus). Daher kann die Kantenmenge A von der Kantenmenge des Graphen G2 abgezogen werden π 2 − 2π log π . Der eine Knoten, der gepebbelt wird, wird durch die +1 symbolisiert. Der Graph G1 wird mehrmals gepebbelt, um den jeweiligen Vorgängerknoten zu G2 zu pebblen π 2 +2 . Untere Grenze für das Pebbeln eines Graphen: Im Beweis wurde gezeigt, dass π log π die obere Grenze ist um einen Graphen zu pebbeln. π log π ist auch eine untere Schranke. Das kann gezeigt werden, durch Konstruktion einer Familie von Graphen, mit Hilfe von Superkonzentratoren, die diese Schranke an Murmeln benötigt. 29.1.2009 Ausgewählte Kapitel der Informatik Markus Pullmann