Algorithmen zum schonen Zeichnen von Graphen und. von. Betreuung. Christian-Albrechts-Universitat zu Kiel. Technische Fakultat

Algorithmen zum schonen Zeichnen von Graphen und deren Integration in das RELVIEW-System Diplomarbeit von Stefan Meier Aufgabenstellung Prof. Dr. Rud...
Author: Sophia Kohler
0 downloads 1 Views 615KB Size
Algorithmen zum schonen Zeichnen von Graphen und deren Integration in das RELVIEW-System Diplomarbeit von Stefan Meier Aufgabenstellung Prof. Dr. Rudolf Berghammer Betreuung Prof. Dr. Rudolf Berghammer Peter Schneider Christian-Albrechts-Universitat zu Kiel Technische Fakultat Institut fur Informatik und Praktische Mathematik 15. Februar 1996

Inhaltsverzeichnis 1 2 3 4

Einleitung Begri e der Graphentheorie Schone Graphen Zeichnen azyklischer Graphen

4.1 Einfuhrung : : : : : : : : : : : : : : : : : : : : : : : 4.1.1 Aesthetische Kriterien : : : : : : : : : : : : : 4.1.2 U berblick uber den Algorithmus : : : : : : : 4.2 Optimale Rang-Einteilung : : : : : : : : : : : : : : : 4.2.1 Was soll die Rang-Einteilung leisten? : : : : : 4.2.2 Die Network-Simplex-Methode : : : : : : : : 4.2.3 Details der Implementierung : : : : : : : : : 4.3 Die Ordnung der Knoten in den Schichten : : : : : : 4.4 X-Koordinaten : : : : : : : : : : : : : : : : : : : : : 4.4.1 Was soll diese Phase des Algorithmus leisten? 4.4.2 Optimale X-Koordinaten-Zuweisung : : : : : 4.4.3 Details der Implementierung : : : : : : : : : 4.5 Erweiterung auf beliebige Graphen : : : : : : : : : : 4.6 Beispiele : : : : : : : : : : : : : : : : : : : : : : : : :

5 Zeichnen von Baumen 5.1 5.2 5.3 5.4 5.5

Einfuhrung : : : : : : : : : : : : : : : : : : : Ein naiver Baumzeichenalgorithmus : : : : : Knuths Algorithmus : : : : : : : : : : : : : : Der Algorithmus von Wetherell und Shannon Beispiele : : : : : : : : : : : : : : : : : : : : :

6 Der Algorithmus KK 6.1 6.2 6.3 6.4 6.5

Einfuhrung : : : : : : : : : : : : : : : : Das Federmodell : : : : : : : : : : : : : Lokale Minimierung der Gesamtenergie : Der Algorithmus : : : : : : : : : : : : : Beispiele : : : : : : : : : : : : : : : : : :

1

: : : : :

: : : : :

: : : : :

: : : : : : : : : : : : : :

: : : : : : : : : : : : : :

: : : : : : : : : : : : : :

: : : : : : : : : : : : : :

: : : : : : : : : : : : : :

: : : : : : : : : : : : : :

: : : : : : : : : : : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

3 7 9 12

12 12 13 13 13 14 18 20 24 24 25 26 27 27

31

31 31 34 35 39

41

41 41 42 44 45

7 Der Algorithmus FR

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

8.1 Relationenalgebra : : : : : : : : : : : : : : : : : : : : : : : 8.1.1 Basisoperationen auf Relationen : : : : : : : : : : 8.1.2 Spezielle homogene Relationen : : : : : : : : : : : 8.1.3 Spezielle heterogene Relationen : : : : : : : : : : : 8.1.4 Relationale Beschreibung von Teilmengen : : : : : 8.1.5 Hullen : : : : : : : : : : : : : : : : : : : : : : : : : 8.1.6 Residuen und Quotienten : : : : : : : : : : : : : : 8.2 Das RELVIEW-System : : : : : : : : : : : : : : : : : : : 8.2.1 Allgemeines : : : : : : : : : : : : : : : : : : : : : : 8.2.2 Das RELVIEW-Menu-Fenster : : : : : : : : : : : : 8.2.3 Das Directory-Fenster : : : : : : : : : : : : : : : : 8.2.4 Das Graphfenster : : : : : : : : : : : : : : : : : : 8.2.5 Das Relationenfenster : : : : : : : : : : : : : : : : 8.3 Eine Anwendung von RELVIEW : : : : : : : : : : : : : : 8.3.1 Schnittvervollstandigung einer geordneten Menge : 8.3.2 Relationaler Zugang zur Schnittvervollstandigung : 8.3.3 Beispiel : : : : : : : : : : : : : : : : : : : : : : : :

: : : : : : : : : : : : : : : : :

: : : : : : : : : : : : : : : : :

: : : : : : : : : : : : : : : : :

: : : : : : : : : : : : : : : : :

7.1 7.2 7.3 7.4 7.5

Einfuhrung : : : : : : : : : : : : : : : : : : : Der Algorithmus : : : : : : : : : : : : : : : : Wahl der Funktionen fa , fr und cool : : : : : Zeichnen nicht zusammenhangender Graphen Beispiele : : : : : : : : : : : : : : : : : : : : :

8 Relationen und RELVIEW

9 Abschlieende Bemerkungen

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

: : : : :

48

48 49 51 53 53

56

56 56 57 58 58 58 59 59 59 61 63 64 65 67 67 67 70

75

2

Kapitel 1

Einleitung Wer mit Relationen- und Graphentheorie arbeitet, mu hau g Beispielrechnungen mit Relationen durchfuhren. Die Ausfuhrung solcher Berechnungen mit Papier und Bleistift ist muhsam und fehleranfallig. Das RELVIEW-System bietet die Moglichkeit Berechnungen und Tests vollig interaktiv und bildschirmorientiert auf dem Rechner durchzufuhren. Damit wird die Arbeit naturlich erleichtert, und die Korrektheit der Ergebnisse ist garantiert. Nun stellt sich aber noch ein weiteres Problem. In RELVIEW werden Relationen als Boolesche Matrizen dargestellt (nahere Einzelheiten zu RELVIEW siehe Kapitel 8). Hat man nun eine Berechnung mit RELVIEW durchgefuhrt, so erhalt man die Ergebnisrelation in der folgenden Form (hier zum Beispiel eine Matrix der Dimension 30  30):

Abbildung 1.1: Eine Relation als Boolesche Matrix Will man nun wissen, ob etwa das Feld in Zeile 13 und Spalte 19 schwarz oder 3

wei ist, so ist dies schlecht auf den ersten Blick zu erkennen. Man mu also muhsam die Zeilen und Spalten abzahlen, um das gewunschte Feld zu nden. Mu man dies fur mehrere Felder tun, so ist das eine recht langwierige Aufgabe. Wesentlich einfacher wird die Aufgabe, wenn man das folgende Bild vorliegen hat, in dem die Relation als Graph dargestellt wird: 18

2

9

8

15

5

27

21

7

14

20

22

4

6

25

11

13

16

17

19

1

24

12

3

26

23

28

29

30

10

Abbildung 1.2: Eine Relation als Graph Dieses Bild entspricht genau der Matrix aus Abb. 1.1. Das bedeutet, in Abb. 1.2 geht ein Pfeil vom Knoten x zum Knoten y, genau dann wenn in Abb. 1.1 das Feld in Zeile x und Spalte y schwarz ist. Hier lat sich nun leicht erkennen, ob ein Pfeil von Knoten 13 zu Knoten 19 fuhrt (ja, es gibt so einen Pfeil, also ist das Feld in Zeile 13 und Spalte 19 in Abb. 1.1 schwarz). Naturlich gibt es viele Moglichkeiten, diesen Graphen zu zeichnen. Man konnte ihn zum Beispiel auch wie in Abb. 1.3 darstellen. Diese Darstellung ist naturlich weit weniger ubersichtlich als die in Abb. 1.2. Man kann schlecht sehen, ob ein Pfeil von Knoten a zu Knoten b geht, und zu erkennen, ob es einen Pfad von Knoten a zu Knoten b gibt, ist sehr schwer. Man wurde deshalb sicherlich die erste Art der Darstellung bevorzugen.

4

18

29

22 16

1

6

13 11

20

12

21 9 10 2 17 4 8

24

19 26 7

15

14

25

23

27

5 28 3 30

