daniel schulz eamt ideapeakcodebook rev 68 ideapeak 1.1 heuristiken die api für heuristiken wurde...

48

Upload: others

Post on 03-Mar-2021

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook zur Applikation Rank-It

Daniel Schulz

Team IdeaPeak

Page 2: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

Seite 2 von 48

Page 3: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

Contents

0.0.1 Präambel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50.0.2 Was Sie hier erwartet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50.0.3 Permanently under construction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1 Heuristiken 71.1 Heuristiken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81.2 Zu allen Heuristiken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

1.2.1 Allgemeines zur Überlegung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.2.2 Abbruchkriterium . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.2.3 Allgemein zum Code in den Heuristiken . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.2.4 Allgemeines zur E�zienzsteigerung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

1.3 Implementierte Heuristiken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131.3.1 Euklid'scher Abstand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.3.2 Absoluter Abstand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.3.3 Manhattan- oder Block-Distanz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161.3.4 Fuÿball-Heuristik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.3.5 Heuristik von IdeaPeak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

2 Die Datenbank 212.1 Die Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3 Java-Klassen für Heuristiken 233.1 Package: heuristics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233.2 Master-API aller Heuristiken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

3.2.1 Euklid.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263.2.2 Absolute.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273.2.3 Manhattan.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283.2.4 CnHeumar.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.2.5 Fussball.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

4 Java-Klassen 314.1 Default-Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4.1.1 Main.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314.1.2 CSVReader.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334.1.3 CSV_SolutionHandle.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344.1.4 Matrix.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354.1.5 MatrixBuilder.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364.1.6 MatrixBuilderDataSet.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

4.2 Package: dbcontrol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394.2.1 DBConnector.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.2.2 DbWrkshopCriterionConnector.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424.2.3 DbWorkshopUserWeightConnector.java . . . . . . . . . . . . . . . . . . . . . . . . . . . 434.2.4 VMMath.java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

3

Page 4: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

5 Implementierung der Heuristiken 475.1 Package: presentationmodules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475.2 Potential am Java-Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

Seite 4 von 48

Page 5: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

0.0.1 Präambel

0.0.2 Was Sie hier erwartet

Dieses CodeBook gewährt einen Überblick und Einblick in den Quellcode der Webapplikation "Rank-It" des TeamsIdeaProve. Anwendungsfälle und Relationen werden dargestellt. Ziel dieses CodeBooks ist es den Quellcode, seineImplikationen und Seitene�ekte zu verstehen, vorhersehen zu können und so die Programmierung und Erweiterunge�ektiver und e�zienter zu machen. Abbildungen, die hier zu klein dargestellt sind, werden in voller Breite undAu�ösung mit mindestens 100%-Skalierung in das Repository commitet.

0.0.3 Permanently under construction

Dieses CodeBook be�ndet sich unter ständiger Vervollständigung, da sich neue Aspekte, Abläufe, Methoden undVariablen und Änderungen auf den gesamten Code auswirken können. Aspekte, die später erst wichtig gewordensind �ieÿen hier genauso ein, wie Änderungen an Abläufen. Daher sollte bei aktuellen oder älteren Fragen diesesCodeBook konsultiert werden. Wurde eine Frage gelöst, allerdings nicht mithilfe dieses CodeBook, so sollte dieInformation oder das Wissen an Daniel gemailt werden, sodass andere indirekt davon pro�tieren können. Danke.

"Ein Denkender beschert dem Teufel mehr Sorgen als tausend Betende."

Seite 5 von 48

Page 6: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

Seite 6 von 48

Page 7: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

Chapter 1

Heuristiken

Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können.Die vorde�nierten Klassen be�nden sich im Repository. Bei Fragen steht auf dem WordPress-Blog auch ein dre-iteiliger Screencast zur Verfügung.

7

Page 8: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

1.1 Heuristiken

Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können.Die vorde�nierten Klassen be�nden sich im Repository. Bei Fragen steht auf dem WordPress-Blog auch ein dre-iteiliger Screencast zur Verfügung.

Der neuste Ansatz, den wir verfolgen, beruht auf einer drei-Dimensionalen Matrix � darin sind Objekte abgelegt,die den möglichen Lösungsvektor in zwei Fällen respräsentieren. Diese Fälle seien in der oberen Dreiecksmatrix(im folgenden Bild rot dargestellt) die Siege von Idee A über B. In der unteren im folgenden Bild blau dargestelltSieg von B über A. Es handelt sich um eine n x n - Matrix, da die Ideen auf beiden Achsen gleich sind.

Die beinhalteten Objekte sind komplexe Datentypen, die folgende Werte und Zustände repräsentieren:

• Den Unterschied zum festen Vorgangsvektor gegenüber dem (nur möglicherweise) folgenden Vektor, wenndiese Idee gewinnen sollte � das ergibt sich aus der Dreiecksmatrix, in welcher der Wert steht.

• Den absoluten Wahrscheinlichkeits-Wert dieser Idee im Lösungsvektor, wenn diese Idee gewinnen würde.

Seite 8 von 48

Page 9: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

1.2 Zu allen Heuristiken

1.2.1 Allgemeines zur Überlegung

Random order: 1 Hier ist der worst-case zu sehen; die Ideen werden den Experten in beliebiger Reihenfolgevorgelegt. So ist im Allgemeinen kein vorzeitiger Abbruch möglich. Es bilden sich keine klaren Konturen undVerläufe heraus, da die Ideen in indeterministischer Reihenfolge bewertet werden.

Euklid'sche Distanz: 2 Eine der besten Fälle � soweit wir das jetzt einschätzen können. Die drei Favoriten sindEuklid'scher und Absolute Distanz sowie die Manhattan-Distanz.Man sieht leicht, dass die Ideen sauber voneinander getrennt werden und sich am Ende wieder relativieren. Daskommt daher, da sich eine Idee nach einer kurzen Initialisierungsphase absetzt und dieser Wert wird immer häu�gerbewertet. Die ersten Paarvergleiche fallen häu�g zu dessen Gunsten aus (Anstieg) und dieses relativiert sich amEnde durch Vergleiche anderer Ideen untereinander � daraufhin fällt dessen relativer Anteil und so die Zahl imLösungsvektor wieder.

1PhD-Thesis-Proposal von René Chelvier, Institut für Simulation und Gra�k, Otto-von-Guericke Universität Magdeburg2PhD-Thesis-Proposal von René Chelvier, Institut für Simulation und Gra�k, Otto-von-Guericke Universität Magdeburg

Seite 9 von 48

Page 10: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

Vergleich von random input und Euklid-Heuristik 3: Zum besseren Vergleich sind beide Gra�ken nocheinmal übereinandergelegt worden und auf dem Zweiten zusätzlich alle Ideen auÿerhalb der beiden Top-Ideenausgeblendet. Man kann auf diesen Abbildungen gut sehen, wie durch die Anwendung der Euklid'schen Abständedie Kurve sehr gut karrikiert wird und damit besser beherrschbar wird. Damit sollte es möglich sein die Anzahl derPaarvergleiche um 90% zur reduzieren. In der computergestützten Ideenbewertung spielt das eine maÿgeblicheRolle, da so auch nur 10% der Zeit für die Experten und Moderatoren benötigt wird.

3PhD-Thesis-Proposal von René Chelvier, Institut für Simulation und Gra�k, Otto-von-Guericke Universität Magdeburg

Seite 10 von 48

Page 11: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

1.2.2 Abbruchkriterium

