• Keine Ergebnisse gefunden

Damit der Umgang mit Graphen und auch der Aufruf der Algorithmen flexibel von der Hand geht, ist im Rahmen der Implementierung ein Interpreter vorgesehen, der dem Benutzer ¨uber Befehle die M¨oglichkeit gew¨ahrt, Graphen zu erstellen, zu modifizieren, zu l¨oschen und Algorithmen auf ihnen auszuf¨uhren. Dazu unterst¨utzt dieser m¨oglichst nur die elementaren Funktionen, um ¨uberschaubar zu bleiben und leicht bedienbar zu sein.

Die folgende Abbildung zeigt den Interpreter nach dem Aufruf:

Abbildung 9: Interpreter nach Aufruf

Aus Abbildung 9 l¨asst sich erkennen, dass mittels des Befehls help eine Liste abgerufen werden kann, die alle verf¨ugbaren Kommandos zeigt.

Grunds¨atzlich ist es m¨oglich, zehnverschiedene Graphen zu erstellen und damit zu arbeiten. Innerhalb des Interpreters werden diese mit gi, 1 6 i 6 10 ange-sprochen. Falls der Benutzer zwischenzeitlich den OO-Subgraph eines Graphengj berechnet, so wird dieser anschließend unter der Bezeichnung sgj abgelegt und gespeichert.

Die Befehle sollen nun vorgestellt und kurz erl¨autert werden, damit f¨ur die sp¨atere Verwendung des Programms Unklarheiten direkt ausger¨aumt sind.

help: Benutzung: help

Zeigt eine Liste mit allen m¨oglichen Befehlen, die ent-sprechende Syntax und eine zugeh¨orige Beschreibung.

listGraphs: Benutzung: listGraphs

Pr¨uft f¨ur alle Graphengiund alle Subgraphensgimit 16i610, ob f¨ur die jeweilige Bezeichnung gerade ei-neGraph-Instanz existiert (belegt), oder nicht (frei).

createGraph: Benutzung: createGraph gi

Falls f¨ur gi noch keine Graph-Instanz existiert, so wird eine solche angelegt und damit diese Bezeichnung belegt.

setLabelFromOther: Benutzung: setLabelFromOther gi gj

Falls f¨urgiundgj Graph-Instanzen existieren, so wer-den alle Beschriftungen von gj nachgikopiert.

deleteGraph: Benutzung: deleteGraph gi

Falls f¨ur gi eine Graph-Instanz existiert, so wird diese zerst¨ort und damit diese Bezeichnung wieder freigegeben.

addLabel: Benutzung: addLabel gi label

F¨ugt eine neue Beschriftung label zur Menge L des Graphs gi hinzu, falls diese noch nicht existiert.

removeLabel: Benutzung: removeLabel gi label

Entfernt eine Beschriftunglabelvon der MengeLdes Graphs gi, falls diese existiert.

addNode: Benutzung #1: addNode gi name label

F¨ugt einen neuen Knoten mit dem Namen name und der Beschriftung label zum Graphen gihinzu.

Benutzung #2: addNode gi name

F¨ugt einen neuen Knoten mit dem Namen name zum Graphen gi hinzu, wobei als Beschriftung das erste Element in L gew¨ahlt wird. Kann f¨ur unbeschriftete Graphen verwendet werden.

changeNodeLabel: Benutzung: changeNodeLabel gi name label Andert die Beschriftung von Knoten¨ name zu label, falls ein solcher Knoten und eine solche Beschriftung in gi existieren.

removeNode: Benutzung: removeNode gi name

Entfernt den Knoten mit Namen name aus gi, falls dieser existiert. Zus¨atzlich werden alle zu name inzi-denten Kanten entfernt.

addEdge: Benutzung #1: addEdge gi from to label F¨ugt eine neue Kante vom Knoten mit dem Namen from zum Knoten mit dem Name to und der Be-schriftung label zum Graphen gi hinzu.

Benutzung #2: addEdge gi from to

