forgot to commit this part last time, final version
This commit is contained in:
parent
5ebf9d2b2b
commit
02acc9643a
@ -4,15 +4,13 @@ import dev.ksan.travelpathoptimizer.model.City;
|
||||
import dev.ksan.travelpathoptimizer.model.Departure;
|
||||
import dev.ksan.travelpathoptimizer.model.Location;
|
||||
import dev.ksan.travelpathoptimizer.model.TransportType;
|
||||
import dev.ksan.travelpathoptimizer.service.CityManager;
|
||||
import dev.ksan.travelpathoptimizer.util.JsonParser;
|
||||
import java.time.Duration;
|
||||
import java.time.LocalTime;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* Simulates pathfinding in a transportation network, managing paths between cities
|
||||
* and calculating top paths based on different cost metrics (e.g., time, price, hops).
|
||||
* Simulates pathfinding in a transportation network, managing paths between cities and calculating
|
||||
* top paths based on different cost metrics (e.g., time, price, hops).
|
||||
*/
|
||||
public class GraphSimulation {
|
||||
|
||||
@ -22,7 +20,7 @@ public class GraphSimulation {
|
||||
private static int nextid = 0;
|
||||
private static Set<String> visitedRoutes = new HashSet<>();
|
||||
public static PriorityQueue<PathResult> topPaths =
|
||||
new PriorityQueue<>(5, Comparator.comparingDouble(PathResult::getCost).reversed());
|
||||
new PriorityQueue<>(5, Comparator.comparingDouble(PathResult::getCost).reversed());
|
||||
|
||||
/**
|
||||
* Gets the list of top 5 paths sorted by cost in ascending order.
|
||||
@ -35,9 +33,7 @@ public class GraphSimulation {
|
||||
return pathList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the simulation, clearing all paths, visited routes, and top paths.
|
||||
*/
|
||||
/** Resets the simulation, clearing all paths, visited routes, and top paths. */
|
||||
public void reset() {
|
||||
topPaths.clear();
|
||||
pathIdCounter = 1;
|
||||
@ -87,35 +83,35 @@ public class GraphSimulation {
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively calculates the top paths from a starting city to an ending city, considering
|
||||
* the type of cost metric (e.g., time, price, or hops).
|
||||
* Recursively calculates the top paths from a starting city to an ending city, considering the
|
||||
* type of cost metric (e.g., time, price, or hops).
|
||||
*
|
||||
* @param currentCity the city where the journey is currently at.
|
||||
* @param endCity the destination city of the journey.
|
||||
* @param path the list of cities visited so far.
|
||||
* @param totalCost the total cost accumulated up to the current city.
|
||||
* @param endCity the destination city of the journey.
|
||||
* @param path the list of cities visited so far.
|
||||
* @param totalCost the total cost accumulated up to the current city.
|
||||
* @param currentTime the current time at the city.
|
||||
* @param departures the list of departure IDs taken so far.
|
||||
* @param type the type of cost metric to use ("time", "price", or "hops").
|
||||
* @param departures the list of departure IDs taken so far.
|
||||
* @param type the type of cost metric to use ("time", "price", or "hops").
|
||||
*/
|
||||
public static void calculateTopPaths(
|
||||
City currentCity,
|
||||
City endCity,
|
||||
List<City> path,
|
||||
double totalCost,
|
||||
LocalTime currentTime,
|
||||
List<Integer> departures,
|
||||
String type,
|
||||
TransportType lastType) {
|
||||
City currentCity,
|
||||
City endCity,
|
||||
List<City> path,
|
||||
double totalCost,
|
||||
LocalTime currentTime,
|
||||
List<Integer> departures,
|
||||
String type,
|
||||
TransportType lastType) {
|
||||
|
||||
if (currentCity.getLocation().equals(endCity.getLocation())) {
|
||||
addToTopPaths(
|
||||
new PathResult(
|
||||
nextid++,
|
||||
new ArrayList<>(path),
|
||||
new ArrayList<>(departures),
|
||||
totalCost,
|
||||
currentTime));
|
||||
new PathResult(
|
||||
nextid++,
|
||||
new ArrayList<>(path),
|
||||
new ArrayList<>(departures),
|
||||
totalCost,
|
||||
currentTime));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -132,23 +128,26 @@ public class GraphSimulation {
|
||||
Duration duration = Duration.between(currentTime, arrivalTime);
|
||||
duration = duration.abs();
|
||||
|
||||
|
||||
if (type.equals("time")) {
|
||||
cost += duration.toMinutes();
|
||||
|
||||
if(lastType == TransportType.NOT_ASSIGNED){
|
||||
if (lastType == TransportType.NOT_ASSIGNED) {
|
||||
|
||||
cost += dep.getMinTransferTime();
|
||||
}else if(lastType != dep.getType()){
|
||||
} else if (lastType != dep.getType()) {
|
||||
|
||||
cost += dep.getMinTransferTime();
|
||||
}
|
||||
|
||||
//cost += dep.getMinTransferTime();
|
||||
// cost += dep.getMinTransferTime();
|
||||
} else if (type.equals("price")) {
|
||||
cost += dep.getPrice();
|
||||
} else if (type.equals("hops")) {
|
||||
cost++;
|
||||
/*if(!(lastType == dep.getType())){
|
||||
cost++;
|
||||
}
|
||||
*/
|
||||
if (!topPaths.isEmpty() && totalCost + cost >= topPaths.peek().getCost()) continue;
|
||||
} else {
|
||||
return;
|
||||
@ -160,7 +159,8 @@ public class GraphSimulation {
|
||||
path.add(nextCity);
|
||||
departures.add(dep.getIdCounter());
|
||||
|
||||
calculateTopPaths(nextCity, endCity, path, totalCost + cost, arrivalTime, departures, type, dep.getType());
|
||||
calculateTopPaths(
|
||||
nextCity, endCity, path, totalCost + cost, arrivalTime, departures, type, dep.getType());
|
||||
|
||||
departures.remove(departures.size() - 1);
|
||||
path.remove(path.size() - 1);
|
||||
@ -170,9 +170,7 @@ public class GraphSimulation {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints the top 5 paths to the console.
|
||||
*/
|
||||
/** Prints the top 5 paths to the console. */
|
||||
public static void printTopPaths() {
|
||||
if (topPaths.isEmpty()) {
|
||||
System.out.println("No Paths");
|
||||
@ -192,13 +190,16 @@ public class GraphSimulation {
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the shortest path between two cities using a specified cost metric (e.g., price, time, hops).
|
||||
* Calculates the shortest path between two cities using a specified cost metric (e.g., price,
|
||||
* time, hops).
|
||||
*
|
||||
* @param startCity the starting city of the path.
|
||||
* @param endCity the destination city of the path.
|
||||
* @param type the type of cost metric to use ("price", "time", or "hops").
|
||||
* @return a map where the keys are city locations and the values are the shortest cost to that location.
|
||||
* @param endCity the destination city of the path.
|
||||
* @param type the type of cost metric to use ("price", "time", or "hops").
|
||||
* @return a map where the keys are city locations and the values are the shortest cost to that
|
||||
* location.
|
||||
*/
|
||||
// old function used just for testing (missing come features and not used in the final product)
|
||||
public Map<Location, Double> calculateShortestPath(City startCity, City endCity, String type) {
|
||||
int n = matrix.length;
|
||||
int m = matrix[0].length;
|
||||
@ -213,7 +214,7 @@ public class GraphSimulation {
|
||||
distances.put(startCity.getLocation(), 0.0);
|
||||
|
||||
PriorityQueue<City> pq =
|
||||
new PriorityQueue<>(Comparator.comparingDouble(city -> distances.get(city.getLocation())));
|
||||
new PriorityQueue<>(Comparator.comparingDouble(city -> distances.get(city.getLocation())));
|
||||
pq.add(startCity);
|
||||
|
||||
while (!pq.isEmpty()) {
|
||||
@ -302,3 +303,4 @@ public class GraphSimulation {
|
||||
return topPaths;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user