Ein passendes Kriterium, welches im Rahmen von René Chelviers PhD-Thesis am ISG der Otto-von-GuerickeUniversität Magdeburg entsteht, kann die Ideenbewertung beenden, sobald kein neuer Sieger in den Top-Ideenmehr auftreten kann und sich in diesem oberen Bereich kein Platzwechsel mehr vollziehen wird.

1.2.3 Allgemein zum Code in den Heuristiken

Anmerkung: Da die Wurzelfunktion f(x) =√x auf dem gesamten De�nitionsbereich monoton steigend ist kön-

nen wir auf einen Vergleich der Abstände s verzichten und die quadrierten Abstände s2 miteinander vergleichen.Das geht schneller, da der Computer nicht nach jeder Markov-Kette zwei mal das Heron-Verfahren ausführenmuss um die Wurzel zu nähern. Zudem dauert dieses Verfahren mit double-Werten circa 60% länger als mit �oat.So kann viel Zeit während der Berechnungen der Markov-Ketten gespart werden.

Beweise

• f(x) =√x auf [0, . . . , ∞] monoton stegend:

∀x ∈ R, x ≥ 0 : (1.1)

df(x)

dx=−12√x6= 0 (1.2)

limn→∞

(−12√x) = 0 (1.3)

• f(x) =√x ist stetig und di�erenzierbar: f(x) ist ein Polynom und eine naturliche Funktion

Seite 11 von 48

Page 12: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

1.2.4 Allgemeines zur E�zienzsteigerung

Liste pq: Um alle o�enen Paarvergleiche nicht nach jedem Aufruf einer Heuristik separat erzeugen zu müssenhaben wir eine sortierte List pq eingeführt. Der Name kommt von PriorityQueue, was die Liste eigentlich vorhereinmal war. Hier werden einmalig und zentral alle möglichen Paarvergleiche von n Ideen, also ~n×~n oder n(n−1)

2 ,hinein gespeichert. Die Liste wird nach Wert, in der Regel wird hier der Abstand zum Lösungsvektor gespeichert,gespeichert und als Resultat einer Heuristik return pq.removeLast() aufgerufen werden. Hierdurch wird das opti-male Element entnommen, wenn die Liste sortiert worden ist, und ist nicht mehr in der Liste verfügbar.

Referenzen und Objekte in Java: Es sieht häu�g so aus, als würden wir groÿe Tabellen oft und redundantspeichern. Das ist allerdings keineswegs so. Wir vergröÿern nur marginal die Speicherauslastung, reduzieren aberenorm die notwendigen Berechnungen. Dazu muss man wissen, wie Java komplexe Datenstrukturen speichert.Komplex sind alle Datenstrukturen, auÿer die Primitiven boolean, byte, short, int, long, �oat, double. Alle an-deren, die auch alle von Java's object-Klasse erben sind komplexe Datenstrukturen. Sie werden nicht auf demProzessor-Stack gespeichert, sondern nur deren Referenz im Hauptspeicher-System. Primitive Datentypen werdendirekt auf dem Stack gesichert.Daher muss man bei präventiven oder prophylaktischen Berechnungen aufpassen nicht die Originale zu verändernsondern mittels clone() eine Kopie erstellen. Die Objekte in der pq, iMatrix etc. sind also genau identisch (equalsliefert true). Ist das klonen mittels clone() nicht möglich muss gegebenenfalls in dem betre�enden Objekt dasInterface Cloneable implementiert werden. Mittels getClass().newInstance() kann eine neue Instanz der Klasseerstellt werden. Allerdings hat diese eine leere Parameterliste im Konstruktor, sodass die Werte entweder nichtübernommen werden können oder durch eine neue, eigene Methode umgeschrieben werden müssen.Ich habe allerdings den Vorteil dadurch ein Objekt aus der pq-Liste zu löschen � beispielsweise weil es verglichenworden ist � und trotz dessen in der iMatrix weiter gesichert zuhaben.

Seite 12 von 48

Page 13: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

1.3 Implementierte Heuristiken

1. maximaler Euklid'scher Vektorabstand

2. maximaler Absoluter Vektorabstand

3. maximaler Vektorabstand nach Manhattan-Distanz

4. empirische Fuÿball-Heuristik

5. eigene Heuristik von IdeaPeak

Seite 13 von 48

Page 14: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

1.3.1 Euklid'scher Abstand

Die Euklid'sche Distanz gibt den Abstand zwischen zwei Vektoren, oder Punkten a und b im Raum, an. Dabeiwird die gerade und direkte Verbindung von a nach b bestimmt. Der Abstand ist die Summe s aller Quadrate derDi�erenzen aller Einträgealso s =

√∑ni=1(yi − xi)2.

In dieser Heuristik werden alle möglichen kommenden Entscheidungen für den Benutzer simuliert. Daraus werdendie resultierenden Lösungsvektoren, für den Fall, dass Idee Eins gewinnt, und den Fall, dass Idee Zwei gewinnt,berechnet. Aus diesen Lösungsvektoren wird der Abstand zum aktuellen Lösungsvektor mittels Euklid'scher Dis-tanz berechnet. Der Paarvergleich, welcher jetzt in einem der beiden möglichen Fälle, den maximalen Euklid'schenAbstand ergeben könnte wird dem Benutzer als nächster Paarvergleich präsentiert.

Seite 14 von 48

Page 15: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

1.3.2 Absoluter Abstand

Die Absolute Distanz gibt den Abstand zwischen zwei Vektoren, oder Punkten a und b im Raum, an. Der Abstandist, im Gegensatz zur Euklid'schen Distanz, nur die Summe s aller Di�erenzen aller Einträgealso s =

∑ni=1 |yi − xi|.

In dieser Heuristik werden alle möglichen kommenden Entscheidungen für den Benutzer simuliert. Daraus werdendie resultierenden Lösungsvektoren, für den Fall, dass Idee Eins gewinnt, und den Fall, dass Idee Zwei gewinnt,berechnet. Aus diesen Lösungsvektoren wird der Abstand zum aktuellen Lösungsvektor mittels Absoluten Distanzberechnet. Der Paarvergleich, welcher jetzt in einem der beiden möglichen Fälle, den maximalen Abstand lautAbsolutem Abstand ergeben könnte wird dem Benutzer als nächster Paarvergleich präsentiert.

Seite 15 von 48

Page 16: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

1.3.3 Manhattan- oder Block-Distanz

Auch bekannt als rectilinear distance, Minkowski's L1 distance, taxi cab metric oder city block distance 4. Hierwerden wir uns der Einfachheit halber in der Regel auf Manhattan-Distanz beschränken.

Die Manhattan-Distanz gibt den Abstand zwischen zwei Vektoren, oder Punkten a und b im Raum, an. Dabeiwird nicht die gerade oder direkte Verbindung von a nach b bestimmt. Der Abstand ist vereinfacht die Summeder Katheten in jeder Dimension. So ist die Manhattan-Distanz das Gegenstück zu der Euklid'schen Distanz-Berechnung, da bei dieser die Hypotenose berücksichtigt wird.

In dieser Heuristik werden alle möglichen kommenden Entscheidungen für den Benutzer simuliert. Daraus werdendie resultierenden Lösungsvektoren, für den Fall, dass Idee Eins gewinnt, und den Fall, dass Idee Zwei gewinnt,berechnet. Aus diesen Lösungsvektoren wird der Abstand zum aktuellen Lösungsvektor mittels Manhattan-Distanzberechnet. Der Paarvergleich, welcher jetzt in einem der beiden möglichen Fälle, den maximalen Abstand nachManhattan-Distanz ergeben könnte wird dem Benutzer als nächster Paarvergleich präsentiert.

