• Keine Ergebnisse gefunden

Benutzerhandbuch EMS-Graphenlabor V.

N/A
N/A
Protected

Academic year: 2022

Aktie "Benutzerhandbuch EMS-Graphenlabor V."

Copied!
93
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

EMS-Graphenlabor V3.0

vorlauge Version Peter Dahm Jurgen Ebert Christoph Litauer

13. Oktober 1994

Inhaltsverzeichnis

1 Einfuhrung 4

1.1 Wozu EMS-Graphenlabor ? : : : : : : : : : : : : : : : : : : : : : : : : : : 4 1.2 Kleine Graphenterminologie : : : : : : : : : : : : : : : : : : : : : : : : : : 4 1.2.1 Gerichtete Graphen : : : : : : : : : : : : : : : : : : : : : : : : : : 5 1.2.2 Ungerichtete Graphen : : : : : : : : : : : : : : : : : : : : : : : : : 6 1.2.3 Orientierung : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 6 1.2.4 Weitere Begrie : : : : : : : : : : : : : : : : : : : : : : : : : : : : 7 1.3 Beispielanwendung : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 8 1.3.1 Aufgabenstellung : : : : : : : : : : : : : : : : : : : : : : : : : : : : 8 1.3.2 Quelltext : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 8 1.3.3 Ubersetzen und Binden : : : : : : : : : : : : : : : : : : : : : : : : 11 1.3.4 Ausfuhren : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 11 1.4 Typisierung : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 13 1.4.1 Realisierung : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 14 1.4.2 Beispiel : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 14 1.5 Attributierung : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 19 1.5.1 Realisierung : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 20 1.5.2 Beispiel : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 22 1.6 Temporare Attributierung : : : : : : : : : : : : : : : : : : : : : : : : : : : 30 1.6.1 Realisierung : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 31 1.6.2 Beispiel : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 31

2 Nutzung des EMS-Graphenlabors 38

2.1 Verzeichnisstruktur des Graphenlabors : : : : : : : : : : : : : : : : : : : : 38 2.2 Ubersetzen und Binden von Anwendungssoftware : : : : : : : : : : : : : : 38 2.2.1 Ubersetzen : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 38 2.2.2 Binden: : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 39 2.3 Nutzung von Environment-Variablen : : : : : : : : : : : : : : : : : : : : : 39

1

(2)

2.4 Meldungen : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 39 2.5 Tracing : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 41 2.5.1 Wie kann Tracing eingeschaltet werden ? : : : : : : : : : : : : : : 41 2.5.2 Wie konnen Funktionen Tracing-fahig programmiert werden ?: : : 41 2.6 Checking : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 43

3 Die Klasse G graph 44

3.1 Typen und Nullwerte : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 44 3.2 Graphen anlegen und loschen: grfall : : : : : : : : : : : : : : : : : : : : : 45 3.3 Graphenstruktur manipulieren: grfman: : : : : : : : : : : : : : : : : : : : 45 3.4 Graphen typisieren und attributieren: grfatr : : : : : : : : : : : : : : : : : 49 3.5 Graphen temporar attributieren: grftmp : : : : : : : : : : : : : : : : : : : 51 3.6 Graphen ausgeben: grfprt : : : : : : : : : : : : : : : : : : : : : : : : : : : 53 3.7 Graphen in Dateien ablegen und laden: grfsto : : : : : : : : : : : : : : : : 54 3.8 Graphen traversieren: grftra : : : : : : : : : : : : : : : : : : : : : : : : : : 55 3.9 Graphen typabhangig traversieren: grftra2 : : : : : : : : : : : : : : : : : : 58 3.10 Knoten- oder Kantenanordnung erfragen und manipulieren: grford : : : : 59 3.11 Knoten, Kanten testen: grftst : : : : : : : : : : : : : : : : : : : : : : : : : 61 3.12 Kanteninformation erfragen: grfaux : : : : : : : : : : : : : : : : : : : : : 63 3.13 Grad von Knoten erfragen: grfdeg : : : : : : : : : : : : : : : : : : : : : : 64 3.14 Globale Graphdaten erfragen: grfmsc: : : : : : : : : : : : : : : : : : : : : 65

