Pebble Game Ausarbeitung für das Seminar „Perlen der theoretischen Informatik“ der AG Meier auf der Heide von Alexander Lohrmann Grundlagen Das Pebble Game: Das Spielfeld des Pebble Game ist ein gerichteter, azyklischer Graph (engl.: directed acyclic graph, DAG) G = (V, E). Die Speilsteine sind Murmeln, Pebbles, welche auf den Knoten des Graphen liegen. Die Regeln sind wie folgt definiert: 1.Ein Eingangsknoten, also ein Knoten, der keinen Vorgänger hat, kann jederzeit mit einem Pebble belegt („gepebbelt“) werden. 2.Ein Knoten k, der kein Eingangsknoten ist, darf erst dann gepebbelt werden, wenn alle seine Vorgängerknoten gepebbelt sind. 3.Es darf zu jedem Zeitpunkt ein Pebble von einem Knoten entfernt, er also „entpebbelt“ werden. Ein Zug im Pebble Game ist entweder das Setzen oder das Entfernen einer Murmel nach den oben beschriebenen Regeln, das Ziel ist, einen vorher definierten Knoten v, welcher in der Regel jedoch nicht notwendigerweise ein Ausgangsknoten ist, zu pebbeln. Die Folge von Zügen, die mit dem Belegen von v endet, soll Strategie genannt werden. Beispiel: 7 6 5 3 4 1 2 Dieser Graph kann auf mehreren Wegen gepebbelt werden, dabei sei Knoten Nummer 7 der Zielknoten v. Eine mögliche Vorgehensweise besteht darin, die Knoten des Graphen nacheinander entspechend ihrer Nummerierung zu pebbeln. Diese Strategie würde 7 Murmeln und 7 Züge benötigen. Eine andere Möglichkeit wäre die Strategie, die in der nachfolgenden Tabelle skizziert wird: Pebble Knoten Entpebble Knoten Anzahl Murmeln Zeitpunkt 1 2 3 4 5 6 7 1 2 4 5 1 2 3 2 1 2 3 2 3 2 3 1 2 3 4 5 6 7 8 9 10 11 Wie unschwer zu erkennen ist, benötigt diese Strategie nur 3 Murmeln, dafür allerdings 11 Züge. Sie ist also in Bezug auf den Platzbedarf besser als die erste Strategie, hat jedoch eine längere Laufzeit von 11 Zügen. Das Pebble Game kann in verschiedenen Bereichen als Modell für den Platz- und/oder Zeitbedarf von Operationen auf gegebenen Eingabedaten eingesetzt werden. Als Beispiel betrachte man sich folgendes Maschinenmodell: Rechenwerk Speicher Register Bezieht man das Modell auf das Pebble Game, so entspricht das Laden eines Wertes aus dem Speicher in ein Register bzw. dem Auftreten eines Wertes nach einer Operation im Rechenwerk dem Verwenden einer Murmel. Die Regeln des Pebble Game lassen sich darauf folgendermaßen übertragen: 1.Es kann jederzeit eine Zahl aus dem Speicher in ein Register geladen werden 2.Wenn alle nötigen Operanden für eine Operation in Registern bereitstehen, so kann diese Operation im Rechenwerk ausgeführt werden, das Ergebnis kann dann wieder in einem Register abgelegt werden. 3.Es kann jederzeit ein Register freigegeben werden. Der Ausgangsgraph, der die Grundlage des Pebble Game bildet, würde in diesem Fall die Abhängigkeiten zwischen den Registern für die Bearbeitung der Operationen beschreiben. Solche Strukturen entstehen z.B. bei Compilern, wenn die Verwendung von Registern der CPU für die zu bearbeitenden Werte berechnet wird. Dabei kann dann, ähnlich dem oben angegebenen Beispiel, eine Strategie mit wenigen Murmeln, also wenigen verwendeten Registern, oder möglichst wenigen Arbeitsschritten unter Verwendung einer größeren Anzahl von Registern das Ziel sein. In vielen Fällen mag es bei solchen Problematiken, wie sie vom Pebble Game modelliert werden, der Fall sein, daß man entweder wenig Murmeln oder wenig Arbeitsschritte benötigt, nicht jedoch beides möglich ist. In diesem Fall spricht man von einem Time-Space-Tradeoff. Pyramiden Im den folgenden Abschnitten soll nun untersucht werdenen, mit wievielen Murmeln sich Graphen mit n Knoten grundsätzlich pebbeln lassen. Die einzige Beschränkung soll dabei der Eingangsgrad der untersuchten Graphen (-familien) sein, dieser wird 2 betragen. Diese Einschränkung ist notwendig, da ansonsten die Murmelzahl unmittelbar mit dem Eingangsgrad zusammenhängen würde. Als erstes Beispiel soll dafür die Familie der Pyramiden dienen. Pyramiden sind entsprechend der nachfolgenden Zeichnung aufgebaut: P4 P3 P2 P1 Für die Anzahl der Knoten und Kanten einer Pyramide Pk gilt: Anzahl Knoten = Anzahl Kanten = Behauptung: Um eine Pk Pyramide (k > 1) zu pebbeln benötigt man mindestens k+1 Murmeln. Beweis: Der Beweis kann mittels Induktion geführt werden. Die Behauptung soll dabei sein, daß man zum Pebbeln einer beliebigen Pk Pyramide, k > 1, k+1 Murmeln benötigt. Für k = 2 und k = 3 ist das einfach nachvollziehbar, man muß nur die obigen Zeichnungen betrachten. Für k = 2 ist es trivial, für k = 3 stelle man sich vor, daß man zunächst die linke untere Teilpyramide pebbelt, wofür man schon 3 Murmeln benötigt. Zwar kann man die Murmel ganz links unten dann entfernen und nach rechts unten setzen, aber dann hat man keine Murmel mehr übrig, um den nächsten Schritt zu tun. Dafür braucht man 4, also k + 1 Murmeln. Damit ist der Induktionsanfang gemacht. Für den Induktionsschritt betrachte man die folgende Zeichnung: V V1 V2 Pk: Pk-1 Es soll nun angenommen werden, daß es eine Strategie gibt, v mit nur k Murmeln zu pebbeln. Um v zu erreichen, muß die verwendete Strategie zwangsläufig auch v1 pebbeln. Laut Induktionsvorraussetzung sind für v1 als obersten Knoten von Pk-1 aber bereits k Murmeln nötig. Man benötigt also noch eine weitere Murmel für v2. Damit ist bewiesen, daß es keine Strategie mit k Murmeln geben kann. Beliebige Graphen Im folgenden soll nun untersucht werden, wieviel Murmeln zum Pebbeln eines beliebigen Graphen benötigt werden. Wie schon erwähnt, sollen dabei nur Graphen mit Eingangsgrad 2 beachtet werden. Dies stellt für die Allgemeingültigkeit kein Problem dar, da sich jeder Graph mit beschränktem Eingagnsgrad d > 2, Kantenzahl n und Murmelbedarf m(n) in einen Graphen mit höchstens 2n Kanten, Eingangsgrad 2 und ebenfalls Murmelbedarf m(n) umwandeln läßt. Dafür muß man nur jede d-fache Eingangsverzweigung durch einen Binärbaum mit d Eingangsknoten ersetzen: Beispiel (d = 4): Desweiteren soll noch das folgende Lemma genutzt werden. Lemma: Jeder DAG mit n Kanten und Eingangsgrad 2 kann so in 2 Teilgraphen G1 und G2 zerlegt werden, daß die Kantenzahl bei G1 zwischen n/2 und n/2 + 2 liegt und daß nur von G1 nach G2 Kanten verlaufen, nicht jedoch umgekehrt. Diese Kantenmenge soll A genannt werden. Um diese Zerlegung zu erreichen muß man, ausgehend von den Eingangsknoten, so lange Schritt für Schritt G1 vergrößern, bis die Kantenzahl den genannten Wert erreicht. „Vergrößern“ bedeutet dabei, daß nach den Eingangsknoten immer nur die Knoten zu G1 hinzugefügt werden, deren gesamte Vorgänger ebenfalls in G1 sind. Somit können keine Rückwärtskanten entstehen. Das resultierende Konstrukt kann man sich so vorstellen: G2 Kantenmenge A G1 Es soll nun gezeigt werden, daß sich sich Graphen dieses Typs in O(n/logn) pebbeln lassen. Dazu soll die folgende Strategie näher untersucht werden: 1.Ist G klein genug, so soll der gewünschte Knoten v direkt gepebbelt werden, andernfalls ist nach Punkt 2, 3 oder 4 zu verfahren. 2.Liegt der zu pebbelnde Ausgangsknoten in G1, so ist die Strategie rekursiv auf G1 anzuwenden, d.h. G1 ist wiederum zu teilen bis Fall 1 eintritt. 3.Liegt v in G2 und gilt , so ist der Alghorithmus zunächst auf G1 anzuwenden und alle Vorgängerknoten von A werden gepebbelt. Diese Murmeln werden liegengelassen und alle weiteren Murmeln entfernt, anschließend G2 gepebbelt. 4.Liegt zuguterletzt v in G2 und gilt , so soll eine Pebble-Strategie für v in G2 angewendet werden und jedesmal, wenn ein Eingangsknoten von G2, dessen Vorgängerknoten in G1 liegt, gepebbelt werden muß, so soll für diesen Vorgängerknoten die Strategie rekursiv auf G1 angewandt werden. Aus diesen Regeln ergeben sich für die verschiedenen Fälle die folgenden Rekursionsgleichungen, dabei sei P(n) die Zahl der benötigten Pebbles: 1.P(n) = O(1) für n ≤ n0 Erklärung ist trivial. 2.P(n) ≤ P(n/2 + 2) Der Murmelbedarf zum Pebbeln ist natürlich kleiner oder gleich dem Murmelbedarf für die Zahl der Kanten im Graphen, und die ist n/2 + 2. 3.P(n) ≤ 2n/logn + P(n/2 + 2) Man pebbelt zunachst G1 mit P(n/2 + 2) Murmeln. Anschließend läßt man auf allen Vorgängerknoten von A eine Murmel liegen, das sind 2n/logn viele. Da alle andere Murmeln dann entfernt werden können und nur diese liegen bleiben, kann man G2 dann mit denselben P(n/2 + 2) Murmeln pebbeln, da die Kantenzahl von G2 kleiner oder gleich der von G1 ist. 4.P(n) ≤ P(n/2 – 2n/logn) + P(n/2 + 2) + 1 Für G2 selber benötigt man P(n/2 – 2n/logn) viele Murmeln, dabei ist n/2 die Zahl der Kanten in G2 inklusive A, davon werden 2n/logn viele Kanten von A wieder abgezogen. Für den gesamten Murmelbedarf der Strategie benötigt man zusätzlich P(n/2 + 2) viele Murmeln für G1. Beweis: Um zu zeigen, daß sich solche Graphen in O(n / logn) pebbeln lassen, soll als Ansatz P(n) ≤ cn / logn für ein genügend großes c gewählt und gezeigt werden, daß c * n/logn eine Lösung für diese Gleichungen darstellt. 1.Gilt trivialerweise 2.P(n) ≤ P(n / 2 + 2) ≤ (n / 2 + 2) / log (n / 2 + 2) ≤ n / logn Läßt sich einfach nachrechnen 3. Die (Un-)Gleichung gilt für alle c ≥ 9 und sehr große n. Die Umformung von P(n/2 + 2) in (n / 2 + 2) / log (n / 2 + 2) wurde in Punkt 2 erledigt. Da es sich um eine Ungleichung handelt kann eine Konstante c vorgestellt werden. Der rechts vom Pluszeichen stehende Teil der Ungleichung wird nun unter Zuhilfenahme der Ungleihungsbedingungen (Die rechte Seite darf größer werden) solange umgeformt, bis beide Summanden bis auf einen Faktor gleich sind. Damit kann dann für ein genügend großes c der Term c * n/logn erreicht werden, was eben dem Ziel des Beweises von O(n/logn) entspricht. 4.Für Fall 4 soll die Ungleichung n/2 – 2n/logn ≥ n/4 verwendet werden. Die Rechnung erfolgt auf die gleiche Weise wie auch bei den vorherigen Punkten: Die Ungleichung wird mit dem Ziel umgeformt, auf die Ungleichnung P(n) ≤ c*n/logn zu kommen, um das ursprüngliche Ziel O(n/logn) zu erreichen. Damit ist bewiesen, daß sich beliebige Graphen mit Eingangsgrad 2 in O(n/logn) pebbeln lassen. Das sagt natürlich nichts darüber aus, wieviele Schritte dafür benötigt werden. Wie schon am Anfang gezeigt, erkauft man sich die Einsparung von Murmeln mit mitunter deutlich mehr Arbeitsschritten. Grundsätzlich gibt es zwischen Platz- und Zeitbedarf von Operationen immer einen Zusammenhang. Das Pebble Game impliziert die folgende Inklusion zwischen den Komplexitätsklassen DTIME und DSPACE (DTIME ist der Zeitbedarf einer deterministischen Turingmaschine für eine Eingabe, DSPACE dementsprechend der Platzbedarf): Im Klartext und in Bezug auf das Pebble Game bedeutet das, daß der Platzbedarf durch die Anzahl der Züge begrenzt wird, nicht jeduch umgekehrt. Das ist auch logisch, denn es können auf keinen Fall mehr Knoten belegt als Züge getan werden. Umgekehrt ist es aber durchaus möglich, daß auf relativ wenig Raum sehr viele Züge gemacht werden. Quellen: Uwe Schöning, Perlen der theoretischen Informatik Dr. Andreas Jakobi, Skript zur Vorlesung „Komplexität und Spiele“, Wintersemester 98/99