Pebble Game

Werbung
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
Herunterladen