diff --git "a/docs/IHK_Abschlusspr\303\274fung_Sven_Bergmann.lyx" "b/docs/IHK_Abschlusspr\303\274fung_Sven_Bergmann.lyx" index 35f24fb..8748e20 100644 --- "a/docs/IHK_Abschlusspr\303\274fung_Sven_Bergmann.lyx" +++ "b/docs/IHK_Abschlusspr\303\274fung_Sven_Bergmann.lyx" @@ -1291,10 +1291,10 @@ Landkarte Qualitätskontrolle stattfindet, welche den derzeitigen Abstand aller Nachbarsta aten berechnet und falls dieser geringer ist, als der vorher gespeicherte Abstand, diesen ersetzt und zudem die HashMap aller Beziehungen speichert. - Diese HashMap wird dann am Ende genommen, um die eigentliche zu überschreiben + Diese HashMap wird dann am Ende genommen, um die Eigentliche zu überschreiben und dadurch wird durch das Kommandozeilenargument, welches die Iterationen angibt nur eine maximale Anzahl an Iterationen festgelegt. - Es kann dadurch beispielsweise passieren, dass bei einer Angabe von + Es kann somit beispielsweise passieren, dass bei einer Angabe von \begin_inset Quotes gld \end_inset @@ -1302,10 +1302,13 @@ aten berechnet und falls dieser geringer ist, als der vorher gespeicherte \begin_inset Quotes grd \end_inset - die Anzahl 460 an Iterationen rauskommt, da dort der minimalste Abstand + die Anzahl 460 an Iterationen herauskommt, da dort der minimalste Abstand der Nachbarstaaten ist. Es fand zudem eine Veränderung der Abstandsberechnung statt, da in irgendeiner Art dargestellt werden musste, dass ein Kreis innerhalb eines anderen liegt. + Des Weiteren wird der Staat mit den meisten Nachbarn von Verschiebungen + ausgenommen, da es so einen Fixpunkt gibt, um den sich die anderen Staaten + herum bewegen können. \end_layout @@ -1313,6 +1316,20 @@ aten berechnet und falls dieser geringer ist, als der vorher gespeicherte Benutzeranleitung \end_layout +\begin_layout Standard +Generell befindet sich die Gesamtdokumentation der Klassen und Methoden + als javadoc im +\begin_inset Quotes gld +\end_inset + +docs +\begin_inset Quotes grd +\end_inset + + Ordner. + +\end_layout + \begin_layout Subsection Ordnerstruktur \end_layout @@ -1781,20 +1798,118 @@ input Beispiel 2: Bierkonsum von 10 Staaten \end_layout +\begin_layout Standard +Der Bierkonsum der Staaten wird in Beispiel 2 beschrieben, was daher interessant + ist, dass alle Nachbarschaftsbeziehungen wie in Beispiel 1 dargestellt + werden müssen, aber die Größe der Kreise vollkommen unterschiedlich sind. + Es kann also nun passieren, dass der Algorithmus mit Beispiel 1 besser + oder schlechter funktioniert als mit Beispiel 2. + Allerdings konnte hier wiederum weder mit 100 noch mit einer anderen Zahl + an Iterationen das Beispiel reproduziert werden. +\end_layout + +\begin_layout Standard +Das Beispiel ist in der Datei +\begin_inset Quotes gld +\end_inset + +beispiel2.txt +\begin_inset Quotes grd +\end_inset + + im Ordner +\begin_inset Quotes gld +\end_inset + +input +\begin_inset Quotes grd +\end_inset + + zu finden. +\end_layout + \begin_layout Subsubsection -Äquivalenzklassen +Beispiel 3: Fläche von 24 Staaten \end_layout -\begin_layout Subsection -White-Box-Test +\begin_layout Standard +Die Fläche von 24 Staaten ist wiederum ähnlich zum Beispiel 1 nur mit mehr + Nachbarn. + Das heißt alle Kenngrößen bleiben gleich und theoretisch sollte auch die + Anordnung der 10 gleichen Staaten gleich bleiben, allerdings kann es durch + die Abstoßungs- und Anziehungskräfte passieren, dass sich die Konstellation + auch ändert. +\end_layout + +\begin_layout Standard +Das Beispiel ist in der Datei +\begin_inset Quotes gld +\end_inset + +beispiel3.txt +\begin_inset Quotes grd +\end_inset + + im Ordner +\begin_inset Quotes gld +\end_inset + +input +\begin_inset Quotes grd +\end_inset + + zu finden. \end_layout \begin_layout Subsubsection -Kontrollflussgraphen +Beispiel 4: 2 Staaten zum Testen +\end_layout + +\begin_layout Standard +In diesem Beispiel habe ich zwei Staaten +\begin_inset Quotes gld +\end_inset + +1 +\begin_inset Quotes grd +\end_inset + + und +\begin_inset Quotes gld +\end_inset + +2 +\begin_inset Quotes grd +\end_inset + + zum Testen angelegt. + Normalerweise sollten sich die Kreise direkt nach der ersten Iteration + richtig ausgerichtet haben. + +\end_layout + +\begin_layout Standard +Das Beispiel ist in der Datei +\begin_inset Quotes gld +\end_inset + +beispiel4.txt +\begin_inset Quotes grd +\end_inset + + im Ordner +\begin_inset Quotes gld +\end_inset + +input +\begin_inset Quotes grd +\end_inset + + zu finden. \end_layout \begin_layout Section -Zusammenfassung und Ausblicks +Zusammenfassung und Ausblick \end_layout \begin_layout Standard @@ -2178,16 +2293,18 @@ name "fig:Berechnung-der-Kräfte" \end_layout -\begin_layout Subsection -Sequenzdiagramme +\begin_layout Section +Selbstständigkeitserklärung \end_layout -\begin_layout Subsection -Aktivitätsdiagramme -\end_layout +\begin_layout Standard +\begin_inset Graphics + filename Selbstständigkeitserklärung.pdf + width 100text% + +\end_inset + -\begin_layout Section -Eigenständigkeitserklärung \end_layout \end_body diff --git "a/docs/IHK_Abschlusspr\303\274fung_Sven_Bergmann.pdf" "b/docs/IHK_Abschlusspr\303\274fung_Sven_Bergmann.pdf" new file mode 100644 index 0000000..31639a8 Binary files /dev/null and "b/docs/IHK_Abschlusspr\303\274fung_Sven_Bergmann.pdf" differ diff --git a/input/beispiel5.txt b/input/beispiel4.txt similarity index 81% rename from input/beispiel5.txt rename to input/beispiel4.txt index c88cc11..e93ada0 100644 --- a/input/beispiel5.txt +++ b/input/beispiel4.txt @@ -2,7 +2,5 @@ Test # Staat Bierkonsum Längengrad Breitengrad 1 200 6 5 2 300 2 3 -3 50 4 7 # Nachbarschaften -1: 2 3 -2: 3 \ No newline at end of file +1: 2 \ No newline at end of file diff --git a/output/beispiel4.txt_out.txt b/output/beispiel4.txt_out.txt new file mode 100644 index 0000000..fab011b --- /dev/null +++ b/output/beispiel4.txt_out.txt @@ -0,0 +1,14 @@ +reset +set xrange [1.0:6.666666666666667] +set yrange [-0.8333333333333335:8.5] +set size ratio 1.0 +set title "Test, Iterationen: 1" +unset xtics +unset ytics +$data << EOD +6.0 5.0 0.6666666666666666 1 0 +2.0 3.0 1.0 2 1 +EOD +plot \ +'$data' using 1:2:3:5 with circles lc var notitle, \ +'$data' using 1:2:4:5 with labels font "arial,9" tc variable notitle \ No newline at end of file diff --git a/output/beispiel5.txt_out.txt b/output/beispiel5.txt_out.txt index 9a7faac..b59d950 100644 --- a/output/beispiel5.txt_out.txt +++ b/output/beispiel5.txt_out.txt @@ -1,14 +1,13 @@ reset -set xrange [1.8698310770064768:6.0379913583150095] -set yrange [4.830346104049601:7.166666666666667] +set xrange [3.5092880150001404:6.666666666666667] +set yrange [1.6759546816668074:7.24535599249993] set size ratio 1.0 -set title "Test, Iterationen: 8" +set title "Test, Iterationen: 1" unset xtics unset ytics $data << EOD -4.0 7.0 0.16666666666666666 3 0 -3.975561971127063 5.880610818217393 0.6666666666666666 1 1 -4.0379913583150095 5.830346104049601 1.0 2 2 +6.0 5.0 0.6666666666666666 1 0 +4.50928801500014 4.254644007500071 1.0 2 1 EOD plot \ '$data' using 1:2:3:5 with circles lc var notitle, \ diff --git a/src/main/java/com/cae/de/models/Landkarte.java b/src/main/java/com/cae/de/models/Landkarte.java index d4483ef..845ca38 100644 --- a/src/main/java/com/cae/de/models/Landkarte.java +++ b/src/main/java/com/cae/de/models/Landkarte.java @@ -3,6 +3,7 @@ import com.cae.de.utils.Pair; import com.cae.de.utils.algorithms.IStrategy; import com.cae.de.utils.la.Kreis; +import com.cae.de.utils.la.Punkt; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; @@ -103,12 +104,12 @@ public double getAbstandZwischenNachbarStaaten() { .map( staatHashSetEntry -> { var s1 = staatHashSetEntry.getKey(); - var k1 = new Kreis(s1.getX(), s1.getY(), s1.getKenngroesse()); + var k1 = new Kreis(new Punkt(s1.getX(), s1.getY()), s1.getKenngroesse()); return staatHashSetEntry.getValue().stream() .map( s2 -> { var abstand = - new Kreis(s2.getX(), s2.getY(), s2.getKenngroesse()) + new Kreis(new Punkt(s2.getX(), s2.getY()), s2.getKenngroesse()) .getAbstandZwischenKreisen(k1); return abstand > 0 ? abstand : 1; }) diff --git a/src/main/java/com/cae/de/utils/algorithms/BruteForceStrategy.java b/src/main/java/com/cae/de/utils/algorithms/BruteForceStrategy.java index 985bdea..07562f3 100644 --- a/src/main/java/com/cae/de/utils/algorithms/BruteForceStrategy.java +++ b/src/main/java/com/cae/de/utils/algorithms/BruteForceStrategy.java @@ -31,18 +31,26 @@ public class BruteForceStrategy implements IStrategy { */ private static void iteriere(Landkarte landkarte) { + var epsilon = 1e-6; + // Abstoßungskräfte der Staaten bestimmen, bei denen die Kreise überlappen landkarte .getBeziehungen() .forEach( (staat, nachbarn) -> { - var k1 = new Kreis(staat.getX(), staat.getY(), staat.getKenngroesse()); + var k1 = new Kreis(new Punkt(staat.getX(), staat.getY()), staat.getKenngroesse()); landkarte.getBeziehungen().keySet().stream() .filter( - staat2 -> - staat != staat2 - && !landkarte.getBeziehungen().get(staat).contains(staat2)) - .filter(staat2 -> k1.isInnerhalb(new Punkt(staat2.getX(), staat2.getY()))) + nachbar -> + staat != nachbar + && !landkarte.getBeziehungen().get(staat).contains(nachbar)) + .filter( + nachbar -> + k1.getAbstandZwischenKreisen( + new Kreis( + new Punkt(nachbar.getX(), nachbar.getY()), + nachbar.getKenngroesse())) + < 0) .forEach( nachbar -> landkarte.addKraft( @@ -56,7 +64,7 @@ private static void iteriere(Landkarte landkarte) { .getBeziehungen() .forEach( (staat, nachbarn) -> { - var k1 = new Kreis(staat.getX(), staat.getY(), staat.getKenngroesse()); + var k1 = new Kreis(new Punkt(staat.getX(), staat.getY()), staat.getKenngroesse()); nachbarn.forEach( nachbar -> landkarte.addKraft( @@ -64,14 +72,15 @@ private static void iteriere(Landkarte landkarte) { nachbar, k1.getAbstandZwischenKreisen( new Kreis( - nachbar.getX(), nachbar.getY(), nachbar.getKenngroesse())))); + new Punkt(nachbar.getX(), nachbar.getY()), + nachbar.getKenngroesse())))); }); var verschiebungen = landkarte.getStaatenNachKenngroesseSortiert().stream() .collect( Collectors.toMap( - Staat::getIdentifier, + staat -> staat, value -> new HashSet(), (prev, next) -> next, HashMap::new)); @@ -89,31 +98,26 @@ private static void iteriere(Landkarte landkarte) { var m1 = new Punkt(staat.getX(), staat.getY()); var m2 = new Punkt(nachbarstaat.getX(), nachbarstaat.getY()); var m1new = - kraft > 0 - ? m1.verschiebeInRichtung(m2, kraft / 2) - : m1.verschiebeInRichtung(m2, -kraft / 2); - verschiebungen.get(staat.getIdentifier()).add(m1new); + (nachbarstaat.equals(landkarte.getStaatMitMeistenNachbarn())) + ? m1.verschiebeInRichtung(m2, kraft) + : m1.verschiebeInRichtung(m2, kraft / 2); + verschiebungen.get(staat).add(m1new); })); // Setze für jeden Staat einen neuen Mittelpunkt, basieren auf den vorher ausgerechneten // Punkten, wobei der Staat mit den meisten Nachbarn nicht beachtet wird und der Staat nicht // verschoben wird, wenn der neue Mittelpunkt in irgendeinem anderen Kreis liegt. - landkarte.getStaatenNachKenngroesseSortiert().stream() + verschiebungen.keySet().stream() .filter(staat -> !staat.equals(landkarte.getStaatMitMeistenNachbarn())) .forEach( staat -> { - LOGGER.log( - Level.INFO, + var mNeu = Punkt.getMittelpunkt(verschiebungen.get(staat)); + var kNeu = new Kreis(mNeu, staat.getKenngroesse()); + var neuerKreisAusserhalb = getKreiseAllerAnderenStaaten(staat, landkarte.getStaatenNachKenngroesseSortiert()) - .toString()); - var p = Punkt.getMittelpunkt(verschiebungen.get(staat.getIdentifier())); - if (getKreiseAllerAnderenStaaten(staat, landkarte.getStaatenNachKenngroesseSortiert()) - .stream() - .noneMatch( - kreis -> - kreis.getAbstandZwischenKreisen( - new Kreis(p.x(), p.y(), staat.getKenngroesse())) - < 0)) + .stream() + .noneMatch(kreis -> kreis.getAbstandZwischenKreisen(kNeu) < epsilon); + if (neuerKreisAusserhalb) { LOGGER.log( Level.INFO, "Verschiebe: " @@ -121,9 +125,10 @@ private static void iteriere(Landkarte landkarte) { + " von " + new Punkt(staat.getX(), staat.getY()) + " nach " - + p); - staat.setX(p.x()); - staat.setY(p.y()); + + mNeu); + staat.setX(mNeu.x()); + staat.setY(mNeu.y()); + } }); landkarte.removeKraefte(); @@ -139,7 +144,7 @@ private static void iteriere(Landkarte landkarte) { private static Set getKreiseAllerAnderenStaaten(Staat staat, List staaten) { return staaten.stream() .filter(staat1 -> !staat1.equals(staat)) - .map(staat1 -> new Kreis(staat1.getX(), staat1.getY(), staat1.getKenngroesse())) + .map(staat1 -> new Kreis(new Punkt(staat1.getX(), staat1.getY()), staat1.getKenngroesse())) .collect(Collectors.toSet()); } diff --git a/src/main/java/com/cae/de/utils/la/Kreis.java b/src/main/java/com/cae/de/utils/la/Kreis.java index ebfdb9f..227c479 100644 --- a/src/main/java/com/cae/de/utils/la/Kreis.java +++ b/src/main/java/com/cae/de/utils/la/Kreis.java @@ -1,12 +1,16 @@ package com.cae.de.utils.la; +import java.util.logging.Level; +import java.util.logging.Logger; + /** * Record Kreis für eine primitive Abstandsberechnung. - * @param x der x Wert des Mittelpunktes - * @param y der y Wert des Mittelpunktes + * @param p der Mittelpunkt * @param r der Radius */ -public record Kreis(double x, double y, double r) { +public record Kreis(Punkt p, double r) { + + private static final Logger LOGGER = Logger.getLogger(Kreis.class.getName()); /** * Berechnet den Abstand beider Kreise @@ -15,7 +19,7 @@ public record Kreis(double x, double y, double r) { * andernfalls ist der Abstand negativ und repräsentiert die Strecke der größten Überschneidung. */ public double getAbstandZwischenKreisen(Kreis k) { - return new Punkt(k.x, k.y).getAbstand(new Punkt(this.x, this.y)) - (this.r + k.r); + return new Punkt(k.p().x(), k.p().y()).getAbstand(this.p) - (this.r + k.r); } /** @@ -24,7 +28,7 @@ public double getAbstandZwischenKreisen(Kreis k) { * @return true wenn er innerhalb liegt, andernfalls false */ public boolean isInnerhalb(Punkt p) { - return p.getAbstand(new Punkt(this.x, this.y)) < this.r; + return p.getAbstand(this.p) < this.r; } } diff --git a/src/test/java/KreisTest.java b/src/test/java/KreisTest.java deleted file mode 100644 index 7237aef..0000000 --- a/src/test/java/KreisTest.java +++ /dev/null @@ -1,13 +0,0 @@ -import com.cae.de.utils.la.Kreis; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -public class KreisTest { - - @Test - public void getAbstand() { - var k1 = new Kreis(0, 0, 10); - var k2 = new Kreis(0, 5, 10); - Assertions.assertEquals(-5, k1.getAbstandZwischenKreisen(k2)); - } -} diff --git a/src/test/java/VerschiebeTest.java b/src/test/java/VerschiebeTest.java deleted file mode 100644 index 39501bc..0000000 --- a/src/test/java/VerschiebeTest.java +++ /dev/null @@ -1,16 +0,0 @@ -import com.cae.de.utils.la.Punkt; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -public class VerschiebeTest { - - @Test - public void verschiebe() { - var p1 = new Punkt(0, 0); - var p2 = new Punkt(0, 5); - var p1Strich = p1.verschiebeInRichtung(p2, 6); - var p2Strich = p2.verschiebeInRichtung(p1, 6); - Assertions.assertEquals(6, p1Strich.y()); - Assertions.assertEquals(-1, p2Strich.y()); - } -}