4 Die Klasse G typeSystem 67

5 Die Klasse G type 69

6 Die Klasse G attrSchema 70

7 Abstrakte Klassen 72

7.1 G basicAttribute : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 72 7.2 G attribute : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 72 7.3 G tempAttribute : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 73

8 Weitere Klassen 74

8.1 G trace : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 74 8.2 G msg : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 75

9 Funktionen zum Lesen von Environment-Variable 78 A Mehrfache Vererbung bei Attributierungsklassen 79 B Zusatzinformation fur die Universitat Koblenz 81

B.1 Environmentvariable fur Universitat Koblenz : : : : : : : : : : : : : : : : 81 B.2 Welche Compiler fur welche Rechnerarchitekturen ? : : : : : : : : : : : : 81

2

(3)

C Dateiformate 82

C.1 Format der Graphen-Dateien : : : : : : : : : : : : : : : : : : : : : : : : : 82 C.1.1 Grammatik der Graphen-Dateien : : : : : : : : : : : : : : : : : : : 82 C.1.2 Beispiel : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 83 C.2 Format der Typsystem-Dateien : : : : : : : : : : : : : : : : : : : : : : : : 85 C.2.1 Grammatik : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 85 C.2.2 Beispiel : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 86 C.3 Format der Meldungsdateien : : : : : : : : : : : : : : : : : : : : : : : : : 87 C.3.1 Meldungskopfe : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 87 C.3.2 Meldungstexte : : : : : : : : : : : : : : : : : : : : : : : : : : : : : 88

D Liste der Environment-Variablen 90

Literatur 91

Index 92

3

(4)

1 Einfuhrung

1.1 Wozu EMS-Graphenlabor ?

Das EMS-Graphenlabor wurde mit dem Ziel entwickelt, einem Anwendungsprogrammie- rer (im folgenden als Benutzer bezeichnet) einen abstrakten Datentyp Graph mit einer moglichst leistungsfahigen Schnittstelle zur Verfugung zu stellen. Insbesondere werden folgende Anforderungen erfullt:

Knoten und Kanten sind eigenstandige, identizierbare Objekte.

Mehrfachkanten, d.h. mehrere Kanten zwischen den gleichen Knoten, sind moglich.

Die Kanten eines Graphen sind gerichtet.

Der einem gerichteten Graphen zugrunde liegende ungerichtete Graph steht dem Benutzer unmittelbar zur Verfugung.

Der Graph kann dynamisch geandert werden, d.h. wahrend der Laufzeit der An- wendung konnen Knoten und Kanten eingefugt und geloscht werden.

Die Kanten, die mit einem Knoten in Beruhrung stehen, sind in einer vom Benutzer veranderbaren Reihenfolge angeordnet.

Alle Knoten eines Graphen, alle Kanten eines Graphen und alle mit einem Knoten inzidenten Kanten konnen leicht traversiert werden.

Zur Unterscheidung unterschiedlicher Knoten bzw. Kantenklassen konnen die Kno- ten bzw. Kanten typisiert werden.

Die in einem Graphen verwendeten Typen konnen in einer Subtyp-Relation stehen.

Die Knoten und Kanten konnen mit Werten versehen (attributiert) werden. Das dabei verwendete Attributierungsschema ist vom Typ des jeweiligen Knotens oder der Kante abhangig.

Knoten und Kanten konnen kurzfristig mit Kontrollinformationen fur Standar- dalgorithmen markiert werden. Diese temporare Attributierung ist von den ty- pabhangigen Attributierungsschemata unabhangig.

Die vom EMS-Graphenlaborverwalteten Graphen sind also i.allg. dynamische, gerich- tete, angeordnete, typisierte und attributierte Graphen, die in der Literatur als TGraphen [EbeFra 94] bezeichnet werden.