4"Manhattan distance" vom NIST � http://www.itl.nist.gov/div897/sqg/dads/HTML/manhattanDistance.html

Seite 16 von 48

Page 17: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

1.3.4 Fuÿball-Heuristik

Einen ganz anderen Weg geht die Fuÿball-Heuristik. Sie ist auch eher keine Heuristik sondern ein empirischesVerfahren, dass sich etabliert hat und jetzt als Heuristik ausprobiert werden soll. Wir vermuten sogar die wenigstenReduzierungen an Paarvergleichen hierdurch.Die Funktionsweise ist sehr einfach: alle n Ideen spielen im Ligasystem "jeder gegen jeden" in ~n×~n oder n(n−1)

2gegeneinander. Ein Gewinner bekommt drei Punkte; ein Verlierer null; im Falle eines Remis beide jeweils einenPunkt.Diese Heuristik allein kann nicht die Anzahl der Paarvergleiche reduzieren. Das gelingt nur durch Kombinationmit TopX. Daher wird vor jedem Paarvergleich geguckt, wieviele Punkte die x-te Idee hat und ob dieser nächstePaarvergleich noch eine mathematische Chance hat in diese TopX einzuziehen. Sei dem nicht so muss dieserPaarvergleich nicht mehr vorgenommen werden und der nächste, in unserer sortierten Liste pq, kann geprüftwerden. Ist diese Liste pq leer so sind wir fertig.

Seite 17 von 48

Page 18: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

1.3.5 Heuristik von IdeaPeak

Unsere Heuristik setzt den Gedanken der Euklid'schen Distanz auf eine andere Art und Weise fort. Es kommtein Dreiklang von Mechamismen zum Einsatz. Zuerst wird, bis zu einer vom Benutzer de�nierten Stelle, einAlgorithmus aus

• Euklid'sche Distanz

• Absolute Distanz

• Manhattan-Distanz

ausgeführt � Technik eins von drei. Der grau unterlegte Teil steht im Bild unten für die schon absolviertenVergleiche. In diesem Teil wird auch die erste Heuristik ausgeführt. Danach wird jeweils der relativ am bestengeeignete Paarvergleich gesucht. Die De�nition bester Paarvergleich ist in diesem Fall der Lösungsvektor, dersich im Fall Idee Eins gewinnt / Idee Zwei gewinnt, ergibt, an welchem die relative Änderung dieser Idee imLösungsvektor maximal ist � Technik zwei von drei.Der neue Lösungsvektor ~r ergibt sich wie folgt:

∀xi ∈ ~x, ri ∈ ~r : (1.4)

ri =|xi − xi−1|

xi−1(1.5)

~r steht im Algorithmus zwei mal in der Matrix � in der oberen Dreiecksmatrix steht der Wert, falls Idee Einsgewinnen sollte, in der unteren der Fall, dass Idee Zwei gewinnen sollte. Der Paarvergleich, welcher gröÿtenAnstieg oder Fall hervorrufen kann, in 50% der Fälle, wird dem Experten als nächsten vorgelegt. Von daher wirdder Betrag benutzt.

Seite 18 von 48

Page 19: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

Transitiver Filter: Vor allem für objektive Kriterien haben wir einen weiteren Mechamismus geplant. Wird dieIdee a als besser als Idee b bewertet und wird b besser als Idee c bewertet, so muss Paarvergleich von a und cnicht mehr durchgeführt werden, da aufgrund

a � b (1.6)

b � c (1.7)

⇒ a � c (1.8)

So muss also c ≺ a gelten.Für subjektive Kriterien denken wir wird sich diese Technik weniger gut eignen und daher sollte man diesen Filterbei Bedarf auch ausstellen können. Zudem vermuten wir, dass dieser Filter die Anzahl der Paarvergleich mindernkann. Allerdings wird sich das im Rahmen halten oder nur bei einer groÿen Zahl von Ideen auszahlen. Wir gehenaber von weniger Reduzierungen hierdurch als durch ein genaues Abbruchkriterium aus � Technik drei von drei.

Seite 19 von 48

Page 20: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

Seite 20 von 48

Page 21: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

Chapter 2

Die Datenbank

2.1 Die Tabellen

• chat

• criterion

• idea

• solutions

• user

• user_decision

• user_decision_ideas

• user_logins

• workshop

• workshop_criterion

• workshop_criterion_user

• workshop_ideas

• workshop_progress

• workshop_tournament

• workshop_user

21

Page 22: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

Seite 22 von 48

Page 23: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

Chapter 3

Java-Klassen für Heuristiken

3.1 Package: heuristics

In diesem Package liegen alle von uns implementierten Heuristiken.

23

Page 24: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

3.2 Master-API aller Heuristiken

Master-Signatur aller Heuristiken: public static Pair heuristic<Name>(. . .);

1. Vector<Pair> openPairsVektor mit allen Permutationen � ohne Rücksicht auf die Reihenfolge � aus den Paaren. Sei ~x Vektor mitn Ideen, so gelte ∀xi ∈ ~x, i 6= j : (xi, xj) = (xj , xi). Die Werte im Vector seinen ~x×~x � das Kreuzprodukt

aller möglichen, nicht-redundanten Ideenvergleiche. Die Anzahl ist folglich n(n−1)2 .

2. LinkedList<Pair> pqpq speichert als PriorityQueue die Referenzen auf alle Ideen aus der iMatrix. Wurde ein Paarvergleich bereitsabsolviert wird er aus pq entfernt. Diese Liste ist vorallem e�zient, um schnell und ohne quadratischenAufwand den nächsten Paarvergleich "aus" der iMatrix ablesen zukönnen. Bei groÿen Workshops wurdenhier sehr viele Rechenoperationen gespart � auf Kosten der Einfachheit des SourceCodes.

3. LinkedList<pIdea> iqDie Liste iq enthält äquivalent zu pq alle möglichen Ideen-Objekte. Die Erklärung ist diesselbe, wie obenin LinkedList<Pair> pq.

4. Matrix[] dataMatricesDieses Feld von Matrizen beinhaltet alle Matrizen, wie sie auch im Ausgangsprojekt verwand worden sind.Jede Matrix speichert die Ideen in einer n × n-Matrix � wobei auf der Höhe die Gewinner- und in derkorrespondierenden Spalte die Unterlegenen Ideen-ID's zu �nden sind. Im Array-Teil ([. . .]) sind die Kriterienabgebildet. Jedes Kriterium hat also seine eigene Markov-Kette.

5. int noMatrixGibt die Nummer des Kriteriums für die Matrix[] dataMatrices an.

6. iMatrix mDie iMatrix ist eine spezielle, e�ziente Struktur für die approximative Berechnung der möglichen Lö-sungsvektoren bei kommenden Entscheidungen. Hier werden in der unteren Hälfte alle Werte gespeichertfür den Fall Idee B oder 2 � aus dem Paarvergleich � gewinne; oben die Idee A oder 1. Siehe dazu auchHeuristiken.

7. MatrixBuilder mbMatrixBuilder ist eine Klasse aus dem ursprünglichen Projekt. Sie ist hauptsächlich zur Übermittlung vonInformationen zu übermitteln. Momentan nutzen wir nur die � zur Laufzeit � Konstante Epsilon. Das istder Wert der re�exiven "Schattenmatrix".

8. int topxvalueGibt die Anzahl der erwünschten Top-Werte in der Ideenbewertung an.

9. double[] weightCriteriaGibt die Gewichte der Kriterien zurück. Diese wurden schon im Ausgangsprojekt auf die Summe von Einsnormiert.

