Visualisierung von Algorithmen Petra Hahnfeld Betreuer: Dr. Andreas Kerren Seminar Softwarevisualisierung SS 2006 TU Kaiserslautern 25. Juli 2006 1 Inhaltsverzeichnis 1 Einleitung 2 2 Concept Keyboards 2.1 Grundsätzliche Idee . . . . . . . . . . . . . . . 2.2 Concept Keyboard . . . . . . . . . . . . . . . . 2.3 Erzeugung eines Concept Keyboards . . . . . . 2.3.1 Anforderungen an die Implementierung 2.3.2 Konfiguration des Concept Keyboards . 2.4 Ergebnisse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 4 4 5 7 3 Shape Analysis 3.1 Abstrakte Darstellung eines Algorithmus . . . 3.2 Shape Analysis . . . . . . . . . . . . . . . . . 3.3 Verarbeitung der Ausgabe der Shape Analysis 3.4 Partitionierung von Shape Graphen . . . . . . 3.5 Visualisierung der Shape Graphen . . . . . . 3.5.1 Eingebettete Visualisierung . . . . . . 3.5.2 V-Knoten Visualisierung . . . . . . . . 3.5.3 Simultane Visualisierung . . . . . . . . 3.6 Zukünftige Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 9 12 13 14 14 15 16 16 . . . . . . . . . 4 Visualisierung dynamischer Graphen 17 4.1 Constraint Programmierung . . . . . . . . . . . . . . . . . . . . . 17 4.2 Visualisierung von Aktivitätsgraphen . . . . . . . . . . . . . . . . 18 4.3 Visualisierung von Einflüssen von Variablen . . . . . . . . . . . . 21 5 Zusammenfassung 24 1 1 EINLEITUNG 2 Einleitung Ein großer Aspekt in der Visualisierung von Algorithmen liegt in seinem pädagogischen Nutzen. Die graphische Darstellung ermöglicht ein besseres Verständnis des Algorithmus und tiefere Einblicke in dessen Struktur. Die Visualisierung erlaubt es, die wichtigen Abläufe und Zustände darzustellen und weniger wichtige zu vernachlässigen, um die Grundidee besser zu verdeutlichen. Somit dient sie sowohl als Erklärungshilfe für Lehrer als auch als wichtiges Lerninstrument für Schüler. Neben dem pädagogischen Wert erlaubt sie auch eine verbesserte Analyse eines Algorithmus und kann somit zu dessen Optimierung beitragen. In der folgenden Arbeit werden drei unterschiedliche Ansätze zur Visualisierung von Algorithmen vorgestellt. Die ersten beiden Verfahren (Abschnitt 2 und Abschnitt 3) dienen hauptsächlich als Erklärungshilfe von Algorithmen. In Abschnitt 2 werden Concept Keyboards eingeführt. Hierbei handelt es sich um Hardware-Tastaturen, welche die Schnittstelle zwischen Benutzer und den Methoden eines Algorithmus darstellen. Neben dem pädagogischen Nutzen wird die Erstellung und Funktionsweise eines solchen Keyboards erläutert. Abschnitt 3 beschreibt ein Verfahren zur Visualisierung einer abstrakten Darstellung eines Algorithmus. Als Werkzeug für die abstrakte Darstellung wird die Shape Analysis eingeführt. Nach der Beschreibung dieses Werkzeuges wird auf verschiedene Möglichkeiten zur Visualisierung der Ausgabe einer Shape Analysis eingegangen. Das letzte Verfahren (Abschnitt 4) betrachtet die Visualisierung als Optimierungshilfe eines vorhandenen Algorithmus. Das Verfahren bezieht sich speziell auf die Visualisierung von Lösungsverfahren der constraint Programmierung. Der erste Teil dieses Abschittes erläutert das Prinzip der constraint Programmierung. Anschließend werden Aktivitätsmatrizen betrachtet, welche das Lösungsverfahren eines Problems der constraint Programmierung visualisieren. Es folgen abschließend zwei Beispiele, welche die Verwendung der Aktivitätsmatrizen verdeutlichen. 2 CONCEPT KEYBOARDS 2 2.1 3 Concept Keyboards Grundsätzliche Idee Bei den meisten Werkzeugen zur Visualisierung von Algorithmen handelt es sich um sogenannte Step-by-step-Verfahren. Hierbei sind Kontrollkonsole der Visualisierung und graphische Repräsentation des Algorithmus nicht getrennt, sondern auf dem gleichen Bildschirm dargestellt. Üblicherweise initialisiert der Benutzer die Visualisierung, indem er den Typ der Visualisierung festlegt, die Schnelligkeit der Animation und das Detail der einzelnen Abfolgeschritte. Während der Animation kann der Benutzer vorwärts und rückwärts navigieren. Zusätzlich sind häufig noch eine Undo-Funktionalität und eine Reset-Funktion implementiert (siehe Abbildung 1). Abbildung 1: Typische Step-by-Step Oberfläche [1] Der größte Nachteil oben genannter Visualisierungen ist, dass der Benutzer stark in seinem Eingreifen eingeschränkt ist. Es wird zwar eine graphische Repräsentation angeboten, der Benutzer hat aber nicht die Chance, direkt einen Algorithmus zu kontrollieren und zu entdecken. Statt nur vorwärts und rückwärts zu navigieren, sollte der Benutzer mehr in das Geschehen des Algorithmus eingebunden werden und sollte diesen aktiv benutzen können. Das heißt, er sollte sich durch die vorhandene Datenstruktur bewegen können und die Aktionen des Algorithmus ausführen können. Vorangegangene Studien haben gezeigt, dass höhere Manipulationsmöglichkeiten des Benutzers das Verständnis von Algorithmen verbessert. What learners do, not what they see, may have the greatest impact ” on learning.“ (Hundhausen [3]) Um dem Benutzer mehr Möglichkeiten des Eingriffs in den Algorithmus zu geben, wurden sogenannte Concept Keyboards entwickelt. 2.2 Concept Keyboard Ein Concept Keyboard dient als Schnittstelle zwischen Benutzer und den Methoden des Algorithmus. Es handelt sich um ein flaches, berührungs-sensitives Keyboard, welches sich am Computer anschließen lässt (siehe Abbildung 2). Im Gegensatz zu herkömmlichen Keyboards hat jede Taste eine spezielle Bedeutung (ein Konzept) statt nur zum Beispiel einem Zeichen. Jede Taste stellt eine Methode in der Implementierung des Algorithmus dar. Um nur Methoden darzustellen, die für das Verständnis des Algorithmus von Bedeutung sind, beschränkt man sich auf eine Auswahl einiger Methoden. Diese Auswahl kann vom Benutzer mithilfe einer Software (siehe Abschnitt 2.3.2) angepasst werden. Wird 2 CONCEPT KEYBOARDS 4 eine Taste auf dem Concept Keyboard gedrückt, führt der Algorithmus die entsprechende Methode aus und die Visualisierung auf dem Bildschirm ändert sich dementsprechend. Der Benutzer kann also direkt die einzelnen Aktionen des Algorithmus ausprobieren und somit verstehen lernen. Dies steht in starkem Unterschied zu den gewöhnlichen Step-by-Step Verfahren, wo es nicht möglich ist, auf die Struktur des Algorithmus zuzugreifen. Um den Algorithmus einer möglichst breiten Personengruppe nahezubringen, sind die Tasten sehr groß gestaltet und können zusätzlich mit MultimediaEffekten wie zum Beispiel einer akustischen Ausgabe (Sprache oder Töne) oder passenden Icons belegt werden. Dies macht diese Keyboards auch für behinderte Personen nutzbar. Neben der Verwendung von eigens dafür hergestellten Keyboards, lässt sich ein Concept Keyboard auch durch das Programmieren von Touch Screens oder Tablets erstellen. Abbildung 2: Concept Keyboard (für AVL-Algorithmus) [1] 2.3 2.3.1 Erzeugung eines Concept Keyboards Anforderungen an die Implementierung Grundlage für die Erstellung eines Concept Keyboards bilden bereits vorhandene Implementierungen von Algorithmen, die eine Visualisierung anbieten. Der ideale Fall wäre dann, wenn sich das Concept Keyboard automatisch aus der Implementierung des Algorithmus selbst erzeugt. Diese Vorgehensweise hätte allerdings zur Folge, dass das Concept Keyboard alle Methoden und Strukturen des Algorithmus darstellt, auch diejenigen, die zwar zum Funktionieren des Algorithmus notwendig sind, aber nicht zum Verständnis des Algorithmus beitragen und somit nur verwirren. Aufgrunddessen verwendet man eine semiautomatische Prozedur zur Erstellung des Keyboards. Diese Prozedur verlangt einige Einschränkungen an die Implementierung des Algorithmus: 2 CONCEPT KEYBOARDS 5 • Methoden sollten so implementiert werden, dass sie das Objekt, welches sie referenzieren, als intrinsischen Parameter enthalten. Das heißt zum Beispiel, dass statt einer Funktion rotate(x) üeber einer Baumstruktur mit x als rechtes oder linkes Kind eine Funktion rotateLeft() oder rotateRight() gewählt werden sollte. Diese Einschränkung führt zu einer Erstellung eines einfacheren und verständlicheren Concept Keyboards. • Jedes Objekt, welches als Argument einer Methode benutzt wird, muss einen Konstrukor besitzen, der einen String als Parameter bekommt (Ausnahme hierbei sind primitive Datentypen). Somit hat jedes Objekt direkt einen Namen und kann in der Visualisierung besser dargestellt werden. Um nun eine Visualisierung des Algorithmus auf dem Bildschirm zu erzeugen, muss wie schon oben erwähnt jede Implementierung eine Methode besitzen, die für die graphische Darstellung verantwortlich ist. Damit das Concept Keyboard diese automatisch ansprechen kann, muss diese Methode von einer festgelegten festen Graphik-Klasse abstammen. Die Übergabe einer Initialisierungsdatei an den Algorithmus muss ebenfalls standardisiert sein. 2.3.2 Konfiguration des Concept Keyboards Um die Visualisierung des Algorithmus mit Hilfe des Concept Keyboards durchführen zu können, muss dieses zuerst konfiguriert werden. Dies geschieht mit Hilfe einer speziell dafür entwickelten Software, welche sowohl die Konfiguration als auch die darauf folgende Visualisierung durchführt. Die Konfiguration gliedert sich in mehrere Schritte: 1. Auwahl der Methoden: Im ersten Konfigurationsfenster (siehe Abbildung 3) sind alle Methoden aufgeführt, welche der Algorithmus zur Verfügung stellt. Der Designer des Concept Keyboards entscheidet hier, welche Methoden das Keyboard später anbietet. Die ausgewählten Methoden entsprechen dann jeweils einer Taste. Jeder Methode (bzw. Taste) kann zusätzlich eine kurze Beschreibung hinzugefügt werden. Die Auswahl der Methoden sollte sinnvoll erfolgen. Es sollten nur diejenigen Methoden ausgewählt werden, welche zum Verständnis des Algorithmus beitragen. Abhängig vom Erfahrungsgrad des Benutzers besteht hier auch die Möglichkeit, den Informationsgehalt zu erhöhen oder erniedrigen. Je mehr Methoden für den Benutzer bereitgestellt werden, desto mehr erhält dieser Einsicht in den Ablauf des Algorithmus, desto schwieriger ist es dann allerdings auch für einen Einsteiger, diesen zu verstehen. Die Konfigurationsdaten werden anschließend in einer XML-Datei gespeichert ( Daten-XML-Datei“). (siehe Abbildung 4) ” 2. Erstellen eines Layouts: Im zweiten Konfigurationsfenster (siehe Abbildung 5) kann der Designer die Position jeder einzelnen Taste mittls drag-and-drop bestimmen. Auch hier sollte eine sinnvolle Anordung gewählt werden, um den Lernerfolg zu erhöhen. So sollte zum Beispiel eine rotateRight-Taste rechts angeordnet 2 CONCEPT KEYBOARDS 6 Abbildung 3: Konfigurationsfenster für die Methodenauswahl [1] werden. Neben der Wahl des Layouts kann hier jedem Button ein Name gegeben werden und zwei Sound-Dateien zugeordnet werden, welche abgespielt werden, wenn die Taste gedrückt wird oder der Benutzer über die Taste wandert. In diesem Fenster wird auch die Initialisierungsdatei festgelegt. Die Modifikationen werden wie oben in einer zweiten XML-Datei gespeichert ( Keyboard XML-Datei“). ” Nachdem die Konfiguration des Keyboards abgeschlossen ist, kann die Visualisierung aufgerufen werden. Diese wird in vier Fenstern angezeigt: Ein Dateneingabefenster, in dem sowohl Daten eingegeben werden können als auch Daten zu bestimmten Objekten angezeigt werden, ein Informationsfenster, ein Fenster, welches das Concept Keyboard zeigt (falls dieses nicht in Hardware vorhanden ist) und ein Fenster für die eigentliche Visualisierung des Algorithmus. Abbildung 6 und Abbildung 7 zeigen das Dateneingabefenster und das Fenster für die graphische Darstellung. Während der Visualisierung ist es möglich, auch andere Concept Keyboards oder andere Layouts, die für diesen Algorithmus erstellt wurden, zu laden. Somit kann jeder Benutzer ensprechend seiner Lernstufe das für ihn am besten geeignete Keyboard benutzen. Erfahrenere Benutzer haben zudem die Möglichkeit, selbst ein Concept Keyboard zu konfigurieren. 2 CONCEPT KEYBOARDS 7 Abbildung 4: Ausschnitt aus der Daten-XML-Datei [1] 2.4 Ergebnisse Um den pädagogischen Wert von Concept Keyboards zu untersuchen, wurden zwei Untersuchungen mit Studenten durchgeführt. Beide Gruppen bekamen eine Auswahl an Concept Keyboards für verschiedene Algorithmen (Sortieralgorithmen, Graphenprobleme, Algorithmen über Baumstrukturen), sollten diese testen und anschließend einen Fragebogen dazu beantworten. Bei beiden Gruppen waren nur 17 bzw. 18 Studenten beteiligt. Die Studenten hatten entweder ein Informatik-Studium schon hinter sich oder befanden sich im Grundstudium. Die Auswertung der Fragebogen ergab insgesamt ein sehr positives Feeback. Die Studenten fanden das Concept Keyboard sehr benutzerfreundlich und stellten fest, dass die Möglichkeit zur Interaktion mit dem Algorithmus ein besseres und tieferes Verständnis desselben mit sich bringt. Es sei gut, das Problem selbst zu lösen, statt beim Ablauf des Algorithmus nur zuzusehen. Auf der anderen Seite wurde auch festgestellt, dass Studenten ohne Vorkenntnisse eines bestimmten Algorithmus ein Concept Keyboard, welches ein Step-by-Step Verfahren simuliert, bevorzugten. Die Bereitstellung von Erklärungstexten während der Visualisierung waren hilfreich. Da eine statistische Aussage durch zwei Untersuchungen nicht möglich ist, werden weitere Tests folgen, welche sich auch mit anderen Personengruppen beschäftigen und weitere Möglichkeiten wie zum Beispiel die Verwendung von Sound und Icons untersuchen. 2 CONCEPT KEYBOARDS 8 Abbildung 5: Konfigurationsfenster für das Layout [1] Abbildung 6: Dateneingabefenster [1] Abbildung 7: Fenster zur graphischen Darstellung [1] 3 SHAPE ANALYSIS 3 9 Shape Analysis 3.1 Abstrakte Darstellung eines Algorithmus Die meisten Visualisierungen von Algorithmen benötigen konkrete Eingangsdaten, um den jeweiligen Algorithmus zu initialisieren. Die Ausführung des Algorithmus hängt dann von diesen Daten ab. Mit diesem Verfahren ist es jedoch schwierig, Gemeinsamkeiten in der Durchführung verschiedener Datensätze herauszufinden. Abhilfe hierbei kann eine abstrakte Darstellung des Algorithmus schaffen, die ohne konkrete Eingabedaten auskommt. Aus dieser abstrakten Darstellung können dann direkt die Gemeinsamkeiten und Unterschiede erkannt werden, was dem Benutzer ein tieferes Verständnis des Algorithmus bietet und diesen von tatsächlichen Daten loslöst. Eine Methode zum Finden solcher Gemeinsamkeiten ist Shape Analysis (siehe Abschnitt 3.2). Da die Datenmenge, welche die Shape Analysis als Ausgabe liefert, sehr groß ist, beschäftigt sich Abschnitt 3.3 damit, diese Datenmenge zu verkleinern und macht sie somit für die Visualisierung nutzbar. 3.2 Shape Analysis Shape Analysis beruht auf einer abstrakten Beschreibung der dem Algorithmus zugrunde liegenden Datenstruktur. Hit Hilfe dieser Beschreibung ist es möglich, eine abstrakte Durchführung eines Algorithmus zu betrachten. Eine Shape Analysis beruht auf einer 3-Werte Logik. Um diese Analyse zu spezifizieren, sind vier Festlegungen notwendig: 1. Festlegung eines Vokabulars, auf dem man arbeitet. 2. Definition von Prädikaten: Diese beschreiben die Eigenschaften der Datenstruktur. 3. Erstellung von Aktionen: Jede Programmanweisung definiert eine Aktion auf der Datenstruktur. 4. Festlegung initialer Shape Graphen. Die Vorgehensweise und Ausgabe einer Shape Analysis wird im Folgenden am Beispiel der Suche eines Elementes in einem Binärbaum gezeigt. 3 SHAPE ANALYSIS Prädikat root(v) x(v) r[root](v) r[x](v) ancest[root](v) ancest[x](v) left(v1, v2) right(v1, v2) 10 Bedeutung Zeigt root auf v ? Zeigt x auf v ? Ist v von root erreichbar? Ist v von x erreichbar? Ist v ein Vorfahr von root? Ist v ein Vorfahr von x ? Ist v1.left = v2 ? Ist v1.right = v2 ? Tabelle 1: Prädikate zur Beschreibung der Datenstruktur //Datenstruktur für Baumelemente type tree = data: integer left: pointer to tree right: pointer to tree //Baumsuche: sucht ein Element el.data im Baum x := root while (x != NULL and x.data != el.data) do if(el.data < x.data) x := x.left else x := x.right od Um eine Shape Analysis für diesen Algorithmus zu erstellen, beginnt man mit der Beschreibung der Eigenschaften der Baumstruktur. Diese erfolgt aufgrund der Festlegung logischer Prädikate, welche über einem Vokabular gebildet werden. Erlaubt sind drei verschiedene Arten von Prädikaten: • Prädikate mit nur einem Argument: Diese beschreiben die Eigenschaften einer Zelle der Datenstruktur (hier also eines Baumknotens) • Prädikate mit zwei Argumenten: Diese beschreiben die Eigenschaften zwischen zwei Zellen der Datenstruktur • Prädikate ohne Argument: Diese beschreiben Eigenschaften der gesamten Struktur Die Argumente der Prädikate sind hierbei die Zellen der Datenstruktur. Um nun die oben aufgeführte Datenstruktur zu beschreiben, werden Prädikate (siehe Tabelle 1) festgelegt. Hierbei bedeutet zum Beispiel root(v): root(v) = true, falls die Zeiger-Variable root auf die Zelle v zeigt, sonst false. In der Auswahl der Prädikate ist man nicht festgelegt. Sie sollte jedoch so erfolgen, dass sie eine sinnvolle Repräsentation der Datenstruktur ist. Die Anzahl der Prädikate stellt zudem den Detaillevel ein, welches man für die Visualisierung verwenden möchte. Je mehr Prädikate verwendet werden, desto genauer wird die zugrunde liegende Datenstruktur beschrieben. 3 SHAPE ANALYSIS 11 Abbildung 8: Beispiel Shape Graph nach mehreren Schleifendurchläufen [4] Die Darstellung der Datenstruktur an einem bestimmten Programmpunkt des Algorithmus wird in sogenannten Shape Graphen ausgedrückt. Abbildung 8 zeigt solch einen Graphen, der nach mehreren Schleifendurchläufen entstanden ist. In der Abbildung sind zwei Arten von Knoten erkennbar: Knoten mit nur einer Umrandung stellen einzelne Zellen dar; Knoten mit doppelter Umrandung stellen eine Klasse von Zellen dar, welche die gleichen Eigenschaften (Prädikate) besitzt. Ist der Name eines Prädikats im Knoten angegeben, so ist dieses Prädikat für alle Zellen, die dieser Knoten umfasst, wahr. Fehlt der Name, ist es falsch. Zwischen den einzelnen Knoten sind die zweiwertigen Prädikate aufgeführt. So gehört zum Beispiel das linke Kind von root zu den Zellen, welche die Eigenschaft Vorfahr von x“ und kann von root erreicht werden“, erfüllen. Da ” ” allerdings nicht alle Zellen, die diese beiden Prädikate erfüllen, linke Zellen von root sind, ist der Wert des Prädikats left zwischen diesen Knoten weder wahr noch falsch (3-Werte-Logik). Dies wird durch eine gestrichelte Linie angezeigt. Um den Algorithmus auszuführen, wird zu Beginn eine Menge von initialen Shape Graphen erstellt, welche die Ausgangsspeicherstrukturen darstellen. Zusätzlich wird für jede Anweisung im Algorithmus eine Aktion festgelegt. Diese Aktion beschreibt, wie sich die Anweisung auf die Werte der Prädikate auswirkt, wie also die Shape Graphen durch diese Anweisung verändert werden. 3 SHAPE ANALYSIS 12 Die Shape Analysis startet dann mit den initialen Shape Graphen und führt nachfolgend die Aktionen aus, welche zum Kontrollfluss des Algorithmus gehören. Am Ende der Berechnung erhält man dann für jeden Programmpunkt eine Menge von Shape Graphen. Die Menge an Shape Graphen für jeden Programmpunkt beschreiben somit alle möglichen Datenstruktur-Konfigurationen für diesen Programmpunkt. 3.3 Verarbeitung der Ausgabe der Shape Analysis Da die Shape Analysis bei der Ausführung eines Algorithmus für jeden Programmpunkt eine Menge an Shape Graphen liefert, ist die Ausgabe dieser Analyse zu komplex für die Visualisierung. Das Hauptziel besteht nun darin, diejenigen Graphen zu finden und darzustellen, welche am besten dazu geeignet sind, den Algorithmus zu verstehen. Abbildung 9: Maximaler Shape Graph nach einigen Schleifendurchläufen [4] Betrachtet man Abbildung 8 und Abbildung 9 (beides Shape Graphen, die während eines Durchlaufs des Algorithmus erzeugt wurden), stellt man fest, dass die dort dargestellten Shape Graphen bezüglich des Pfades, der während 3 SHAPE ANALYSIS 13 des Suchvorgangs gebildet wurde, gleich sind. Sie unterscheiden sich lediglich in den Teilgraphen, welche entlang des Pfades herabhängen. Die Idee besteht nun darin, die Menge der Shape Graphen für einen Programmpunkt zu betrachten und in dieser Menge ähnliche Graphen jeweils zu Klassen zusammenzufassen. Ähnliche Graphen bedeutet in diesem Zusammenhang, dass sie einen gemeinsamen Teilgraphen haben. Der gemeinsame Teilgraph von Abbildung 8 und Abbildung 9 wäre dann der Graph in Abbildung 10. Man partitioniert also jede Menge von Shape Graphen in Klassen. Abbildung 10: Gemeinsamer Untergraph [4] 3.4 Partitionierung von Shape Graphen Die Partitionierung von Shape Graphen eines Programmpunktes in Klassen erfolgt durch die Festlegung einer Prädikatenmenge. Definition 1 (Untergraph) Sei D eine Untermenge der Prädikate, welche für die Spezifikation der Analysis erstellt wurden. Sei S ein Shape Graph. Der Untergraph von S, der von D induziert wird, ist wie folgt definiert: 1. Er besteht aus allen 0-wertigen Prädikaten von D. 3 SHAPE ANALYSIS 14 2. Er besteht aus allen Knoten v von S, so dass es ein 1-wertiges Prädikat p ∈ D gibt mit p(v) ≥ 1/2. 3. Die Binär-Prädikate zwischen diesen Knoten sind Binär-Prädikate aus D, reduziert auf die neue Knotenmenge. Definition 2 (Äquivalenz) Sei D eine Untermenge der Prädikate, welche für die Spezifikation der Analysis erstellt wurden. Seien S und T zwei Shape Graphen, welche zum selben Programmpunkt gehören. Man nennt S und T äquivalent in Bezug auf D, falls ihre Untergraphen, die von D induziert werden, gleich sind. Alle Graphen, welche äquivalent sind, fasst man dann zu einer Äquivalenzklasse zusammen, so dass man nicht mehr alle einzelnen Graphen eines Programmpunktes betrachtet, sondern die aus den Graphen entstehenden Klassen. Beispiel: Sei D = {root, x, ancest[x]} ∪ {lef t, right} die Prädikatenmenge, welche die Partitionierung bestimmt. Dann ist der von D induzierte Untergraph von Abbildung 8 und Abbildung 9 der Graph in Abbildung 10. Durch die Festlegung der Prädikatenmenge D hat man also eine Partitionierung der Menge an Shape Graphen zu jedem Programmpunkt in Äquivalenzklassen bezüglich D erreicht. Diese Äquivalenzklassen kann man abhängig von der Wahl von D vergrößern oder verkleinern. Wählt man eine größere Menge D, so entspricht dies einer Verfeinerung für die Partitionierung. Das heißt, es gibt dann mehr Äquivalenzklassen. Somit werden dann mehr Unterschiede für jeden Programmpunkt gezeigt. Mit der Wahl von D lässt sich somit also auch die Menge an Details einstellen, die man in der Visualisierung zeigen möchte. 3.5 Visualisierung der Shape Graphen Nachdem nun die Einteilung der Shape Graphen in Klassen erfolgt ist, benötigt man eine Darstellung, um die einzelnen Klassen zu visualisieren. Im Folgenden sind daher drei Methoden aufgeführt, wie dieses realisiert werden kann. 3.5.1 Eingebettete Visualisierung Da es oftmals zu viele Shape Graphen in einer Klasse gibt, um diese alle darzustellen, wählt man einige repräsentative Shape Graphen zur Visualisierung aus und verwirft die restlichen. Die verbleibenden Shape Graphen werden für jeden Programmpunkt gleichzeitig angezeigt. Betrachtet man eine Klasse von Shape Graphen, gibt es oftmals Situationen, in denen Shape Graphen in anderen Shape Graphen eingebettet sind. Einbettung bedeutet, dass es Shape Graphen S und T gibt, so dass T einen Zustand beschreibt, der den Zustand von S umfasst. S ist dann eingebettet in T . Beispiel: Betrachte nochmals die Prädikatenmenge D, wie sie in Abschnitt 3.4 festgelegt wurde. In der Klasse, die den Graphen aus Abbildung 10 enthält, liegen auch die 3 SHAPE ANALYSIS 15 Shape Graphen aus Abbildung 8 und 9. Der Shape Graph S aus Abbildung 8 kann nicht in den Graphen T aus Abbildung 9 eingebettet werden, da in S genau eine Zelle von x erreicht werden kann, in T aber mindestens zwei Zellen erreichbar sein müssen. Wäre in S unter dem Knoten, der von x referenziert wird, noch ein weiterer Knoten, so könnte man S in T einbetten. Die Vorgehensweise der eingebetteten Visualisierung ist es nun, alle Shape Graphen einer Klasse zu verwerfen, welche in andere Shape Graphen eingebettet werden können, da diese im Prinzip redundante Information enthalten. Dies reduziert die Zahl der Shape Graphen oft sehr stark. 3.5.2 V-Knoten Visualisierung Auch bei dieser Visualisierungsart verwirft man bestimmte Shape Graphen einer Klasse und stellt die restlichen gleichzeitig dar. In der Shape Analysis sind nur Knoten darstellbar, welche genau eine Zelle repräsentieren (einfache Umrandung) oder Knoten, welche eine oder mehrere Zellen zusammenfassen (doppelte Umrandung). Es gibt keinen Knoten, der ausdrückt, dass an dieser Stelle keine Zelle oder mehrere Zellen stehen können. Abbildung 11: Shape Graph mit virtuellen Knoten zur Visualisierung [4] 3 SHAPE ANALYSIS 16 Zu Visualisierungszwecken führt man nun dieses Konzept ein und nennt die entstehenden Knoten virtuelle Knoten. Abbildung 11 zeigt einen solchen Graphen. Die virtuellen Knoten sind grau markiert. Um nun die Anzahl der Shape Graphen in einer Klasse zu reduzieren, bedient man sich wieder der oben eingeführten Einbettung. Vor der Einbettung ist es jedoch erlaubt, die virtuellen Knoten zu entfernen und erst danach die Einbettung durchzuführen. Hierdurch erreicht man eine Verringerung der Graphenanzahl im Vergleich zu Methode 3.5.1. Der Graph aus Abbildung 8 kann dann auch in den Graphen aus Abbildung 9 eingebettet werden. 3.5.3 Simultane Visualisierung Diese Visualisierung stellt den einfachsten Ansatz dar. Sie nimmt einfach alle Shape Graphen einer Klasse und visualisiert diese gleichzeitig oder nacheinander. Möglich ist dies jedoch nur, wenn nur wenige Shape Graphen erzeugt wurden, da diese Art der Ausführung sonst sehr unübersichtlich wird. 3.6 Zukünftige Arbeit Die in diesem Abschnitt dargestellten Ideen wurden bis jetzt noch nicht in die Realität umgesetzt. Die gezeigten Shape Graphen verdeutlichen nur die Konzepte, stellen jedoch noch nicht die eigentliche Visualisierung dar. Zur graphischen Darstellung der Graphen müsste man sich überlegen, welche Positionen für bestimmte Knoten gut geeignet sind, welche Farben man verwendet und wie man die Ausführungsreihenfolge des Algorithmus, also die einzelnen aufeinanderfolgenden Shape Graphen, darstellt. 4 VISUALISIERUNG DYNAMISCHER GRAPHEN 4 17 Visualisierung dynamischer Graphen Der folgende Abschnitt beschäftigt sich mit der Visualisierung dynamischer Graphen, welche zur Darstellung von Lösungsverfahren zu Problemen der constraint Programmierung entstehen können. 4.1 Constraint Programmierung Ein endliches Problem der constraint Programmierung besteht aus den folgenden Elementen: • eine endliche Menge von Variablen V • eine endliche Menge D, welche alle möglichen Werte für die Variablen in V enthält • eine Funktion, welche jeder Variable v einen Definitionsbereich aus D zuweist • eine endliche Menge C von Bedingungen. Jede Bedingung definiert eine Relation zwischen den Variablen aus V . Die Lösung eines solchen Problems ist die Zuweisung jeder Variablen v aus V zu jeweils einem Wert aus D, so dass alle Bedingungen aus C erfüllt sind. Es kann hierbei genau eine Lösung geben, mehrere Lösungen oder gar keine Lösung. Zur Lösung solcher Probleme wird ein sogenannter Löser (constraint-solver) verwendet, der mit einer bestimmten Bedingung beginnt, diese auswertet und dann nachfolgende Bedingungen, welche durch die Auswertung dieser Bedingung aktiviert werden, ebenfalls auswertet. Beispiel: Abbildung 12: Beispiel für die Arbeitsweise eines constraint-solvers [2] Abbildung 12 zeigt die Arbeitsweise eines Lösers anhand eines Problems mit drei Variablen x, y und z und zwei Bedingungen x > y und y > z. Zu Beginn sind die Definitionsbereiche aller drei Variablen die Menge {1, 2, 3}. Dies ist dargestellt durch jeweils drei leere Kästchen unter jeder Variable. Der Löser beginnt mit der Auswertung der ersten Bedingung. Diese führt zu einer Reduktion des Definitionsbereiches von x. x kann den Wert 1 nicht haben, da x > y sein muss. Die Löschung dieses Wertes ist in der Abbildung mit einem schwarzen Kästchen dargestellt. Als nächstes wird diese Bedingung nochmals ausgeführt, was zu der Löschung des Wertes 3 der Variable y führt. Betrachtet man nun die andere Bedingung, wird in der gleichen Weise zuerst der Wert 1 aus dem Definitionsbereich von y gelöscht und anschließend die Werte 2 und 3 aus dem Definitonsbereich von z. Als letztes kann dann nochmals die Bedingung x > y ausgeführt werden, so dass man eine eindeutige Lösung erhält. 4 VISUALISIERUNG DYNAMISCHER GRAPHEN 4.2 18 Visualisierung von Aktivitätsgraphen Da ein Problem aus der constraint Programmierung auch mehrere Lösungen besitzen kann und es möglich ist, dieses in unterschiedlicher Art und Weise vom Löser berechnen zu lassen, stellt sich schnell die Frage, welches der optimale Lösungsweg ist, der mit möglichst wenig Rechenaufwand erreichbar ist. Ein Ansatz dazu besteht darin, ein Netzwerk von Variablen und Bedingungen zu erstellen, welches die Abhängigkeiten voneinander zeigt. So zum Beispiel wären die Variablen x und y aus Abbildung 12 mit der Bedingung x > y verbunden und die Variablen y und z mit der Bedingung y > z. Um noch anzuzeigen, wie oft eine solche Beziehung in der Lösung genutzt wird, weist man jeder Kante einen Aktivitätswert zu. Der Aktivitätswert drückt aus, wie oft die Beziehung über ein bestimmtes Zeitintervall benötigt wurde. Das so entstehende Netzwerk wird Aktivitätsnetzwerk genannt. Ein Beispiel für ein solches Aktivitätsnetzwerk ist in Abbildung 13 gezeigt. Die einzelnen Knoten dieses Graphen stellen jeweils eine Bedingung dar. Existiert ein Pfeil zwischen zwei Bedingungen, bedeutet dies, dass die Auswertung einer Bedingung zur Aktivierung der Auswertung einer anderen Bedingung geführt hat. Unter den Pfeilen ist dann der jeweilige Aktivitätswert für diese Beziehung angegeben. Abbildung 13: Beispiel für ein Aktivitätsnetzwerk aus Bedingungen Verwendet man zur Darstellung dieser Aktivitätsnetzwerke Graphen mit Knoten und Kanten wie in Abbildung 13 gezeigt, wird die Darstellung sehr schnell unübersichtlich. Eine Lösung dieses Problems ist die Darstellung von Aktivitätsnetzwerken mit Hilfe von Matrizen. Es handelt sich hierbei um (N x N )-Matrizen, wobei N die Anzahl an Knoten im Graphen ist. Jede Reihe bzw. Spalte steht für einen Knoten. Sind zwei Knoten miteinander verbunden, wird das enstprechende Feld in der Matrix mit dem Aktivitätswert belegt, den die Kante zwischen den beiden Knoten hat, ansonsten mit 0. In der graphischen Darstellung der Matrix werden die Aktivitätswerte durch Farben dargestellt. Je höher der Aktivitätswert, desto dunkler das Feld in der Matrix. Führt man nun die Berechnung auf einem Problem durch, erhält man eine sich über die Zeit ändernde Matrix. In dieser Matrix ist dann eine komplette Historie für die bisherige Aktivität zwischen den Knoten sichtbar. In der Visualisierung ist es möglich, entweder die Aktivität über dem gesamten Verlauf der Berechnung zu betrachten oder zwischen zwei bestimmten Zeitpunkten in der Berechnung. 4 VISUALISIERUNG DYNAMISCHER GRAPHEN 19 Der Vorteil dieser Darstellung in Matrizen liegt darin, dass es keine Überschneidungen wie bei der Darstellung mit Graphen gibt. Jede Verbindung kann direkt betrachtet werden. Nachteil dieser Darstellungsart ist jedoch, dass ungeübte Benutzer eine gewisse Eingewöhnungszeit benötigen, um die Darstellungen richtig lesen zu können, da hier die Knoten des Netzwerks im Gegensatz zu Graphen über beide Achsen der Matrix verteilt sind. Beispiel der Visualisierung von Aktivitätsnetzwerken: Folgendes Problem ist gegeben: Eine Variablenmenge mit 100 Variablen, welche jeweils den Definitionsbereich [1..100] haben und 99 Bedingungen: ∀i ∈ [1, 99] : xi < xi+1 . Abbildung 14: Aktivitätsmatrix der Bedingungen [2] Dieses Problem besitzt eine eindeutige Lösung. Abbildung 14 zeigt die Aktivitäts-Matrix der einzelnen Bedingungen, welche durch den Löser entstanden ist. Die Spalten bzw. Reihen der Matrix enthalten der Reihe nach alle oben genannten Bedingungen. Aktivität zwischen zwei Bedingungen bedeutet hier, dass die Auswertung einer Bedingung auf die Variablen die Auswertung einer anderen Bedingung nach sich gezogen hat. Die Auswirkungen auf die Variablen wurde in dieser Matrixdarstellung weggelassen. Bei der Betrachtung der Matrix lässt sich folgendes beobachten: • Es existiert eine starke Interaktivität zwischen Bedingungen, welche nahe beieinander liegen (im Sinne der Festlegungsreihenfolge des gegebenen Prolbems). Dies ist erkennbar durch den insgesamt dunkleren Bereich an der Diagonale. • Alle Bedingungen stehen miteinander in Beziehung, das heißt, jede wirkt sich auf jede andere aus. Dies ist dadurch erkennbar, dass die Matrix keine leeren Felder aufweist (außer die leeren Felder auf der Diagonale der Matrix, die immer dort sind, da eine Bedingung sich nicht auf sich selbst auswirkt). • Je weiter die Bedingungen auseinander liegen, desto weniger interagieren diese. 4 VISUALISIERUNG DYNAMISCHER GRAPHEN 20 • Mittlere Bedingungen interagieren öfter miteinander als äußere Bedingungen (siehe den dunkleren Teil in der Mitte der Matrix). In Hinsicht auf die Arbeitsweise des Lösers kann man aus diesen Beobachtungen feststellen, dass dieser sehr lange für die Lösung des gegebenen Problems benötigt, da alle Bedingungen mehrmals miteinander interagieren. Um nun noch herauszufinden, warum die mittleren Bedingungen im Gegensatz zu den äußeren so oft miteinander interagieren, kann man sich die einzelnen Teilabschnitte des Lösungsverfahren ansehen. Abbildung 15 und Abbildung 16 zeigen sieben Zeit-Ausschnitte der Aktivitätsmatrix des Problems. Abbildung 15: Visualisierung der Arbeitsweise des Lösers. Von links nach rechts: Beginn der ersten Phase, Mitte der ersten Phase, Ende der ersten Phase, Wechsel der Phasen (entnommen aus [2]). Abbildung 16: Visualisierung der Arbeitsweise des Lösers. Von links nach rechts: Beginn der zweiten Phase, Mitte der zweiten Phase, Ende der zweiten Phase (entnommen aus [2]). Bei Betrachtung dieser Ausschnitte sind deutlich zwei Phasen zu erkennen, welche jeweils eine Forpflanzungswelle durch die einzelnen Bedingungen zeigen. Die erste Phase beginnt mit der Auswertung der letzten Bedingung (also der Auswertung von x99 < x100 ). Die Auswertung dieser Bedingung bewirkt das Anstoßen aller anderen Bedingungen. Dies lässt sich aus den Bildern für die erste Phase erkennen, da hier eine Ausbreitungswelle von der letzten Bedingung auf alle anderen sichtbar ist. Die erste Phase des Lösungsverfahrens resultiert in der Anpassung der oberen Grenzen der Variablen. Sind alle oberen Grenzen angepasst, erfolgt der Wechsel zur zweiten Phase. Hier lässt sich wieder eine Ausbreitungswelle ausgehend von der letzten Bedingung auf alle anderen Bedinungen erkennen. Der Löser verändert hier die unteren Grenzen der einzelnen Variablen. Nach Ablauf der zweiten Phase sind somit dann alle Variablen eindeutig zugewiesen. 4 VISUALISIERUNG DYNAMISCHER GRAPHEN 4.3 21 Visualisierung von Einflüssen von Variablen Die Effizienz einer Heuristik zur Lösung eines Problems hängt sehr stark von ihrer Fähigkeit ab, frühzeitig diejenigen Berechnungen zu verwerfen, welche zu keiner Lösung führen oder diese stark verzögern. Oftmals ist es daher von Vorteil, Variablen herauszufinden, welche einen großen Einfluss auf eine schnelle Lösung des Problems haben und daher die Berechnungszeit verkürzen. Der Einfluss einer Variablen kann entweder direkt oder indirekt sein. Direkt bedeutet hier, dass eine Variable direkten Einfluss auf die Reduktion des Definitionsbereiches einer anderen Variablen hat. Der indirekte Einfluss einer Variablen bezieht sich auf alle Reduktionen, die nachfolgend durch diese Variable angeregt wurden, lange nachdem die Variable in der Berechnung benutzt wurde. Der Einfluss einer Variablen v auf eine andere Variable y kann als die Anzahl angesehen werden, in der das Instanziieren von v eine Reduktion von y herbeigeführt hat. Hierbei wird sowohl der direkte als auch der indirekte Einfluss betrachtet. Die Darstellung der Einflüsse von Variablen kann großen Aufschluss darüber geben, ob eine Heuristik gut oder schlecht arbeitet und was die Gründe dafür sind. Das nachfolgende Beispiel verdeutlicht dies. Beispiel: Das folgende Beispiel beruht auf einer Menge von 30 Variablen. Auf diesen Variablen wurden sehr starke Bedingungen erstellt, so dass jeweils drei Mengen von Variablen entstehen, welche untereinander stark in Beziehung stehen, zu den anderen Mengen jedoch kaum Beziehungen haben. So sind dann also die ersten zehn Variablen stark miteinander verbunden, ebenso die Variablen zehn bis 19 und 20 bis 29. Von einer guten Heuristik, welche eine Lösung für das beschriebene Problem bietet, wird erwartet, dass sie dieser auferlegten Struktur folgt, das heißt, man sollte eine starke Aktivität innerhalb dieser drei Mengen erhalten und kaum Aktivität zwischen den Mengen. In Abbildung 17 ist die Struktur dargestellt. Man kann deutlich die drei Mengen erkennen, die zueinander in Beziehung stehen. Auf dieses Problem wird nun die MinDom-Heuristik angewandt. Diese wählt jeweils die Variable mit dem kleinsten Definitionsbereich aus und berechnet ausgehend von dieser die Auswirkungen auf andere Variablen. Abbildung 18 zeigt den Graphen für die Einflüsse der Variablen nach zweiminütiger Berechnung der MinDom-Heuristik (hier wurde abgebrochen). Es ist zu erkennen, dass die Variablen der ersten beiden Mengen starken Einfluss auf die Variablen aus der dritten Menge haben (blauer Kasten links unten). Dies lässt die Vermutung zu, dass die Heuristik irgendwo in der Berechnung eine schlechte Entscheidung getroffen hat, welche den Löser in sehr viele unnötige Berechnungsschritte auf die Variablen der dritten Menge geführt hat. Um genauer herauszufinden, wie die Heuristik gearbeitet hat, betrachtet man die Aktivitätsmatrix (siehe Abbildung 19). Diese Abbildung zeigt die Aktivität der Variablen untereinander nach zweiminütigem Durchlauf der MinDomHeuristik. Es ist deutlich erkennbar, dass der Löser ständig zwischen der ersten und der dritten Menge an Variablen hin- und herspringt (Farben sind sehr dunkel), die zweite Variablenmenge jedoch nur wenig Aktivität zeigt (Farben sind hier sehr hell). Vergleicht man nun Abbildung 18 mit Abbildung 19, stellt man fest, dass die Auswirkungen der Variablen aus der zweiten Gruppe starken Einfluss auf die dritte Gruppe hatten (Abbildung 18), die Aktivität zwischen der 4 VISUALISIERUNG DYNAMISCHER GRAPHEN 22 Abbildung 17: Struktur des Problems [2] zweiten und der dritten Gruppe jedoch sehr gering war (Abbildung 19). Dies bedeutet, dass der Löser schwache Entscheidungen auf den Variablen der zweiten Gruppe getroffen hat, die dann dazu führten, dass der Löser so viele irreführende Berechnungen auf die Variablen der dritten Menge unternommen hat. Um eine verbesserte Heuristik zu erhalten, wurde nun die obige Heuristik so angepasst, dass sie die Stärke des Einflusses der Variablen während der Berechnungszeit einbezieht und diejenigen Entscheidungen verwirft, deren Einflüsse übermäßig stark anwachsen. Als Ergebnis entsteht somit eine Heuristik, welche sehr gut die Struktur des Problems widerspiegelt (siehe Abbildung 20). 4 VISUALISIERUNG DYNAMISCHER GRAPHEN Abbildung 18: Graph der Variablen nach zwei Minuten Berechnung mit der MinDom-Heuristik [2] 23 Abbildung 19: Aktivitätsgraph der Variablen nach zwei Minuten Berechnung mit der MinDom-Heuristik [2] Abbildung 20: Graph der Variablen unter Verwendung der angepassten Heuristik [2] 5 5 ZUSAMMENFASSUNG 24 Zusammenfassung In der vorliegenden Arbeit wurden drei unterschiedliche Ansätze zur Visualisierung von Algorithmen betrachtet. Der erste Ansatz behandelte die Verwendung von Concept Keyboards. Entscheidendes Ziel dieses Ansatzes war es, die Interaktivität des Benutzers zu erhöhen und somit dessen Verständnis für den Algorithmus zu verbessern. Erste Studien an zwei Gruppen von Studenten haben gezeigt, dass dieses Ziel erreicht wurde. Ein zweiter wesentlicher Aspekt der Concept Keyboards ist die Möglichkeit, verschiedene Concept Keyboards für denselben Algorithmus zu erstellen. Diese Keyboards unterscheiden sich bezüglich des Detaillevels, den sie dem Benutzer anbieten. Somit kann abhängig vom Erfahrungsgrad des Benutzers diesem mehr oder weniger Einsicht in den Ablauf des Algorithmus gewährt werden. Die oben genannten Studien haben jedoch auch ergeben, dass für Benutzer, welche noch gar keine Ahnung vom Prinzip des Algorithmus haben, ein Step-by-Step Verfahren als erste Erklärungshilfe besser ist. Ein Nachteil des Concept Keyboards ist sein Anschaffungspreis. Sicherlich muss man hierbei abwägen, ob man das Concept Keyboard wirklich öfter einsetzen will (zum Beispiel an einer Schule) oder ob man es nur selten brauchen würde. Es existiert zwar auch die Möglichkeit, das Concept Keyboard als Fenster neben der eigentlichen graphischen Darstellung anzuzeigen, allerdings ist hierbei der Lerneffekt laut [1] geringer. Ein weiterer Ansatz beschäftigte sich mit der abstrakten Darstellung eines Algorithmus mit Hilfe von Shape Analysis. Durch dieses Verfahren ist es möglich, den Benutzer von konkreten Datensätzen loszulösen und ihm den Ablauf des Algorithmus unabhängig davon zu erklären. Der Benutzer erhält hier also die Möglichkeit, das Verhalten eines Algorithmus in allen möglichen Fällen zu studieren. Ohne eine abstrakte Darstellung ist dies nur erreichbar, indem man viele verschiedene Datensätze mit dem Algorithmus ausprobiert, was zum einen sehr aufwändig ist und zum anderen auch zu Fehlern führen kann, wenn bestimmte Fälle vergessen werden. Der hier vorgestellte Ansatz steckt bis jetzt allerdings noch in der Entwicklungsphase. Es existiert daher noch keine konkrete Visualisierung, so dass auch der tatsächliche pädagogische Nutzen noch nicht erprobt werden konnte. Der letzte Ansatz war speziell für den Einsatz von constraint Programmierung zugeschnitten. Es wurde hierbei auf das Problem eingegangen, dynamische Graphen zu visualisieren und durch die Darstellung dieser tiefere Einsichten in den Ablauf der Lösungsverfahren von constraint Problemen zu bekommen. Wie im letzten Beispiel des Abschnittes gezeigt wurde, ist diese Visualisierungsart auch dazu geeignet, Performanceprobleme eines Lösers zu erkennen und diesen somit eventuell auch zu optimieren. Diese Eigenschaft grenzt dieses Verfahren von den beiden oben genannten Ansätzen ab, welche sich nur mit Visualisierung als Erklärungshilfe eines Algorithmus beschäftigen. Nachteil dieses Verfahrens ist, dass sich unerfahrene Benutzer erst an die verwendete Darstellungsart gewöhnen müssen, um diese gut zu verstehen. Da dieser Ansatz jedoch in erster Linie auf Optimierung und nicht auf den pädagogischen Nutzen ausgelegt ist, wird diese Visualisierung in der Regel sowieso von Personen verwendet werden, welche sich 5 ZUSAMMENFASSUNG 25 tiefer mit constraint Programmierung beschäftigen und die diese Visualisierung dann öfter einsetzen können. LITERATUR 26 Literatur [1] N. Baloian, H. Breuer, and W. Luther. Algorithm visualization using concept keyboards. ACM SoftVis‘05, 7-16. [2] Mohammad Ghoniem, Hadrien Cambazard, Jean-Daniel Fekete, and Narendra Jussien. Peeking in solver strategies using explanations visualization of dynamic graphs for constraint programming. ACM SoftVis‘05, 27-36. [3] C. Hundhausen. Toward effective algorithm visualization artifacts: Designing for participation and communication in an undergraduate algorithms course. 1999. [4] Dierk Johannes, Raimund Seidel, and Reinhard Wilhelm. Algorithm animation using shape analysis: Visualising abstract executions. ACM SoftVis‘05, 17-26.