1.2 Kleine Graphenterminologie

Graphen sind ein leistungsfahiges Modellierungsmittel, da sie zugleich anschaulich sind, mit den formalen Methoden der Graphentheorie behandelt werden konnen und ezi- ent implementierbar sind. Im folgenden werden viele Begrie aus der Graphentheorie verwendet:

4

(5)

1.2.1 Gerichtete Graphen

Ein gerichteter Graph (kurz auch nur Graph) umfat eine endliche Menge von Knoten V und eine endliche Menge von gerichteten Kanten (kurz auch nur Kanten) E. Dabei verbindet jede Kante e 2 E genau einen Anfangsknoten (oder Startknoten) v 2 V mit genau einem Endknoten (oder Zielknoten) u 2 V. Man sagt dann auch, Kante e fuhrt von Knoten v nach Knoten w. Fallsv =w gilt, heite auch eine Schlinge.

Die Beziehungen zwischen Kanten und ihren Anfangsknoten und Endknoten werden durch die Funktionen:E !V und! :E !V ausgedruckt. (e) ist der Anfangskno- ten der Kante e, !(e) der Endknoten. Zwei verschiedene Kanten durfen durchaus den gleichen Anfangs- und den gleichen Endknoten haben und werden dann als Mehrfach- kanten bezeichnet.

Eine Kante e heit inzident zu einem Knoten v, wenn er Anfangs- oder Endknoten dieser Kante ist. Eine Kante, deren Anfangsknoten bzw. Endknoten ein Knoten v ist, heit auchout-Kantebzw.in-Kantebezuglich Knotenv. Ein Knoten, der weder Anfangs- knoten noch Endknoten irgendeiner Kante ist, heit isoliert. Ein Graph kann graphisch dargestellt werden:

1

2

3

4

a b

c d

e

f g

Die KnotenmengeV ist hierf1;2;3;4g, die KantenmengeE istfa;b;c;d;e;f;gg. Kanten b und c sind Mehrfachkanten, Kanten a und g sind Schlingen. Knoten 3 ist isoliert. Die Funktionen und ! sind:

a b c d e f g

1 1 1 2 4 4 4

! 1 2 2 1 1 2 4

Das Graphenlabor reprasentiert die Menge aller Knoten und die Menge aller Kanten als (injektive) Folgen. Vseq bezeichnet die Folge aller Knoten, Eseq die Folge aller Kan- ten. Diese Folgen konnen mittels der Makros

G forAllVertices

und

G forAllEdges

durchlaufen werden.1 Die Reihenfolge, in der das Labor die Werte zuruckliefert, ist durch den Benutzer beeinubar. Zu weiteren Details siehe Abschnitt 3.8, S. 55.

Knoten und Kanten werden eindeutig naturliche Zahlen als Identikationsnummern zugeordnet. Diese Zahlen werden bei der Ausgabe von Graphen durch Laborfunktionen zur Identikation von Knoten oder Kanten verwendet. Sie werden evtl. nach Loschen eines Knotens oder einer Kante fur andere, neu erzeugte Knoten oder Kanten wiederver- wendet.

1Realisiert werden diese Makros durch rst-, next- Funktionspaare, die auch einzeln dem Benutzer zur Verfugung stehen.

5

(6)

1.2.2 Ungerichtete Graphen

Ein ungerichteter Graph umfat eine endliche Menge von Knoten V und eine endliche Menge von ungerichteten Kanten E. Jede ungerichtete Kante e 2E verbindet entweder zwei verschiedene Knotenu;v 2V miteinander oder im Falle einerungerichteten Schlinge einen Knoten v 2V mit sich selbst.

Die Beziehung zwischen einer ungerichteten Kante und den durch sie verbundenen Knoten werden durch die Funktionen this;that : E ! V ausgedruckt. this(e) ist einer der beiden durch Kantee verbundenen Knoten, that(e) der andere Knoten.2 Fallse eine Schlinge ist, giltthis(e) =that(e). Auch in ungerichteten Graphen sind Mehrfachkanten erlaubt.