F¨ugt eine neue Kante vom Knoten mit dem Namen from zum Knoten mit dem Namen to zum Graphen gi hinzu, wobei als Beschriftung das erste Element in Lgew¨ahlt wird. Kann f¨ur unbeschriftete Graphen verwendet werden.

changeEdgeLabel: Benutzung: changeEdgeLabel gi from to old new Andert die Beschriftung der Kante vom Knoten¨ from zum Knoten to mit (alter) Beschriftung old zu new (neue Beschriftung), falls eine solche Kante in gi existiert.

removeEdge: Benutzung: removeEdge gi from to label

Entfernt die Kante vom Knoten from zum Knoten to mit der Beschriftunglabelvom Graphen gi, falls eine solche Kante existiert.

printGraph: Benutzung: printGraph gi

Gibt den Graphgials Adjazenzlisten-Darstellung auf dem Terminal aus.

printLabels: Benutzung: printLabels

Gibt die Menge der BeschriftungenLdes Graphengi auf dem Terminal aus.

printNodes: Benutzung: printNodes

Gibt die Menge der Knoten V des Graphen gi auf dem Terminal aus.

printEdges: Benutzung: printEdges

Gibt die Menge der Kanten E des Graphen gi auf dem Terminal aus.

importGraph: Benutzung: importGraph filename

Versucht, die Datei/graphs/filenamezu ¨offnen und die darin befindlichen Graphdaten in das Programm zu laden.

exportGraph: Benutzung: exportGraph gi filename

Exportiert den Graphengiin eine Datei, die den Na-menfilename.graphtr¨agt und im Ordner/graphs/

abgelegt wird. Als Inhalt wird die aktuelle Zeit und alle notwendigen (hier beschriebenen) Befehle auf-gelistet, die zur Rekonstruktion der Graph-Instanz n¨otig sind.

generateCompleteGraph:

(siehe Kapitel 6)

Benutzung: generateCompleteGraph nodes Erzeugt einen vollst¨andigen Rooted OOLDG mit nodes Knoten und speichert ihn im Ord-ner /graphs/generated/ mit dem aktuellen Zeitstempel.

generateRandomNGraph:

(siehe Kapitel 6)

Benutzung: generateRandomNGraph nodes

Erzeugt einen Rooted OOLDG mit nodes Kno-ten und zuf¨alligen Kanten und speichert ihn im Ordner /graphs/generated/ mit dem aktuellen Zeitstempel.

generateRandomNMGraph:

(siehe Kapitel 6)

Benutzung: generateRandomNMGraph no ed Erzeugt einen zuf¨alligen Rooted OOLDG mit no Knoten und ed Kanten und speichert ihn im Ordner /graphs/generated/ mit dem aktuellen Zeitstempel.

generateDegreeGraph:

(siehe Kapitel 6)

Benutzung: generateDegreeGraph nodes degree Erzeugt vollst¨andigen Rooted OOLDG mit nodes Knoten, wobei jeder Knoten einen Grad von degree hat und speichert ihn im Ord-ner /graphs/generated/ mit dem aktuellen Zeitstempel.

importGeneratedGraph: Benutzung: importGeneratedGraph file gi Versucht, die Datei/graphs/generated/filezu ¨ off-nen und die darin befindlichen Graphdaten in das Programm unter der Bezeichnung gizu laden.

listGraphData: Benutzung: listGraphData

Offnet das Verzeichnis¨ /graphs/und listet alle darin befindlichen Dateien auf.

copyGraph: Benutzung: copyGraph gi gj

Kopiert die Graphinstanz gi nach gj (ohne Referen-zen; tiefe Kopie).

misshapeGraph: Benutzung: misshapeGraph gi gj

Kopiert die Graphinstanz ginachgj und l¨oscht bzw.

f¨ugt zuf¨allig Kanten hinzu (ohne Referenzen; tiefe Kopie).

checkIsomorphism: Benutzung: checkIsomorphism gi gj

