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.