1.2.3 Orientierung

Um gerichtete und ungerichtete Graphen gleich behandeln zu konnen, wird im EMS- Graphenlabor das Konzept der Orientierung eingefuhrt. Eine orientierte Kante~e ist ein Paar (e;d) 2 E Dir mit Dir = fin;outg. Dies entspricht der Tatsache, da man eine Kante von einem der durch sie verbundenen Knoten aus sehen kann.

v w

e that

this

that this

(e,out) (e,in)

α( )e ω( )e

Fur jede gerichtete oder ungerichtete Kante e ist ~e = (e;out) die normal orientierte oder auch normalisierte Kante. Die normale Orientierung einer gerichtete Kante ist diejenige Orientierung, bei der man die Kante von ihrem Startknoten aus sieht, bei einer ungerichteten Kantee diejenige Orientierung, bei der man die Kante vom Knotenthis(e) aus sieht.

Im EMS-Graphenlabor werden Kanten mit ihren normal orientierten Kanten identi- ziert. Die Funktionen , !, this und that werden auf die Menge der orientierten Kanten E Dir wie folgt erweitert:

(e;out) := (e)

(e;in) := (e)

!(e;out) := !(e)

!(e;in) := !(e) this(e;out) := (e)

2Die Zuordnung ist hier willkurlich. Werden this(e) und that(e) vertauscht, andert sich der Graph nicht. Dennoch ist die Zuordnung im weiteren als fest anzusehen.

6

(7)

this(e;in) := !(e) that(e;out) := !(e) that(e;in) := (e)

Man beachte, da die Werte der Funktionen und ! von der Orientierung der betrach- teten Kante unabhangig sind und nur fur gerichtete Graphen sinnvoll sind, und da die Werte der Funktionen this und that von der Orientierung abhangen. So ist this(~e) im- mer derjenige Knoten, von dem aus man die Kante e gerade betrachtet, undthat(~e) der Knoten am anderen Ende der Kante.

Insgesamt wird dadurch erreicht, da zu jedem gerichteten Graph der zugrundelie- gende ungerichtete Graph unmittelbar zur Verfugung steht, indem man auf den gerich- teten Graph ausschlielich mit den Funktionen this, that zugreift und mit orientierten Kanten arbeitet. Soll mit dem EMS-Graphenlabor ein ungerichteter Graph verwaltet werden, kann der Benutzer also einen gerichteten Graphen anlegen, dessen zugrundelie- gender ungerichteter Graph der gewunschte Graph ist.

Bei der Ausgabe von Graphen wird die Orientierung von Kanten durch das Vorzeichen zur Identikationsnummer ausgedruckt. Positives Vorzeichen bedeutet die Orientierung

out, negatives Vorzeichen die Orientierungin.

1.2.4 Weitere Begrie

Zu jedem Knoten v sind alle in- und out-Kanten als orientierte Kanten in einer Sequenz (v) angeordnet, die im folgenden als Folge der zu Knoten v inzidenten Kanten be- zeichnet wird. In dieser Folge erscheinen in-Kanten mit der Orientierungin, out-Kanten mit der Orientierungout, also normalisiert. Schlingen treten doppelt, namlich in beiden Orientierungen auf. Fur jede orientierte Kante~e aus (v) gilt this(~e) =v.

Formal ergibt sich fur die Funktion die Charakteristik :V !seq(E Dir). Bei gerichteten Graphen enthalt (v) die Teilfolge aller in-Kanten ,(v) und die Teilfolge aller out-Kanten +(v).3 Auch diese Folgen kann der Benutzer durch die vom Labor denierten Makros

G forAllIncidentEdges

,

G forAllInEdges

und

G forAllOut- Edges

durchlaufen. Ferner ist die Reihenfolge der Elemente der Sequenz (v) durch Laborfunktionen beeinubar.