Ruft Algorithmus 4 mit den Eingabegraphen gi und gj auf. Falls gi ∼= gj, wird der Isomorphismus π und die ben¨otigte Zeit zur Berechnung ausgegeben. An-dernfalls wird beschrieben, weshalb der Algorithmus nicht erfolgreich war.

checkRootedOOLDGProperty: Benutzung: checkRootedOOLDGProperty gi

Pr¨uft, ob der GraphgidieRooted Outgoing- Ordered -Eigenschaft besitzt.

calculateOOSubgraph: Benutzung: calculateOOSubgraph gi

Berechnet den OO-Subgraphen von gi und legt ihn unter der Bezeichnung sgi ab.

exit: Benutzung: exit

Beendet das Programm.

Zus¨atzlich zu den genannten Befehlen ist es n¨utzlich, einige weitere Regeln zu ken-nen.

Wichtig ist, dass die Beschriftungen nach dem Anlegen einer Graph-Instanz zu-erst eingetragen werden.Mindestenseine Beschriftung muss jeder Graph haben (vgl. Definition 2.13), selbst wenn er unbeschriftet ist. Mehrere Knoten d¨urfen die gleiche Beschriftung besitzen, aber der Name jedes Knotens muss eindeutig sein. Man kann den Namen eines Knotens nicht ver¨andern, weil das in der Regel ohnehin nicht n¨otig ist, da die Knotennamen keinerlei Relevanz hinsichtlich der genannten Algorithmen haben. Sie dienen nur der Identifizierung.

Wenn eine Beschriftunglgel¨oscht wird, dann werden alle Knoten und alle Kanten, die vorher mit l beschriftet waren, nun mit der ersten Beschriftung aus der Men-ge L belegt. Dadurch eventuell entstehende redundante Kanten werden entfernt.

Dasselbe passiert, wenn die Beschriftung von Kanten modifiziert wird.

Außerdem ist es mittels derimportGraph- undexportGraph-Funktion m¨oglich, ei-ne Graph-Instanz ein- bzw. auszulagern. Man kann auch direkt eiei-ne entsprechende Datei mit der .graph-Endung im Ordner /graphs/ anlegen und die gew¨

unsch-ten Befehle in der Datei abspeichern. Damit ist unter Umst¨anden eine flexiblere Handhabung mit h¨aufig verwendeten Graphinstanzen m¨oglich. Abbildung 10 zeigt eine solche Beispieldatei:

1 # F I L E C R E A T E D : So May 04 2 0 1 4 1 7 : 2 7 : 1 0 M E S Z

2

3 c r e a t e G r a p h g1

4 a d d L a b e l g1 1

5 a d d L a b e l g1 2

6 a d d L a b e l g1 3

7 a d d L a b e l g1 4

8 a d d L a b e l g1 a

9 a d d L a b e l g1 b

10 a d d L a b e l g1 c

11 a d d L a b e l g1 d

12 a d d N o d e g1 a a

13 a d d N o d e g1 b b

14 a d d N o d e g1 c c

15 a d d N o d e g1 d d

16 a d d E d g e g1 a b 1

17 a d d E d g e g1 a d 2

18 a d d E d g e g1 b c 3

19 a d d E d g e g1 c e 4

Abbildung 10: Graph-Instanz nach dem Exportieren als Datei Alle Zeilen, die mit einem

”#“ Zeichen beginnen, stellen Kommentare dar und werden beim Einlesen – genauso wie leere Zeilen – ignoriert. Außerdem simuliert der Interpreter beim Einleseprozess die Befehle als Eingaben des Benutzers selbst, so dass dieser immer direkt R¨uckmeldung erh¨alt, ob Fehler aufgetreten sind oder ob die Ausf¨uhrung erfolgreich war. Außerdem m¨ussen die jeweiligen Befehle ein-zeln in einer Zeile stehen.

Damit sei der Interpreter nun vollst¨andig pr¨asentiert und die Nutzungsart verdeut-licht. Als abschließende Betrachtung im Design soll nun noch ¨uber die angedachte Datenspeicherung und weitere Einzelheiten informiert werden.