10. String[] ideaNamesGibt alle Ideen-Namen zurück. Die Werte in [. . .] korrespondieren dabei mit den Ideen-ID's.

Seite 24 von 48

Page 25: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

11. int last_idea_id1Gibt die Referenz auf die letzt Idee 1 aus dem vorherigen Paarvergleich an.

12. int last_idea_id1Gibt die Referenz auf die letzt Idee 2 aus dem vorherigen Paarvergleich an.

13. int last_criterionGibt das im letzten Durchlauf benutzte Kriterium an. Siehe dazu auch int noMatrix, welches das aktuelleangibt. In der Regel sollten diese also gleich sein.

14. Pair last_doneGibt das Objekt des letzten Paarvergleichs an.

15. byte idea_id1_wonGibt an, wie der letzte Bewertungsschritt ausgegangen ist. Positive Werte sagen, dass Idee 1 gewonnen hat,negative, dass Idee 2 gewonnen hat und die Null steht für ein Remis.

16. double[] currentSolutionVectorGibt den aktuellen Lösungsvektor an. Mit diesem werden die Abstände aus den approximativen Lösungsvek-toren mittels diverser Distanzfunktionen berechnet.

Seite 25 von 48

Page 26: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

3.2.1 Euklid.java

Diese Klasse beinhaltet die Umsetzung der Heuristik "euklid'scher Vektorabstand". Allgemein wird dieser Abstandnach folgender Berechnungsvorschrift ermittelt:

• v1 sei ein Vektor mit Elementen x1 bis xn

• v2 sei ein Vektor mit Elementen y1 bis yn

Der euklid'sche Vektorabstand ist die Summe der Beträge der Di�erenzen von xi und yi:√∑n

i=1 = (xi − yi)2.Die Vergleiche wird die Heuristik allerdings mit

∑ni=1 = (xi − yi)2 durchführen, da die Berechnung der Wurzel

nicht benötigt wird, siehe dazu Heuristiken. Die aufwändige Berechnung des Heronverfahrens mit doppelterGenauigkeit wird so häu�g erspart.

Als Ergebnis wird derjenige Paarvergleich vorgeschlagen, der den maximalen euklid'schen Vektorabstand zumaktuellen Lösungsvektor hat.

Wichtige Methoden:

• protected static double getSquareEuklidDistance(ideaprove.mathematic.Vector a,ideaprove.mathematic.Vector b)Die Methode gibt die euklid'sche Vektordistanz, also die Summe der Beträge der Di�erenzen der Quadratevon xi und yi:

∑ni=1 = (xi − yi)2, aus.

• protected static double getSquareEuklidDistance(double[] a, double[] b)Äquivalent zu getSquareEuklidDistance(ideaprove.mathematic.Vector a, ideaprove.mathematic.Vector b) �siehe oben. Die Methode gibt die euklid'sche Vektordistanz, also die Summe der Beträge der Di�erenzender Quadrate von xi und yi:

∑ni=1 = (xi − yi)2, aus.

• public static Pair heuristiEuklid(. . .)siehe Master-API aller Heuristiken

Seite 26 von 48

Page 27: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

3.2.2 Absolute.java

Diese Klasse beinhaltet die Umsetzung der Heuristik "absoluter Vektorabstand". Allgemein wird dieser Abstandnach folgender Berechnungsvorschrift ermittelt:

• v1 sei ein Vektor mit Elementen x1 bis xn

• v2 sei ein Vektor mit Elementen y1 bis yn

Der absolute Vektorabstand ist die Summe der Beträge der Di�erenzen von xi und yi:∑n

i=1 = |xi − yi|

Als Ergebnis wird derjenige Paarvergleich vorgeschlagen, der den maximalen absoluten Vektorabstand zumaktuellen Lösungsvektor hat.

Wichtige Methoden:

• protected static double getAbsoluteDistance(ideaprove.mathematic.Vector a,ideaprove.mathematic.Vector b)Die Methode gibt die absolute Vektordistanz, also die Summe der Beträge der Di�erenzen von xi und yi:∑n

i=1 = |xi − yi|, aus.

• protected static double getAbsoluteDistance(double[] a, double[] b)Äquivalent zu getAbsoluteDistance(ideaprove.mathematic.Vector a, ideaprove.mathematic.Vector b) � sieheoben. Die Methode gibt die absolute Vektordistanz, also die Summe der Beträge der Di�erenzen von xiund yi:

∑ni=1 = |xi − yi|, aus.

• public static Pair heuristicAbsolute(. . .)siehe Master-API aller Heuristiken

Seite 27 von 48

Page 28: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

3.2.3 Manhattan.java

Diese Klasse beinhaltet die Umsetzung der Heuristik Manhattan- oder Block-Distanz zweier Vektoren. Allgemeinwird dieser Abstand nach folgender Berechnungsvorschrift ermittelt:

• ~v mit den Elementen v1 bis vn sei ein Vektor mit Elementen 1 bis n

• ~w mit den Elementen w1 bis wn sei ein Vektor mit Elementen 1 bis n

Die Manhattan-Distanz ist ohne Beschränkung der Allgemeinheit die Summe aller Di�erenzen aller Koordi-naten der korrespondierenden Dimensionen.

Als Ergebnis wird derjenige Paarvergleich vorgeschlagen, der die maximale Manhattan-Distanz zum aktuellenLösungsvektor hat.

Wichtige Methoden:

• public static double[] addNToDoubleArray(double[] input, double n, int pos)Gibt das Array input wieder. Die Stelle pos wird um n erhöht. Hierbei wird eine Kopie zurückgegeben unddas Original bleibt unverändert. Diese Funktion sollte für approximative Lösungsvektoren genutzt werden,wobei pos die ID der gewinnenden Ideen sei.

• protected static double manhattanDistance(double[] beg, double[] dest, double qsize)Gibt die Manhattan-Distanz zurück, wobei in einem qsize × qsize-Raster der Weg von beg nach desttraversiert wird.

• protected static double manhattanDistanceFast(double[] beg, double[] dest, double qsize)Gibt die Manhattan-Distanz zurück, wobei in einem qsize × qsize-Raster der Weg von beg nach dest nichttraversiert wird. Die Berechnung ist hierbei statisch � also mit konstantem Aufwand. Der Abstand ist dergenäherte zwischen beg und dest. Genähert wird der Fehler durch das Raster, im Umkreis qsize

2 .

• protected static double manhattanDistanceFast(double[] beg, double[] dest)Gibt die Manhattan-Distanz zurück, wobei in einem ε×ε-Raster der Weg von beg nach dest nicht traversiertwird. Die Berechnung ist hierbei statisch � also mit konstantem Aufwand. Hierbei ist ε eine in�nitisimalkleine Zahl. Der Abstand ist der genaue zwischen beg und dest und der Fehler durch das Raster, im Umkreisqsize

2 , nicht genähert wird.

• public static Pair heuristicManhattan(. . .)siehe Master-API aller Heuristiken

Seite 28 von 48

Page 29: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

3.2.4 CnHeumar.java

Die Heuristik ist eine Kombination von Euklid'schem Abstand und einem eigenen Ansatz. Der Euklid'sche Abstandwird solange der Nutzer es angibt ausgeführt und soll maÿgeblich die Ideen von einander di�erenzieren. Nach derInitialisierung wird ein Ansatz verfolgt, der die relativen Änderungen im Vektor verfolgt und diese gröÿten Änderun-gen quali�zieren Paarvergleiche dazu der nächste im Workshop zu sein. Näheres dazu siehe in den Heuristiken.

Wichtige Methoden:

