Hallo,
ich schreibe gerade ein Programm, in dem ich in einem Graphen zu aufkommenden Notrufen an verschiedenen Knoten nächstgelegene Fahrzeuge zuweise. Diese will ich mit dem Dijkstra Algorithmus ausfindig machen. Den Dijkstra habe ich von einer anderen Seite übernommen und ihn auch vorher getestet, er funktioniert für einen Knoten. Die vorletzte Zeile mit "settledNodes.clear()" habe ich hinzugefügt, damit das Set mit allen Knoten nach dem Durchlaufen wiedergelöscht wird.
Meine Frage ist nun, wie ich die Methode "calculateShortestPathFromSource" ändern muss, dass die berechneten Pfadlängen wieder zurückgesetzt werden. Denn wenn ich meinen Graph erstelle und für verschiedene Knoten die Methode aufrufe, werden die Distanzen vom ersten Aufruf übernommen. Ich füge auch meine Main Methode mit dem Graph und den Ausgaben ein(die Ausgaben sind:
Knoten 2Distanz 8
Distanz zu Knoten A0
Distanz zu Knoten B20
Knoten 3Distanz 7
Distanz zu Knoten A0
Distanz zu Knoten B0)
Wie man sehen kann bleibt die Distanz zu Knoten A bei Null, obwohl ich eigentlich nun Knoten B betrachte, habe ich irgendwo einen Denkfehler oder geht das mit diesem Ansatz grundsätzlich nicht?
Vielen Dank schon mal im Voraus!
ich schreibe gerade ein Programm, in dem ich in einem Graphen zu aufkommenden Notrufen an verschiedenen Knoten nächstgelegene Fahrzeuge zuweise. Diese will ich mit dem Dijkstra Algorithmus ausfindig machen. Den Dijkstra habe ich von einer anderen Seite übernommen und ihn auch vorher getestet, er funktioniert für einen Knoten. Die vorletzte Zeile mit "settledNodes.clear()" habe ich hinzugefügt, damit das Set mit allen Knoten nach dem Durchlaufen wiedergelöscht wird.
Java:
import java.util.HashSet;
import java.util.Set;
import java.util.LinkedList;
import java.util.Map.Entry;
public class Dijkstra {
public static Node getLowestDistanceNode(Set<Node> unsettledNodes) {
Node lowestDistanceNode = null;
int lowestDistance = Integer.MAX_VALUE;
for (Node node : unsettledNodes) {
int nodeDistance = node.getDistance();
if (nodeDistance < lowestDistance) {
lowestDistance = nodeDistance;
lowestDistanceNode = node;
}
}
return lowestDistanceNode;
}
GraphDijkstra graph2;
private static void CalculateMinimumDistance(Node evaluationNode, Integer edgeWeigh, Node sourceNode) {
Integer sourceDistance = sourceNode.getDistance();
if (sourceDistance + edgeWeigh < evaluationNode.getDistance()) {
evaluationNode.setDistance(sourceDistance + edgeWeigh);
LinkedList<Node> shortestPath = new LinkedList<>(sourceNode.getShortestPath());
shortestPath.add(sourceNode);
evaluationNode.setShortestPath(shortestPath);
}
}
public static GraphDijkstra calculateShortestPathFromSource(GraphDijkstra graph, Node source) {
source.setDistance(0);
Set<Node> settledNodes = new HashSet<>();
Set<Node> unsettledNodes = new HashSet<>();
unsettledNodes.add(source);
while (unsettledNodes.size() != 0) {
Node currentNode = getLowestDistanceNode(unsettledNodes);
unsettledNodes.remove(currentNode);
for (Entry < Node, Integer> adjacencyPair:
currentNode.getAdjacentNodes().entrySet()) {
Node adjacentNode = adjacencyPair.getKey();
Integer edgeWeight = adjacencyPair.getValue();
if (!settledNodes.contains(adjacentNode)) {
CalculateMinimumDistance(adjacentNode, edgeWeight, currentNode);
unsettledNodes.add(adjacentNode);
}
}
settledNodes.add(currentNode);
}
settledNodes.clear();
return graph ;
}
}
Meine Frage ist nun, wie ich die Methode "calculateShortestPathFromSource" ändern muss, dass die berechneten Pfadlängen wieder zurückgesetzt werden. Denn wenn ich meinen Graph erstelle und für verschiedene Knoten die Methode aufrufe, werden die Distanzen vom ersten Aufruf übernommen. Ich füge auch meine Main Methode mit dem Graph und den Ausgaben ein(die Ausgaben sind:
Knoten 2Distanz 8
Distanz zu Knoten A0
Distanz zu Knoten B20
Knoten 3Distanz 7
Distanz zu Knoten A0
Distanz zu Knoten B0)
Wie man sehen kann bleibt die Distanz zu Knoten A bei Null, obwohl ich eigentlich nun Knoten B betrachte, habe ich irgendwo einen Denkfehler oder geht das mit diesem Ansatz grundsätzlich nicht?
Vielen Dank schon mal im Voraus!
Java:
public static void main(String[]args){
Node nodeA = new Node(false,0,null,0);
Node nodeB = new Node(true,1,null,0);
Node nodeC = new Node(false,2,null,0);
Node nodeD = new Node(false,3,null,0);
Node nodeE = new Node(false,4,null,0);
Node nodeF = new Node(true,5,null,0);
Node nodeG = new Node(false,6,null,0);
Node nodeH = new Node(false,7,null,0);
Node nodeI = new Node(false,8,null,0);
Node nodeJ = new Node(true,9,null,0);
Node nodeK = new Node(false,10,null,0);
nodeA.addDestination(nodeB, 20);
nodeA.addDestination(nodeC, 8);
nodeA.addDestination(nodeE, 9);
nodeB.addDestination(nodeA, 20);
nodeB.addDestination(nodeD, 7);
nodeB.addDestination(nodeI, 17);
nodeC.addDestination(nodeA, 8);
nodeC.addDestination(nodeE, 8);
nodeC.addDestination(nodeF, 5);
nodeC.addDestination(nodeJ, 10);
nodeD.addDestination(nodeB, 7);
nodeD.addDestination(nodeF, 6);
nodeD.addDestination(nodeH, 5);
nodeE.addDestination(nodeC, 8);
nodeE.addDestination(nodeA, 9);
nodeE.addDestination(nodeJ, 10);
nodeF.addDestination(nodeC, 5);
nodeF.addDestination(nodeD, 6);
nodeF.addDestination(nodeG, 4);
nodeF.addDestination(nodeH, 5);
nodeG.addDestination(nodeF, 4);
nodeG.addDestination(nodeH, 4);
nodeG.addDestination(nodeJ, 8);
nodeG.addDestination(nodeK, 7);
nodeH.addDestination(nodeD, 5);
nodeH.addDestination(nodeG, 4);
nodeH.addDestination(nodeF, 5);
nodeH.addDestination(nodeI, 6);
nodeI.addDestination(nodeH, 6);
nodeI.addDestination(nodeB, 17);
nodeI.addDestination(nodeK, 8);
nodeJ.addDestination(nodeG, 8);
nodeJ.addDestination(nodeE, 10);
nodeJ.addDestination(nodeC, 10);
nodeJ.addDestination(nodeK, 9);
nodeK.addDestination(nodeJ, 9);
nodeK.addDestination(nodeI, 8);
nodeK.addDestination(nodeG, 7);
GraphDijkstra graph = new GraphDijkstra();
graph.addNode(nodeA);
graph.addNode(nodeB);
graph.addNode(nodeC);
graph.addNode(nodeD);
graph.addNode(nodeE);
graph.addNode(nodeF);
graph.addNode(nodeG);
graph.addNode(nodeH);
graph.addNode(nodeI);
graph.addNode(nodeJ);
graph.addNode(nodeK);
Set<Node> fahrzeugNodes = new HashSet<>();
fahrzeugNodes.add(nodeC);
fahrzeugNodes.add(nodeD);
fahrzeugNodes.add(nodeF);
fahrzeugNodes.add(nodeG);
fahrzeugNodes.add(nodeH);
calculateShortestPathFromSource(graph, nodeA);
System.out.print("Knoten "+getLowestDistanceNode(fahrzeugNodes).knotennummer);
System.out.println("Distanz "+getLowestDistanceNode(fahrzeugNodes).distance);
System.out.println("Distanz zu Knoten A"+nodeA.distance);
System.out.println("Distanz zu Knoten B"+nodeB.distance);
calculateShortestPathFromSource(graph, nodeB);
System.out.print("Knoten "+getLowestDistanceNode(fahrzeugNodes).knotennummer);
System.out.println("Distanz "+getLowestDistanceNode(fahrzeugNodes).distance);
System.out.println("Distanz zu Knoten A"+nodeA.distance);
System.out.println("Distanz zu Knoten B"+nodeB.distance);
}