Unter dem Grad (v) eines Knotens v versteht man die Anzahl der Kanten in der Kantenfolge zu v: (v) =j (v) j.4 Fur gerichtete Graphen deniert man analog noch den Innengrad ,(v) und Auengrad+(v) eines Knoten v mittels ,(v) =j,(v)j und

+(v) =j+(v) j.

3Da es sich um Teilfolgen handelt, sind ,(v) und +(v) durch (v) eindeutig beschrieben.

4Bei dieser Denition werden Schlingen daher doppelt gezahlt.

7

(8)

1.3 Beispielanwendung

1.3.1 Aufgabenstellung

In diesem Abschnitt soll ein Programm5 folgenden Baum aufbauen und in pre-Order traversieren:6

1

2 5

3 4 7 8

9 10 11

12 13

6

14

Als Ausgabe sollen alle Knoten in pre-order und gema ihrer Tiefe im Baum durch Punkte eingeruckt erscheinen.

1.3.2 Quelltext

Man legt mit einem beliebigen Editor eine Datei treeTrav.c an und gibt den notwendi- gen Quelltext ein. Zunachst sind die Deklarationen des Graphenlabors dem Programm mitzuteilen:

#include <graph.h>

Ab jetzt stehen alle Typen, globale Variable und Funktionsprototypen des Graphenlabors zur Verfugung. Das Programm besteht aus dem Hauptprogramm main, einer Funktion

buildTree zum Aufbau des Baums und einer rekursiven Funktion traversezur Traver- sierung. Zunachst das Hauptprogramm:

5Der Quelltext dieses Beispielprogramms liegt in Verzeichnis $EMSDEMO(zu Verzeichnisangaben siehe Abschnitt 2.1, S. 38) vor.

6Traversierung von Graphen erfordert in der Regel eine Markierung der bereits besuchten Knoten, um nicht in Kreise zu gelangen. Eine Markierung von Knoten sollte aber durch die den Mechanismus dertem- poraren Attributierung(siehe Abschnitt 1.6, S. 30) erfolgen und wurde das Beispiel unnotig verkomplizieren.

8

(9)

void main ( void ) {

G_graph g;

G_vertex root;

root = buildTree (g);

traverse (g, root, 0);

}

Beim Betreten der Funktionmain wird zunachst der Konstruktor der KlasseG graph fur die Variable g aufgerufen. Dieser erzeugt einen leeren Graphen. Die Funktion

buildTree erzeugt anschlieend aus diesem leeren Graphen den obigen Baum und liefert den Wurzelknoten rootzuruck. Die Funktiontraverse schlielich traversiert den Baum von der Wurzel root aus mit der aktuellen Rekursionstiefe 0.

Als nachstes ist die FunktionbuildTree anzugeben. Der Baum soll interaktiv einge- geben werden.

G_vertex buildTree(G_graph &g) {

unsigned vCount, i, rootNo, alphaNo, omegaNo;

cout << "Wieviele Knoten hat der Graph: ";

cin >> vCount;

for (i=1; i<=vCount; ++i) g.createVertex(i);

cout << vCount << " Knoten wurden erzeugt." << endl

<< endl

<< "Welche Kanten hat der Graph?" << endl

<< "Eingabe von 0 als Startknoten beendet die Eingabe."

<< endl

<< endl;

while (1) {

cout << "Startknoten: ";

cin >> alphaNo;

if (alphaNo==0) break;

if (!g.isVertex(g.getV(alphaNo))) {

cout << alphaNo << " ist eine ungueltige Knotennummer."

<< endl;

continue;

}

cout << "Endknoten: ";

9

(10)

cin >> omegaNo;

if (!g.isVertex(g.getV(omegaNo))) {

cout << omegaNo << " ist eine ungueltige Knotennummer."

<< endl;

continue;

}

g.createEdge(g.getV(alphaNo), g.getV(omegaNo));

cout << "Kante von " << alphaNo << " nach "

<< omegaNo << " wurde erzeugt." << endl

<< endl;

}

cout << endl

<< "Welcher Knoten ist der Wurzelknoten: ";

cin >> rootNo;

cout << endl;

return g.getV(rootNo);

}