• protected static double getHeumarDistance(ideaprove.mathematic.Vector a,ideaprove.mathematic.Vector b)Berechnet die Di�erenzen zwischen a und b zwischen allen benachbarten Werten und berechnet zwischenden Di�erenzen die Summe der Quadrate der relativen Abstände.

• protected static double getHeumarDistance(double[] a, double[] b)Äquivalent zu getHeumarDistance(ideaprove.mathematic.Vector a, ideaprove.mathematic.Vector b) � sieheoben. Berechnet die Di�erenzen zwischen a und b zwischen allen benachbarten Werten und berechnetzwischen den Di�erenzen die Summe der Quadrate der relativen Abstände.

• protected static double getSquareEuklidDistance(ideaprove.mathematic.Vector a,ideaprove.mathematic.Vector b)Die Methode gibt die euklid'sche Vektordistanz, also die Summe der Beträge der Di�erenzen der Quadratevon xi und yi:

∑ni=1 = (xi − yi)2, aus.

• protected static double getSquareEuklidDistance(double[] a, double[] b)Äquivalent zu getSquareEuklidDistance(ideaprove.mathematic.Vector a, ideaprove.mathematic.Vector b) �siehe oben. Die Methode gibt die euklid'sche Vektordistanz, also die Summe der Beträge der Di�erenzender Quadrate von xi und yi:

∑ni=1 = (xi − yi)2, aus.

• public static Pair heuristicHeumar(. . .)siehe Master-API aller Heuristiken

Seite 29 von 48

Page 30: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

3.2.5 Fussball.java

. . .

Wichtige Methoden:

• . . .

• public static Pair heuristicFussball(. . .)siehe Master-API aller Heuristiken

Seite 30 von 48

Page 31: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

Chapter 4

Java-Klassen

4.1 Default-Package

Das Default-Package ist im OS das Quellverzeichnis der Source-Files.

4.1.1 Main.java

Die Main.java ist standardmäÿig die Klasse, welche bei dem Start der Applikation zuerst geladen wird und vonwelcher alle Ladevorgänge ausgehen müssen. Allerdings ist hier die Main.java ein Werkzeug der Entwickler, umzentral und schnell die mathematischen Algorithmen starten und die Ergebnisse testen zu können. Die Main-Methode für Instanzen ist leer und die public static void main(String[] args)-Methode wird nur zum Aufruf derTestmethoden genutzt. Diese geben dann via System.out.println(...) die Roh-Werte zur Kontrolle durch dieEntwickler aus.

Von der Main.java sind folgende Klassen konsekutiv abhängig � siehe nächste Seite.

31

Page 32: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

Seite 32 von 48

Page 33: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

4.1.2 CSVReader.java

Wichtige Methoden:

• public CSVReader()Erstellt eine Instanz des CSVReader-Objekts. Es werden keine Instruktionen ausgeführt.

• public boolean importCSVFile()Bemüht wenigstens drei seperate Datenbank-Verbindungen � welche immer zu geö�net und geschlossenwerden � durch Aufruf von preReadFile(ϕ), readFile(ϕ) und writeToDatabase() � ϕ sei die gleiche Dateithis.�leName in beiden Methoden. Hier werden also die Ideen auf den String-Arrays ideaName[] undideaDescription[] gespeichert. Zudem werden alle nicht bereits enthaltenen Einträge in die Datenbankgeschrieben. Die benötigten Datenbank Verbindungen für n Ideen sind also O(n) = 2n+ 3.

• private void preReadFile(String �leName) throws FileNotFoundException, IOExceptionStellt eine Verbindung zu der Datei �leName her; gelingt dies so legt die Methode die String-ArraysideaName[] sowie ideaDescription[], welche korrespondierende Werte besitzen, an. Für jede Idee mitBeschreibung wird nullbasiert genau ein Speicherplatz angelegt.

• private void readFile(String �leName) throws FileNotFoundException, IOExceptionNimmt einen String �leName und liest den Inhalt. Dieser besteht aus einer Kette von <Ideen-Name>,<deren Beschreibung>: diese werden auf das Feld ideaName[] und korrespondierend ideaDescription[]geschrieben. Wird die Datei nicht gefunden und tritt ein Fehler beim Lesen auf so wird, wie in der Signaturbezeichnet, die jeweilige Exception geworfen.

• private boolean writeToDatabase()Schreibt alle Werte von idea[] in die Datenbank idea. Allerdings müssen sowohl der Name als auch derenBeschreibung nicht in der Datenbank gefunden werden. Die benötigten Datenbank Verbindungen für nIdeen sind also O(n) = 2n+ 1.

• private boolean checkEntry(String compareString, String column)Guckt in der Datenbank, ob der compareString nicht bereits in der Datenbank vorhanden ist. Bei Fundwird true, bei erfolgloser Suche false ausgegeben.

• public boolean getImportStatus()Macht semantisch genau das gleiche, wie importCSVFile(). Diese Methode wird hier auch aufgerufen. DerCode ist quasi folgender: "return importCSVFile();" � nur leider ine�zienter geschrieben.

• public void setFileName(String newFileName)Legt die Variable this.�leName mit dem Wert newFileName fest. Der absolute Pfad kann angegeben werdenoder ein realtiver. Im zweiten Fall wird der absolute Pfad anhand der relativen Lage zur gerade ausgeführtenKlasse benutzt. Der Dateiname und ein Kommentar zu absoluter oder relativer Lokalisierung erfolgen injedem Fall direkt über die Kommandozeile.

Seite 33 von 48

Page 34: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

4.1.3 CSV_SolutionHandle.java

Wichtige Methoden:

• public CSV_SolutionHandle()Keine Instruktionen � erstellt nur eine neue, leere Instanz der Klasse.

• private boolean ExportCSVSol()Liest alle Lösungen aus der Datenbank -Tabelle solutions und schreibt diese auf die Datei namens this.�leName.Achtung: da diese per default leer ist muss der Wert zuerst durch setFileName(String newFileName) gesetztwerden um Fehler zu vermeiden. Fehler jeder Art werden auf die Kommandozeile geschrieben.

• private double[] ImportCSVSol()Importiert den Lösungsvektor aus der CSV-Datei this.�leName. Achtung: da diese per default leer ist mussder Wert zuerst durch setFileName(String newFileName) gesetzt werden um Fehler zu vermeiden. Fehlerjeder Art werden auf die Kommandozeile geschrieben. Zudem müssen Werte mittels Komma getrennt seinund in US-amerikanischer Notation, mit Punktseparierung getrennt, vorliegen.

• private boolean writeInDB()Stellt eine Datenbank-Verbindung her und INSERT ed den Lösungsvektor in die Tabelle solutions. Dieserwird mittels ImportCSVSol() geladen. Fehler werden generell auf die Kommandozeile geschrieben. Achtung:Bricht ab und gibt false aus, wenn this.�leName null (Null-Referenz) ist. Es erfolgt keine Fehlerausgabeauf der Konsole.

• public Vector showDi�erence()Liest alle voneinander unterschiedlichen Lösungen aus der Datenbank-Tabelle solutions, welche zum Work-shop mit der ID des Aktuellen korrespondieren. Die Rückgabe ist ein Vektor γ der Länge n mit denUnterschieden der beiden Vektoren α und β. Es gilt: i = {1, . . . , n} und ∀xi : xi ∈ γ gilt xi = α − β. αsind alle Lösungen mit isReference = 0 aus diesem Workshop (absteigend nach SID geordnet); bei β ebensoallerdings ist hier isReference = 1. Es werden zwei Datenbank-Verbindungen zuviel hergestellt, da die DB-Engine den Datensatz viermal, zweimal zu viel, traversieren muss. Das wäre sogar in einem Durchgangmöglich.

