Stable Version Christian

This commit is contained in:
cmerkens 2024-06-26 02:20:36 +02:00
parent dd4ad4e574
commit ba548f6c1e
7 changed files with 78 additions and 18 deletions

View File

@ -11,7 +11,7 @@ public class DirectedGraph<T extends VertexMarking, U extends EdgeMarking> exten
public DirectedGraph() { public DirectedGraph() {
super(); super();
} //TestSeans }
public DirectedGraph(String s) { public DirectedGraph(String s) {
@ -126,6 +126,7 @@ public class DirectedGraph<T extends VertexMarking, U extends EdgeMarking> exten
// Dijkstra-Algorithmus // Dijkstra-Algorithmus
public int getShortestPathDijkstra(MarkedVertex<T> n1, MarkedVertex<T> n2) { public int getShortestPathDijkstra(MarkedVertex<T> n1, MarkedVertex<T> n2) {
// Erstellt Hashmap um Distanz von Startnoten zu jedem Knoten auf dem Graph zu tracken // Erstellt Hashmap um Distanz von Startnoten zu jedem Knoten auf dem Graph zu tracken
// Erstellt Hashmap um zu tracken welche Knoten schon besucht wurden // Erstellt Hashmap um zu tracken welche Knoten schon besucht wurden
// Initialisierung aller Distanzen auf UNENDLICH (= -1) // Initialisierung aller Distanzen auf UNENDLICH (= -1)
@ -136,6 +137,7 @@ public class DirectedGraph<T extends VertexMarking, U extends EdgeMarking> exten
distance.put(i, -1); distance.put(i, -1);
visited.put(i, false); visited.put(i, false);
} }
// Erstelle Schlange wo die nächsten Verbindungen drin sind // Erstelle Schlange wo die nächsten Verbindungen drin sind
PriorityQueue<WrapperElement<T>> queue = new PriorityQueue<>(new WrapperComparator<T>()); PriorityQueue<WrapperElement<T>> queue = new PriorityQueue<>(new WrapperComparator<T>());
@ -144,16 +146,47 @@ public class DirectedGraph<T extends VertexMarking, U extends EdgeMarking> exten
distance.put(n1, 0); distance.put(n1, 0);
queue.add(new WrapperElement<>(n1, 0)); queue.add(new WrapperElement<>(n1, 0));
// Variable, die Distanz zwischen aktuellem Knoten und Nachfolger speichert
int dist = 0;
while (!queue.isEmpty()) { while (!queue.isEmpty()) {
// Den nächsten Knoten, der am wenigsten kostet, besuchen // Den nächsten Knoten, der am wenigsten kostet, besuchen
WrapperElement<T> nextVertex = queue.poll(); WrapperElement<T> nextVertex = queue.poll();
// Knoten als besucht makieren
visited.put(nextVertex.getElement(), true); visited.put(nextVertex.getElement(), true);
System.out.println("Visit " + nextVertex.getElement().getName());
// Gehe von diesem Knoten aus alle erreichbaren Knoten durch
for (MarkedVertex<T> i: this.getSuccessors(nextVertex.getElement())) { for (MarkedVertex<T> i: this.getSuccessors(nextVertex.getElement())) {
// Kante finde, die den jetzigen und nächsten Knoten verbindet
for (MarkedEdge<U> j: this.getAllEdges()) {
if (j.getSource() == nextVertex.getElement() && j.getDestination() == i) {
// Berechne Distanz zu nächstem Knoten
dist = distance.get(nextVertex.getElement()) + j.getWeighting();
break;
} }
} }
return 1; // Wenn es schon einen kürzeren Weg zum Knoten gibt, überspringen
if ((distance.get(i) <= dist && distance.get(i) != -1) || visited.get(i)) {
continue;
}
// Aktualisiere Distanz von Start zu nächstem Knoten
distance.put(i, dist);
System.out.println("Add " + i.getName() + " with " + dist + " weight to queue.");
// Nehme nächsten Knoten in die Queue auf
queue.add(new WrapperElement<>(i, dist));
}
}
// Gibt Distanz zu gefragtem Knoten zurück
return distance.get(n2);
} }
} }

