Sauberer Routenplaner mit Dijkstra fertig implementiert.

better
hummel 2025-04-11 13:59:04 +02:00
parent a2040c3afe
commit 245b235d43
4 changed files with 110 additions and 28 deletions

View File

@ -1,6 +1,7 @@
package de.th_mannheim.informatik.routenplaner; package de.th_mannheim.informatik.routenplaner;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.util.Stack;
import de.th_mannheim.informatik.routenplaner.domain.Routeplaner; import de.th_mannheim.informatik.routenplaner.domain.Routeplaner;
@ -9,9 +10,14 @@ public class NaviApp {
public static void main(String[] args) throws FileNotFoundException { public static void main(String[] args) throws FileNotFoundException {
Routeplaner map = new Routeplaner(); Routeplaner map = new Routeplaner();
System.out.println(map.getNumberOfCities()); System.out.println(map.getNumberOfCities() + " Städte enthalten.");
map.planRoute("Mannheim", "Lübeck"); Stack<String> route = map.planRoute("Mannheim", "Lübeck");
System.out.println();
System.out.println("Gefundene Route:");
while (!route.isEmpty())
System.out.println(route.pop());
} }
} }

View File

@ -1,26 +1,80 @@
package de.th_mannheim.informatik.routenplaner.domain; package de.th_mannheim.informatik.routenplaner.domain;
import java.util.TreeSet; import java.util.LinkedList;
public class City { public class City implements Comparable<City>{
private String name; private String name;
private int distance;
private boolean explored;
private City predecessor;
private TreeSet<Street> neighbors = new TreeSet<>(); private LinkedList<Road> neighbors = new LinkedList<>();
public City(String name) { public City(String name) {
this.name = name; this.name = name;
this.reset();
} }
public void addConnection(City stadt2, int distance) { public void addConnection(City stadt2, int distance) {
neighbors.add(new Street(this, stadt2, distance)); neighbors.add(new Road(this, stadt2, distance));
} }
public String getName() { public String getName() {
return name; return name;
} }
public TreeSet<Street> getNeighbors() { public LinkedList<Road> getConnections() {
return neighbors; return neighbors;
} }
public void reset() {
distance = Integer.MAX_VALUE;
explored = false;
predecessor = null;
}
public int getDistance() {
return distance;
}
public void checkAndSetDistance(City start, City target, int value) {
if (this.distance > value) {
this.distance = value;
target.setPredecessor(start);
}
}
public boolean isExplored() {
return explored;
}
public void setExplored() {
explored = true;
}
public void setPredecessor(City predecessor) {
this.predecessor = predecessor;
}
public City getPredecessor() {
return predecessor;
}
@Override
public int compareTo(City other) {
int diff = this.distance - other.distance;
if (this == other)
return 0;
if (diff != 0)
return diff;
// if two Cities happen to have the same distance, sort alphabetically
return this.name.compareTo(other.name);
}
public String toString() {
return name + " " + distance;
}
} }

View File

@ -1,31 +1,17 @@
package de.th_mannheim.informatik.routenplaner.domain; package de.th_mannheim.informatik.routenplaner.domain;
public class Street implements Comparable<Street> { public class Road {
private final City start; private final City start;
private final City destination; private final City destination;
private final int distance; private final int distance;
public Street(City start, City destination, int distance) { public Road(City start, City destination, int distance) {
super(); super();
this.start = start; this.start = start;
this.destination = destination; this.destination = destination;
this.distance = distance; this.distance = distance;
} }
@Override
public int compareTo(Street v) {
int diff = this.distance - v.distance;
if (diff != 0)
return diff;
if (this.start.equals(v.start) && this.destination.equals(v.destination))
return 0;
// wg. Nutzung von TreeSet
return 1;
}
public City getStart() { public City getStart() {
return start; return start;

View File

@ -2,10 +2,11 @@ package de.th_mannheim.informatik.routenplaner.domain;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList;
import java.util.Scanner; import java.util.Scanner;
import java.util.Stack;
import java.util.TreeSet;
public class Routeplaner { public class Routeplaner {
private HashMap<String, City> cities = new HashMap<>(); private HashMap<String, City> cities = new HashMap<>();
@ -18,13 +19,47 @@ public class Routeplaner {
return cities.size(); return cities.size();
} }
public Deque<String> planRoute(String start, String destination) { public Stack<String> planRoute(String start, String destination) {
Deque<String> waypoints = new ArrayDeque<>(); TreeSet<City> candidates = new TreeSet<>();
System.out.println(cities.get("Mannheim").getNeighbors().size()); City startCity = cities.get(start);
startCity.checkAndSetDistance(startCity, startCity, 0);
LinkedList<Road> connections = startCity.getConnections();
this.processCandidates(startCity, connections, candidates);
startCity.setExplored();
// ---------------------------------------
// iterate over graph
while (!candidates.isEmpty()) {
City current = candidates.removeFirst();
this.processCandidates(current, current.getConnections(), candidates);
current.setExplored();
}
Stack<String> waypoints = new Stack<>();
City waypoint = cities.get(destination);
while (!waypoint.getName().equals(start)) {
waypoints.add(waypoint.toString());
waypoint = waypoint.getPredecessor();
}
waypoints.add(waypoint.toString());
return waypoints; return waypoints;
} }
private void processCandidates(City start, LinkedList<Road> connections, TreeSet<City> candidates) {
for (Road r : connections) {
City other = r.getTarget();
if (other.isExplored())
continue;
other.checkAndSetDistance(start, other, start.getDistance() + r.getDistance());
candidates.add(other);
}
}
private void loadData() throws FileNotFoundException { private void loadData() throws FileNotFoundException {
final Scanner sc = new Scanner(new File("Routenplaner/resources/entfernungen.txt")); final Scanner sc = new Scanner(new File("Routenplaner/resources/entfernungen.txt"));
@ -61,6 +96,7 @@ public class Routeplaner {
cities.put(name2, c2); cities.put(name2, c2);
} }
// all roads go in both directions
c1.addConnection(c2, distance); c1.addConnection(c2, distance);
c2.addConnection(c1, distance); c2.addConnection(c1, distance);
} }