• public boolean getImportStatus()Macht semantisch genau das gleiche, wie writeInDB(). Diese Methode wird hier auch aufgerufen. Der Codeist quasi folgender: "return writeInDB();" � nur leider ine�zienter geschrieben.

• public boolean getExportStatus()Macht semantisch genau das gleiche, wie ExportCSVSol(). Diese Methode wird hier auch aufgerufen. DerCode ist quasi folgender: "return ExportCSVSol();" � nur leider ine�zienter geschrieben.

• public void setFileName(String newFileName)Setzt die Variable this.�leName auf den Wert newFileName. Der Name der Datei und ein Kommentar zuabsoluten oder relativen Pfadangaben wird auf die Kommandozeile ausgegeben.

Ausschlieÿliche Getter- und Setter-Methoden:

• public int getWid()

• public void setWid(int WID)

Seite 34 von 48

Page 35: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

4.1.4 Matrix.java

Wichtige Methoden:

• public Matrix(int newW, int newH) � newW, newH: Breite (newW) und Höhe (newH) der MatrixSetzt die Höhe und Breite mittels setWidth(int newW) und setHeight(int newH) und legt die Matrixelements an.

• public void setWidth(int newW) � newW: neue Breite der MatrixSetzt jede positive int-Zahl als Breite fest. Gibt ansonsten einen Fehler auf die Kommandozeile aus.

• public void setHeight(int newH) � newH: neue Höhe der MatrixSetzt jede positive int-Zahl als Höhe fest. Gibt ansonsten einen Fehler auf die Kommandozeile aus.

• public void setElements(double[][] newElements)Ersetzt die komplette Matrix elements durch das neue Feld newElements, wenn die Breite nach Spalten �also elements.length mit newElements.length � übereinstimmen. Ansonsten erfolgt die Fehlerausgabe aufder Kommandozeile.

• public void setElement(int x, int y, double newElement)x: Wert der Zeile double[x][. . . ]y: Wert der Spalte double[. . . ][y]Setzt das Element an der Stelle [x][y] in elements auf newElement. Liegen x oder y nicht innerhalb deszulässigen Bereiches, also (x, y) /∈ elements[][], wird die Fehlermeldung auf der Konsole ausgegeben.

• public double getElement(int x, int y)Gibt den Wert aus der Matrix elements aus, der sich an der Stelle (x, y) be�ndet.

• public void makeIdentity()Schreibt auf eine beliebige mxn - Matrix und schreibt auf deren Diagonale Einsen � überschreibt dieseWerte, erzeugt aber keine Nullen. Ist m 6= noderm > n, liegt also keine quadratische Matrix vor, so wirdmindestens ein Fehlerwert erzeugt, die das Element nicht erreichbar ist. Da sich der Algorithmus nur an derBreite orientiert. So wird in diesem Fall genau ein Fehlerwert auf der Kommandozeile ausgegeben.

• private String toString(double value) � inhaltlich sogar private static String toString(double value)Kann derzeit nur mit einer Instanz der Klasse Matrix verwendet werden. Nimmt einen double-Wert valueund formatiert diesen in Unicasts sowie der US-amerikanischer Punkt-Separierung, statt dem Komma.

• public String toString() � @ Override-AnnotationSchreibt eine Matrix spaltenweise in einen String, welcher zurück gegeben wird. Überschreibt die toString -Methode der Java Object-Klasse.

Ausschlieÿliche Getter- und Setter-Methoden:

• public int getWidth()

• public int getHeight()

• public double[][] getElements()

Seite 35 von 48

Page 36: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

4.1.5 MatrixBuilder.java

Wichtige Methoden:

• private boolean readFromDatabase()Baut eine eigene Verbindung zur Datenbank auf und de�niert sich selbst einige �nals � zur Laufzeit �,welche innerhalb der Datei als lokale Variablen gespeichert sind.Die Methode traversiert den kompletten Datensatz der Workshop-User, der Kriterien des Workshops undderen Korrelation. Diese Werte werden dann in einen MatrixBuilderDataSet geschrieben � hier gehen alleBewertungen nach Kriterien ein. Die Ausgabe gibt nur an, ob die Operation erfolgreich war (true) odervorzeitigabgebrochen werden musste (false). Kontrollwerte werden via Kommandozeile ausgegeben.

• private void readIdeas()Liest alle Ideen durch zwei Abfragen aus der Datenbank aus und speichert sie auf das Array ideas[n]. Eswerden nur Ideen berücksichtigt, die im Workshop vorkommen und genutzt werden.

• private int searchIdeaPos(int iid) � iid: Ideen-ID in der DatenbankSucht eine beliebige Idee auf dem Array ideas[n], die die Integer-Zahl iid besitzt. Die Ausgabe ist dienullbasierte Speicherposition im ideas[n]-Array. Standard-Fehlerwert ist -1 für "nicht gefunden". In diesemFall werden alle Ideen-IDs und ihre Speicherpositionen im Array auf die Kommandozeile geschrieben.

• private void buildMatrix(int dataPos, int MatrixNr)Setzt in dataMatrices[i] den Wert an der Stelle (a, b) � a steht die die Position des Gewinners, b des Verlierers� auf Eins. Die Stelle (b, b) wird mit Null beschrieben. Es erfolgt eine Ausgabe auf der Kommandozeile imFehlerfall.

• private void buildMatrices()Baut eine Einheitsmatrix als Grundlage aller Matrizen und in dataMatrices[0]. Alle folgenden Matrizenmüssen in CID und WUID von ihren jeweiligen Vorgängern verschieben sein. Die Matrizen werden korrektnormiert und nach Gewicht a) des Users und b) des Kriteriums für alle dataMatrices[n] errechnet.

• private Matrix correctMatrix(Matrix m)Bekommt eine Matrix m und traversiert sie. Sind die Kriterien nach Spalten > 1.0 so werden sie nachträglichauf die korrekte Summe von genau 1.0 normiert.

• private Matrix weightMatrix(Matrix m, double weight)Gewichtet eine Matrix m durch Multiplikation mit dem Faktor weight auf allen Elementen.

• private void buildFinalMatrix()Schreibt auf den Speicher �nalMatrix die Summe aller dataMatrices[i] � ∀i ∈ {1, ..., n}. Diese Matrizensind bereits gewichtet.

• private int getWeightSumUser(int CID) � CID: ID des Kriteriums in der DatenbankGibt die Summe aller Gewichte der Kriterien aus. Das wird zum Normalisieren der Einträge genutzt. Bauteine eigene Datenbank-Verbindung auf und prüft auf Fehler.

• private int getIdeaCount()Gibt die Summe der Ideen aus. Wird benutzt um die Matrizen anzulegen. Baut eine eigene Datenbank-Verbindung auf.

• private void writeSolutionVectorIntoTable()Schreibt die Wertungen der Ideen � als Elemente der Ideen aus dem Lösungsvektor � aus ideas[i] in dieTabelle solutions der Datenbank. Baut eine eigene Verbindung auf.

• private void print(String str) � str: String, der geschrieben werden sollSchreibt den String str direkt auf die Kommandozeile, wenn debugprint (debugprint : boolean) wahr ist.

• public void printMatrices()Schreibt alle dataMatrices[i] direkt auf die Kommandozeile.

Seite 36 von 48

Page 37: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