Zunachst wird die Anzahl der KnotenvCount eingegeben und entsprechend viele Knoten mit den Nummern 1 bis vCount mit der Methode

G graph::createVertex

erzeugt.

Zur Eingabe der Kanten wird die Nummer des Anfangsknoten alphaNound die Nummer des Endknoten omegaNo eingegeben. Die Zulassigkeit der eingegebenen Nummern wird mit der Methode

G graph::isVertex

uberpruft. Die Methode

G graph::getV

liefert dabei den zu einer Nummer gehorenden Knoten. Bei zulassigen Nummern wird die gewunschte Kante mit

G graph::createEdge

erzeugt. Die Eingabe der Kanten wird durch Eingabe von 0 als Startknotennummer beendet. Zuletzt wird noch die Nummer des WurzelknotensrootNo eingegeben und der Wurzelknoten an die aufrufende Funktion zuruckgegeben.7

Schlielich noch die Funktion traverse:

void traverse(G_graph &g, G_vertex root, unsigned depth) {

G_edge e;

int i;

if (depth>=g.vertexCount()) {

// circle detected

cerr << "Der Graph enthaelt einen Kreis." << endl;

abort();

}

7Es wird nicht getestet, ob es sich bei dem eingegeben Graphen um einen Baum handelt.

10

(11)

for (i=0; i<depth; ++i) cout << "..";

cout << "Knoten(" << g.getVNo(root) << ")" << endl;

G_forAllOutEdges(g, root, e) {

traverse(g, g.omega(e), depth+1);

} }

Die Funktion selbst gibt nach dem Test auf einen Kreis8 entsprechend der Rekursionstiefe viele Punktpaare und dann die Identikationsnummer des gerade betrachteten Knoten

v mittels der Methode

G graph::getVNo

aus. Danach werden alle Kanten in +(v) bearbeitet. Der Zugri auf +(v) erfolgt durch das Makro

G forAllOutEdges

. Da die Endknoten g.omega(e) dieser Kanten e aus +(v) die Kindknoten des gerade betrach- teten Knotenv sind, wird danntraverse mit einer um eins erhohten Rekursionstiefe fur die Kindknoten erneut aufgerufen.

1.3.3 Ubersetzen und Binden

Sobald der Quelltext unter dem NamentreeTrav.c abgespeichert ist, kann er mit

$CC -g -I$EMSINC treeTrav.c $EMSLIB/libgraphUdebug.a -o treeTrav

mit dem in der Environmentvariable CC angegebenen C++-Compiler ubersetzt und mit der notigen EMS-Library gebunden werden. Dazu sind die Environmentvariable des Graphenlabor zu setzen (siehe Abschnitt 2.1, S. 38).9 Einfacher kann man es sich mit dem make-Kommando und einem entsprechenden Makele machen. Ein moglicher Makele steht im Verzeichnis $EMSDEMO zur Verfugung.

1.3.4 Ausfuhren

Sobald der Quelltext fehlerfrei ubersetzt und gebunden worden ist, kann das Programm

treeTrav ausgefuhrt werden. Fur den Beispielbaum erhalt man folgendes Ablaufproto- koll:

Wieviele Knoten hat der Graph:

14

14 Knoten wurden erzeugt.

Welche Kanten hat der Graph?

Eingabe von 0 als Startknoten beendet die Eingabe.

Startknoten:

1

Endknoten:

2

Kante von 1 nach 2 wurde erzeugt.

8Ein Kreis wird dadurch erkannt, da die Rekursionstiefe die Knotenanzahl des Graphen uberschreitet.

9Zur Wahl des Compilers siehe Anhang B.2, S. 81.

11

(12)

Startknoten:

1

Endknoten:

5

Kante von 1 nach 5 wurde erzeugt.

Startknoten:

1

Endknoten:

6

