BasePlanner.java (4493B)
1 package osm.planner; 2 3 import java.util.Collection; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 import java.util.Stack; 8 import java.util.concurrent.atomic.AtomicReference; 9 10 import osm.planner.TargetIterable.TargetSet; 11 import osm.routing.RoutingEdge; 12 import osm.routing.RoutingGraph; 13 import osm.routing.RoutingNode; 14 import osm.routing.RoutingStrategy; 15 import osm.routing.RoutingGraph.Route; 16 import osm.routing.entity.Passenger; 17 18 /** 19 * An abstract base class implementing the {@link PlannerFunction} interface for 20 * planning routes in a routing graph. 21 * 22 * @param <N> The type of nodes in the graph. 23 * @param <E> The type of edges connecting the nodes. 24 */ 25 public abstract class BasePlanner<N extends RoutingNode<N>, E extends RoutingEdge<N>> implements PlannerFunction<N, E> { 26 27 /** 28 * Plans a route based on the specified routing graph, distance function, 29 * estimate function, garage node, and targets. 30 * 31 * @param router The routing graph. 32 * @param distanceFunction The strategy for calculating distance between nodes. 33 * @param estimateFunction The strategy for estimating remaining distance to 34 * targets. 35 * @param garage The starting node representing the garage or initial 36 * location. 37 * @param targets The collection of passengers with their destination 38 * nodes. 39 * @return A list of nodes representing the planned route. 40 */ 41 @Override 42 public List<N> plan( 43 RoutingGraph<N, E> router, 44 RoutingStrategy<N, E> distanceFunction, 45 RoutingStrategy<N, E> estimateFunction, 46 N garage, Collection<Passenger<N>> targets) { 47 48 Stack<N> path = new Stack<>(); 49 50 path.push(garage); 51 52 long pathLength = 0; 53 TargetIterable<Passenger<N>, N> targetIterable = new TargetIterable<>(garage, targets, path::peek, 54 p -> p.startPoint, p -> p.targetPoint); 55 56 for (TargetSet<Passenger<N>, N> currentTargets : targetIterable) { 57 Map<N, Long> targetEstimate = new HashMap<>(); 58 59 for (N target : currentTargets.targets) 60 targetEstimate.put(target, estimateLength(router, estimateFunction, currentTargets, target)); 61 62 Route<N> subPath = distanceFunction.route(router, targetEstimate, path.peek(), pathLength); 63 if (subPath == null) { 64 System.out.println("nothing found searching for " + currentTargets); 65 return null; 66 } 67 68 path.addAll(List.of(subPath.getPath())); 69 pathLength += subPath.getLength(); 70 } 71 72 return path; 73 } 74 75 /** 76 * Estimates the length of a route based on the specified routing graph, 77 * estimate function, entry, and current node. 78 * 79 * @param router The routing graph. 80 * @param estimateFunction The strategy for estimating remaining distance to 81 * targets. 82 * @param entry The set of current targets and their visitation 83 * states. 84 * @param current The current node. 85 * @return The estimated length of the route. 86 */ 87 protected long estimateLength(RoutingGraph<N, E> router, 88 RoutingStrategy<N, E> estimateFunction, 89 TargetSet<Passenger<N>, N> entry, N current) { 90 long pathLength = 0; 91 92 AtomicReference<N> currentRef = new AtomicReference<>(); 93 currentRef.set(current); 94 95 for (TargetSet<Passenger<N>, N> currentTargets : entry.doContinue(currentRef::get)) { 96 Route<N> subPath = estimateFunction.route(router, currentTargets.targets, currentRef.get(), 0); 97 98 currentRef.set(subPath.getTarget()); 99 pathLength += subPath.getLength(); 100 } 101 102 return pathLength; 103 } 104 105 /** 106 * Calculates the path score based on the specified routing graph, route length, 107 * and passenger distances. 108 * 109 * @param router The routing graph. 110 * @param length The length of the calculated route. 111 * @param passengers A map containing passengers and their respective distances. 112 * @return The calculated path score, considering the average passenger distance 113 * and the total route length. 114 */ 115 protected abstract long getPathScore(RoutingGraph<N, E> router, long length, Map<Passenger<N>, Long> passengers); 116 }