• public Vector getSolutionVector()Es wird der Lösungsvektor mittels calcSolutionVectorVL() berechnet, dieser wird konsekutiv in die Tabellegeschrieben, durch Aufruf von writeSolutionVectorIntoTable(), auf die Komandozeile ausgegeben und dersolutionsVector zurück gegeben. Bewirkt das gleiche, wie calcSolutionVectorVL(), allerdings wird hier derWert in der Tabelle gesichert, ist freundlicher in der Handhabung und es wird generell mehr Aufwandbetrieben.

• private void calcSolutionVL()Liest Werte via readFromDatabase() aus der Datenbank aus. Schlägt die nicht fehl, so werden via readIdeas,buildMatrices(), buildFinalMatrix() Werte für Ideen und Matrizen initialisiert. Mittels einer Solver -Klassewird der Lösungsvektor der Matrix �nalMatrix, einem gleichverteilten Vektor v mit n Elementen (∀i :i ∈ {1, ..., n} ∧ i ∈ v : xi = 1/n) und dem Wert epsilon. Dieser Wert wird mittels print(str) auf dieKommandozeile geschrieben � falls debugprint == true ist. Der letzte, also korrekte, Lösungsvektor ausder Liste wird auf solutionVector geschrieben.

Ausschlieÿliche Getter- und Setter-Klassen:

• public int getWorkshopID()Gibt die ID des Workshops aus. Wird für Datenbank-Queries, -Inserts und -Updates genutzt.

• public void setWorkshopID(int workshopID) � workshopID: neue ID des WorkshopsSchreibt auf this.workshopID die neue ID aus der Signatur.

• public Matrix getFinalMatrix()Gibt die �nalMatrix aus.

• public void setEpsilon(double epsilon) � epsilon: neu zu setzendes EpsilonSetzt this.epsilon auf den Wert Epsilon. Werte werden nicht geprüft.

• public double getEpsilon()Gibt this.epsilon zurück.

Seite 37 von 48

Page 38: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

4.1.6 MatrixBuilderDataSet.java

Wichtige Methoden:

• public MatrixBuilderDataSet()Leeres Objekt ohne Instruktionen inkarnieren.

• public MatrixBuilderDataSet(int CID, int criteriaWeight, int WUID, int userWeight, int IID_1, intIID_2, int IID_winner)Weist die Werte gleichnamigen, globalen Variablen zu.

• public String toString() � @ Override-AnnotationÜberschreibt die toString()-Methode, welche jeder komplexe Datentyp von Object erbt. Die Ausgabe zeigtalle Werte der Variablen in einem mit Bindestrichen getrennten String, welcher als Return-Typ zurück-gegeben wird.

Ausschlieÿliche Getter- und Setter-Methoden:

• Zu jeder Variablen gibt es sowohl einen Getter als auch einen Setter:

� CID

� criteriaWeight

� WUID

� userWeight

� IID_1

� IID_2

� IID_winner

Seite 38 von 48

Page 39: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

4.2 Package: dbcontrol

Hier soll die Komplette Datenbank-Verwaltung realisiert und Verbindungen hergestellt werden.

Seite 39 von 48

Page 40: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

Seite 40 von 48

Page 41: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

4.2.1 DBConnector.java

Wichtige Methoden:

• public void setStamp(int stamp)Schreibt den int-Wert stamp in die Tabelle Table, die Standard-mäÿig "User" sei. Zudem werden Wertefür �rstName und lastName benötigt. Danach wird ohne return-Statement this.stamp auf den Wert stampgesetzt. Achtung: auch bei Missglückter Datenbank-Verbindung wird diese Variable lokal gesetzt undman bekommt keinen Hinweis im Code, dass etwas schief gelaufen ist! Fehler werden allerdings auf derKommandozeile ausgegeben.

• public static StringwriteToDatabase()Macht nichts sinnvolles. Gibt nur lastName und �rstName auf der Kommandozeile aus und returnt immer"ok!".

Ausschlieÿliche Getter- und Setter-Methoden:

• public String getFirstName()

• public void setFirstName(String �rstName)

• public String getLastName()

• public void setLastName(String lastName)

• public String getgetName()

Seite 41 von 48

Page 42: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

4.2.2 DbWrkshopCriterionConnector.java

Wichtige Methoden:

• public DbWorkshopCriterionConnector()Konstruktor ohne Instruktionen.

• public void setStamp(int stamp)In der Datenbank-Tabelle workshop_criterion werden alle Gewichte weights[i] neu gesetzt wo die Kriterien-ID und Workshop-ID mit dem laufenden übereinstimmen. Zusätzlich wird der Stempel this.stamp auf denstamp der Signatur gesetzt. Eventuell ein Fehler durch Copy'n-Paste.

Ausschlieÿliche Getter- und Setter-Methoden:

• public int getStamp()

• public int getWorkshopID()

• public void setWorkshopID(int workshopID)

• public int[] getWeights()

• public void setWeights(int[] weights)

• public int[] getCriterionIDs()

• public void setCriterionIDs(int[] criterionIDs)

Seite 42 von 48

Page 43: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

4.2.3 DbWorkshopUserWeightConnector.java

Wichtige Methoden:

• public DbWorkshopUserWeightConnector() Konstruktor ohne Instruktionen.

• public void setStamp(int stamp)In der Datenbank-Tabelle workshop_criterion_user werden die jeweiligen Gewichte weights[i] aller User(userIDs[i]) neu gesetzt wo die Kriterien-ID und Workshop-ID mit dem laufenden übereinstimmen. Zusät-zlich wird der Stempel this.stamp auf den stamp der Signatur gesetzt. Eventuell ein Fehler durch Copy'n-Paste.

Ausschlieÿliche Getter- und Setter-Methoden:

• public int getWorkshopID()

• public void setWorkshopID(int workshopID)

• public int[] getWeights()

• public void setWeights(int[] weights)

• public int[] getUserIDs()

• public void setUserIDs(int[] userIDs)

• public int[] getCriterionIDs()

• public void setCriterionIDs(int[] criterionIDs)

Seite 43 von 48

Page 44: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

4.2.4 VMMath.java

Allgemein: Die Klasse stellt viele Methoden zum Berechnen und Vergleichen mathematischer Strukturen imn-Dimensionalen Raum dar. Hier können Vektoren, Matrizen miteinander oder Matrizen mit Skalaren multiliziertwerden. In den meisten Fällen wird dafür allerdings eine Instanz von VMMath.java benötigt, da die Methodennicht als static deklariert worden sind obwohl sie ausschlieÿlich den Input verarbeiten.

Anmerkung: Die Operationen:

• Vektor-mal-Vektor-Multiplikation,

• Matrix-mal-Vektor-Multiplikation und

• Skalar-Matrix-Multiplikation

sind kommutativ. Ausschlieÿlich die Multiplikation zweier Matrizen m,n ist im Allgemeinen nicht abelsch �m× n 6= n×m. Ausnahmen sind nur die Fälle m,n ∈ R1×1 speziell und m,n ∈ Rn×1,∀n ∈ N.

Wichtige Methoden:

• public Vector subVV(Vector u, Vector v) throws IncompatibleLengthExceptionSubtrahiert für jeden Wert xi ∈ ~u und yi ∈ ~v voneinander. Die Werte werden durch wi ∈ ~w = xi −yi,∀~w, ~u,~v ∈ Rn. Die Werte auf u und v werden nicht verändert, da ein neuer, leerer Vector für dieErgebnisse erstellt wird. Sind die Vektoren u, v nicht gleicher Länge n � also u, v ∈ Rn � so wird dieIncompatibleLengthException geworfen.