View File

@ -1,7 +1,32 @@
package graph; package graph;
import java.util.Random;
public class Display { public class Display {
public static void main(String[] args) { public static void main(String[] args) {
DirectedGraph<VertexMarking, EdgeMarking> myGraph = new DirectedGraph<>();
for (int i = 0; i < 10; i++) {
myGraph.addVertex(new MarkedVertex<>(String.valueOf(i), null));
}
Random random = new Random();
for (MarkedVertex<VertexMarking> i: myGraph.getAllVertexes()) {
myGraph.addEdge(new MarkedEdge<>("a", i, myGraph.getAllVertexes().get(random.nextInt(myGraph.getAllVertexes().size())), null, random.nextInt(1, 10)));
}
for (MarkedVertex<VertexMarking> i: myGraph.getAllVertexes()) {
myGraph.addEdge(new MarkedEdge<>("a", i, myGraph.getAllVertexes().get(random.nextInt(myGraph.getAllVertexes().size())), null, random.nextInt(1, 10)));
}
System.out.println(myGraph.toString());
MarkedVertex<VertexMarking> start = myGraph.getAllVertexes().get(random.nextInt(myGraph.getAllVertexes().size()));
MarkedVertex<VertexMarking> end = myGraph.getAllVertexes().get(random.nextInt(myGraph.getAllVertexes().size()));
System.out.println(start.getName() + " to " + end.getName());
System.out.println(myGraph.getShortestPathDijkstra(start, end));
} }
} }

View File

@ -51,7 +51,16 @@ public abstract class Graph<T extends VertexMarking, U extends EdgeMarking> {
// Ausgabe // Ausgabe
public String toString() { public String toString() {
return ""; String output = "";
for (Vertex i: this.vertexes) {
output += i.toString();
output += "\n";
}
for (Edge i: this.edges) {
output += i.toString();
output += "\n";
}
return output;
} }

View File

@ -1,7 +1,5 @@
package graph; package graph;
import java.util.Vector;
public class MarkedVertex<T extends VertexMarking> extends Vertex{ public class MarkedVertex<T extends VertexMarking> extends Vertex{
// ATTRIBUTE // ATTRIBUTE

View File

@ -1,10 +1,9 @@
package graph; package graph;
import java.util.Comparator; import java.util.Comparator;
// Exception, das User nach einem ungültigen Knoten sucht // Exception, das User nach einem ungültigen Knoten sucht
class NameDoesNotExistException extends Exception { public class NameDoesNotExistException extends Exception {
public NameDoesNotExistException() { public NameDoesNotExistException() {
super(); super();
} }
@ -50,6 +49,12 @@ class WrapperElement<T extends VertexMarking> {
public int getPrio() { public int getPrio() {
return this.prio; return this.prio;
} }
// Ausgabe
public String toString() {
return "Wrapper with " + this.n1 + " with prio " + this.prio;
}
} }

View File

@ -1,8 +1,6 @@
package graph; package graph;
import java.util.HashMap;
import java.util.Objects; import java.util.Objects;
import java.util.PriorityQueue;
import java.util.Vector; import java.util.Vector;
public class UndirectedGraph<T extends VertexMarking, U extends EdgeMarking> extends Graph<T, U> { public class UndirectedGraph<T extends VertexMarking, U extends EdgeMarking> extends Graph<T, U> {
@ -19,12 +17,6 @@ public class UndirectedGraph<T extends VertexMarking, U extends EdgeMarking> ext
} }
// Ausgabe
public String toString() {
return "";
}
// KNOTEN EIGENSCHAFTEN // KNOTEN EIGENSCHAFTEN
// Prüfung des Grades eines Knotens // Prüfung des Grades eines Knotens

View File

@ -1,7 +1,5 @@
package graph; package graph;
import java.util.Vector;
public abstract class Vertex { public abstract class Vertex {
// ATTRIBUTE // ATTRIBUTE