package de.srsoftware.web4rail; import java.util.HashSet; import java.util.List; import java.util.Map.Entry; import java.util.TreeMap; import java.util.Vector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import de.srsoftware.web4rail.Plan.Direction; import de.srsoftware.web4rail.moving.Train; import de.srsoftware.web4rail.tiles.Block; public class PathFinder extends BaseClass{ public static final Logger LOG = LoggerFactory.getLogger(PathFinder.class); private static TreeMap> availableRoutes(Context context,HashSet visitedRoutes){ LOG.debug("PathFinder.availableRoutes({})",context); TreeMap> availableRoutes = new TreeMap>(); String inset = ""; for (int i=0; i> forwardRoutes = availableRoutes(forwardContext,visitedRoutes); visitedRoutes.remove(routeCandidate); if (forwardRoutes.isEmpty()) continue; // the candidate does not lead to a block, from which routes to the destination exist Entry> entry = forwardRoutes.lastEntry(); LOG.debug("{}→ The following routes have connections to {}:",inset,destination); for (Route rt: entry.getValue()) LOG.debug("{} - {}",inset,rt.shortName()); priority += entry.getKey()-10; } } List routeSet = availableRoutes.get(priority); if (isNull(routeSet)) { routeSet = new Vector(); availableRoutes.put(priority, routeSet); } routeSet.add(routeCandidate); if (routeCandidate.endBlock() == destination) break; // direct connection to destination discovered, quit search } if (!availableRoutes.isEmpty()) LOG.debug("{}→ Routes from {}: {}",inset,block,availableRoutes.isEmpty()?"none":""); for (Entry> entry : availableRoutes.entrySet()) { LOG.debug("{} - Priority {}:",inset,entry.getKey()); for (Route r : entry.getValue()) { LOG.debug("{} - {}",inset,r.shortName()); } } return availableRoutes; } public static Route chooseRoute(Context context) { LOG.debug("PathFinder.chooseRoute({})",context); TreeMap> availableRoutes = PathFinder.availableRoutes(context,new HashSet()); while (!availableRoutes.isEmpty()) { LOG.debug("availableRoutes: {}",availableRoutes); Entry> entry = availableRoutes.lastEntry(); List preferredRoutes = entry.getValue(); LOG.debug("preferredRoutes: {}",preferredRoutes); Route selectedRoute = preferredRoutes.get(random.nextInt(preferredRoutes.size())); if (selectedRoute.isFreeFor(context.route(selectedRoute))) { LOG.debug("Chose \"{}\" with priority {}.",selectedRoute,entry.getKey()); return selectedRoute; } LOG.debug("Selected route \"{}\" is not free for {}",selectedRoute,context); preferredRoutes.remove(selectedRoute); if (preferredRoutes.isEmpty()) availableRoutes.remove(availableRoutes.lastKey()); } return null; } }