Kante von 1 nach 6 wurde erzeugt.

Startknoten:

2

Endknoten:

3

Kante von 2 nach 3 wurde erzeugt.

Startknoten:

2

Endknoten:

4

Kante von 2 nach 4 wurde erzeugt.

Startknoten:

6

Endknoten:

7

Kante von 6 nach 7 wurde erzeugt.

Startknoten:

6

Endknoten:

8

Kante von 6 nach 8 wurde erzeugt.

Startknoten:

6

Endknoten:

12

Kante von 6 nach 12 wurde erzeugt.

Startknoten:

6

Endknoten:

13

Kante von 6 nach 13 wurde erzeugt.

Startknoten:

6

Endknoten:

14

Kante von 6 nach 14 wurde erzeugt.

Startknoten:

8

Endknoten:

9

Kante von 8 nach 9 wurde erzeugt.

Startknoten:

8

Endknoten:

10

Kante von 8 nach 10 wurde erzeugt.

Startknoten:

8

Endknoten:

11

Kante von 8 nach 11 wurde erzeugt.

Startknoten:

0

Welcher Knoten ist der Wurzelknoten:

1

Knoten(1) ..Knoten(2) ....Knoten(3) ....Knoten(4)

12

(13)

Kreuzung Einmuendung

Verzweigung Parkeinrichtung Parkplatz

Parkgebaeude Tiefgarage

Parkhaus

Abbildung 1: ER-Diagramm des Typisierungsbeispiels

..Knoten(5) ..Knoten(6) ....Knoten(7) ....Knoten(8) ...Knoten(9) ...Knoten(10) ...Knoten(11) ....Knoten(12) ....Knoten(13) ....Knoten(14)

1.4 Typisierung

Bei vielen Anwendungen von Graphen haben nicht alle Knoten bzw. Kanten ahnli- che Bedeutungen. Vielmehr kann man Teilmengen von Knoten bzw. Kanten ahnlicher Bedeutung identizieren.

Wenn man z.B. einen Stadtplan auf einen Graphen abbilden will, liegt es nahe, Straenabschnitte als Kanten und Kreuzungen, Einmundungen, Parkplatze, Parkhauser und Tiefgaragen als Knoten zu modellieren. Bei den Knoten fallt auf, da man sie grob in zwei Mengen zerlegen kann, namlich alle Verzweigungspunkte (Kreuzungen und Einmundungen) und alle Parkeinrichtungen, die ihrerseits wieder feiner zerlegt werden konnen (siehe Abb.1).

Die Einteilung von Knoten oder Kanten zu unterschiedlichen Mengen kann durch Typisierung realisiert werden. Die unterschiedlichen Mengen werden dabei durch Typen reprasentiert. Die Zugehorigkeit eines Knotens bzw. einer Kante zu einer bestimmten Menge wird dann dadurch ausgedruckt, da dem Knoten bzw. der Kante der diese Menge reprasentierende Typ zugewiesen wird. Falls eine Menge, die durch einen Typ A reprasentiert wird, Teilmenge der durch Typ B reprasentierten Menge ist, ist A ein Untertyp von B (A is-a B) und B ein Obertyp von A. Z.B. ist Parkhaus ein Untertyp

13

(14)

von Parkgebaeude. In der Abbildung wird die Untertyprelation dadurch ausgedruckt, da der Untertyp innerhalb des Obertyps steht. Die Untertyprelation ist reexiv und transitiv, mu aber nicht notwendigerweise antisymmetrisch sein.

1.4.1 Realisierung

Im Graphenlabor wird Typisierung realisiert, indem Graphen ein geeignetes Typsystem (

G typeSystem

-Instanz) zugeordnet wird. Dieses Typsystem beschreibt alle verwende- ten Typen (

G type

-Instanzen) und die Subtyp-Relation zwischen ihnen. Die Beschrei- bung eines Typs enthalt eine innerhalb des Typsystems eindeutige Typbezeichnung (als String) und evtl. ein Schema fur die Attributierung der Knoten oder Kanten des Typs (siehe dazu Abschnitt 1.5, S. 19). Jedes Typsystem enthalt einen Nulltyp mit der Be- zeichnung "NULL", der automatisch Obertyp aller anderen Typen ist. Dem Nulltyp ist kein Attributierungsschema zugeordnet.