• public VectorListElement subVV(VectorListElement u, VectorListElement v)throws IncompatibleLengthExceptionSyntaktisch äquivalent zu subVV(Vector u, Vector v) � siehe oben in VMMath.java. Subtrahiert für jedenWert xi ∈ ~u und yi ∈ ~v voneinander. Die Werte werden durch wi ∈ ~w = xi − yi,∀~w, ~u,~v ∈ Rn.Die Werte auf u und v werden nicht verändert, da ein neues, leeres VectorListElement für die Ergebnisseerstellt wird. Sind die VectorListElements u, v nicht gleicher Länge n � also u, v ∈ Rn � so wird dieIncompatibleLengthException geworfen.

• public Vector multVM(Matrix m, Vector v) throws IncompatibleLengthExceptionBerechnet für dieMatrixm und den Vector v das Produktm∗v. Die Vorschrift ist in diesem Fall kommutativ.Die Werte in m und v werden nicht verändert. Ist die Länge von v nicht gleich der Höhe von m so wirdeine IncompatibleLengthException geworfen.

• public Matrix multSM(Matrix m, double s)Multipliziert die Matrix m mit dem Faktor, also Skalar, s. Die Werte in m werden nicht verändert, da einneues Object von Matrix mit eigener Instanz n erzeugt wird.

• public Matrix addMM(Matrix m, Matrix n) throws IncompatibleLengthExceptionAddiert die Matrizen m und n � diese Operation ist kommutativ. Dabei werden die Werte in m und n nichtverändert. Sowohl Länge als auch Höhe von m muss gleich derer von n sein.

• public static Matrix addMatrices(Matrix m, Matrix n) throws IncompatibleLengthExceptionSyntaktisch äquivalent zu addMM(Matrix m, Matrix n) � siehe oben. Addiert die Matrizen m und n �diese Operation ist kommutativ. Dabei werden die Werte in m und n nicht verändert. Sowohl Länge alsauch Höhe von m muss gleich derer von n sein. Vorteil: Es muss keine Instanz von VMMath.java erzeugtworden sein.

Seite 44 von 48

Page 45: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

• public VectorListElement multVM(Matrix m, VectorListElement v)throws IncompatibleLengthExceptionSyntaktisch äquivalent zu multVM(Matrix m, Vector v) � siehe oben. Berechnet für die Matrix m unddas VectorListElement v das Produkt m ∗ v. Die Vorschrift ist in diesem Fall kommutativ. Die Wertein m und v werden nicht verändert. Ist die Länge von v nicht gleich der Höhe von m so wird eineIncompatibleLengthException geworfen.

• public double compare(Vector v, Vector w) throws IncompatibleLengthExceptionVergleicht zwei Vektoren durch die Addition des Betrages ihrer beiden Di�erenzen. ∀r, x, y ∈ Rn undi = {1, . . . , n}mit x ∈ ~v, y ∈ ~w ist ri = |xi−yi|. Das Ergebnis ist die Summe des Betrages aller Di�erenzen,sodass diese sich nicht gegenseitig eliminieren. Das Ergebnis d ist d =

∑ni=1 ri also d =

∑ni=1 |xi − yi|.

• public double compare(VectorListElement v, VectorListElement w)throws IncompatibleLengthExceptionSyntaktisch äquivalent zu compare(Vector v, Vector w) � siehe oben. Vergleicht zwei Vektoren durch dieAddition des Betrages ihrer beiden Di�erenzen. ∀r, x, y ∈ Rn und i = {1, . . . , n} mit x ∈ ~v, y ∈ ~w istri = |xi−yi|. Das Ergebnis ist die Summe des Betrages aller Di�erenzen, sodass diese sich nicht gegenseitigeliminieren. Das Ergebnis d ist ebenso d =

∑ni=1 |xi − yi|.

Seite 45 von 48

Page 46: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

Seite 46 von 48

Page 47: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

Chapter 5

Implementierung der Heuristiken

5.1 Package: presentationmodules

In diesem Package werden die von uns erstellten Heuristiken implementiert.

Die Klasse public class PresentationHeuristic_Euklid implements Serializable implementiert die Java-Heuristikenfür die JSP-WebPages. Die Vorlage lieferte die PresentationDynamic. Die wichtigsten Methoden sind am Endezu �nden:

• public int createOrder()Hier werden die heuristiken implementiert und nach jedem Durchlauf und jeder Bewertung ein weiteres Malaufgerufen.

• public int useTransitivity()Die Ideen werden nach transitiven Entscheidungen aussortiert, wenn das nicht bereits in der Heuristikgeschehen ist.

47

Page 48: Daniel Schulz eamT IdeaPeakCodeBook Rev 68 IdeaPeak 1.1 Heuristiken Die API für Heuristiken wurde in das Projekt gemergt, um auch unter anderem Matrix-Ketten lösen zu können. Die

CodeBook Rev 68 IdeaPeak

5.2 Potential am Java-Code

In Anbetracht des Codes überkam mich das kalte Grauen. Es wurden Fehler und Ine�zienzen inkauf genom-men, welche ich nicht dulden möchte. Hier ist die Liste mit den gröbsten Verstöÿen gegen Java, die auchhoch-intelligente Compiler nicht gerade biegen können und müssen. Compiler optimieren; es wird � wenn auchfälschlicherweise � von Mitdenken und einem Sinn für E�zienz bei Programmierern ausgegangen. In fast zehnJahren programmieren mit Java habe ich vor allem mit solchen Fehlern die meisten Probleme auch auf schwachenSystemen durchführen können.

Potential am Code:

1. nicht direkt auf die Kommandozeile sondern auf einen StringBuilder laden und am Ende einmal schreiben

2. Redundante und äquivalente Datenbank-Verbindungen nicht im Wechsel herstellen, trennen, herstellen,trennen, . . . . Für mehr E�zienz die Verbindungen übergeben und monolithisch schlieÿen und ö�nen.

3. Es werden zwei Datenbank-Verbindungen zu viel hergestellt, da die DB-Engine den Datensatz viermal,zweimal zu viel, traversieren muss. Das wäre sogar in einem Durchgang möglich.(<default_package>.CSV_SolutionHandle.java Zeile 239 �)

4. Datenbank-Verbindung als Objekt zentral de�nieren und nicht fortwährend aufbauen und Fehler-Exceptionsabfangen

5. eindeutige Fallunterscheidungen serialisieren, wenn for(int i = 0; ...) und if(i == 0) feststehend sind �MatrixBuilder.java Zeile 311 �

6. Konstanten zentral de�nieren und ansprechen � erleichtert die Fehlersuche und das Ändern von Werten

7. Methoden, die nur den Input verwalten als static deklarieren, um nicht immer via Instanzen auf diesezugreifen zu müssen.

8. Kommandozeilen Outputs zur Fehleranalyse überdenken � generell sollten alle System.out-Statements aufSinnhaftigkeit, Art und Weise überdacht werden

9. Akkumulatoren und Variablen benutzen � letztere vor Allem, um Werte nicht redundant zu berechnen, daAnweisungen gröÿer, aber weniger rechenintensiv, statt kürzer und komplizierter

10. Einheitliches Namensschema verwenden: entweder "DB", "Db" oder "Datenbank" respektive . . . "Sol"oder . . . "Solution" respektive "Wrkshop" oder "Workshop".

11. Konventionen für Methodenname einhalten. Negativ-Beispiel: "ImportCSVSol()"(<default_package>.CSV_SolutionHandle.java Zeile 151)

Diese Ine�zienzen sollten bei der nächsten Gelegenheit behoben werden, da sie implizit Geld, Zeit

und Rechenleistung kosten.

Seite 48 von 48