Skip to content
This repository has been archived by the owner on Oct 8, 2023. It is now read-only.

Commit

Permalink
Finished Gro_pro
Browse files Browse the repository at this point in the history
  • Loading branch information
svbergmann committed Apr 8, 2022
1 parent 2f960f5 commit a80cb56
Show file tree
Hide file tree
Showing 10 changed files with 197 additions and 88 deletions.
147 changes: 132 additions & 15 deletions docs/IHK_Abschlussprüfung_Sven_Bergmann.lyx
Original file line number Diff line number Diff line change
Expand Up @@ -1291,28 +1291,45 @@ 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

-i 500
\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

\begin_layout Section
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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
Binary file added docs/IHK_Abschlussprüfung_Sven_Bergmann.pdf
Binary file not shown.
4 changes: 1 addition & 3 deletions input/beispiel5.txt → input/beispiel4.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
1: 2
14 changes: 14 additions & 0 deletions output/beispiel4.txt_out.txt
Original file line number Diff line number Diff line change
@@ -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
11 changes: 5 additions & 6 deletions output/beispiel5.txt_out.txt
Original file line number Diff line number Diff line change
@@ -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, \
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/com/cae/de/models/Landkarte.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
})
Expand Down
61 changes: 33 additions & 28 deletions src/main/java/com/cae/de/utils/algorithms/BruteForceStrategy.java
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -56,22 +64,23 @@ 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(
staat,
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<Punkt>(),
(prev, next) -> next,
HashMap::new));
Expand All @@ -89,41 +98,37 @@ 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: "
+ staat.getIdentifier()
+ " 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();
Expand All @@ -139,7 +144,7 @@ private static void iteriere(Landkarte landkarte) {
private static Set<Kreis> getKreiseAllerAnderenStaaten(Staat staat, List<Staat> 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());
}

Expand Down
Loading

0 comments on commit a80cb56

Please sign in to comment.