Jeder Knoten und jede Kante eines Graphen hat genau einen Typ des dem Graphen zugeordneten Typsystems.10 Jeder Knoten und jede Kante hat nach der Erzeugung mit

G graph::createVertex

oder

G graph::createEdge

den Typ"NULL", doch kann der Typ mit den Methoden

G graph::setVType

fur Knoten und

G graph::setEType

fur Kanten geandert werden.

1.4.2 Beispiel

In diesem Beispiel soll zunachst das oben beschriebene Typsystem deniert und ansch- lieend eine Graphinstanz dazu erzeugt werden.

Denition des Typsystems

Um das oben beschriebene Typsystem im Graphenlabor anzulegen, kann man z.B. wie folgt vorgehen:

#include <graph.h>

G_typeSystem planTypSystem;

G_type verzweigung(planTypSystem, "Verzweigung");

G_type kreuzung(planTypSystem, "Kreuzung");

G_type einmuendung(planTypSystem, "Einmuendung");

G_type parkeinrichtung(planTypSystem, "Parkeinrichtung");

G_type parkplatz(planTypSystem, "Parkplatz");

G_type parkgebaeude(planTypSystem, "Parkgebaeude");

G_type parkhaus(planTypSystem, "Parkhaus");

G_type tiefgarage(planTypSystem, "Tiefgarage");

10Sollte z.B. ein Knoten eigentlich mehrere Typen haben, weil er unterschiedlichen Mengen angehort, ist es beim Graphenlabor notwendig, einen gemeinsamen Untertyp zu denieren und dem Knoten diesen gemeinsamen Untertyp zuzuordnen.

14

Abbildung

Abbildung 1: ER-Diagramm des Typisierungsbeispiels
Abbildung 2: Graph des Typisierungsbeispiels
Abbildung 3: ER-Diagramm der Attributierung
Abbildung 4: Implementierung von Attributen
+3

Referenzen

ÄHNLICHE DOKUMENTE

Bemerkung: (Satz von Kuratowski) Ein Graph ist genau dann nicht planar, wenn er eine Unterteilung des K 5 oder des K 3,3 als Teilgraph enth¨ alt.. Diskrete Strukturen 2.7

Vertauscht man auf diesem Pfad gematchte und ungematchte Kanten, erh¨ alt man dadurch ein Matching M 0 mit |M 0 | = |M | + 1, was wiederum einen Widerspruch darstellt:... Von

ľ Ernst W.. Wir betrachten die Folge der Queuezust¨ ande. Deswegen werden sie aus der Queue entfernt, und so wird das Element 9 das vorderste Queueelement. Im Zustand j) sind

Pfadkompression ben¨ otigt f¨ ur eine (beliebige) Folge von m Union- und Find-Operationen Zeit O(m log ∗ n).. Union-Find mit gewichteter Vereinigung

Man beweise, dass jeder algebraisch abgeschlossene Korper unendlich viele Elemente hat..

b) Gegeben ein ungerichteter Graph G = (V, E) mit n Knoten (n geradzahlig), ent- scheide, ob es eine Clique der Gr¨ oße n/2 gibt. Hinweis: Verwenden Sie f¨ ur den Beweis der NP-H¨

b) Es gibt eine erkennbare Sprache, f¨ur die es keinen ¨aquivalenten NEA mit genau einem Endzustand gibt. Wenden Sie auf folgenden NEA die Potenzmengenkonstruktion an und berechnen

Eine schwedische Forschergruppe hat sich daher dieser Problematik angenommen und ver- schiedene Merkmal-Cluster geschaf- fen, nach denen es möglich sein könnte, in Zukunft