Abb. 1.3: Eine andere Darstellung des Graphen Aufgabe der vorliegenden Arbeit ist es nun, Algorithmen auszuwahlen, mit denen man Graphen schon zeichnen kann (was der Begri \schon" hier genau bedeutet sehen wir in Kapitel 3). Die Algorithmen sollen erstens hier vorgestellt und zweitens ins RELVIEW-System eingebaut werden, um die Moglichkeit zu scha en, quadratische Relationen als Graphen darzustellen. Die Arbeit ist folgendermaen gegliedert: Kapitel 2 fuhrt zunachst einige Begri e aus der Graphentheorie ein, die im Verlauf der Arbeit benutzt werden (auch die bereits hier verwendeten Begri e wie Graph oder Knoten). In Kapitel 3 werden dann allgemeine Bemerkungen zum Thema \Schones Zeichnen von Graphen" gemacht. Wie oben bereits gesehen, kann man Graphen ja auf verschieden Weise in der Ebene darstellen. Vergleicht man nun Abb. 1.2 und Abb. 1.3, so wird wohl jederman zustimmen, da das Bild in 1.2 schoner ist als das in 1.3. In Kapitel 3 betrachten wir nun generelle Aussagen daruber, wann die Darstellung eines Graphen schon ist. 5

Die Kapitel 4{7 stellen die verschiedenen Algorithmen vor, die auch ins RELVIEW-System eingebaut sind. In Kapitel 4 wird ein Algorithmus vorgestellt, der Graphen in Schichten zeichnet. Das heit, die Knoten des Graphen werden auf Schichten verteilt und Knoten, die in einer Schicht liegen, werden auf ein und derselben Hohe gezeichnet. Mit diesem Algorithmus wurde auch Abb. 1.2 erzeugt. Kapitel 5 beschreibt einen Algorithmus, der nur auf Baume bzw. Walder (d.h. Graphen, deren Zusammenhangskomponenten Baume sind) anwendbar ist. Auch dieser Algorithmus stellt den Graphen, wie bei Baumen ublich, in Schichten dar. Dies ist der einzige der hier vorgestellten Algorithmen, dessen Anwendung auf eine bestimmte Klasse von Graphen beschrankt ist. Der Algorithmus aus Kapitel 6 zeichnet die Graphen nicht in Schichten, sondern verteilt sie gleichmaig auf der Zeichen ache. Dadurch werden die Bilder einerseits kompakter, andererseits aber auch unubersichtlicher. In Kapitel 7 wird ein Algorithmus beschrieben, dessen Idee ahnlich ist wie die des Algorithmus aus Kapitel 6. Er lauft einerseits deutlich schneller, macht aber auch etwas schlechtere Bilder als der Algorihtmus aus Kapitel 6. Das Kapitel 8 gibt eine kurze Beschreibung von RELVIEW. Dazu werden zuerst Begri e der Relationentheorie eingefuhrt (RELVIEW ist ja zum Arbeiten mit Relationen entwickelt worden). Danach folgt eine kurze Beschreibung der Benutzung von RELVIEW, wobei insbesondere die Graphein- und Graphausgabe, bercksichtigt wird. Als letztes betrachten wir noch ein Beispiel fur die Anwendung von RELVIEW. Den Abschlu bildet Kapitel 9 mit einem Ausblick in mogliche Erweiterungen des Systems.

6

Kapitel 2

Begri e der Graphentheorie Dieser Abschnitt dient dazu, einige Begri e zu klaren, die im Verlaufe dieser Arbeit verwendet werden. In den folgenden Abschnitten wird dann die Bedeutung der hier eingefuhrten Begri e nicht mehr explizit erlautert. Ein ungerichteter Graph ist ein Paar G = (V; E ), wobei V eine nichtleere Menge und E eine Teilmenge von ffx; y gjx; y 2 V mitx 6= y g ist. Die Elemente von V heien Knoten und die Elemente von E heien Kanten von G. Sei nun G = (V; E ) ein ungerichteter Graph. Seien u; v 2 V .  Eine Folge p = (v0; v1; : : :; vn) mit v0 = u, vn = v und fvi; vi+1g 2 E fur alle i 2 f0; 1; : : :; n 1g heit Pfad von u nach v in G der Lange n.  Ein ungerichteter Graph heit zusammenhangend, wenn es einen Pfad von u nach v gibt fur alle u; v 2 V .  G heit Baum, wenn G zusammenhangend ist und jV j = jE j + 1 gilt. Sei die Relation  auf V folgendermaen de niert:

u  v gdw. es gibt einen Pfad von u nach v in G: Dann ist  eine A quivalenzrelation auf V . Seien V1; V2; : : :; Vm die A quivalenzklassen von  und seien Ei = ffx; y g 2 E jx; y 2 Vi g fur i = 1; 2; : : :; m. Dann bilden die Ei eine Partition von E . Die Graphen Gi = (Vi; Ei), i = 1; 2; : : :; m heien die Zusammenhangskomponenten von G. Ein gerichteter Graph ist ein Paar G = (V; E ), wobei V eine nichtleere Menge und E eine Teilmenge von V  V ist. Sei e = (u; v ) 2 E . Dann heit u Anfangspunkt und v Endpunkt von e. Ist eine Unterscheidung in Anfangsund Endpunkt nicht wichtig, so bezeichnet man auch beide Punkte als die Endpunkte der Kante e. Im folgenden bezeichnen wir gerichtete Graphen einfach als Graphen. Sei G = (V; E ) ein Graph. Seien u; v 2 V .  Der G zugrundeliegende ungerichtete Graph ist de niert als (V; E 0) mit

E 0 = ffx; y gj(x; y ) 2 E oder (y; x) 2 E und x 6= y g : 7

 Eine Folge p = (v0; v1; : : :; vn) mit v0 = u, vn = v und (vi; vi+1) 2 E fur alle i 2 f0; 1; : : :; n 1g heit Pfad von u nach v in G der Lange n.  Ist u = v und n  1, so nennt man den Pfad p einen Kreis.  G heit azyklisch, wenn es in G keinen Kreis gibt.  G geit zusammenhangend, wenn sein zugrundeliegender ungerichteter

Graph zusammenhangend ist.  Seien Vi die Knotenmengen der Zusammenhangskomponenten des G zugrundeliegenden ungerichteten Graphen und Ei = f(x; y ) 2 E jx; y 2 Vi g. Dann sind die Graphen Gi = (Vi; Ei) die Zusammenhangskomponenten von G.  G heit Baum, wenn G zusammenhangend ist, jeder Knoten nur Endpunkt hochstens einer Kante ist und es genau einen Knoten gibt, der nicht Endpunkt einer Kante ist.  G heit Wald, wenn seine Zusammenhangskomponenten Baume sind. Ein Graph G = (V; E ) heit endlich, wenn V endlich ist. Im Rest der Arbeit werden wir es nur mit endlichen Graphen zu tun haben. Endliche Graphen lassen sich in der Ebene darstellen, indem man Knoten aus V durch Punkte und Kanten aus E durch Kurven zwischen den entsprechenden Punkten reprasentiert. Der Zweck von Graphausgabealgorithmen ist, das sie fur endliche Graphen eine Darstellung in der Ebene liefern.

8

Kapitel 3

Schone Graphen Graphen sind ein oft benutztes Mittel zur Reprasentation aller Arten von Daten. Wir benutzen sie, um konkrete Relationen ubersichtlicher darzustellen als z.B. durch Matrizen. Es gibt nun eine Fulle von Algorithmen zum Schonen Zeichnen von Graphen (siehe [1]), von denen hier vier vorgestellt werden sollen, die auch ins RELVIEW-System eingebaut sind. Was sind nun schone Graphen? In der Literatur gibt es viele verschiedene Kriterien, nach denen man beurteilt, ob das Bild eines Graphen schon ist. Diese hangen naturlich davon ab, mit welchen Mitteln der Graph dargestellt werden soll, fur welche Zwecke das Bild benutzt wird und was fur eine Art von Graph gezeichnet werden soll.

~

~ @

@

~

@ @

~

@ @`` `

   

H  HH

H

 ``` ``` ```  ``  `   

~

~

HH    

~

Abbildung 3.1: Geradlinige Darstellung Es gibt verschiedene Standards zur Darstellung von Graphen in der Ebene. Ublicherweise werden die Knoten durch Kreise oder Kasten dargestellt, und eine Kante (u; v ) wird durch eine Linie zwischen den Symbolen, die u und v darstellen, reprasentiert. Nach der Art, wie die Linien, die die Kanten reprasentieren, gezeichnet werden, kann man die Bilder zum Beispiel in folgende Kategorien einteilen. In einer geradlinigen Darstellung werden die Kanten nur durch gerade Linien reprasentiert, stellt man jede Kante durch einen Polygonzug dar, so spricht man von einer Polygondarstellung, und wenn die einzelnen Segmente 9

~

~

~

~

  @   @   @   @   @  @  @  @  @

@ @ @

@ @

~

~

~

@ @ @ @ @

Abbildung 3.2: Polygondarstellung des jeweiligen Polygonzuges nur horizontal oder vertikal verlaufen, spricht man von einer Orthogonaldarstellung (siehe dazu Abb. 3.1 { 3.3). Die in dieser Arbeit dargestellten Algorithmen liefern Bilder, die entweder eine Polygon- oder eine geradlinige Zeichnung sind. Wann ist nun eine Darstellung eines Graphen schon? Auf jeden Fall mochte man, da ein Graph gut lesbar ist, das heit, da man schnell erkennen kann, welche Knoten durch Kanten miteinander verbunden sind bzw. zwischen welchen Knoten es einen Pfad in dem Graphen gibt. Daraus ergeben sich zum Beispiel die folgenden Forderungen an das Bild eines Graphen.  Die Kanten sollten moglichst kurz und gerade sein,  Knoten sollten nicht zu dicht nebeneinander liegen und  die Kanten sollten sich moglichst wenig schneiden. Weitere mogliche Wunsche sind,  da im Graph vorhandene Symmetrien sich auch im Bild wiederspiegeln,  da isomorphe Teilgraphen stets gleich dargestellt werden, egal an welcher Stelle sie im Graphen auftreten und  da das Bild so wenig Platz wie moglich beansprucht. Zusatzlich kommen fur spezielle Arten von Graphen noch spezi sche Anforderungen hinzu. So will man bei gerichteten Baumen gerne den Vater uber seinen Sohnen zentriert haben, bei azyklischen Graphen sollen alle Kanten die gleiche Richtung haben und planare Graphen sollen auf jeden Fall auch planar, das heit, ohne da sich zwei Kanten schneiden, dargestellt werden. Es ist nicht zu erwarten, da ein Algorithmus alle diese Anforderungen an die Darstellung von Graphen erfullen kann, und so gibt es auch eine Fulle von Algorithmen zum 10

~

~ ~

~ ~

~ ~

~ ~

~

~

~

Abbildung 3.3: Orthogonaldarstellung Zeichnen von Graphen, die dann jeweils bei einigen der genannten Kriterien ihre Schwerpunkte setzen und andere ganz oder teilweise vernachlassigen. Und selbst bei den Schwerpunkten der Algorithmen ist nicht immer Optimalitat der Ergebnisse zu erwarten, da zum Beispiel die Minimierung von Kantenkreuzungen NP{vollstandig ist [5], also mit ezienten Algorithmen nicht immer ein optimales Ergebnis erreicht werden kann. Bei den Algorithmen, die hier vorgestellt werden, wird jeweils erwahnt, welche Kriterien bei der Entwicklung des Algorithmus eine Rolle spielten.

11

Kapitel 4

Zeichnen azyklischer Graphen 4.1 Einfuhrung Der hier vorgestellte Algorithmus stammt hauptsachlich aus einer Arbeit von Gansner et al. [10].

4.1.1 Aesthetische Kriterien

Gerichtete azyklische Graphen (kurz dags - directed acyclic graphs) haben die Eigenschaft, da man sie so darstellen kann, da alle Kanten des Graphen eine gemeinsame Richtung haben, wie zum Beispiel von links nach rechts oder von oben nach unten (wie die meisten Beispielgraphen hier). Diese Tatsache hat zur Entwicklung einiger Algorithmen zum Zeichnen von dags gefuhrt, die auf den folgenden Prinzipien basieren: A1: Stelle den Graph als eine Hierarchie dar, sorge insbesondere dafur, da alle Kanten dieselbe Richtung haben. Dies hilft, Pfade zu nden, und hebt Quellen und Senken besonders hervor. A2: Vermeide Anomalien im Bild, die es unubersichtlich machen, wie zum Beispiel Kreuzungen von Kanten oder besonders stark geknickte Kanten. A3: Male die Kanten moglichst kurz. Das macht es leichter benachbarte Knoten zu nden, und ist auerdem im Sinne von A2. A4: Achte auf Symmetrie und Ausgewogenheit im Bild. Dieser Punkt spielt an manchen Stellen in dem hier vorgestellten Algorithmus nur eine untergeordnete Rolle. Wie bereits in 3 erwahnt, ist es naturlich nicht moglich, den Graph bezuglich all dieser Punkte optimal darzustellen. Daher werden an einigen Stellen vereinfachende Annahmen gemacht und Heuristiken verwendet, die schnell laufen und in den meisten Fallen gute Ergebnisse liefern.

12

1. procedure draw graph() 2. begin 3. rank(); 4. ordering(); 5. position(); 6. end

Abbildung 4.1: Gesamtalgorithmus

 4.1.2 Uberblick uber den Algorithmus

Die Eingabe, auf der der Algorithmus arbeitet, ist ein Graph G = (V; E ), dabei ist V die Knotenmenge und E die Kantenmenge. Wir nehmen an, da der Graph zusammenhangend ist. Ist dies nicht der Fall, so konnen die einzelnen Zusammenhangskomponenten getrennt dargestellt werden. Der Algorithmus hat, wie in Abb. 4.1 zu sehen, drei Phasen. In der ersten Phase wird jedem Knoten ein Rang zugewiesen. Knoten mit gleichem Rang werden auf einer Hohe, sozusagen in einer Schicht gezeichnet. Das heit, hiermit werden auch gleichzeitig die YKoordinaten bestimmt. In der zweiten wird die Ordnung der Knoten innerhalb der Schichten festgelegt, so da Kreuzungen von Kanten moglichst vermieden werden, und in der letzten Phase werden schlielich die X-Koordinaten der Knoten festgelegt.

4.2 Optimale Rang-Einteilung

4.2.1 Was soll die Rang-Einteilung leisten?

Diese erste Phase des Algorithmus weist jedem Knoten v 2 G einen ganzzahligen Rang (v ) zu, so da er mit den zu v inzidenten Kanten vertraglich ist. Das bedeutet, da fur jede Kante e = (v; w) 2 E gilt l(e)   (e), wobei die Lange l(e) von e = (v; w) als (w) (v ) de niert ist, und  (e) die Mindestlange der Kante e angibt.  (e) ist normalerweise gleich 1, wird aber aus technischen Grunden, wie wir spater sehen werden, bei einigen Gelegenheiten programmintern anders gesetzt. A3 aus 4.1.1 besagt, da die Kantenlangen moglichst klein sein sollen. Abgesehen davon, da dies schonere Bilder liefert, verkurzt sich mit der Kantenlange auch die Laufzeit der noch folgenden Phasen des Algorithmus, da diese von der Gesamt-Kantenlange abhangt. Somit ist es naturlich wunschenswert, eine optimale Rang-Einteilung zu nden, das heit eine bei der die Summe der gewichteten Kantenlangen minimal wird. Das Finden einer optimalen Rang-Einteilung kann auch durch das folgende ganzzahlige lineare Programm beschrieben werden: X min ! (v; w)((w) (v )) (v;w)2E

wobei (w) (v )   (v; w) fur alle (v; w) 2 E 13

Die Gewichtsfunktion ! ist hierbei wiederum in dem Ausgangsgraphen gleich 1 fur alle Kanten, wird aber intern spater anders gesetzt. Die Gewichtsfunktion ! und die Funkton  , die die minimale Lange angibt, bilden die Menge der Kanten E auf die nichtnegativen rationalen Zahlen bzw. auf die naturlichen Zahlen ab. Es gibt nun verschiedene Wege, dieses ganzzahlige Programm zu losen. Eine Moglichkeit ware zum Beispiel, das aquivalente lineare Programm zu losen und dann diese Losung in eine ganzzahlige zu transformieren (in polynomialer Zeit).

4.2.2 Die Network-Simplex-Methode

Dies ist ein einfacher Zugang zu dem Problem, der auf dem Network-SimplexAlgorithmus aus [3] basiert. Obwohl seine Komplexitat nicht als polynomial bewiesen wurde, braucht er in der Praxis nur wenige Iterationen und lauft sehr schnell. Fur die Beschreibung des Algorithmus benotigen wir zunachst folgende De nitionen: Eine Rang-Einteilung ist zulassig, wenn sie die Bedingung l(e)   (e) erfullt. Die Spanne slack(e) einer Kante e ist die Di erenz zwischen ihrer Lange und ihrer minimalen Lange, also slack(e) = l(e)  (e). Eine Kante heit passend, wenn ihre Spanne Null ist. Ein spannender Baum induziert eine Rang-Einteilung, oder besser eine Familie von Rang-Einteilungen. (Beachte, da der spannende Baum nicht unbedingt ein gerichteter Baum ist, und nur auf dem zu Grunde liegenden ungerichteten Graphen basiert.) Man erhalt diese Rang-Einteilung, indem man zuerst einem beliebigen Knoten irgendeinen Rang zuweist, und dann die RangEinteilung fur die restlichen Knoten nach folgendem Schema durchfuhrt: Sei v ein Knoten, der noch keinen Level hat, und w ein mit v durch eine Baumkante verbundener Knoten, dem berets ein Rang zugewiesen wurde. Der Wert, der v als Rang zugewiesen wird, ist dann der Rang von w erhoht bzw. vermindert um die Mindestlange der Kante zwischen v und w, und zwar erhoht, wenn die Kante von w nach v geht, und vermindert, wenn sie von v nach w geht. Dies fuhrt man so lange fort, bis man allen Knoten einen Rang zugewiesen hat. Ein spannender Baum heit zulassig, wenn er eine zulassige Rang-Einteilung induziert. Durch diese Konstruktion der Rang-Einteilung sind automatisch alle Baumkanten passend. Mit einem gegebenen spannendem Baum konnen wir jeder Baumkante e einen ganzzahligen Schnittwert wie folgt zuordnen: Loscht man die Kante e aus dem Baum, so zerfallt der Baum in zwei Zusammenhangskomponenten, die Vorder- und die Hinterkomponente. Die Vorderkomponente enthalt den Endund die Hinterkomponente den Anfangsknoten der Kante e. Der Schnittwert von e ist de niert als die Summe der Gewichte aller Kanten, die von der Hinter- zur Vorderkomponente gehen (das heit auch der Kante e selbst) minus der Summe der Gewichte aller Kanten, die von der Hinter- zur Vorderkomponente gehen. Ein negativer Schnittwert einer Baumkante deutet darauf hin (wegen Degeneriertheit mu dies aber nicht immer der Fall sein), da die Summe der gewichteten Kantenlangen reduziert werden kann, indem diese Kante so weit wie moglich gestreckt wird. So weit wie moglich bedeutet, bis eine der Kanten, die von der Vorder- zur Hinterkomponente gehen, passend wird. Dies entspricht 14

1. procedure rank() 2. feasible tree(); 3. while (e = leave edge()) 6= nil do 4. f = enter edge(e); 5. exchange(e,f); 6. end 7. normalize(); 8. balance(); 9. end

Abbildung 4.2: Network-Simplex dem Ersetzen der Baumkante mit dem negativen Schnittwert durch die neue dann passende Kante, um so einen neuen zulassigen spannenden Baum zu erhalten. Diese Feststellung ermoglicht es uns, das Problem der Rang-Einteilung graphentheoretisch statt mit algebraischen Mitteln zu losen. Baumkanten mit negativen Schnittwerten werden sukzessive durch geeignete Nicht-Baumkanten ersetzt, bis alle Baumkanten nicht-negative Schnittwerte haben. Theoretisch mu man, um die Terminierung des Algorithmus zu garantieren, naturlich eine Technik verwenden, die das Kreisen verhindert. In der Praxis ist dies jedoch nicht unbedingt erforderlich, da Falle, in denen das Kreisen auftritt, nur sehr schwer zu konstruieren sind, und deshalb praktisch nie auftreten. Fur genauere Informationen uber den Network-Simplex-Algorithmus, was Terminierung und Optimalitat der Losung betri t, verweise ich auf die Literatur [3, 4]. Abb. 4.2 zeigt die Version des Network-Simplex-Algorithmus von Gansner et al.: 2: Die Funktion feasible tree erzeugt einen zulassigen spannenden Baum. Diese Funktion wird gleich noch ausfuhrlich beschrieben. Die SimplexMethode beginnt mit einer zulassigen Losung und behalt dies bis zum Schlu bei. 3: leave edge liefert eine Baumkante mit negativem Schnittwert, falls eine solche vorhanden ist, oder nil, falls nicht, was bedeutet, da die Losung optimal ist. Jede Kante mit negativem Schnittwert kann als die zu ersetzende Kante ausgewahlt werden. 4: enter edge ndet eine Kante, die nicht zum Baum gehort, durch die e ersetzt wird. Dazu wird die Kante e aus dem Baum geloscht, wodurch der Baum in eine Vorder- und eine Hinterkomponente geteilt wird. Von allen Kanten, die von der Vorder- zur Hinterkomponente gehen, wird eine mit minimaler Spanne ausgewahlt. Dies ist notig, damit der entstehende Baum wieder zulassig ist. 15

1. procedure feasible tree() 2. init rank(); 3. tree init(); 4. while treesize < jVj do 5. e = eine Nicht-Baumkante, die einen Endknoten im Baum 6. und minimale Spanne hat; 7. delta = slack(e); 8. if der Baumknoten von e ist Endknoten von e then 9. delta = -delta; 10. for v in tree do v.rank = v.rank + delta; 11. fuge den Nicht-Baumknoten von e in den Baum ein 12. mit e als neuer Baumkante; 13. treesize = treesize + 1; 14. end 15. init cutvalues(); 16. end

Abbildung 4.3: Die Prozedur feasible tree 5: Die Kanten e und f werden ausgetauscht. Dazu wird der Baum mit den Schnittwerten entsprechend geandert. 7: Die Funkton normalize setzt den niedrigsten Rang auf Null. 8: Knoten, bei denen die Summe der Kantengewichte aller Kanten, die zu ihnen hingehen, gleich der Summe der Kantengewichte aller Kanten, die von ihnen weggehen, ist und die mehrere zulassige Range haben, werden auf einen zulassigen Rang mit den wenigsten Knoten verschoben. Dies soll im Sinne von Prinzip A4 aus 4.1.1 verhindern, da die Knoten sich mehr als notig in einer Schicht haufen. Diese Korrekturen verandern die Kosten der Rang-Einteilung nicht. Die Knoten werden einfach nach einem gierigen Algorithmus verschoben, was zu zufriedenstellenden Ergebnissen fuhrt. Abb. 4.3 beschreibt den Algorithmus zum Konstruieren eines initialen zulassigen Baumes: 2: Hier wird eine initiale zulassige Rang-Einteilung konstruiert. Dies geschieht folgendermaen: Die Knoten werden in einem FIFO-Pu er verwaltet. Knoten werden in den Pu er getan, wenn sie keine unmarkierten Eingangskanten haben, gleichzeitig werden ihre Ausgangskanten markiert. Wenn alle Knoten im FIFO-Pu er sind, werden sie in umgekehrter Reihenfolge wieder entnommen, wobei jedem Knoten der niedrigste Rang zugeordnet wird, der der Mindestlange seiner Eingangskanten genugt. 3: tree init stellt einen initialen Baum her, der aus einem beliebigen Knoten besteht. treesize wird auf 1 gesetzt. 16

 

 

 

am

am

1

JJ 2

 ? J^ em fm bm 1JJ 0 2 ? cm ? J^ gm 2 ? dm

2

?

 hm

J 3 JJ^ bm 3

? em fm cm 0JJ 0 3 J^ ? ?



?

gm dm -1

3 ?  hm (a)

(b)

Abbildung 4.4: Beispiel zum Network-Simplex-Algorithmus 5-13: Hier wird eine Nicht-Baumkante gesucht, die in den Baum hineinfuhrt, das heit, die genau einen Endknoten im Baum hat. Dann wird der Rang der Baumknoten so verandert, da die neue Baumkante passend wird. Da die Kante so gewahlt wurde, da sie eine minimale Spanne hat, ist die neue Rang-Einteilung immer noch zulassig. In jeder Iteration wachst der Baum also um einen Knoten, und am Schlu erhalt man einen zulassigen spannenden Baum. Diese Technik wird ahnlich auch von Sugiyama in [2] beschrieben. 15: Die Funktion init cutvalues berechnet die Schnittwerte der Baumkanten. Fur jede Baumkante erhalten die Knoten dazu eine Marke, die angibt, ob der Knoten zur Vorder- oder Hinterkomponente gehort. Dann wird Summe der vorzeichenbehafteten Kantengewichte der Kanten gebildet, deren Anfangs- und Endknoten in verschiedenen Komponenten liegen, wobei das Vorzeichen negativ ist, wenn die Kante von der Vorderzur Hinterkomponente geht. Ein kleines Beispiel fur den Network-Simplex-Algorithmus ist in Abb. 4.4 zu sehen. Nicht-Baumkanten sind durch dunne Linien dargestellt, das Gewicht und die minimale Lange aller Kanten ist gleich 1. Bild (a) zeigt den Graph nach der initialen Rang-Einteilung mit den entsprechenden Schnittwerten. Zum Beispiel ist der Schnittwert der Kante (g; h) gleich -1. Dies ergibt sich aus dem Gewicht der Kante (g; h) (von der Hinter- zur Vorderkomponente) minus der Kantengewichte von (a; e) und (a; f ) (von der Vorder- zur Hinterkomponente). In Bild (b) wurde die Kante (g; h) mit negativem Schnittwert durch die Kante (a; e) ersetzt, wobei sich die gezeigten neuen Schnittwerte ergeben. Da alle Schnittwerte nichtnegativ sind, ist die Losung optimal, und der Algorithmus terminiert. 17

PP PP PP PP PP PP PP P PP PP PP P A PPPP B PP P  E A uQ A * G PP Q A  P Q  6 F P qQ P s -x A C D YH H 1 3  w   I   ? H    H HH v    J   I @  @@  K@ @@ L   @    @ @  R @        

' & ' &

$ s % $s s %

s

Abbildung 4.5: Berechnung der Schnittwerte

4.2.3 Details der Implementierung

Hier werden einige spezielle Punkte angesprochen, die bei einer Implementierung des Network-Simplex-Algorithmus wichtig sind, um die Laufzeit zu verringern. Diese Verbesserungen sind hier ganz nutzlich, werden aber unbedingt notwendig in der dritten Phase des Algorithmus, wenn die Network-SimplexMethode auf sehr viel groere Graphen angewandt wird. Die Berechnung des initialen zulassigen Baumes und der ersten Schnittwerte benotigt oft einen sehr groen Anteil an der Gesamtrechenzeit zur Losung eines Problems mithilfe des Network-Simplex-Algorithmus. Tatsachlich ist es in der Praxis hau g so, da die Anfangslosung nicht weit von der Optimalen entfernt ist, und es nur noch einiger weniger Iterationen bedarf, um diese zu nden. In einer naiven Implementierung kann man die Schnittwerte berechnen, indem man fur jede Kante alle Knoten markiert, je nachdem ob sie zur Vorder- oder zur Hinterkomponente gehoren, und dann die Summe berechnet, wie vorhin bereits beschrieben. Um die Kosten dieser Berechnung zu reduzieren, hilft uns die Feststellung, da zur Berechnung der Schnittwerte nur zur jeweiligen Kante lokale Informationen notig sind (genauer, man braucht nur Kanten betrachten, die einen der Endpunkte der Baumkante enthalten), wenn man bei den Blattern des Baumes anfangt und dann weiter nach innen geht. Es ist einfach, die Schnittwerte einer Kante zu berechnen, die ein Blatt des Baumes als Endknoten hat, da entweder die Vorder- oder die Hinterkomponente nur aus einem einzigen Knoten besteht. Hat man nun zu einem Knoten die Schnittwerte aller Kanten, die ihn enthalten, bis auf eine berechnet, so ist der Schnittwert der letzten Kante die Summe der Schnittwerte der anderen Kanten plus einem Term, der jetzt nur noch von den 18

vroot

s A

(1,1)

  

s

s

(1,9)

@ @ @ @

 A A 

A A (2,2) A

s

@

s

(4,8)@

(1,3)

(4,5)

(4,4)

A  A A  A  A  A 

s

s

(6,6)

s

(7,7)

s

Abbildung 4.6: Postorder-Durchlauf mit Knotenmarkierungen (low,lim) Kanten, die diesen Knoten enthalten, abhangt. Diese Berechnung wird in Abb. 4.5 illustriert, fur den speziellen Fall, wo ein Knoten w Endpunkt von genau drei Baumkanten ist. Wir nehmen an, da die Schnittwerte von (u; w) und (v; w) bereits bekannt sind. Die Kanten, die mit Grobuchstaben beschriftet sind, stehen fur die Menge aller Kanten in der dargestellten Richtung, deren Endpunkte in den entsprechenden Komponenten liegen. Die Schnittwerte von (u; w) und (v; w) berechnen sich wie folgt:

c(u;w) = ! (u; w) + A + C + F B E D beziehungsweise

c(v;w) = !(v; w) + L + I + D K J C : Der Schnittwert von (w; x) ist demnach

c(w;x) = ! (w; x) + G H + A B + L K = ! (w; x) + G H + (c(u;w) ! (u; w) C F + E + D) + (c(v;w) !(v; w) I D + J + C ) = ! (w; x) + G H + c(u;w) ! (u; w) + c(v;w) ! (v; w) F + E I + J ; ein Ausdruck, der nur die bereits bekannten Schnittwerte und lokale Informationen uber die betrachtete Kante (w; x) benotigt. Berechnet man die Schnittwerte auf diese Weise, so wird jede Kante nur zweimal betrachtet, namlich genau dann, wenn bei der Berechnung des Schnittwertes einer Baumkante einer der Endpunkte die Funktion des Knotens w aus obigem Beispiel hat. Eine weitere Verbesserung, die einer Technik aus [3] entspricht, lat sich durch die Durchfuhrung eines Postorder-Durchlaufs auf dem spannenden Baum erreichen. Dabei beginnt man mit irgendeinem festen Knoten vroot als Wurzel, und markiert jeden Knoten v mit der Postorder-Nummer lim(v ), die angibt, 19

als wievielter Knoten er besucht wurde, mit low(v ), der niedrigsten PostorderNummer aller Nachfolger von v , und mit parent(v ), der Kante, uber die v erreicht wurde (siehe Abb. 4.6). Dies versetzt uns in die Lage, sehr einfach testen zu konnen, ob ein Knoten in der Vorder- oder in der Hinterkomponente einer Baumkante liegt, und somit, ob eine Nicht-Baumkante die beiden Komponenten verbindet. Sei zum Beispiel e = (v; w) eine Baumkante und vroot in ihrer Vorderkomponente (das heit lim(u) < lim(v )). Dann liegt ein Knoten w genau dann in der Hinterkomponente von e, wenn gilt low(u)  lim(w)  lim(u). Diese Parameter konnen auch benutzt werden, um den Baum nach einem Schritt im Network-Simplex-Algorithmus wieder zu aktualisieren(in exchange(e,f)). Wenn f = (w; x) die neue Baumkante ist, dann mussen nur die Schnittwerte auf dem Pfad zwischen w und x (im Baum) korrigiert werden. Dieser Pfad ist leicht zu nden, indem man die parent-Kanten von w und x bis zum ersten gemeinsamen Vorganger zuruckverfolgt, das heit, bis zu dem ersten Knoten l mit low(l)  lim(w); lim(x)  lim(l). Naturlich mussen die Postorder-Parameter beim Austausch der Kanten auch korrigiert werden, aber nur fur Knoten unterhalb von l. Die Geschwindigkeit des Network-Simplex-Algorithmus wird auerdem stark durch die Wahl der auszutauschenden Kante mit negativem Schnittwert beein ut. Die Praxis zeigt, da es viele Iterationen sparen kann, wenn man die Baumkanten zyklisch durchsucht, statt immer wieder am Anfang der Kantenliste zu beginnen.

4.3 Die Ordnung der Knoten in den Schichten Nach der Rang-Einteilung werden Kanten zwischen Knoten, deren Rang sich um mehr als eins unterscheidet, durch Ketten von Kanten der Lange 1 ersetzt. Dazu werden Hilfsknoten, sogenannte virtuelle Knoten, auf den Schichten, die zwischen den beiden Knoten der ursprunglichen Kante liegen, eingefuhrt. Dadurch gibt es in dem entstehendem Graph nur noch Kanten zwischen benachbarten Schichten. Die Anordnung der Knoten in den Schichten bestimmt die Anzahl der Kantenkreuzungen in der Darstellung des Graphen. Eine gute Anordnung der Knoten ist also eine, die wenige Kreuzungen produziert. Hierzu mussen wir auf Heuristiken zuruckgreifen, da das Problem der Minimierung von Kantenkreuzungen selbst fur Graphen mit nur zwei Schichten NP-vollstandig ist. Einige wichtige Heuristiken zur Reduzierung von Kantenkreuzungen in Graphen, die in Schichten gezeichnet werden, sind auf der Grundlage des folgendem Schemas, das zuerst von War eld [6] vorgestellt wurde, entwickelt worden. Zuerst wird fur jede Schicht eine initiale Ordnung hergestellt. Dann wird in einer Folge von Iterationen versucht, die Ordnung zu verbessern. Jede Iteration besucht zunachst die erste Schicht und geht dann der Reihe nach alle Schichten bis zur letzten durch, oder umgekehrt. Wird eine Schicht besucht, so wird jeder ihrer Knoten ein Gewicht zugeordnet, das von den relativen Positionen der mit ihm durch eine Kante verbundenen Knoten der vorhergehenden Schicht abhangt (das heit entweder eine Schicht hoher oder eine Schicht tiefer, je nachdem in 20

1. procedure ordering() 2. order = init order(); 3. best = order; 4. for i = 0 to Max iterations do 5. wmedian(order,i); 6. transpose(order); 7. if crossing(order) < crossing(best) then 8. best = order; 9. end 10. return best; 11. end

Abbildung 4.7: Ordnungs-Algorithmus welche Richtung die aktuelle Iteration lauft). Dann werden die Knoten neu geordnet, indem sie nach ihren Gewichten sortiert werden. Zwei bekannte Methoden, die Knoten zu gewichten, sind die BarycenterMethode [2] und die Median-Methode [7]. Sei v ein Knoten und P die Liste der Positionen der zu ihm inzidenten Knoten in der gerade betrachteten benachbarten Schicht. Die Position eines Knotens ist seine Nummer in der Ordnung der Schicht, in der er sich be ndet. Die Barycenter-Methode de niert das Gewicht von v als das arithmetische Mittel der Elemente aus P , die Median-Methode dagegen als das mittlere der Elemente aus P . Wenn die Anzahl der Elemente in P gerade ist, gibt es zwei Medians. Das fuhrt zu zwei verschiedenen MedianMethoden: benutze stets den linken Median oder benutze stets den rechten Median. Die Median-Methode erweist sich in der Praxis als besser geeignet und hat einen leichten theorethischen Vorteil. Eades und Wormald [7] haben namlich gezeigt, da die Anzahl der Kantenkreuzungen im Bild eines Graphen mit zwei Schichten, das nach der Median-Methode gezeichnet wurde (das heit, bei dem die Knoten nach der Median-Methode geordnet wurden), hochstens drei mal so gro ist wie die minimale Anzahl der Kantenkreuzungen. Solch eine Schranke ist fur die Barycenter-Methode bisher nicht bekannt. Die hier verwendete Heuristik zum Ordnen der Knoten ist eine Verfeinerung der Median-Methode bei der Gansner et al. zwei Neuerungen eingefuhrt haben. Die erste ist, da in dem Fall, da es zwei Medians gibt, ein Wert zwischen diesen Beiden genommen wird, der mehr in die Richtung geht, auf der die Knoten dichter zusammenliegen (wie genau, das sehen wir spater in Abb. 4.8). Die zweite Neuerung ist eine zusatzliche Heuristik, die die Anzahl der Kreuzungen verringert, nachdem die Knoten nach ihren Gewichten sortiert wurden und die eine bezuglich Vertauschung zweier benachbarter Knoten lokal optimale Ordnung liefert. Diese zusatzliche Heuristik reduziert in den meisten Fallen die Anzahl der Kreuzungen noch einmal um weitere 20-50%. Detaillierte Statistiken zu diesem Thema ndet man in der entsprechenden Literatur [8].

21

1. procedure wmedian(order,iter) 2. if iter mod 2 = 0 then 3. for r = 1 to Max rank do 4. for v in order[r] do 5. median[v] = median value(v,r-1); 6. sort(order[r],median); 7. end 8. else . . . 9. endif 10. end

Abbildung 4.8: Die gewichtete Median-Heuristik Abb. 4.7 zeigt den Ordnungs-Algorithmus: 2: init order liefert eine initiale Ordnung. Dazu wird eine Tiefensuche auf dem Graphen durchgefuhrt, wobei man stets bei denjenigen Knoten beginnt, die keine Vorganger haben. Den Knoten wird eine Positon in ihrer Schicht in der Reihenfolge von links nach rechts zugewiesen, das heit, wird ein Knoten besucht, so bekommt er die nachste freie Position in seiner Schicht. Diese Strategie sorgt dafur, da die initiale Ordnung eines Baumes keine Kreuzungen hat. Dadurch werden schon einige leicht vermeidbare Kantenkreuzungen unterbunden. 4-9: Max Iterations ist die Anzahl der Iterationen, die durchgefuhrt werden (bei Gansner et al. ist Max Iterations 24). Bei jeder Iteration wird die neue Ordnung ubernommen, wenn sich die Anzahl der Kreuzungen verringert hat. Es ware auch denkbar eine andere Strategie zu verwenden, die keine absolute Zahl von Iterationen vorgibt. Zum Beispiel konnte man die Iterationen so lange durchfuhren, wie die Losung sich in den letzten x Iterationen noch um y Prozent verbessert hat, wobei man dann x und y nach Belieben setzen kann. wmedian ordnet die Knoten neu gema der gewichteten Median-Methode. transpose vertauscht die benachbarten Knoten in jeder Schicht, wenn dadurch die Zahl der Kantenkreuzungen reduziert werden kann. Diese beiden Funktionen werden gleich noch ausfuhrlich beschrieben. Der gewichtete Median-Algorithmus ist in Abb. 4.8 dargestellt. Je nachdem, ob die aktuelle Iteration eine gerade oder eine ungerade Nummer hat, werden die Schichten von oben nach unten oder umgekehrt durchgegangen. Um die Darstellung zu vereinfachen, wird in Abb. 4.8 nur eine Richtung im Detail dargestellt: 1-10: Beim Durchlaufen in Vorwartsrichtung beginnt die Hauptschleife mit 1 und endet mit der Nummer der hochsten Schicht. In jeder Schicht wird den Knoten ein Median abhangig von den zu ihm inzidenten Knoten in der nachst niedrigeren Schicht zugewiesen. Dann werden die Knoten in 22

1. procedure median value(v,adj rank) 2. P = adj position(v,adj rank); 3. m = jPj/2; 4. if jPj = 0 then 5. return -1.0; 6. elseif jPj mod 2 = 1 then 7. return P[m]; 8. elseif jPj = 2 then 9. return (P[0] + P[1])/2; 10. else 11. left = P[m-1] - P[0]; 12. right = P[jPj-1] - P[m]; 13. return (P[m-1]right+P[m]left)/(left+right); 14. endif 15. end

Abbildung 4.9: Die Funktion median value der Schicht nach ihren Medians sortiert. Eine wichtige Frage ist noch, was man mit den Knoten macht, die keine inzidenten Knoten in der vorigen Schicht haben. Bei Gansner et al. behalten solche Knoten ihre bisherige Position bei und die anderen Knoten werden dann in die verbleibenden Positionen sortiert. In Abb. 4.9 wird die Funktion median value beschrieben: 1-15: Der Median eines Knotens ist de niert als die Position des mittleren seiner benachbarten Knoten, wenn diese eindeutig ist. Sonst wird ein Wert zwischen den beiden Medians genommen, der sich danach richtet, wie eng die Knoten beieinander liegen. Generell wird der Wert zu der Seite verschoben, auf der die Knoten dichter zusammen liegen. 2: Die Funktion adj position liefert ein geordnetes Feld mit den Positionen der zu v benachbarten Knoten in der gegebenen Schicht adj rank. 4-5: Wenn Knoten keine Nachbarn in dieser Schicht haben, bekommen sie den Median-Wert 1. Dies wird in der sort-Funktion benutzt, um anzuzeigen, da diese Knoten ihre bisherige Position behalten sollen. Abb. 4.10 zeigt die Transpositionsheuristik: 3-15: Dies ist die Hauptschleife, die so lange lauft, wie die Anzahl der Kantenkreuzungen durch das Vertauschen benachbarter Knoten verringert werden kann. Wie in der Funktion ordering konnte man auch hier eine andere Abbruchbedingung wahlen, zum Beispiel um die Schleife zu beenden, wenn die Verringerung nur noch ein genugend kleiner Teil der Anzahl der Kreuzungen ist. 23

1. procedure transpose(rank) 2. improved = True; 3. while improved do 4. improved = False; 5. for r = 0 to Max rank do 6. for i = 0 to jrank[r]j-2 do 7. v = rank[r][i]; 8. w = rank[r][i+1]; 9. if crossing(v,w) > crossing(w,v) then 10. improved = True; 11. exchange(rank[r][i],rank[r][i+1]); 12. endif 13. end 14. end 15. end 16. end

Abbildung 4.10: Transpositionsheuristik zur Reduzierung der Kreuzungen 7-12: Jedes Paar benachbarter Knoten wird untersucht. Ihre Positionen werden getauscht, wenn dies die Anzahl der Kreuzungen verringert. Die Funktion crossing (v,w) z ahlt einfach die Anzahl der Kreuzungen, die entstehen, wenn v links von w plaziert wird, genauer, die Anzahl der Kreuzungen, die durch Kanten entstehen, die v oder w als Endpunkte haben. Auf Kreuzungen, die durch andere Kanten entstehen, hatte das Vertauschen von v und w naturlich keinen Ein u. Wenn die Knoten nach ihren Median-Werten sortiert werden, oder wenn man den Transpositions-Algorithmus anwendet, kann es vorkommen, da beide Knoten die gleichen Median-Werte haben, bzw. da die Anzahl der Kreuzungen die gleiche ist, egal in welcher Reihenfolge die Knoten auftreten. Es hat sich als hilfreich herausgestellt, und auerdem als passend zu A4 aus 4.1.1, wenn man Knoten mit gleichen Werten in der Sortier- oder Transpositionsphase bei jedem zweiten Durchlauf vertauscht.

4.4 X-Koordinaten

4.4.1 Was soll diese Phase des Algorithmus leisten?

In dieser Phase werden den Knoten die X-Koordinaten zugewiesen (die YKoordinaten sind durch die Einteilung in Schichten ja bereits gegeben). Einige altere Arbeiten behandeln dies als eine der Barycenter-Methode nachgeschaltete Phase, die nur lokale Verbesserungen vornimmt, um allzu schlechte Bilder zu vermeiden. Gansner et al. sehen die Zuweisung der X-Koordinaten als ein eigenstandiges, wohlde niertes Problem an, was zu besseren Bildern fuhrt und 24

die Moglichkeit zur spateren Verbesserung oder Erweiterung des Algorithmus o enhalt. Entsprechend der asthetischen Kriterien aus 4.1.1, sind kurze, gerade Kanten in einem Bild eher erwunscht als lange, geknickte. Dies fuhrt uns dazu, die X-Koordinatenzuweisung als das folgende ganzzahlige OptimierungsProblem zu betrachten: min

X

e=(v;w)

(e)! (e)jxw xv j

wobei xb xa  1 fur alle a, b mit a ist linker Nachbar von b in derselben Schicht. Das Gewicht (e), ein interner Wert und nicht zu verwechseln mit dem ursprunglichen Kantengewicht ! (e), wird so de niert, da die Kosten gering sind, wenn lange Kanten gerade gezeichnet werden. Da Kanten zwischen zwei benachbarten Schichten stets als gerade Linien gezeichnet werden konnen, ist es wichtiger, den horizontalen Abstand zwischen virtuellen Knoten moglichst gering zu halten. Dann konnen die Ketten von virtuellen Knoten, durch die die ursprunglichen Kanten ersetzt wurden, namlich vertikal angeordnet werden, und der entstehende Polygonzug, durch den die Kante dargestellt wird, hat dann keine Knicke. Dies ist sehr wichtig, da das Bild eines Graphen, dessen Kanten viele Knicke aufweisen, sehr unubersichtlich wird. Dementsprechend werden die Kanten in drei verschiedene Klassen, abhangig von der Art ihrer Endknoten, aufgeteilt. 1. Beide Knoten sind echte Knoten (das heit keine virtuellen Knoten). 2. Ein Knoten ist ein echter und einer ein virtueller Knoten. 3. Beides sind virtuelle Knoten. Sei e eine Kante der Klasse 1, f eine Kante der Klasse 2 und g eine Kante der Klasse 3. Dann ist (e)  (f )  (g ). Gansner et al. benutzen hier entsprechend die Werte 1, 2, und 8.

4.4.2 Optimale X-Koordinaten-Zuweisung

Um den Knoten die X-Koordinaten zuzuweisen, benutzen wir noch einmal den Network-Simplex-Algorithmus aus 4.2.2, indem wir die X-Koordinaten als den Rang der Knoten ansehen. Dafur mussen wir uns einen Hilfsgraph konstruieren, wie in Abb. 4.11 dargestellt. Die Knoten des Hilfsgraphen G0 sind die Knoten des Ausgangsgraphen G plus eines Knotens ne fur jede Kante e aus G (mit Ausgangsgraph ist hier der Graph nach dem Ordnungs-Algorithmus gemeint, das heit, in G sind bereits die virtuellen Knoten enthalten). In G0 gibt es nun zwei Arten von Kanten. Die einen enthalten die Information uber die Kosten der ursprunglichen Kanten. Jede Kante e = (u; v ) in G wird ersetzt durch zwei Kanten eu = (ne ; u) und ev = (ne ; v ) mit  = 0 und ! = ! (e) (e). Die anderen Kanten trennen Knoten, die in derselben Schicht liegen. Sei v der linke Nachbar von w. Dann hat G0 eine Kante e(v;w) = (v; w) mit  (e(v;w)) = 1 und ! (e(v;w)) = 0. Diese Kante sorgt dafur, da die Knoten u und v nicht dieselben Koordinaten 25

 *A      A  u

u    PPP  PPPP e e

n

ev

A A e A A

PPP   PPAPqAAU e(v;w)  w v





Abbildung 4.11: Ein Hilfsgraph erhalten, hat aber keinen Ein u auf die Kosten. Wir betrachten nun das RangEinteilungsproblem fur den Graphen G0 , das mithilfe der Network-SimplexMethode gelost werden kann. Jede X-Koordinaten-Zuweisung von G entspricht einer Rang-Einteilung von G0 mit den gleichen Kosten. Diese erhalt man, indem man jedem Knoten u aus G als Rang in G0 den Wert zuweist, den er in G als X-Koordinate hat, und jedem Knoten ne mit e = (u; v ) den Wert min(xu; xv ), wobei xu und xv die X-Koordinaten von u bzw. v in G sind. Umgekehrt induziert jede Rang-Einteilung in G0 eine X-Koordinaten-Zuweisung in G. Zusatzlich gilt, da in einer optimalen Rang-Einteilung stets eine der Kanten eu oder ev die Lange 0 haben mu und die andere die Lange jxu xv j. Das heit, die Kosten der ursprunglichen Kante (u; v ) in G ist gleich der Summe der Kosten der beiden Kanten eu und ev in G0 und somit haben insgesamt beide Losungen, die der Rang-Einteilung von G0 und die der X-Koordinaten-Zuweisung von G, dieselben Kosten. Also bedeutet Optimalitat fur G0 auch Optimalitat fur G, und eine Losung fur G0 liefert uns eine Losung fur G.

4.4.3 Details der Implementierung

Der Hilfsgraph ist erheblich groer als der ursprungliche Graph. Hat der ursprungliche Graph V Knoten, E Kanten und S Schichten, so hat der Graph mit den zusatzlich eingefuhrten virtuellen Knoten V + D Knoten und E + D Kanten, wobei D die Anzahl der virtuellen Knoten sei. Der Hilfsgraph hat dann V + E +2D Knoten und V +2E +3D S Kanten. Dieser Graph braucht deutlich mehr Zeit bei der Anwendung des Network-Simplex-Algorithmus. Demzufolge sind die Verbesserungen, die in 4.2.3 angefuhrt wurden, in dieser Phase des Algorithmus auerst wichtig. Es ist auerdem noch eine weitere Verbesserung moglich. Wenn man sich die spezielle Struktur des Hilfsgraphen anschaut, stellt man fest, da es sehr leicht ist, hierfur einen zulassigen spannenden Baum zu konstruieren, und zwar auf folgende Weise. Man benutzt alle Kanten, die Knoten in ein und derselben Schicht verbinden. Fur je zwei benachbarte Schichten wahlt man eine Kante f = (u; v ) zwischen den beiden Schichten und fugt dann beide Kanten fu und fv zum Baum hinzu. Dadurch wird fur alle Knoten in diesen beiden Schichten die Positon relativ zueinander festgelegt. Zum Schlu fugt man fur jede Kante 26

e = (w; x) die Kante ew oder ex zum Baum hinzu, je nachdem ob w oder x weiter links plaziert ist (was durch die Wahl der Kante f festgelegt wurde).

Ohne die genannten Verbesserungen braucht der Network-Simplex-Algorithmus 5{10 mal langer. So lauft er jedoch genauso schnell wie einige Heuristiken, die erstens schwerer zu programmieren sind und zweitens keine optimalen Losungen produzieren.

4.5 Erweiterung auf beliebige Graphen Der Algorithmus, wie bisher beschrieben, ist nur auf kreisfreie Graphen anwendbar. Wir wollen ihn jedoch auch auf nicht-kreisfreie Graphen anwenden. Dazu sind folgende Modi kationen notwendig. Vor Anwendung des bisherigen Algorithmus wird der Graph kreisfrei gemacht. Dazu werden zunachst alle Schleifen, das heit Kanten (v; v ) mit v 2 V , geloscht. Zusatzlich fuhren wir eine Tiefensuche auf dem Graphen durch, bei der den Knoten ihre DFS-Parameter (DFS = depth rst search) zugewiesen werden, namlich der Wert d[v ], wenn der Knoten besucht wird und der Wert f [v ], wenn der Knoten verlassen wird, also, wenn alle seine Nachfolger besucht wurden. Dies funktioniert so, da bei der Tiefensuche ein Zahler mitgefuhrt wird, dessen Wert jeweils der nachste DFS-Parameter wird (d oder f ). Nach jeder solchen Zuweisung wird der Zahler um 1 erhoht, das heit, jeder Wert zwischen 1 und 2jV j kommt nur einmal unter den d- oder f -Werten vor. Nun gibt es unter den Kanten, die nicht zum DFS-Baum gehoren, drei verschiedene Sorten, die sich durch die d- und f -Werte ihrer Anfangs- und Endpunkte unterscheiden lassen (u bezeichne im Folgenden stets den Anfangsund v den Endpunkt einer Kante). 1. Die Vorwartskanten, das heit Kanten, die von einem Knoten zu einem seiner Nachfahren im DFS-Baum gehen. Fur diese gilt d[u] < d[v ] und f [u] > f [v ]. 2. Die Ruckwartskanten, das heit Kanten, die von einem Knoten zu einem seiner Vorfahren im DFS-Baum gehen. Fur diese gilt d[u] > d[v ] und f [u] < f [v ]. 3. Die Querkanten, das heit Kanten, die weder Vorwartskanten noch Ruckwartskanten sind. Fur sie gilt d[u]; f [u] < d[v ]; f [v ] oder d[u]; f [u] > d[v ]; f [v ]. O enbar gilt: Gibt es keine Ruckwartskanten, so ist der Graph kreisfrei. Also werden alle Ruckwartskanten vorubergehend umgedreht, und man erhalt einen kreisfreien Graph. Auf diesem Graph lat man nun den Algorithmus laufen, fuhrt die zuvor geloschten Schleifen wieder ein und zeichnet dann die gedrehten Kanten wieder in ihrer ursprunglichen Orientierung.

4.6 Beispiele Die hier abgebildeten Darstellungen von Graphen sind direkt vom RELVIEWSystem gezeichnet worden. Anhand dieser Bespiele werden wir sehen, da man 27

im allgemeinen uber diesen Algorithmus zwei Aussagen tre en kann. Zum Einen ist er sehr gut geeignet, Graphen gut lesbar darzustellen, auch wenn sie relativ komplex sind. Zum Anderen konnen aber in Einzelfallen recht einfache Graphen auch wesentlich knapper dargestellt werden, als dieser Algorithmus es tut, ohne da dabei die Lesbarkeit beeintrachtigt wird. 1

5

3

10

8

2

4

6

9

7

11

Abbildung 4.12: Beispiel 1 Der in Abb. 4.12 dargestellte Graph ist sehr ubersichtlich und gut lesbar gezeichnet. Fur diesen Fall ist der Algorithmus also gut geeignet.

28

1

2

3

7

6

5

4

9

8

10

Abbildung 4.13: Beispiel 2 In Abb. 4.13 sehen wir einen Graphen, der etwas komplexer ist. Aber auch dieses Bild ist ziemlich ubersichtlich (vergleiche hierzu Abb. 6.5 und Abb. 7.5) 29

1

2

3

4

5

6

7

8

9

Abbildung 4.14: Beispiel 3 Der Graph aus Abb. 4.14 konnte allerdings besser gezeichnet werden. Es ware hier besser, den Graph nicht in Schichten zu zeichnen, da hierdurch die Kanten, die von Knoten 1 ausgehen, unotig lang werden. Eine bessere Moglichkeit ware zum Beispiel, die Knoten 2{9 auf einem Kreis um Knoten 1 zu plazieren (vgl. hierzu Abb. 7.2).

30

Kapitel 5

Zeichnen von Baumen 5.1 Einfuhrung Der in diesem Kapitel beschriebene Algorithmus stammt aus einer Arbeit von Wetherell und Shannon [11]. Die Darstellung des Algorithmus wird so aussehen, da zunachst ein naiver Algorithmus prasentiert wird, der noch nicht besonders schone Bilder liefert, und ausgehend von diesem ein Algorithmus zum schonen Zeichnen von Baumen entwickelt wird. Die Kriterien, die hier angewandt werden, um zu beurteilen, wann ein Baum schon ist, werden in der jeweiligen Phase, das heit, wenn der Algorithmus dieses Kriterium erfullt, genauer erwahnt. Es seien hier nur einige Punkte erwahnt, die einen schonen Baum ausmachen und wohl auf allgemeine Zustimmung tre en.  Baume sind planare Graphen, also sollten Kanten sich nicht schneiden.  Im Baum hat jeder Knoten eine bestimmte Entfernung von der Wurzel. Diese sollte auch im Bild zum Ausdruck kommen, das heit, kein Knoten soll dichter an der Wurzel liegen als einer seiner Nachfolger.  In einem Binarbaum soll der linke Sohn links und der rechte Sohn rechts vom Vater liegen. Wie gro in der Darstellung eines Baumes die Knoten sein sollen, wird hier nicht betrachtet. Um die Knoten zu trennen, wird bei der Vergabe von Positionen auf einer Schicht zwischen zwei Knoten mindestens ein Platz frei gelassen. Die Ausgabe des Algorithmus ist dann eine Angabe der relativen Positionen der Knoten zueinander, deren absolute Werte nach Belieben variiert werden konnen.

5.2 Ein naiver Baumzeichenalgorithmus Fur diesen ersten Algorithmus haben wir zwei asthetische Kriterien, die das Bild erfullen soll. A1: Die Knoten des Baumes, die dieselbe Entfernung von der Wurzel haben, sollen alle auf einer geraden Linie liegen, und alle solchen Linien sollen parallel verlaufen. 31

1. procedure naive tree() 2. begin 3. for i = 0 to max height do 4. next x[i] = 1; 5. root.status = 0; 6. current = root; 7. while current 6= nil do 8. if current.status = 0 then 9. current.x = next x[current.height]; 10. next x[current.height] = next x[current.height] + 2; 11. for v ist Sohn von current do 12. v.status = 0; 13. current.status = 1; 14. elseif 1  current.status  current.] of sons then 15. current.status = current.status + 1; 16. current = current.son[current.status{1]; 17. else ( current.status > current.] of sons ) 18. current = Vater von current; 19. end

Abbildung 5.1: Naiver Baumzeichenalgorithmus A2: Das Bild eines Baumes soll so wenig Platz wie moglich verbrauchen, das heit, die Breite soll moglichst gering sein (Die Hohe des Baumes ist ja durch den Baum selber festgelegt). Die Hohe eines Knotens bestimmt seine Y-Koordinate. Die Hohe des Baumes wird gebraucht, um Speicherplatz fur Hilfsfelder zu reservieren. Also ist das erste, was man tun mu, die Bestimmung der Hohe der Knoten, was durch irgendeine Durchlaufstrategie, bei der Vater vor ihren Sohnen besucht werden, erledigt werden kann. Die einfachste Art, die Kriterien A1 und A2 zu erfullen, ist, die Knoten in jeder Schicht so weit wie moglich links zu plazieren. In Abb.

x x x x x

@ @ @H @ @HH @ @ H @ @ HHH @HH @ @ H @ @ HH @ @ @ @ @ @ @

x x x x x x x x x x x x x

Abbildung 5.2: Baum gemalt mit naivem Algorithmus 32

1. procedure binary tree() 2. begin 3. next number = 1; 4. root.status = rst visit; 5. current = root; 6. while current = 6 nil do 7. case current.status of 8. rst visit: begin 9. current.status = left visit; 10. if current hat linken Sohn then 11. current = linker Sohn von current; 12. current.status = rst visit; 13. endif 14. end 15. left visit: begin 16. current.x = next number; 17. next number = next number +1; 18. current.status = right visit; 19. if current hat rechten Sohn then 20. current = rechter Sohn von current; 21. current.status = rst visit; 22. endif 23. end 24. right visit: current = Vater von current; 25. endcase 26. end

Abbildung 5.3: Knuths Algorithmus 5.2 ist ein Baum zu sehen, der mit diesem Algorithmus gezeichnet wurde. Abb.5.1 zeigt diesen ersten Algorithmus: 3{5: Das Feld next x wird initialisert, root.status wird auf Null und current gleich root gesetzt. current ist der Knoten, der gerade besucht wird, und next x[i] gibt die n achste freie Position fur Knoten der Hohe i an. Der Status eines Knotens sagt aus, ob er selbst und wieviele seiner Sohne schon besucht wurden. 9{13: Dem aktuellen Knoten wird die nachste freie Position auf seiner Hohe zugewiesen, und der entsprechende Eintrag im Feld next x wird um 2 erhoht (um 2, damit zwischen zwei Knoten immer ein Platz frei bleibt). Der Status der Sohne von current wird auf 0 gesetzt und der Status von current selbst auf 1, was bedeutet, da er schon besucht wurde. 33

u

A  A   A @ A  @ A  @ AP PP A PP  A PP PP  A

u

u

u

u

u u

u

A  A A  A A A  A A A  A A A  A A A     A  A A  A  A A 

u u u u u u u u u u uA u uA AAu u u u AAu u u

Abbildung 5.4: Zwei Bilder von einem Baum und zwar links von Knuths Algorithmus und rechts eine bessere Version 15{16:

wird um 1 erhoht, und im folgenden Durchlauf durch die while{Schleife wird der nachste Sohn von current besucht. 18: Alle Sohne wurden besucht, und current wird gleich Vater von current gesetzt (wobei der Vater von root als nil de niert ist). current.status

5.3 Knuths Algorithmus Wie in Abb. 5.2 zu sehen, ist es bei diesem Algorithmus moglich, da Vater links, rechts oder zentriert uber ihren Sohnen gezeichnet werden. Um einen beseren Algorithmus zu nden, betrachten wir zunachst nur Binarbaume. Fur diese wollen wir das folgende Kriterium erfullt haben: A3: In einem Binarbaum sollen linke Sohne stets links und rechte Sohne stets rechts von ihren Vatern liegen. Der Algorithmus von Knuth [9] in Abb. 5.3 stellt Binarbaume so dar, da sie A1 und A3 erfullen: 9{12: Der Knoten current wird hier zum ersten Mal besucht. Falls vorhanden, wird der linke Sohn besucht, und der Status wird entsprechend gesetzt. 16{21: Der linke Sohn wurde bereits besucht, und current erhalt nun die nachste freie Nummer als X-Koordinate. Danach wird next number um eins hochgezahlt und der rechte Sohn besucht, falls vorhanden. 24: Beide Sohne wurden besucht, und es geht beim Vater von current weiter. Den Knoten wird dort als X-Koordinate also ihr Index in einer In-OrderNumerierung zugewiesen. Dadurch sind zwar linke Sohne immer links und rechte Sohne immer rechts von ihren Vatern plaziert, aber dadurch, da in jeder Spalte nur ein Knoten liegen kann, konnen Bilder entstehen, die sehr viel mehr Platz als notig verbrauchen (siehe Abb. 5.4), das heit, A2 wird durch Knuths Algorithmus verletzt. 34

1. procedure tidy tree() 2. begin 3. for i = 0 to max height do 4. modi er[i] = 0; 5. next pos[i] = 1; 6. endfor; 7. rst pass(); 8. modifying pass(); 9. end

Abbildung 5.5: Algorithmus von Wetherell und Shannon

5.4 Der Algorithmus von Wetherell und Shannon Die beiden bisher vorgestellten Algorithmen haben den Nachteil, da sie jeweils nur eines der beiden Kriterien A2 und A3 beachten und das andere vollkommen vernachlassigen. Der naive Algorithmus plaziert die Knoten, ohne dabei die Positionen der Sohne zu beachten, und Knuths Algorithmus benutzt fur jeden Knoten eine eigene Spalte, so da in dieser Spalte keine anderen Knoten mehr plaziert werden konnen, wodurch es zu einem zu groen Platzverbrauch kommt. Der folgende Algorithmus verbindet nun die Ideen der beiden Vorherigen. Abb. 5.5 zeigt den groben Aufbau des Algorithmus von Wetherell und Shannon. Es nden hier zwei Durchlaufe statt. Im Ersten wird den Knoten in einer Post-Order Durchlaufstrategie das Maximum der Position place und der nachsten freien Position in der entsprechenden Schicht zugewiesen. Dabei ist place die Position, die der Knoten haben sollte, um zwischen seinen S ohnen zu liegen. Liegt place zu weit links, das heit, liegen die Sohne so, da sie den Vater zu weit nach links ziehen, so mussen sie (und damit naturlich auch alle ihre Nachfolger) entsprechend nach rechts verschoben werden. Dazu wird in diesem Durchlauf zusatzlich ein Feld modifier angelegt, in dem fur jeden Knoten gespeichert wird, wie weit seine Sohne verschoben werden mussen. Dabei mu man dafur sorgen, da der Modi er in einer Schicht von rechts nach links nie kleiner werden darf. Deshalb merkt man sich fur jede Schicht auch den gerade aktuellen Modi er. Im zweiten Durchlauf werden (in einer Pre-Order Durchlaufstrategie) die Knoten entsprechend der Summe der Modi er aller ihrer Vorfahren nach rechts verschoben. Abb. 5.6 zeigt den ersten Durchlauf durch den Baum, bei dem den Knoten vorlau ge Positionen zugewiesen werden: 7{12: Den Sohnen wird vor dem Vater eine Position zugewiesen, damit der Vater spater zwischen seine Sohne plaziert werden kann. 15: Die Variable place ist abhangig von der Position der Sohne. Ist current ein Blatt, so ist place die nachste freie Position in Schicht current.height. Hat current zwei Sohne, so ist place der Durchschnitt ihrer beiden Positionen. Hat current nur einen Sohn, so ist place um eins groer bzw. 35

1. procedure rst pass() 2. begin 3. current = root; 4. current.status = rst visit; 5. while current 6= nil do 6. case current.status of 7. rst visit: 8. Setze current.status = left visit und 9. besuche linken Sohn, falls vorhanden; 10. left visit: 11. Setze current.status = right visit und 12. besuche rechten Sohn, falls vorhanden; 13. right visit: 14. h = current.height; 15. Finde place; 16. modi er[h] = max(modi er[h],next pos[h]-place); 17. if current ist Blatt then 18. current.x = place; 19. else 20. currrent.x = place + modi er[h]; 21. next pos[h] = current.x + 2; 22. current.modi er = modi er[h]; 23. current = Vater von current; 24. end; 25. endcase; 26. end

Abbildung 5.6: Erster Durchlauf

16: 18: 20: 21{23:

kleiner als die Position seines Sohnes, je nachdem, ob es ein linker oder ein rechter Sohn ist. Da der Modi er innerhalb einer Schicht nicht kleiner werden darf, wird modifier[h] als das Maximum vom alten Modi er und dem Abstand von place zu next pos[h] gesetzt. Ist current ein Blatt, so bekommt er einfach die nachste freie Position in der Schicht (falls current Blatt ist, wird place namlich gerade so gewahlt). current wird soweit nach rechts verschoben, da seine Nachfolger nicht mit Nachfolgern von Knoten, die links von ihm liegen, kollidieren. next pos[h] wird aktualisiert, current.modifier wird der aktuelle Modi er der Schicht zugewiesen und danach geht es beim Vater von current 36

1. procedure modifying pass() 2. begin 3. current = root; 4. current.status = rst visit; 5. modi er sum = 0; 6. while current 6= nil do 7. case current.status of 8. rst visit: 9. current.x = current.x + modi er sum; 10. modi er sum = modi er sum + current.modi er; 11. Setze current.status = left visit und besuche linken Sohn; 12. left visit: 13. Setze current.status = right visit und besuche rechten Sohn; 14. right visit: 15. modi er sum = modi er sum - current.modi er; 16. current = Vater von current; 17. endcase; 18. end

Abbildung 5.7: Zweiter Durchlauf weiter. Der zweite Durchlauf ist in Abb. 5.7 dargestellt: 5: modifier sum ist die Summe der Modi er aller Vorfahren des gerade besuchten Knotens, und wird zu Beginn auf Null gesetzt. 9{11: Die X-Position von current wird entsprechend der Summe der Modi er seiner Vorfahren heraufgesetzt, modifier sum wird aktualisiert und der linke Sohn besucht. 15{16: Beide Sohne wurden besucht, und es geht beim Vater weiter. modifier sum wird entsprechend aktualisiert. In Abb. 5.8 wird anhand eines Beispielbaumes verdeutlicht, wie die einzelnen Phasen des Algorithmus funktionieren. Dieser Beispielbaum ist gema der Forderungen A1, A2 und A3 gut gezeichnet, es kann jedoch bei einigen Baumen vorkommen, da Algorithmus WS Bilder liefert, die mehr Platz brauchen als notig ware, um sie A1, A2 und A3 entsprechend zu zeichnen (siehe Abb. 5.9). Das heit, Algorithmus WS verletzt Forderung A2. Dies ist darauf zuruckzufuhren, da er das folgende Kriterium erfullt, das eine Verscharfung von A3 ist. A4: Ein Vater soll uber seinen Sohnen zentriert sein. Fordert man Kriterium A4, so sind die Bilder von Algorithmus WS bezuglich der Breite minimal (beachte, da die schmalere Version in Abb. 5.9 Kriterium A4 37

w

3 0>

< ;

@

w@ 2 0 @@@w 4 0 w 1 0 @@@w 3 1 @@@w 5 1 w 1 0 @@w 3 0 @@w w 30 @ w@ 2 0 @@w w 1 0 @@w 3 0 < ;

< ;

>

< ;

>

>

< ;

>

< ;

>

< ;

>

< ;

>

< ;

< ;

>

< ;

>

< ;

>

< ;

>

< ;

w 5 1> 4 0>

X-Koord. und Modi er nach 1. Durchlauf

wx=3

@ x=2 @@ x=4 @ @ @ x=1 @ x=3 @@ x=5 @ @ x=2 @@ x=4 @@

w

w

w

wx=3

w

w

w

wx=4 @

wx=5

@

wx=6

wx=6

@ @

wx=5

@ @

Endgultige X-Koordinaten

Abbildung 5.8: Beispiel fur Algorithmus WS verletzt). Wetherell und Shannon geben eine Moglichkeit an, den Algorithmus so zu modi zieren, da er Bilder liefert, die Kriterium A2 erfullen (Kriterium A4 dann naturlich nicht mehr). Diese Modi kation wollen wir hier aber nicht weiter verfolgen. Statt dessen betrachten wir die von ihnen nur skizzierte Moglichkeit, den Algorithmus auf beliebige Baume (im Gegensatz zu den bisher betrachteten Binarbaumen) zu verallgemeinern. Dazu mu im ersten Durchlauf die case-Anweisung so verandert werden, da nicht nur zwei Sohne eines Knotens besucht werden, bevor man zum Vater zuruckkehrt, sondern alle vorhandenen. Dies erreicht man dadurch, da man mitzahlt, wieviele Sohne schon besucht wurden, und diese Zahl mit der Anzahl der Sohne vergleicht. Auerdem mu die Position place anders gewahlt werden, und zwar wird hier statt des Mittelwertes der Positionen der beiden Sohne bzw. der Position des einen Sohnes um eins erhoht oder vermindert, stets der Mittelwert der Positionen aller Sohne genommen (Dieser mu dann naturlich nicht unbedingt ein ganzzahliger Wert sein, man wahlt in dem Fall die nachstkleinere ganze Zahl). Im zweiten Durchlauf ist das einzige, was geandert werden mu, das case-Statement. Genau wie im ersten Durchlauf wird es so modi ziert, da nicht nur zwei sondern mehrere Sohne eines Knotens besucht werden konnen. Dieser Algorithmus ist eine Kompromilosung, die den Kriterien A2 (minimaler Platzverbrauch) und A4 (Vater zentriert uber Sohnen) recht nahekommt. A4 wird nicht ganz erfullt, da es jetzt sein kann, da der Durchschnitt der Positionen zweier Sohne nicht ganzzahlig ist. Dies ist aber insofern nicht so tragisch, als da man es nun ja mit Baumen zu tun hat, deren Knoten auch mehr als zwei Sohne haben konnen, und es ohnehin nicht klar ist, wann man einen Vater von mehreren Sohnen als zentriert ansehen will. Auch der Platzbedarf ist nicht minimal, jedoch geringer als beim Algorithmus WS, da jetzt linke und rechte Sohne nicht mehr unterschieden werden, und somit ein Sohn direkt unter seinem Vater gezeichnet werden kann, wenn er der Einzige ist (siehe Abb. 5.10).

38

y

y@

@

@ @ @

y

@

y@

@ @ @

y@

@ @ y y @   @    @  @y y @ @ @ @y @ @ @ @y @ @ @ @y

@ @ @

y

y

@ @ @ @

y

@ @

@ @

y

Baum mit Alg. WS

Schmalere Version

Abbildung 5.9: Beispiel fur einen Baum, der von Algorithmus WS breiter als notig gezeichnet wird

y

@ @

y

y y y y

@ @

y

@ @

y

@ @

Abbildung 5.10: Der Baum aus Abb. 5.9, gezeichnet mit dem modi zierten Algorithmus WS

5.5 Beispiele In diesem Abschnitt werden zwei Beispielbilder prasentiert, die direkt mit RELVIEW gezeichnet wurden. Diese Beispiele zeigen, da der Algorithmus zwar gute Bilder erzeugen kann, er jedoch in manchen Fallen auch seine Nachteile hat (ahnlich wie beim Algorithmus aus Kapitel 4).

39

1

2

3

4

8

5

9

10

6

11

7

12

13

14

15

Abbildung 5.11: Beispiel 1 In Abb. 5.11 ist ein vollsandiger binarer Baum dargestellt, der so gezeichnet wird, wie man es erwartet. 1

2

3

4

5

6

7

8

9

11

10

12

13

14

Abbildung 5.12: Beispiel 2 In Abb. 5.12 sehen wir einen Baum, der einen Nachteil des Algorithmus aufzeigt. Man konnte den Baum namlich schmaler zeichnen, wenn man die Reihenfolge der Knoten in den einzelnen Schichten andern wurde. Dies ware moglich, da die Reihenfolge der Knoten keinerlei Informationsgehalt hat, denn es kommt bei den Graphen im RELVIEW-System nur darauf an, welche Knoten durch eine Kante verbunden sind. Da die Knoten in den einzelnen Schichten gerade so angeordnet sind, liegt naturlich daran, da der Algorithmus so implementiert ist, da er die Knoten in der Reihenfolge ihrer Numerierung bearbeitet. Im Groen und Ganzen kann man aber sagen, da der Algorithmus Baume doch sehr schon zeichnet. 40

Kapitel 6

Der Algorithmus KK 6.1 Einfuhrung Dieser Algorithmus von T. Kamada und S. Kawai ist ursprunglich fur ungerichtete Graphen entwickelt worden [16]. Er wird hier auf gerichtete Graphen angewandt, indem man einfach die Richtung der Kanten vergit, den Algorithmus auf den entstehenden ungerichteten Graphen anwendet, und dann die Kanten in ihrer ursprunglichen Orientierung zeichnet. Auerdem ist der Algorithmus nur auf zusammenhangende Graphen anwendbar. Will man nicht zusammenhangende Graphen zeichnen, so mussen die einzelnen Komponenten getrennt behandelt werden. Die grundlegende Idee des Algorithmus ist, da man die minimale Lange eines Pfades zwischen zwei Knoten als den gewunschten Abstand zwischen ihnen im Bild des Graphen ansieht. Dazu stellt man sich alle Paare von Knoten durch eine Feder der entsprechenden Lange verbunden vor, und sieht dann das Bild des Graphen als optimal an, in dem die Gesamtenergie dieses dynamischen Systems von Federn am geringsten ist. Die Idee, Graphen zu zeichnen, indem man Kanten durch Federn ersetzt, wurde zuerst von Eades in [12] vorgestellt. Kanten werden hier als gerade Linien gezeichnet, es geht bei diesem Algorithmus also nur darum, die Positionen der Knoten festzulegen. Das asthetische Kriterium, aufgrund dessen dieser Algorithmus entwickelt wurde, ist die globale Ausgewogenheit des Bildes, das heit, die Knoten und Kanten sollen moglichst gleichmaig verteilt sein. Es gilt nun also eine Moglichkeit zu nden, wie die globale Ausgewogenheit beurteilt werden soll. Das geschieht hier durch die Berechnung der Summe der Quadrate der Di erenz von gewunschtem Abstand und tatsachlichem Abstand zwischen allen Knotenpaaren.

6.2 Das Federmodell Wir fuhren ein dynamisches System ein, in dem n (= jV j) Punkte durch Federn verbunden sind. Seien p1; p2; : : :; pn die Punkte in der Ebene, die den Knoten v1; v2; : : :; vn 2 V entsprechen. Wir betrachten nun ein Bild des Graphen als ausgeglichen, wenn das entsprechende System von Federn ausgeglichen ist. Das Ma an Unausgewogenheit beschreiben wir als die gesamte Energie der Federn, 41

das heit,

nX1 X n

1 k (jp p j l )2: (6.1) ij i j ij i=1 j =i+1 2 Ausgewogene Bilder erhalt man also, wenn man die Energie E moglichst weit vermindert, und das Beste ist dasjenige, das einer Minimierung der Energie in unserem Modell entspricht. Die Originallange lij der Feder zwischen vi und vj entspricht dem gewunschten Abstand zwischen ihnen im Bild, und wird folgendermaen bestimmt. Der Abstand dij zwischen zwei Knoten vi und vj ist de niert als die Lange eines minimalen Pfades zwischen vi und vj . Die Lange lij ist dann de niert als lij = L  dij ; (6.2) wobei L die gewunschte Lange einer Kante in der Darstellung des Graphen ist. Ist der Platz fur das Bild des Graphen beschrankt, so kann man L abhangig von dem groten Abstand zwischen zwei Knoten wahlen, namlich

E=

L = L0 = max d ; i 

begin

Sei pm der Punkt mit m = maxi i; while m > 

begin

berechne x und y durch Losen von (11) und (12); xm = xm + x; ym = ym + y;

end end

Abbildung 6.1: Algorithmus KK den Ausgangspositionen abhangt. Ein e ektives Mittel um die Laufzeit zu reduzieren, ist auf jeden Fall, die Schranke  in der Abbruchbedingung der beiden while-Schleifen zu vergroern, womit man naturlich eine Verschlechterung der Qualitat der Bilder in Kauf nehmen mu.

6.5 Beispiele Wir wollen hier einige Beipielgraphen betrachten, fur die der Algorithmus KK gute Bilder liefert, andere, fur die er nur sehr unbefriedigende Bilder liefert, und auch solche, bei denen das Bild kleine aber au allige Mangel aufweist. Die folgenden Bilder wurden wiederum von RELVIEW erzeugt. 3

10

8

5

7

11 2

9

1 14

6 12 4 13

Abbildung 6.2: Beispiel 1 Abb. 6.2 zeigt, da der Algorithmus nicht immer optimale Bilder liefert. Knoten Nr. 5 ist hier sicherlich schlecht plaziert. Auerdem wurde man sich vielleicht wunschen, da die Zusammenhangskomponenten nicht nebeneinander gezeichnet sondern besser auf das gesamte Bild verteilt werden (vergleiche hierzu Abb. 45

7.4). Welche Moglichkeit man vorzieht, ist naturlich eine Frage des Geschmacks. 4

7

9

3

10 6

8

2

5

1

Abbildung 6.2: Beispiel 2 Der Graph aus Abb. 6.3 ist sicherlich so gezeichnet, wie man sich es wunschen wurde. 7

10

6

5 8 9

3 4

1 2

Abbildung 6.4: Beispiel 3 Auch Abb. 6.4 zeigt wieder ein vernunftiges Bild.

46

1 7

2

3 6 4

8

5

10 9

Abbildung 6.5: Beispiel 4 In Abb. 6.5 sehen wir nun einen Graphen, der relativ viele Kanten hat. Dieser Graph wird schon ziemlich unubersichtlich gezeichnet. Da es besser geht, konnen wir in Abb. 4.13 sehen, wo derselbe Graph dargestellt ist. Zum Algorithmus KK lat sich allgemein sagen, da er fur Graphen, die nicht sehr komplex sind, das heit, die wenig Kanten haben, ganz brauchbare Bilder macht. Der Vorteil von Algorithmus KK ist, da er sehr kompakte Bilder macht, was aber bei etwas komplexeren Graphen sehr schnell dazu fuhrt, da sie unubersichtlich dargestellt werden.

47

Kapitel 7

Der Algorithmus FR 7.1 Einfuhrung Auch dieser Algorithmus, der von Thomas M. J. Fruchterman und Edward M. Reingold entwickelt wurde [18], ist, wie auch der Algorithmus von Kamada und Kawai, ursprunglich fur ungerichtete Graphen konzipiert worden, wird bei uns aber auf gerichtete Graphen angewandt, indem man vorubergehend die Orientierung der Kanten unbeachtet lat. Dieser Algorithmus ist eine Modi kation von Eades' Algorithmus [12]. Also wird auch hier wieder ein physikalisches Modell herangezogen, um eine Positionierung der Knoten zu bekommen. Und auch bei diesem Algorithmus ist es wieder das Ziel, ein moglichst ausgeglichenes Bild zu erhalten, das heit die Kanten sollen gleich lang und die Knoten gleichmaig verteilt sein. Genau verfolgen wir hier folgende Ziele: 1. Knoten, die durch eine Kante verbunden sind, sollen dicht beieinander liegen. 2. Knoten sollen nicht zu dicht beieinander liegen. Wie dicht Knoten nun genau zusammen liegen sollen, hangt davon ab, wieviel Zeichen ache vorhanden ist, und wieviele Knoten der Graph hat. Wie wir bereits gesehen haben, lassen sich manche Graphen aufgrund ihrer Struktur uberhaupt nicht schon darstellen. Die groben Richtlinien, nach denen der Algorithmus laufen soll, sind an Erkenntnisse der Atomphysik angelehnt: Bei einer Entfernung von etwa 1 fm (fm = femto-meter) wirkt die starke Kernkraft anziehend, und ist ungefahr zehnmal so stark wie die elektrische Kraft zwischen zwei Protonen. Die Kraft nimmt mit zunehmender Entfernung sehr schnell ab und ist bei etwa dem 15fachen dieser Entfernung vollig vernachlassigbar. Bei einer Entfernung von ungefahr 0.4 fm wirken die starken Kernkrafte abstoend, so da die Elementarteilchen nicht kollabieren. Betrachten wir nun die folgende Analogie: wir sehen die Knoten als Elementarteilchen an, die abstoende und anziehende Krafte aufeinander ausuben, und 48

so Bewegungen der Knoten hervorrufen. Der Algorithmus ahnelt so einer Simulation von Molekulen oder Planetensystemen. Naturlich ist es nicht notwendig, da wir eine exakt der Natur entsprechende Simulation durchfuhren. Wir konnen uns die Freiheit nehmen, unrealistische Krafte auf unrealistische Art und Weise anzuwenden, wie es bereits Eades in seiner Arbeit getan hat. Wie auch Eades, betrachten wir Anziehungskrafte nur zwischen Knoten, die durch eine Kante verbunden sind, Abstoungskrafte jedoch zwischen allen Knoten. Dies ist auch konsistent mit der Asymmetrie der obigen Richtlinien. Erwahnenswert ist noch die folgende Diskrepanz zwischen den naturlichen Systemen wie die durch Kernkrafte zwischen Elementarteilchen entstehen, die die Inspiration zu diesem Algorithmus geliefert haben, und der Art, wie diese Systeme hier simuliert werden. Hier werden Krafte benutzt, um Geschwindigkeiten und damit ein Displacement zu berechnen. In der Natur dagegen induzieren Krafte Beschleunigung, was dazu fuhrt, da sich dynamische Gleichgewichte herausbilden, wir suchen jedoch nach statischen Gleichgewichten.

7.2 Der Algorithmus Der Algorithmus lauft uber eine vorgegebene Anzahl von Iterationen, die man experimentell ermittelt (in der aktuellen Implementierung im RELVIEW-System sind es 50). Jede Iteration besteht aus drei Schritten.  Die Berechnung der Wirkung der Anziehungskrafte auf jeden Knoten,  die Berechnung der Wirkung der Abstoungskrafte auf jeden Knoten und  die Begrenzung des Displacements bezuglich der Temperatur und der Zeichen ache. Ein spezieller Fall tritt auf, wenn zwei Knoten die gleiche Position haben. Dann werden die Knoten so behandelt, als ob sie ein klein wenig voneinander entfernt waren, was zu einem sehr starken Abstoungse ekt fuhrt, wodurch die Knoten voneinander getrennt werden. Ein zentraler Begri des Algorithmus ist die Temperatur. Die Idee hierbei ist, da die Knoten zu Beginn eine groe Bewegungsfreiheit haben, die dann im Verlauf des Algorithmus abnimmt. Genauer wird das Displacement der Knoten in jeder Iteration auf einen bestimmten maximalen Wert beschrankt, und diesen Wert verringert man dann im Laufe der Zeit. So wird das Ausma der Korrekturen immer feiner, je besser das Bild wird. Als Beispiel konnte man die Temperatur mit einem beliebigen Wert initialisieren, und sie dann linear bis auf Null sinken lassen. Wir werden spater noch bessere Methoden hierzu kennenlernen. Die Begrenzung des Displacements bezuglich der Zeichen ache bedeutet, da man es nicht zulat, da Knoten Positionen zugewiesen werden, die uber den Rand der Zeichen ache hinaus gehen. Dieser Punkt kann entfallen, wenn entweder die Zeichen ache nicht beschrankt ist oder wenn man nach Durchfuhrung des Algorithmus das Bild so verkleinert, da es auf die Zeichen ache pat. Meiner Meinung nach erhalt man mit letzterer Methode bessere Bilder. 49

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.

area = width  length; assign initial positions; p k = area=jVj function fa(x) = begin return x2=k end; function fr(x) = begin return k2=x end; for i = 1 to iterations do begin for v in V do begin v.disp = 0; for u in V do if u 6= v then begin  = v.pos u.pos; v.disp = v.disp + (=jj)  fr(jj)

end

end for e in E do begin

 = e.v.pos e.u.pos; e.v.disp = e.v.disp (=jj)  fa(jj); e.u.disp = e.u.disp +(=jj)  fa(jj);

end for v in V do begin

v.pos = v.pos + (v.disp/jv.dispj)  min(v.disp,t); v.pos.x = min(width/2,max( width/2,v.pos.x)); v.pos.y = min(length/2,max( length/2,v.pos.y));

end

t = cool(t);

end

Abbildung 7.1: Der Algorithmus von Fruchterman und Reingold Der Algorithmus ist in Abb. 7.1 dargestellt: 1{3: Die Variablen area und k werden initialisiert. Dabei sind width und length die L ange bzw. die Breite der Zeichen ache. k ist dann der Radius der leeren Flache um jeden Knoten, wenn die Knoten gleichformig auf der Zeichen ache verteilt sind. Weiter werden den Knoten hier initiale Positionen zugewiesen. Dies kann auf vielfaltige Art und Weise geschehen. Wir verteilen die Knoten einfach moglichst gleichmaig. Denkbar ware zum Beispiel auch, die Knoten auf die Ecken eines regelmaigen n-Ecks zu plazieren, oder sie zufallig auf der Zeichen ache zu verteilen. 4{5: Die Funktionen, die die Abstoungskrafte bestimmen, werden hier de niert. 50

6{26: In jeder Iteration werden die drei Schritte Berechnung der Abstoungskrafte, Berechnung der Anziehungskrafte und Begrenzung bezuglich Temperatur ausgefuhrt. 8{13: Hier werden die Abstoungskrafte, die von allen anderen Knoten auf v wirken, bzw. die daraus resultierenden Displacements aufsummiert. 15{19: Die Anziehungskrafte zwischen benachbarten Knoten bzw. die daraus resultierenden Displacements werden berechnet und auf das disp-Feld der entsprechenden Knoten aufaddiert (eine Kante ist ein geordnetes Paar von Knoten .u und .v). 21: Das Displacement wird auf die aktuelle Temperatur t begrenzt, und die Knoten werden auf ihre neuen Positionen gesetzt. 22{23: Es kann sein, da die Positionen der Knoten nun auerhalb der Zeichen ache liegen. Dies wird hier wieder ruckgangig gemacht, das heit, die Knoten werden auf den Punkt auf dem Rand der Zeichen ache gesetzt, der ihrer jetzigen Position am nachsten ist. Diese Begrenzung auf die Zeichen ache kann unter gewissen Vorraussetzungen auch weggelassen werden. 25: Die Temperatur t wird durch die Funktion cool fur die nachste Iteration neu bestimmt. Wie man die Funktion cool wahlen kann, wird noch gesondert beschrieben. Wir wollen noch kurz die Komplexitat des Algorithmus betrachten. Jede Iteration braucht Zeit O(jV j2 + jE j). Die Frage ist, wie viele Iterationen notig sind, um einen Graphen schon darzustellen. Die Situation ist hier ahnlich wie bei dem Algorithmus von Kamada und Kawai, bei dem man schlecht abschatzen konnte, wie lange er lauft. Deshalb lat sich die hier benutzte feste Anzahl von 50 Iterationen auch kaum theoretisch rechtfertigen. Wir konnen nur feststellen, da sich in der Praxis gezeigt hat, da diese Anzahl auch fur komplexere Graphen vernunftige Ergebnisse liefert. Fur kleinere Graphen ist die Zahl 50 vielleicht etwas uberdimensioniert, aber da die Iterationen bei kleinen Graphen ohnehin sehr wenig Zeit in Anspruch nehmen, ist es nicht schlimm, wenn man ein paar Iterationen mehr als notig durchfuhrt.

7.3 Wahl der Funktionen f , f und cool a

r

Wir wollen zunachst noch einmal die Wahl der Funktionen, die die Abstoungsund Anziehungskrafte modellieren, betrachten. Wir berechnen k, die optimale Entfernung zweier benachbarter Knoten als   area k = sqrt number of vertices Die Idee ist, da die Knoten gleichmaig verteilt werden und k der Radius der leeren Flache um einen Knoten ist. Intuitiv wird man sagen, je weiter zwei 51

Knoten auseinander liegen bzw. je dichter sie zusammen liegen, desto weniger kann man das aktuelle Bild akzeptieren und desto starker mu die Korrektur ausfallen. Bezeichnen wir mit fa und fr die Anziehungs- bzw. die Abstoungskrafte (r wie repulsive) und mit d die Entfernung zwischen zwei Knoten dann de nieren wir wie folgt: fa (d) = d2=k fr (d) = k2=d Dann haben die Funktionen die folgenden Eigenschaften:  Der Betrag von fa(d) wachst sehr schnell, wenn d groer als k ist.  Der Betrag von fr (d) wachst sehr schnell, wenn d kleiner als k ist.  Bei der idealen Entfernung d = k, heben sich die Krafte fa und fr gerade gegenseitig auf. Naturlich gibt es auch andere Moglichkeiten, die Funktionen fa und fr zu de nieren. Fruchterman und Reingold [18] haben zum Beispiel auch mit folgenden Funktionen experimentiert: fa (d) = d=k fr (d) = k=d Diese Funktionen funktionierten jedoch fur etwas komplexere Graphen sehr schlecht, da es nicht moglich schien, lokale Minima zu uberwinden. Dies hatte zur Folge, da ein Knoten nicht an einem anderen Knoten vorbeibewegt werden konnte, der ihm im Weg war, etwa durch eine schlechte initiale Plazierung. Funktionen mit hoheren Potenzen bringen gegenuber den quadratischen Funktionen auch keine Verbesserungen, sie kosten blo mehr Zeit bei der Berechnung. Die Funktionen, die Eades benutzt hat, waren

fa (d) = ka log d fr (d) = kr =d2

. Die Ergebnisse von Eades waren in etwa die gleichen wie die von Fruchterman und Reingold, jedoch ist die Funktion fa von Eades nicht so ezient zu berechnen. Die Funktion cool verbindet hier zwei Ideen miteinander. Einerseits soll sie so de niert werden, da es moglich ist, lokale Minima zu uberwinden, das heit, es mu moglich sein, in einem Schritt groe Veranderungen vorzunehmen. Andererseits soll sie es ermoglichen, durch Feinabstimmung sehr dicht an einen Status mit minimaler Energie heranzukommen. Man verwirklicht dies, indem man den Algorithmus in zwei Phasen aufteilt. In der Ersten beginnt man mit einer hohen Temperatur, die man dann schnell sinken lat, um so eine Plazierung der Knoten zu nden, die schon relativ gut ist. In der zweiten Phase lat man die Temperatur auf einem konstant niedrigen Wert, um so eine Feinabstimmung zu erreichen. Experimente haben gezeigt, da diese Methode deutlich bessere Bilder produziert, als es bei der Benutzung einer Funktion der Fall ware, die die Temperatur uber den gesamten Verlauf des Algorithmus stetig senkt. 52

7.4 Zeichnen nicht zusammenhangender Graphen Der Algorithmus in der jetzigen Form ist nur fur zusammenhangende Graphen geeignet. Er lat sich zwar auf beliebige Graphen anwenden, jedoch treten bei nicht zusammenhangenden Graphen folgende Probleme auf. Verwendet man den Algorithmus in der Form, die die Zeichen ache von vornherein beschrankt, so werden die einzelnen Komponenten an den Rand gedruckt und in der Mitte bleibt der meiste Platz ungenutzt. Dies kommt daher, da die Knoten aus den verschiedenen Komponenten sich nur gegenseitig abstoen, da es ja keine Kanten zwischen den Komponenten gibt, die Anziehungskrafte hervorrufen wurde. Aus demselben Grund tritt bei der Version, die die Zeichen ache nicht begrenzt, das Problem auf, da die verschiedenen Zusammenhangskomponenten mit jeder Iteration weiter auseinander streben wurden. Diese Schwierigkeiten werden nun folgendermaen uberwunden. Bisher betrachteten wir in der Phase des Algorithmus, in der die Abstoungskrafte berechnet werden, die Wirkung samtlicher anderen Knoten auf einen Knoten v . Nun ist es aber so, da die Kraft fr (d) mit zunehmender Entfernung d sehr schnell abnimmt, also Knoten, die weit entfernt sind, keinen groen Ein u auf den Knoten v haben. Aufgrund dieser Erkenntnis modi zieren Fruchterman und Reingold den Algorithmus so: Die Abstoungskrafte werden nur noch zwischen Knoten berechnet, die nicht weiter als 2k voneinander entfernt sind. Experimente haben gezeigt, da dies auf die Qualitat der Bilder keinen Ein u hat. Der Vorteil ist jedoch, da Komponenten sich nicht mehr gegenseitig abstoen, wenn sie erst einmal einen gewissen Abstand voneinander haben, und der Algorithmus so auch fur nicht zusammenhangende Graphen vernunftige Bilder liefert.

7.5 Beispiele Auch zu diesem Algorithmus wollen wir einige durch RELVIEW erzeugte Beispielgraphen betrachten. 6

7

5 8

1

4 9

3

2

Abbildung 7.2: Beispiel 1 Dieser Graph wird hier besser gezeichnet, als in Abb. 4.14, da die Kanten hier 53

nicht so unnotig lang werden. 1

2

3

4

5

8

7

6

9

10

Abbildung 7.3: Beispiel 2 Der Graph in Abb. 7.3 ist schon dargestellt, ahnlich wie der in Abb. 6.4 vom Algorithmus KK erzeugte. 2 4

1

3 5

9

8

7

6

10

12

11

13 14

Abbildung 7.4: Beispiel 3 54

In Abb. 7.4 sieht man einen Vorteil des Algorithmus FR gegenuber dem Algorithmus KK, namlich da nicht zusammenhangende Graphen nicht erst in ihre Zusammenhangskomponenten zerlegt werden mussen, um sie dann nebeneinander zu zeichnen, sondern da sie in einem Stuck bearbeitet werden konnen (vergleiche hierzu Abb. 6.2). 1

7

4 2

3

8

6

5

9 10

Abbildung 7.5: Beispiel 4 Abb. 7.5 zeigt nun den Graphen, der schon in Abb. 6.5 von KK gezeichnet und in Abb. 4.13 vom Algorithmus von Gansner et al. gezeichnet zu sehen ist. Auch hier ist er wie im Fall von KK sehr unubersichtlich gezeichnet, im Gegensatz zu dem Bild das der Algorithmus von Gansner et al. liefert. Im Allgemeinen gilt fur den Algorithmus FR das Gleiche wie fur den Algorithmus KK. Fur Graphen mit wenig Kanten ist er brauchbar, fur komplexere Graphen nicht unbedingt. Beim Vergleich dieser beiden Algorithmen stellt man fest, da Algorithmus KK meistens die etwas schoneren Bilder macht, jedoch ist der Algorithmus FR um einiges schneller.

55

Kapitel 8

Relationen und RELVIEW 8.1 Relationenalgebra In diesem Abschnitt werden grundlegende Begri e, die beim Arbeiten mit Relationen benotigt werden, eingefuhrt. Zuerst werden die Basisoperationen auf Relationen komponentenweise eingefuhrt. Dann betrachten wir Relationen mit speziellen Eigenschaften und beschaftigen uns mit einigen hoheren Operationen auf Relationen. Hier benutzen wir statt der komponentenweisen Darstellung dann die zuvor eingefuhrten Basisoperationen. Dadurch wird die Lesbarkeit der De nitionen deutlich verbessert. Weiterfuhrende Informationen ndet man in dem Buch von Schmidt und Strohlein [19].

8.1.1 Basisoperationen auf Relationen

Seien X und Y zwei Mengen. Eine Teilmenge R des Kartesischen Produkts X  Y heit dann (heterogene) Relation zwischen X und Y mit Argumentbereich X und Wertebereich Y. Statt R  X  Y schreiben wir auch R : X $ Y und (X $ Y) bezeichnet die Mengen der Relationen zwischen X und Y. Sei x 2 X und y 2 Y. Statt (x; y) 2 R schreiben wir kurz Rxy . Ist X = Y, so heit die Relation R homogen. Sind X und Y endliche Mengen der Machtigkeit m bzw. n, so konnen wir R als Boolesche Matrix mit m Zeilen und n Spalten darstellen. Diese Art der Reprasentation wird neben der Graphdarstellung auch im RELVIEW-System benutzt. Durchschnitt, Vereinigung und Komplement und die dazugehorigen Konstanten konnen wie folgt eingefuhrt werden: Der Durchschnitt R \ S : X $ Y und die Vereinigung R [ S : X $ Y zweier Relationen R; S : X $ Y werden komponentenweise de niert durch die Gleichungen  (R \ S)xy , Rxy ^ Sxy  (R [ S)xu , Rxy _ Sxy . Die Symbole auf der rechten Seite ^ und _ bezeichnen die ubliche Konjunktion bzw. Disjunktion auf den Wahrheitswerten. Das Komplement (oft auch als Negation bezeichnet) R : X $ Y ist komponentenweise de niert durch  Rxy , :Rxy , 56

wobei : die Negation auf den Wahrheitswerten bezeichnet. Fur die Nullrelation O : X $ Y und die Universalrelation L : X $ Y gilt:  0xy , false  Lxy , true Die Menge (X $ Y) bildet mit den Operationen [, \ und eine vollstandige Boolesche Algebra mit L als grotem Element, O als kleinstem Element und mit der Ordnung  (Inklusion), die gegeben ist durch  R  S , 8x 2 X; y 2 Y : Rxy ! Sxy . Als nachstes de nieren wir die Komposition von Relationen und eine zugehorige Konstante. Die Komposition (oft auch als Produkt oder Multiplikation bezeichnet) RS : X $ Z zweier Relationen R : X $ Y und S : Y $ Z ist komponentenweise de niert als  (RS)xz , 9y 2 Y : Rxy ^ Sxy und die identische Relation I : X $ X ist der Gleichheitstest auf X, das heit, die komponentenweise De nition lautet  Ixy , x = y Die Menge (X $ X) bildet mit Komposition und Identischer Relation ein Monoid (das heit, eine Halbgruppe mit neutralem Element). Ferner erhalten wir aus der Existenz des Produkts RS (mit R und S wie oben), da QS fur alle Relationen Q : X $ Y de niert ist. Die letzte der Basisoperationen auf Relationen ist die Transposition. Fur eine Relation R : X $ Y ist die transponierte Relation RT : Y $ X komponentenweise de niert durch  RTxy , Rxy Es ist klar, da die Transposition involutorisch ist, und mit der Komplementbildung kommutiert. Der Zusammenhang zwischen Transposition und den Operationen der Booleschen Algebra und Komposition zeigt sich in der Dedekind Regel (QR \ S)  (Q \ SRT )(R \ QT S); die gilt, wenn alle drei geklammerten Ausdrucke de niert sind.

8.1.2 Spezielle homogene Relationen

Sei R eine homogene Relation. R ist re exiv wenn I  R, transitiv wenn R2  R und antisymmetrisch wenn R \ RT  I. Eine partielle Ordnung ist eine re exive, antisymmetrische und transitive Relation.  Eine andere wichtige Klasse von homogenen Relationen sind Aquivalenzre lationen. Aquivalenzrelationen sind re exiv, transitiv und symmetrisch. Eine Relation R ist symmetrisch, wenn gilt R  RT . 57

8.1.3 Spezielle heterogene Relationen

Eine Relation R heit (partielle) Funktion, wenn RT R  I. Falls gilt RL = L heit R totale Funktion. Eine totale Funktion kann auch charakterisiert werden durch RI = R. Eine Relation R ist injektiv, wenn RT eine partielle Funktion ist (das heit, RRT  I), und surjektiv, wenn RT total ist (das heit, RT L = L). Eine surjektive und injektive Relation heit bijektiv. Die Menge aller Funktionen von einer Menge X in eine Menge Y bezeichnen wir mit (X ! Y).

8.1.4 Relationale Beschreibung von Teilmengen

Eine Relation v : X $ Y mit v = vL heit zeilenkonstant. Solche Relationen konnen als Teilmenge von X, als Pradikate von X oder Vektoren betrachtet werden. Da fur einen Vektor v : X $ Y die Menge Y nicht relevant ist, bezeichnen wir mit V(X) die Menge aller Vektoren mit Argumentbereich X. Ist v : X $ Y ein Vektor, so schreiben wir vx statt vxy fur alle y 2 Y, da vxy1 , vxy2 fur alle y1 ; y2 2 Y. Ein Punkt ist eine Teilmenge, die genau ein Element enthalt. Also ist ein Vektor genau dann ein Punkt, wenn er bijektiv ist: Surjektivitat bedeutet, da der Vektor eine Teilmenge beschreibt, die mindestens ein Element enthalt, und Injektivitat bedeutet, da er eine Teilmenge beschreibt, die hochstens ein Element enthalt. Die Menge aller Punkte wird mit P(X) bezeichnet. Eine Boolesche Matrix reprasentiert genau dann einen Vektor, wenn jede Zeile nur Einsen oder nur Nullen enthalt. Gibt es von den Zeilen, die nur Einsen enthalten genau eine, so stellt die Matrix einen Punkt dar. Neben Vektoren gibt es noch eine zweite Moglichkeit zur Beschreibung von Teilmengen, namlich injektive Abbildungen. Haben wir eine injektive Abbildung i : Y ! X, so nennen wir Y die durch i gegebene Teilmenge. Ist Y eine durch i gegebene Teilmenge von X, so beschreibt der Vektor iT L : X $ 1 die Teilmenge Y im obigen Sinne (1 steht hier fur eine einelementige Menge). Umgekehrt kann man auch eine injektive Abbildung aus einem gegebenen Vektor konstruieren.

8.1.5 Hullen

Sei R eine homogene Relation. Die kleinste re exive (symmetrische bzw. transitive) Relation, die R enthalt, heit re exive (symmetrische bzw. transitive) Hulle von R. Mit den Basisoperationen aus 8.1.1 lassen sich die Hullenbildungen folgendermaen beschreiben:  I[R ist die re exive Hulle von R.  R [ RT ist die symmetrische Hulle von R. ist die transitive Hulle von R.  S Rn n1

wobei die Potenzen Rn fur alle n  0 rekursiv de niert sind durch R0 = I und Rn+1 = RRn . U blicherweise schreibt man R+ fur die transitive Hulle von R. Die re exive Hulle hiervon I [ R+ heit re exiv transitive Hulle von R und man schreibt hierfur R . 58

8.1.6 Residuen und Quotienten

Residuen sind die groten Losungen bestimmter Inklusionen. Das Linksresiduum von S uber R (in Zeichen S=R) ist die grote Relation X mit XR  S; das Rechtsresiduum von S uber R (in Zeichen RnS) ist die grote Relation X mit RX  S. Beide Residuen konnen auch mithilfe der Basisoperationen aus 8.1.1 beschrieben werden:  S=R = SRT

 RnS = RTS Jedes Residuum kann auch durch das andere de niert werden, denn es gilt (S=R)T = RT nST und (RnS)T = ST =RT . Relationen, die sowohl Rechts- als auch Linksresiduum sind, sind die symmetrischen Quotienten. Der symmetrische Quotient syq(R; S) zweier Relationen R und S ist de niert als die grote Relation X mit RX  S und XST  RT . Mit den Basisoperationen lat sich der symmetrische Quotient ausdrucken durch

 syq(R; S) = RT S \ RT S . In komponentenweiser Darstellung sind die Residuen allquanti zierte Implikationen und der symmetrische Quotient eine allquanti zierte A quivalenz. Ist zum Beispiel S : X $ Z und R : Y $ Z, so gilt fur das Linksresiduum S=R : X $ Y  (S=R)xy , 8z(Ryz ! Sxz ) und ist S : X $ Z und R : X $ Y, so gilt fur den symmetrischen Quotienten syq(R; S) : Y $ Z  syq(R; S)yz , 8x(Rxy $ Sxz ) .

8.2 Das RELVIEW-System 8.2.1 Allgemeines

Wenn man sich mit der Theorie der Relationen (Booleschen Matrizen) oder mit Graphentheorie beschaftigt, wird man hau g mit mehr oder weniger kleinen Beispielen konkreter Relationen arbeiten, um zu zeigen, da diese Relationen gewisse Eigenschaften haben bzw. nicht haben. Das RELVIEW-System bietet nun die Moglichkeit, Relationen maschinenunterstutzt zu manipulieren, statt dies mit Papier und Bleistift zu tun. RELVIEW ist ein interaktives bildschirmorientiertes System zur Manipulation konkreter Relationen. Es wurde entwickelt an der Universitat der Bundeswehr Munchen, teilweise unterstutzt durch die Deutsche Forschungsgemeinschaft. Das System wurde standig erweitert, ist nun aber ausgehend von der Ursprungsversion an der Christian-Albrechts-Universitat zu Kiel vollkommen neu entwickelt worden. RELVIEW betrachtet Relationen als Boolesche Matrizen. Diese konnen mithilfe der Maus auf dem Bildschirm erzeugt und manipuliert 59

werden. Die Ausfuhrung von Kommandos erfolgt durch das Anklicken der entsprechenden Knopfe. Neben den Basisoperationen wie Vereinigung oder Komplementbildung gibt es auch Kommandos zum Ausfuhren hoherer Operationen wie Hullenbildung oder Residuenbildung und bestimmte Test-Kommandos (zum Beispiel Test auf Transitivitat). Auerdem gibt es noch Kommandos mit administrativem Charakter, um zum Beispiel Relationen in einer Datei zu speichern.

Abbildung 8.1: Der RELVIEW-Bildschirm Der Bildschirm von RELVIEW ist in Abb. 40 zu sehen. Das RELVIEW-MenuFenster erscheint beim Aufruf von RELVIEW zuerst. Von diesem Fenster aus kann man durch Anklicken der entsprechenden Knopfe weitere Fenster o nen wie zum Beispiel das Relationen-, das Graph- und das Directory- Fenster. Auerdem be nden sich in diesem Fenster die Knopfe zur Ausfuhrung von Operationen auf Relationen und administrativen Funktionen, wie Laden und Speichern von Relationen und Graphen. Im Directory-Fenster (im Bild rechts oben) kann man unter den Relationen, die man in den Arbeitsspeicher geladen hat, eine auswahlen, die dann im Relationenfenster (im Bild links unten) als Boolesche Matrix dargestellt wird (In diesem Beispiel ist das die Relation graph1). Im Graphfenster (auf der rechten Seite des Bildschirms, hinter dem Directory-Fenster) kann man sich die Relation als Graph anzeigen lassen, falls sie quadratisch ist. Andersherum kann man auch im Graphfenster mithilfe der Maus einen Graph zeichnen, und sich diesen 60

dann im Relationenfenster als Boolesche-Matrix anzeigen lassen. Wir wollen in den folgenden Abschnitten die wichtigsten Grundbegri e zum Arbeiten mit RELVIEW, die wir in 8.3 benotigen, betrachten. Dabei werden die einzelnen Fenster, die man beim Arbeiten mit RELVIEW o nen kann, jeweils in einem eigenen Abschnitt erklart.

8.2.2 Das RELVIEW-Menu-Fenster

In diesem Fenster be nden sich mehrere Knopfe, die mit der linken Maustaste angeklickt werden konnen. Ganz oben be nden sich folgende Knopfe:  Der Knopf RELATION o net das Relationenfenster, in dem dann die im Directory-Fenster ausgewahlte Relation angezeigt wird.  Mit dem Knopf GRAPH o net man das Graphfenster, in dem dann die aktuelle Relation als Graph angezeigt wird, falls die Relation schon einmal als Graph gezeichnet wurde.  Mit SAVE kann man den aktuellen Inhalt des Arbeitsspeichers in einer Datei ablegen. Dazu kann man nach Anklicken von SAVE einen Namen eingeben, der dann die Extension \.xrv" erhalt, oder man kann in dem dann erscheinenden Menu den Namen einer bereits existierenden Datei auswahlen.  LOAD dient zum Laden einer durch SAVE abgespeicherten Datei in den Arbeitsspeicher. Den Namen der Datei kann man auch hier wieder aus dem erscheinenden Menu auswahlen.  DIR o net das Directory-Fenster, in dem der gesamte Inhalt des Arbeitsspeichers aufgelistet ist.  Mit QUIT kann man die RELVIEW-Sitzung beenden. Darunter be nden sich die Kopfe zum Arbeiten mit benutzerde nierten Funktionen:  Mit DEF kann man sich benutzereigene Funktionen de nieren. Dazu gibt man in dem sich o nenden Fenster die Funktionsde nition in der Form

< fname > (< varlist >) = < relterm >; wobei der Name der Funktion ist, eine Liste von Bezeichnern, die durch Kommata getrennt sind und ein re-

lationenalgebraischer Term in der Notation von RELVIEW. Wir wollen hier auf eine formale De nition eines RELVIEW-Terms verzichten und nur kurz au uhren, woraus solche Terme aufgebaut sind. Der Term kann aufgebaut sein aus den in der Variablenliste aufgefuhrten Bezeichnern, aus Namen von Relationen, die im Arbeitsspeicher vorhanden sind und aus Funktionssymbolen. Dabei konnen die Funktionssymbole sowohl in RELVIEW vorde niert als auch benutzerde niert sein. Ein Beispiel zur De nition von Funktionen ndet man in 8.3. 61

 Mit dem Knopf EVAL kann man benutzerde nierte Funktionen aufru-

fen. Klickt man EVAL an, so o net sich ein Fenster, in dem man einen RELVIEW-Term eingibt, in dem jetzt keine Variablen vorkommen durfen. Weiter mu man einen Namen eingeben, unter dem die Ergebnisrelation abgelegt werden soll. Dann wird der Term ausgewertet, und das Ergebnis erscheint unter dem angegebenen Namen im Relationenfenster.  Auch mit dem Knopf ITER kann man benutzerde nierte Funktionen aufrufen. Klickt man ITER an, so mu man wieder einen Namen fur das Ergebnis eingeben, den Namen einer einstelligen Funktion, den Namen einer Relation und eine Zahl zwischen 0 und 5000. Dann wird die Funktion zunachst auf die angegebene Relation und dann immer wieder auf das erhaltene Ergebnis angewandt, bis die Iteration entweder stationar wird, oder so oft wie angegeben durchgefuhrt wurde. Als nachstes kommen die Knopfe zum Ausfuhren der Grundoperationen. Klickt man diese an, so mu man stets einen Namen fur die Ergebnisrelation angeben, und ein oder zwei Argumente, je nachdem , ob die Operation einoder zweistellig ist. Dabei sind die Argumente wieder RELVIEW-Terme, ohne Variablen. Es werden dann zunachst die Argumentterme ausgewertet und danach wird die gewahlte Operation auf die Resultate angewandt. Dabei haben die Knopfe folgende Bedeutung:  W bedeutet Vereinigung (zweistellig),  V bedeutet Durchschnitt (zweistellig),  { bedeutet Komplement (einstellig),  ^ T bedeutet Transposition (einstellig) und   bedeutet Produkt (zweistellig). Diese Symbole werden auch beim Termaufbau verwendet (auer fur die Transposition; dafur verwende statt ^ T nur ^ ). Die Knopfe zur Berechnung der Residuen und und des symmetrischen Quotienten tragen die folgenden Symbole:  S/R fur das Linksresiduum,  RnS fur das Rechtsresiduum und  SYQ fur den symmetrischen Quotienten. Wie bei den zweistelligen Operationen oben, mu man auch hier einen Namen fur das Ergebnis und zwei Argumente angeben. In der nachsten Reihe be nden sich die Knopfe zur Berechnung von Hullen.  Mit SYMM berechnet man die symmetrische Hulle,  mit REFL die re exive Hulle 62

 und mit TRANS die transitive Hulle einer Relation. Dies sind einstellige Funktionen, bei denen jeweils eine Argument- und eine Resultatrelation angegeben werden mu. Ganz unten im Fenster nden wir folgende Knopfe:  EPSI berechnet zu einer quadratischen Relation der Dimension n  n die Relation, die alle Teilmengen einer Menge der Machtigkeit n beschreibt. Dazu mu man wieder als Argument einen Term eingeben, dessen Auswertung eine quadratische Relation liefert.  PARTF erwartet als Argumente zwei quadratische Relationen. Haben diese die Dimension n  n bzw. m  m, so wird als Ergebnis eine Relation geliefert, deren Spalten alle partiellen Funktionen von einer Menge der Machtigkeit n in eine Menge der Machtigkeit m beschreiben.  TOT tut das gleiche wie PARTF, blo liefert TOT nur die totalen Funktionen.  Mit INJ kann man zu einem Vektor eine injektive Abbildung erzeugen, die die gleiche Teilmenge beschreibt, wie der Vektor (siehe 8.1.4). Alle Funktionen, die durch die hier angefuhrten Knopfe aufgerufen werden konnen, konnen mit den gleichen Bezeichnungen auch zum Aufbau von Termen verwendet werden (siehe 8.3 fur Beispiele). Es gibt in diesem Fenster noch weitere Knopfe, auf die wir hier nicht weiter eingehen wollen. Diese dienen zum Testen von Relationen auf bestimmte Eigenschaften wie zum Beispiel Symmetrie oder Re exivitat und zur Bereichsde nition, wir werden sie aber im Rahmen dieser Arbeit nicht benotigen.

8.2.3 Das Directory-Fenster

Das Directory-Fenster zeigt den Inhalt des Arbeitsspeichers von RELVIEW und zwar in drei verschiedenen Feldern. Im ersten Feld werden die im Arbeitsspeicher enthaltenen Relationen angezeigt. In einer Zeile stehen jeweils der Name der Relation, ihre Dimension und die Angabe =graph falls die Relation schon als Graph gezeichnet wurde, und diese Graphdarstellung abgespeichert ist. Durch Anklicken der entsprechenden Zeile kann man nun eine Relation auswahlen, die dann im Relationenfenster als Boolesche Matrix dargestellt wird. Ist die Relation auch als Graph abgespeichert, so wird der Graph im Graphfenster angezeigt. Das zweite Feld zeigt die benutzerde nierten Funktionen in der Form, wie man sie eingegeben hat. Genauso verhalt es sich mit den Bereichsde nitionen, die im dritten Feld angezeigt werden. In allen drei Feldern kann man die Liste editieren. Zum Beispiel kann man eine der benutzerde nierten Funktionen aus dem Arbeitsspeicher loschen oder auch ihre De nition andern. Fur uns ist hier aber nur wichtig, da wir Relationen auswahlen konnen. 63

8.2.4 Das Graphfenster

Die Grapheingabe

Um einen Graph einzugeben, klickt man im Graphfenster die rechte Maustaste. Es erscheint dann ein Menu, aus dem man den Punkt NEW auswahlt. In dem sich nun o nenden Fenster gibt man einen Namen fur den zu zeichnenden Graphen ein. Dann kann man im Graph-Fenster mithilfe der Maus einen Graph zeichen.  Um Knoten zu zeichnen, klickt man die linke Maustaste im Graphfenster. Dann wird ein Knoten an der Stelle erzeugt, an der sich der Mauszeiger be ndet. Die Knoten werden automatisch durchnumeriert.  Um eine Kante von Knoten a nach Knoten b zu zeichnen, klickt man zuerst Knoten a mit der linken Maustaste an. Knoten a wird dadurch markiert. Klickt man nun Knoten b an, so wird die Kante gezeichnet.  Will man einen Knoten loschen, so markiert man ihn zunachst mit der linken Maustaste und loscht ihn dann durch Klicken der mittleren.  Zum Loschen einer bereits gezeichneten Kante von Knoten a nach Knoten b markiert man diese, indem man zunachst Knoten a und dann Knoten b mit der linken Maustaste anklickt. Dann loscht man die Kante durch Drucken der mittleren Maustaste.  Will man einen Knoten verschieben, so markiert man ihn mit der linken Maustaste und klickt dann nochmal mit der linken Maustaste die Stelle im Graphfenster an, an die man den Knoten verschieben mochte.

Das Graph-Menu Den im Graphfenster dargestellten Graphen kann man mithilfe des GraphMenus, das erscheint, wenn man die rechte Maustaste klickt, bearbeiten. Folgende Menupunkte stehen zur Auswahl.  NEW wurde bereits oben erklart.  Mit RENAME kann man den angezeigten Graphen umbenennen.  Mit GRAPH > RELATION wird der Graph in eine Relation umgewandelt, und als Boolesche Matrix im Relationenfenster angezeigt.  Klickt man PRINT an, so wird der Graph als Postscript-Datei unter dem Namen .gr.eps abgespeichert. Dabei ist der Name des Graphen.  Beim Anklicken von MARK NODES o net sich ein Fenster, in dem man einen relationalen Term eingeben kann. Die Auswertung dieses Terms mu einen Vektor ergeben, der genauso viele Zeilen hat wie der dargestelte Graph Knoten. Dann werden im Graph die Knoten markiert, die in der durch den Vektor beschriebenen Teilmenge enthalten sind. 64

 Der Punkt MARK EDGES dient zum Markieren von Kanten. Dazu mu

in dem sich o nenden Fenster ein Term eingegeben werden, dessen Auswertung eine Relation liefert, die in der durch den Graph dargestellten Relation enthalten ist. Dann werden die entsprechenden Kanten markiert.  Mit UNMARK GRAPH kann man die Markierungen wieder loschen.  FIT IN WINDOW dient dazu, die Groe des Graphen der aktuellen Fenstergroe anzupassen. Der Graph wird dann so vergrossert bzw. verkleinert, da er genau ins Fenster pat.  Beim Anklicken von GRAPH DRAWING erscheint ein weiteres Menu, aus dem man sich dann einen Graphzeichenalgorithmus auswahlen kann. Der Graph wird dann mit dem gewahlten Algorithmus im Graphfenster dargestellt. Bisher stehen zum Zeichnen von Graphen funf Algorithmen zur Verfugung. Dazu gehoren die vier hier beschriebenen Algorithmen, die unter folgenden Namen aufrufbar sind: Mit LAYER ruft man den Algorithmus aus Kapitel 4 auf. FOREST bezeichnet den Algorithmus zum Zeichnen von Baumen bzw. Waldern. Diesen Algorithmus kann man nur aufrufen, wenn der Graph auch wirklich ein Wald ist. Mit SPRING(slow) kann man den Algorithmus KK aus Kapitel 6 aufrufen. Mit SPRING(fast) ruft man Algorithmus FR aus Kapitel 7 auf. Schlielich kann man noch CORRESPONDENCE anklicken. Dann wird der Graph folgendermaen dargestellt. Hat der Graph im Fenster n = jVj Knoten, so hat der dann erzeugte Graph 2n Knoten. Diese werden in zwei Reihen nebeneinander gezeichnet, wobei die Knoten in jeder Reihe von 1 bis n durchnumeriert sind. Gab es im Ausgangsgraphen eine Kante von Knoten a zu Knoten b, so gibt es nun eine Kante von Knoten a aus der linken Reihe zu Knoten b aus der rechten Reihe.

8.2.5 Das Relationenfenster

Die Relationeneingabe

Um eine Relation als Boolesche Matrix einzugeben, klickt man im Relationenfenster die rechte Maustaste. Wie auch bei der Grapheingabe erscheint dann ein Menu, aus dem man zunachst den Punkt NEW auswahlt. Dann gibt man einen Namen fur die Relation und ihre Dimension an (d.h. die Anzahl der Zeilen und Spalten). Nun erscheint im Relationenfenster eine leere Matrix der gewunschten Dimension, die man mithilfe der Maus editieren kann.  Um ein Feld in der Matrix schwarz zu farben, klickt man dieses Feld mit der linken Maustaste an. 65

 Um ein bereits schwarzes Feld wieder zu loschen, klickt man es nochmals

mit der linken Maustaste an.  Klickt man ein weies Feld mit der mittleren Maustaste an, so werden je nach gewahltem Zeichenmodus (siehe nachsten Abschnitt) entweder alle Felder in der entsprechenden Spalte, der entsprechenden Zeile, der entsprechenden Diagonale von links unten nach rechts oben oder der entsprechenden Diagonale von links oben nach rechts unten schwarz gefarbt.  Klickt man ein schwarzes Feld mit der mittleren Maustaste an, so wird entsprechend die gesamte Zeile, Spalte oder Diagonale geloscht.

Das Relation-Menu Die Relation, die im Relationenfenster dargestellt ist, kann man mithilfe des Relation-Menus, das nach Klicken der rechten Maustaste im Relationenfenster erscheint, bearbeiten. Dazu stehen folgende Menupunkte zur Verfugung.  NEW wurde bereits oben erklart.  Mit DELETE kann man die angezeigte Relation aus dem Arbeitsspeicher loschen.  RENAME dient zum Umbenennen der angezeigten Relation.  Mit CLEAR kann man alle Felder der Relaton loschen.  Klickt man RANDOM-FILL an, so kann man eine Zahl zwischen 0 und 100 auswahlen, und die Matrix wird dann zu dem angegebenen Prozentsatz zufallig gefarbt.  Mit EXTRACT COLUMN(S) kann man sich eine beliebige Anzahl zusammenhangender Spalten aus der angezeigten Matrix herausziehen. Fur die so entstandene neue Matrix kann man dann einen neuen Namen eingeben.  Beim Anklicken von RELATION >GRAPH wird die Relation im Graphfenster als Graph dargestellt, und zwar in der Form, da die Knoten alle auf einem Kreis angeordnet werden. Dieser Graph kann dann im Graphfenster, wie in 8.2.4 beschrieben, weiter bearbeitet werden.  Mit PRINT wird die Matrix unter dem Namen .rel.eps als Postscript-Datei gespeichert. Dabei ist der Name der Relation.  Klickt man DRAW MODE an, so o net sich ein Menu mit den folgenden Punkten: DRAW MODE n, DRAW MODE =, DRAW MODE j und DRAW MODE . Damit wahlt man den Zeichenmodus aus, der angibt, ob man beim Anklicken eines Feldes der Matrix die Diagonale von links oben nach rechts unten, die Diagonale von links unten nach rechts oben, die Spalte bzw. die Zeile schwarz farbt bzw. loscht. 66

8.3 Eine Anwendung von RELVIEW In diesem Abschnitt setzen wir Grundkenntnisse der Verbandstheorie voraus. Die Grundbegri e der Verbandstheorie ndet man zum Beispiel in [22]. Wir betrachten die Schnittvervollstandigung einer geordneten Menge, wie sie in [21] vorgestellt wird. Die Methode der Dedekind Schnitte ist eine Art, die reellen Zahlen R aus den rationalen Zahlen Q zu konstruieren. Sie wurde verallgemeinert zu einer Methode zur Vervollstandigung geordneter Mengen. Wir werden sehen, wie diese Schnittvervollstandigung im Kalkul der Relationen behandelt wird und wie wir sie mit RELVIEW berechnen konnen. Um dies tun zu konnen, mussen die Symbole der Metasprache 2 und  und der ist-Elementvon-Relation und der Mengeninklusionsrelation der Objektsprache unterschieden werden. Im Folgenden verwenden wir in der Objektsprache die Relationen " : X $ 2X und v: 2X $ 2X.

8.3.1 Schnittvervollstandigung einer geordneten Menge

Sei R : X $ X eine (partielle) Ordnung. Dann heit das Paar (X,R) eine geordnete Menge. Wenn auerdem jede Teilmenge Y  X ein Supremum und ein In mum in X besitzt, so heit (X,R) vollstandiger Verband. Die Konstruktion von Vervollstandigungen geordneter Mengen mit Dedekind Schnitten sieht nun folgendermaen aus. Sei (X,R) eine geordnete Menge. Man de niert sich zwei Funktionen auf der Potenzmenge 2X von X, namlich Ma : 2X ! 2X

Ma(Y) := fx 2 Xjx ist untere Schranke von Yg

Mi : 2X ! 2X Mi(Y) := fx 2 Xjx ist obere Schranke von Yg: Ein Element M 2 2X heit Schnitt gdw. Mi(Ma(M)) = M. O enbar ist fur jedes p 2 X die Menge (p) := fx 2 XjRxp g ein Schnitt und heit der von p erzeugte Hauptschnitt. Sei CX die Menge der Schnitte von X und PX die Menge der Hauptschnitte von X. Seien weiter vC : CX $ CX und vP : PX $ PX die Restriktionen der Mengeninklusion v: 2X $ 2X auf die Mengen der Schnitte bzw. der Hauptschnitte. Dann ist (CX; vC ) ein vollstandiger Verband mit (PX; vP ) als Teilordnung. Auerdem ist die Abbildung e : X ! CX e(x) := (x) ein injektiver Ordnungshomomorphismus von R nach vC . Der Verband (CX; vC ) heit Schnittvervollstandigung der geordneten Menge (X,R). Ist (X,R) selbst ein Verband, so ist (PX; vP ) ein Teilverband von (CX ; vC ) und e ist ein injektiver Verbandshomomorphismus.

8.3.2 Relationaler Zugang zur Schnittvervollstandigung

Wir setzen fur den gesamten Abschnitt eine feste geordnete Menge (X,R) voraus. Unser Ziel ist die Konstruktion der Schnittvervollstandigung von (X,R) 67

mit relationenalgebraischen Mitteln. Diese Konstruktion besteht aus mehreren Stufen, die jede fur sich mit RELVIEW durchgefuhrt werden kann. Eine relationenalgebraische Konstruktion der Vervollstandigung (CX; vC ) der geordneten Menge (X,R) und des injektiven Ordnungshomomorphismus e geschieht folgendermaen. 1. Beschreiben wir eine Teilmenge von X durch einen Vektor v : X $ 1 im Sinne von 8.1.4, dann ist RT v der Vektor der oberen Schranken von v und Rv der Vektor der unteren Schranken von v. Zum Beispiel kann die erste Behauptung durch folgende Ableitung gezeigt werden. Fur alle x 2 X gilt (RTv)x () :(9y 2 X : RTxy ^ vy ) () 8y 2 X : :(Ryx ^ vy ) () 8y 2 X : Ryx _ :vy () 8y 2 X : vy ! Ryx : Gema der oben eingefuhrten Beschreibungen der oberen und unteren Schranken fuhren wir nun zwei Funktionen auf Mengen von Relationen ein. Ma : (X $ X)  (X $ Y) ! (X $ Y) Mi : (X $ X)  (X $ Y) ! (X $ Y)

Ma(R; S) := RT S Mi(R; S) := RS

Sei S : X $ Y eine Relation. In der Terminologie der Booleschen Matrizen kann man sagen, da fur ein Element y 2 Y die y-Spalte von Ma(R,S) der Vektor der oberen Schranken bezgl. R der y-Spalte von S ist und da die y-Spalte von Ma(R,S) der Vektor der unteren Schranken bzgl. R der y-Spalte von S ist. Fur die Anwendung von RELVIEW kann man die Funktionen Mi und Ma mit dem DEF-Kommando de nieren und zwar folgendermaen:

; = Mi(R; S) = Ma(R S)

( R^  S) ( R  S)

2. Als nachstes brauchen wir die ist-Element-von-Relation " : X $ 2X und vergleichen sie mit der Relation Mi(R; Ma(R; ")) : X $ 2X. Durch s : 2X $ 1

s := (syq(Mi(R; Ma(R; ")); ") \ I)L;

wobei I : 2X $ 2X und L : 2X $ 1 die identische bzw. die Universalrelation sind, erhalten wir den Vektor der die Teilmengen von X beschreibt, die Schnitte sind. Zum Beweis der Korrektheit sei m 2 2X. Benutzen wir die Tatsache, da die identische Relation dem Gleichheitssymbol in der Metasprache entspricht, so erhalten wir sm () ((syq(Mi(R; Ma(R; ")); ") \ I)L)m 68

() () () ()

9n 2 2X : syq(Mi(R; Ma(R; ")); ")mn ^ Imn ^ Ln 9n 2 2X : syq(Mi(R; Ma(R; ")); ")mn ^ (m = n) syq(Mi(R; Ma(R; ")); ")mm 8x 2 X : Mi(R; Ma(R; "))xm $ "xm :

Dies impliziert, da sm genau dann gilt, wenn die Teilmenge von X, die durch die m-Spalte der ist-Element-von-Relation " : X $ 2X beschrieben wird, ein Schnitt ist. Im RELVIEW-System berechnet das Kommando EPSI fur jede homogene Relation Q : X $ X (die die Menge X reprasentiert) die ist-Elementvon-Relation ". Nun kann man mit diesem Knopf, dem Knopf SYQ, den Knopfen fur die Grundoperationen und den oben de nierten Funktionen Ma und Mi den Vektor der Schnitte s leicht berechnen. 3. Da die Schnitte durch Mengeninklusion geordnet sind, betrachten wir nun die Relation v: 2X $ 2X. Benutzen wir, da die Relationen v und " den Symbolen  und 2 der Metasprache entsprechen, erhalten wir fur beliebige Mengen m; n 2 2X die A quivalenz

vmn () () () ()

mn 8x 2 X : x 2 m ! x 2 n 8x 2 X : "xm ! "xn ("n")mn :

Dies zeigt, da die Mengeninklusion als Relation der Objektsprache das Rechtsresiduum "n" ist. Also kann man sie mit den RELVIEW-Kommandos EPSI und R \ S berechnen. 4. Wir brauchen nun zunachst eine injektive Abbildung i : CX ! 2X, so da CX die durch i gegebene Teilmenge von 2X ist (im Sinne von 8.1.4). RELVIEW berechnet so eine injektive Abbildung mit der Funktion INJ, wobei der oben berechnete Vektor s als Argument eingegeben wird. Benutzen wir die Funktion i, so konnen wir die Restriktion vC : CX $ CX der Mengeninklusion auf die Mengen der Schnitte wie folgt berechnen:

vC = i v iT Benutzen wir fur die Abbildung i die ubliche Funktionennotation, so erhalten wir die Gleichung aus der Tatsache, da fur alle Schnitte m; n 2 CX gilt

vC mn () () () ()

9m1; n1 2 2X : m1 = i(m) ^ n1 = i(n) ^ m1 v n1 9m1 2 2X : m1 = i(m) ^ (9n1 2 2X : m1 v n1 ^ n1 = i(n)) 9m1 2 2X : m1 = i(m) ^ (v iT)m n (i v iT )mn : 1

69

5. Als letztes brauchen wir nun noch die relationenalgebraische Beschreibung des injektiven Ordnungshomomorphismus e von X nach CX . Mit der istElement-von-Relation " aus Schritt (2) und der injektiven Abbildung i aus Schritt (4) erhalten wir e : X ! CX

e = syq(R; "iT ):

Zum Nachweis der Korrektheit sei x 2 X und m 2 C ein Schitt. Wir benutzen fur i wieder Funktionennotation und die Symbole der Metasprache 2 und = und erhalten die A quivalenz syq(R; "iT )xm () 8y 2 X : Ryx $ ("iT )ym () 8y 2 X : Ryx $ (9z 2 2X : y 2 z ^ i(m) = z) () 8y 2 X : Ryx $ y 2 i(m) () 8y 2 X : y 2 (x) $ y 2 i(m) () (x) = i(m): Also ist die Relation syq(R; "iT ) eine Abbildung und bildet ein Element x 2 X gerade auf den von ihm erzeugten Hauptschnitt (x) 2 PX ab. Wir konnen nun noch die Relation C : X $ CX berechnen, deren Spalten genau die Schnitte beschreiben, und zwar gilt fur alle x 2 X und m 2 CX ("iT )xm () 9z 2 2X : "xz ^ (i(m) = z) () 9z 2 2X : x 2 z ^ (i(m) = z) () x 2 i(m): Also ist die Relation, die die Schnitte beschreibt gegeben durch C = "iT .

8.3.3 Beispiel

Nachdem wir nun im letzten Abschnitt einen Algorithmus zur Berechnung der Schnittvervollstandigung einer geordneten Menge entwickelt haben, wollen wir diesen nun an einem konkreten Beispiel mit RELVIEW ausprobieren. Wir betrachten die Menge X = f1; 2; 3; 4; 5; 6; 7g mit 7 Elementen und der partiellen Ordnung R, dessen irre exiver Teil durch folgenden Graph gegeben ist (Dieses Bild wurde mit dem Zeichenalgorithmus aus Kapitel 4 gezeichnet, der Pfeile von oben nach unten zeichnet. Es ist eigentlich ublich, die groeren Elemente uber den kleineren zu zeichnen, aber hier stehen die kleineren Elemente uber den groeren):

70

1

2

3

5

6

7

4

Die Darstellung von R als Boolesche Matrix sieht folgendermaen aus:

Die nachsten drei Bilder zeigen die Relationen, die wir in Schritt (2) berechnen. Zuerst haben wir die ist-Element-von-Relation ". Diese hat 7 Zeilen und 128 Spalten. Jede Spalte reprasentiert eine Teilmenge von X. Die erste Zeile steht zum Beispiel fur die leere Menge und die achte Zeile fur die Menge f5; 6; 7g. Nun wird zunachst die Funktion Ma und dann die Fuktion Mi auf diese Relation angewandt, das heit, man wertet den Term Mi(R, Ma(R, epsi)) aus. Dabei steht epsi hier fur die zuvor erhaltene Relation ". Das Resultat sieht dann folgendermaen aus: Wie in Schritt (2) beschrieben, vergleichen wir diese Relation nun mit der Relation " indem wir den symmetrischen Quotienten berechnen, danach mit der identischen Relation schneiden und dann mit der Universalrelation multiplizie71

ren. Wir erhalten den Vektor der Schnitte s. Seine Transponierte sehen wir im folgenden Bild. Wir konnen feststellen, da genau 10 der Teilmengen von X Schnitte sind. Das nachste Bild zeigt die Mengeninklusion (vgl. Schritt (3)) v: 2X $ 2X. Zum Beispiel ist das Feld in Zeile 17 und Spalte 18 schwarz, weil f3g eine Teilmenge von f3; 7g ist.

Die Relationen aus Schritt (4) sehen folgendermaen aus. Das Kommando INJ liefert mit dem Argument s die folgende injektive Abbildung i : CX ! 2X :

Aus dieser Relation erhalten wir zusammen mit der Mengeninklusion v die partielle Ordnung vC : CX $ CX der Schnittvervollstandigung (CX; vC ). Die Matrix dazu sehen wir in folgendem Bild: 72

In Schritt (5) berechnen wir die injektive Abbildung e : X ! CX , die wir im nachsten Bild sehen.

Auerdem berechnen wir die Relation C : X $ CX, deren Spalten genau die Schnitte beschreiben,

das heit, CX besteht aus den Mengen ;, f3g, f3, 7g, f1g, f1, 3g, f1, 3, 6g, f1, 3, 5g, f1, 2g, f1, 2, 4g und X.

Wir wollen nun sehen, wie die ursprungliche geordnete Menge (X,R) in die Schnittvervollstandigung eigebettet ist. Dazu stellen wir @C als Graph dar, und markieren die Kanten der zu (X,R) isomorphen Teilrelation von @C . Dazu berechnen wir zunachst aus der injektiven Abb. e : X ! CX den Vektor w, der genau die gleiche Teilmenge wie e beschreibt. Multiplizieren wir diesen Vektor mit seiner Transponierten und schneiden das Ergebnis dann mit @C , so erhalten wir genau die Teilrelation, mit der wir dann den Graph markieren mussen (zum Markieren von Graphen siehe 8.2.4). Zur Berechnung der Teilrelation de nieren wir uns eine Funktion mark durch mark(X; Y) = X & dom(Y^)  dom(Y^)^ : Dabei ist dom eine fest eingebaute Funktion, die zu jeder Relation den Vek73

tor liefert, der ihren De nitionsbereich beschreibt (dies kann man auch durch Multiplikation mit der entsprechenden Universalrelation erreichen). Ruft man nun mark mit den Argumenten @C und e auf, so erhalt man die gewunschte Markierungsrelation. Der so markierte Graph (wieder nur der irre exive Teil der Relation) ist im folgenden Bild zu sehen (gezeichnet mit dem Algorithmus aus Kapitel 4). 1

2

4

3

5

8

6

7

9

10

Will man diese Berechnung der Schnittvervollstandigung ofter durchfuhren, das heit mit verschiedenen Relationen, so ist es sinnvoll, sich Funktionen zu de nieren, die sofort die interessanten Ergebnisrelationen wie zum Beispiel @C liefern. Man mu dann nicht mehr alle Zwischenresultate einzeln berechnen. De niert man sich etwa zusatzlich zu den bereits angegebenen noch die folgenden Funktionen & X); dom(syq(epsi(X); mi(X; ma(X; epsi(X)))) & I(epsi(X)^  epsi(X))); cutord(X) = inj(decut(X))  (epsi(X)nepsi(X))  inj(decut(X))^; emb(X) = syq(X; epsi(X)  inj(decut(X))^) und markrel(X) = mark(cutord(X); emb(X)); I(X)

= decut(X) =

refl(X

so erhalt man die Relation vC durch die Auswertung des Terms cutord(R) und die Markierungsrelation durch Auswertung von markrel(R). 74

Kapitel 9

Abschlieende Bemerkungen Mit dieser Diplomarbeit wurden nun vier Algorithmen zum Zeichnen von Graphen in das RELVIEW-System eingebaut. Ein Algorithmus der die Knoten in Schichten auf der Zeichen ache anordnet und der fur beliebige Graphen benutzt werden kann, obwohl er eigentlich fur azyklische Graphen entwickelt wurde, ein Algorithmus, der speziell fur das Zeichnen von Baumen bzw. Waldern entwickelt wurde und auch nur auf solche anwendbar ist, zwei Algorithmen, die die Knoten gleichmaig auf der Zeichen ache verteilen und wiederum auf beliebige Graphen anwendbar sind. Diese Algorithmen sind fur viele Falle brauchbar, fur viele andere liefern sie jedoch nur unbefriedigende Ergebnisse. Daher soll die Graphausgabe weiterentwickelt werden. Das heit, es sollen noch mehr Algorithmen eingebaut werden, um auch die Graphen schon zeichnen zu konnen, fur die die bisher vorhandenen Algorithmen keine zufriedenstellenden Bilder liefern. Als mogliche Erweiterungen waren zum Beispiel denkbar ein Algorithmus zum Zeichnen von planaren Graphen oder ein Algorithmus zum Zeichnen von Graphen in Orthogonaldarstellung. Naturlich wird es immer Graphen geben, die so komplex sind, da man sie uberhaupt nicht schon darstellen kann, aber je mehr verschiedene Algorithmen zur Verfugung stehen, desto groer ist die Menge der Graphen, fur die sich eine schone Ausgabe erzeugen lat.

75

Literaturverzeichnis [1] G. Di Battista, P. Eades, R. Tamassia, I. G. Tollis, \Algorithms for Drawing Graphs: an Annotated Bibliography", Brown University, Department of Computer Science, 1994. [2] K. S. Sugiyama, S. Tagawa und M. Toda, \Methods for visual understanding of hierarchical system structures", IEEE Trans. Syst. Man Cybern., Band SMC-11, Nr.2, S. 109{125, Feb. 1981. [3] V.Chvatal, Linear Programming. New York: W. H. Freeman, 1983. [4] W. H. Cunningham, \A network simplex method", Mathematical Programming, Band 11, S. 105{116, 1976. [5] P. Eades, B. McKay und N.Wormald, \On an edge crossing problem", in Proc. 9th Australian Computer Science Conf., 1986, S. 327{334. [6] J.War eld, \Crossing theory and hierarchy mapping", IEEE Trans. Syst. Man Cybern., Band SMC-7, Nr. 7, S. 505{523, 1977. [7] P.Eades und N. Wormald, \The median heuristic for drawing 2-layers networks", Tech. Rep. 69, Dept. of Computer Science, University of Queensland, 1986. [8] E. R. Gansner, S. C. North und K.-P. Vo, \DAG|A Program that draws directed graphs", Software{Practice and Experience, Band 17, Nr. 1, S. 1047{1062, 1988. [9] D. E. Knuth, \Optimum binary search trees", Acta Informatika, Band 1, S. 14{25, 1971. [10] E. R. Gansner, E. Koutso os, S. C. North und Kiem-Phong Vo, \A technique for drawing directed graphs", IEEE Trans. Software Eng., Band 19, Nr. 3, S. 214{229, 1993. [11] C. Wetherell und A. Shannon, \Tidy Drawings of Trees", IEEE Trans. Software Eng., Band SE-5, Nr. 5, S. 514{520, 1979. [12] P. Eades, "A heuristic for graph drawing", Congr. Numer. 42 (1984) 149{ 160. [13] R. W. Floyd, Algorithm 97: shortest path, Comm. ACM 5, (1962), S. 345. 76

[14] A. Mo at und T. Takaoka, \An all pairs shortest path algorithm with expected running time O(n2 log n)", Proc. Conf. Found. Comp. Sci., 1985, S. 101{105. [15] P. M. Spira, \A new algorithm for nding all shortest paths in a graph of positive arcs in average time O(n2 log n)", SIAM J. Comp. 2 (1973) S. 28{32. [16] Tomihisa Kamada und Satoru Kawai, \An algorithm for drawing general undirected graphs", Information Processing Letters, Band 31, S. 7{15, 1989. [17] L. A. Rowe, M. Davis, E. Messinger, C. Meyer, C. Spirakis und A. Tuan, \A browser for directed graphs", Software{Practice and Experience, Band 11, S. 61{76, 1987. [18] T. Fruchterman und E. Reingold, \Graph drawing by force-directed placement", Software{Practice and Experience, Band 21, Nr. 11, S. 1129{1164, 1991. [19] G. Schmidt und T. Strohlein, Relationen und Graphen, Springer, BerlinHeidelberg-New York, 1989. [20] H. Abold-Thalman, R. Berghammer und G. Schmidt, \Manipulation of Concrete Relations: The RELVIEW-System", Bericht Nr. 8905, Universitat der Bundeswehr Munchen, 1989. [21] R. Berghammer, \Computing the Cut Completion of a Partially Ordered Set - An Example for the Use of the RELVIEW-System", Bericht Nr. 9205, Universitat der Bundeswehr Munchen, 1992. [22] H. Hermes, \Eine Einfuhrung in die Verbandstheorie", 2. Au age, Springer, Berlin-Heidelberg-New York, 1989.

77