private Map<Node, InitialNode> swapNodes(final Map<Node, InitialNode> original) { Map<Node, InitialNode> result = new HashMap<>(); for (Map.Entry<Node, InitialNode> entry : original.entrySet()) { result.put(entry.getKey(), new InitialNode(entry.getValue().initialCost, entry.getValue().initialTime)); } return result; }
private Map<TransitStopFacility, InitialNode> locateWrappedNearestTransitStops(Person person, Coord coord, double departureTime) { Collection<TransitStopFacility> nearestTransitStops = this.transitRouterQuadTree.getNearestTransitStopFacilities(coord, this.config.getSearchRadius()); if (nearestTransitStops.size() < 2) { // also enlarge search area if only one stop found, maybe a second one is near the border of the search area TransitStopFacility nearestTransitStop = this.transitRouterQuadTree.getNearestTransitStopFacility(coord); double distance = CoordUtils.calcEuclideanDistance(coord, nearestTransitStop.getCoord()); nearestTransitStops = this.transitRouterQuadTree.getNearestTransitStopFacilities(coord, distance + this.config.getExtensionRadius()); } Map<TransitStopFacility, InitialNode> wrappedNearestTransitStops2AccessCost = new LinkedHashMap<>(); for (TransitStopFacility node : nearestTransitStops) { Coord toCoord = node.getCoord(); double initialTime = getWalkTime(null, coord, toCoord); double initialCost = getWalkDisutility(coord, toCoord); wrappedNearestTransitStops2AccessCost.put(node, new InitialNode(initialCost, initialTime + departureTime)); } return wrappedNearestTransitStops2AccessCost; }
private Map<Node, InitialNode> locateWrappedNearestTransitNodes(Person person, Coord coord, double departureTime){ Collection<TransitRouterNetworkWW.TransitRouterNetworkNode> nearestNodes = this.transitNetwork.getNearestNodes(coord, this.config.getSearchRadius()); if (nearestNodes.size() < 2) { // also enlarge search area if only one stop found, maybe a second one is near the border of the search area TransitRouterNetworkWW.TransitRouterNetworkNode nearestNode = this.transitNetwork.getNearestNode(coord); double distance = CoordUtils.calcEuclideanDistance(coord, nearestNode.stop.getStopFacility().getCoord()); nearestNodes = this.transitNetwork.getNearestNodes(coord, distance + this.config.getExtensionRadius()); } Map<Node, InitialNode> wrappedNearestNodes = new LinkedHashMap<Node, InitialNode>(); for (TransitRouterNetworkWW.TransitRouterNetworkNode node : nearestNodes) { Coord toCoord = node.stop.getStopFacility().getCoord(); double initialTime = getWalkTime(person, coord, toCoord); double initialCost = getWalkDisutility(person, coord, toCoord); wrappedNearestNodes.put(node, new InitialNode(initialCost, initialTime + departureTime)); } return wrappedNearestNodes; }
/** * Get the very next transitNode. * @param person Which person we are routing for. For default leave null. * @param coord The origin of the tree. * @param departureTime The time the person departures at the origin. * @return the next transitNode. */ private Map<Node, InitialNode> locateWrappedNearestTransitNode(Person person, Coord coord, double departureTime) { TransitRouterNetwork.TransitRouterNetworkNode nearestNode = network.getNearestNode(coord); Map<Node, InitialNode> wrappedNearestNodes = new LinkedHashMap<>(); Coord toCoord = nearestNode.stop.getStopFacility().getCoord(); double initialTime = travelDisutility.getWalkTravelTime(person, coord, toCoord); double initialCost = travelDisutility.getWalkTravelDisutility(person, coord, toCoord); wrappedNearestNodes.put(nearestNode, new InitialNode(initialCost, initialTime + departureTime)); return wrappedNearestNodes; }
fromNodes.put(f.network.getNodes().get(Id.create(0, Node.class)), new InitialNode(0.0, 0.0)); Map<Node, InitialNode> toNodes = new HashMap<>(); toNodes.put(f.network.getNodes().get(Id.create(1, Node.class)), new InitialNode(0.0, 0.0)); for (Node node : fromNodes.keySet()) { System.out.println("From Node = " + node.getCoord());
private Map<Node, InitialNode> locateWrappedNearestTransitNodes(Person person, Coord coord, double departureTime) { Collection<TransitRouterNetwork.TransitRouterNetworkNode> nearestNodes = getTransitRouterNetwork().getNearestNodes( coord, this.getConfig().getSearchRadius()); if (nearestNodes.size() < 2) { // also enlarge search area if only one stop found, maybe a second one is near the border of the search area TransitRouterNetwork.TransitRouterNetworkNode nearestNode = this.getTransitRouterNetwork() .getNearestNode(coord); if (nearestNode != null) { // transit schedule might be completely empty! double distance = CoordUtils.calcEuclideanDistance(coord, nearestNode.stop.getStopFacility().getCoord()); nearestNodes = this.getTransitRouterNetwork() .getNearestNodes(coord, distance + this.getConfig().getExtensionRadius()); } } Map<Node, InitialNode> wrappedNearestNodes = new LinkedHashMap<>(); for (TransitRouterNetwork.TransitRouterNetworkNode node : nearestNodes) { Coord toCoord = node.stop.getStopFacility().getCoord(); double initialTime = getWalkTime(person, coord, toCoord); double initialCost = getWalkDisutility(person, coord, toCoord); wrappedNearestNodes.put(node, new InitialNode(initialCost, initialTime + departureTime)); } return wrappedNearestNodes; }
/** * Tests that a route is found even if not all given start nodes lead to an end node */ public void testSomeStartNodesNotUseable() { Fixture f = new Fixture(); TestTimeCost tc = new TestTimeCost(); tc.setData(Id.create(1, Link.class), 2.0, 2.0); tc.setData(Id.create(2, Link.class), 1.0, 1.0); tc.setData(Id.create(3, Link.class), 3.0, 3.0); tc.setData(Id.create(4, Link.class), 2.0, 2.0); tc.setData(Id.create(5, Link.class), 1.0, 1.0); tc.setData(Id.create(6, Link.class), 3.0, 3.0); tc.setData(Id.create(7, Link.class), 4.0, 4.0); MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); Map<Node, InitialNode> fromNodes = new HashMap<Node, InitialNode>(); fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(2.0, 2.0)); fromNodes.put(f.network.getNodes().get(Id.create(4, Node.class)), new InitialNode(3.0, 3.0)); // cannot lead to 5 or 6 Map<Node, InitialNode> toNodes = new HashMap<Node, InitialNode>(); toNodes.put(f.network.getNodes().get(Id.create(5, Node.class)), new InitialNode(1.0, 1.0)); toNodes.put(f.network.getNodes().get(Id.create(6, Node.class)), new InitialNode(3.0, 3.0)); Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); assertNotNull("no path found!", p); assertEquals(3, p.links.size()); assertEquals("2", p.links.get(0).getId().toString()); assertEquals("7", p.links.get(1).getId().toString()); assertEquals("5", p.links.get(2).getId().toString()); }
/** * Tests that a route is found even if not all given end nodes are reachable */ public void testSomeEndNodesNotReachable() { Fixture f = new Fixture(); TestTimeCost tc = new TestTimeCost(); tc.setData(Id.create(1, Link.class), 2.0, 2.0); tc.setData(Id.create(2, Link.class), 1.0, 1.0); tc.setData(Id.create(3, Link.class), 3.0, 3.0); tc.setData(Id.create(4, Link.class), 2.0, 2.0); tc.setData(Id.create(5, Link.class), 1.0, 1.0); tc.setData(Id.create(6, Link.class), 3.0, 3.0); tc.setData(Id.create(7, Link.class), 4.0, 4.0); MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); Map<Node, InitialNode> fromNodes = new HashMap<Node, InitialNode>(); fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(2.0, 2.0)); fromNodes.put(f.network.getNodes().get(Id.create(1, Node.class)), new InitialNode(3.0, 3.0)); Map<Node, InitialNode> toNodes = new HashMap<Node, InitialNode>(); toNodes.put(f.network.getNodes().get(Id.create(5, Node.class)), new InitialNode(1.0, 1.0)); toNodes.put(f.network.getNodes().get(Id.create(3, Node.class)), new InitialNode(3.0, 3.0)); // cannot be reached! Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); assertNotNull("no path found!", p); assertEquals(3, p.links.size()); assertEquals("2", p.links.get(0).getId().toString()); assertEquals("7", p.links.get(1).getId().toString()); assertEquals("5", p.links.get(2).getId().toString()); }
/** * Tests that a path is found if some links are in the set of start * as well as in the set of end nodes and the path only containing * of this node is the cheapest. */ public void testSameNodeInFromToSetCheapest() { Fixture f = new Fixture(); TestTimeCost tc = new TestTimeCost(); tc.setData(Id.create(1, Link.class), 2.0, 2.0); tc.setData(Id.create(2, Link.class), 1.0, 1.0); tc.setData(Id.create(3, Link.class), 3.0, 3.0); tc.setData(Id.create(4, Link.class), 2.0, 2.0); tc.setData(Id.create(5, Link.class), 1.0, 1.0); tc.setData(Id.create(6, Link.class), 3.0, 3.0); tc.setData(Id.create(7, Link.class), 4.0, 4.0); MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); Map<Node, InitialNode> fromNodes = new HashMap<Node, InitialNode>(); fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(2.0, 2.0)); fromNodes.put(f.network.getNodes().get(Id.create(4, Node.class)), new InitialNode(1.0, 1.0)); Map<Node, InitialNode> toNodes = new HashMap<Node, InitialNode>(); toNodes.put(f.network.getNodes().get(Id.create(4, Node.class)), new InitialNode(1.0, 1.0)); toNodes.put(f.network.getNodes().get(Id.create(6, Node.class)), new InitialNode(3.0, 3.0)); Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); assertNotNull("no path found!", p); assertEquals(0, p.links.size()); assertEquals(1, p.nodes.size()); assertEquals("4", p.nodes.get(0).getId().toString()); }
public void testEndViaFaster() { Fixture f = new Fixture(); TestTimeCost tc = new TestTimeCost(); tc.setData(Id.create(1, Link.class), 2.0, 2.0); tc.setData(Id.create(2, Link.class), 1.0, 1.0); tc.setData(Id.create(3, Link.class), 3.0, 3.0); tc.setData(Id.create(4, Link.class), 2.0, 2.0); tc.setData(Id.create(5, Link.class), 1.0, 1.0); tc.setData(Id.create(6, Link.class), 3.0, 3.0); tc.setData(Id.create(7, Link.class), 4.0, 4.0); MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); Map<Node, InitialNode> fromNodes = new HashMap<Node, InitialNode>(); fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(1.0, 1.0)); Map<Node, InitialNode> toNodes = new HashMap<Node, InitialNode>(); toNodes.put(f.network.getNodes().get(Id.create(8, Node.class)), new InitialNode(3.0, 3.0)); toNodes.put(f.network.getNodes().get(Id.create(5, Node.class)), new InitialNode(1.0, 1.0)); Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); assertNotNull("no path found!", p); assertEquals(3, p.links.size()); assertEquals("2", p.links.get(0).getId().toString()); assertEquals("7", p.links.get(1).getId().toString()); assertEquals("5", p.links.get(2).getId().toString()); }
/** * Tests that a path is found if some links are in the set of start * as well as in the set of end nodes, but the path only containing * of this node is the not the cheapest. */ public void testSameNodeInFromToSetNotCheapest() { Fixture f = new Fixture(); TestTimeCost tc = new TestTimeCost(); tc.setData(Id.create(1, Link.class), 2.0, 2.0); tc.setData(Id.create(2, Link.class), 1.0, 1.0); tc.setData(Id.create(3, Link.class), 3.0, 3.0); tc.setData(Id.create(4, Link.class), 2.0, 2.0); tc.setData(Id.create(5, Link.class), 1.0, 1.0); tc.setData(Id.create(6, Link.class), 3.0, 3.0); tc.setData(Id.create(7, Link.class), 4.0, 4.0); MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); Map<Node, InitialNode> fromNodes = new HashMap<Node, InitialNode>(); fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(2.0, 2.0)); fromNodes.put(f.network.getNodes().get(Id.create(4, Node.class)), new InitialNode(10.0, 10.0)); Map<Node, InitialNode> toNodes = new HashMap<Node, InitialNode>(); toNodes.put(f.network.getNodes().get(Id.create(4, Node.class)), new InitialNode(8.0, 8.0)); toNodes.put(f.network.getNodes().get(Id.create(6, Node.class)), new InitialNode(3.0, 3.0)); Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); assertNotNull("no path found!", p); assertEquals(3, p.links.size()); assertEquals("2", p.links.get(0).getId().toString()); assertEquals("7", p.links.get(1).getId().toString()); assertEquals("6", p.links.get(2).getId().toString()); }
List<InitialNode> toNodes = new ArrayList<InitialNode>(); fromNodes.add(new InitialNode(f.network.getNodes().get(Id.create(2, Node.class)), 2.0, 2.0)); fromNodes.add(new InitialNode(f.network.getNodes().get(Id.create(4, Node.class)), 10.0, 10.0)); toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(4, Node.class)), 8.0, 8.0)); toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(6, Node.class)), 3.0, 3.0));
List<InitialNode> toNodes = new ArrayList<InitialNode>(); fromNodes.add(new InitialNode(f.network.getNodes().get(Id.create(2, Node.class)), 2.0, 2.0)); fromNodes.add(new InitialNode(f.network.getNodes().get(Id.create(4, Node.class)), 3.0, 3.0)); // cannot lead to 5 or 6 toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(5, Node.class)), 1.0, 1.0)); toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(3, Node.class)), 3.0, 3.0));
/** * Both nodes 1 and 4 are part of the start set. Even if the path from 1 to the * target leads over node 4, it may be faster, due to the intial cost values. * Test that the route does not cut at node 4 as the first node backwards from * the start set. */ public void testStartViaFaster() { Fixture f = new Fixture(); TestTimeCost tc = new TestTimeCost(); tc.setData(Id.create(1, Link.class), 2.0, 2.0); tc.setData(Id.create(2, Link.class), 1.0, 1.0); tc.setData(Id.create(3, Link.class), 3.0, 3.0); tc.setData(Id.create(4, Link.class), 2.0, 2.0); tc.setData(Id.create(5, Link.class), 1.0, 1.0); tc.setData(Id.create(6, Link.class), 3.0, 3.0); tc.setData(Id.create(7, Link.class), 4.0, 4.0); MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); Map<Node, InitialNode> fromNodes = new HashMap<Node, InitialNode>(); fromNodes.put(f.network.getNodes().get(Id.create(1, Node.class)), new InitialNode(1.0, 1.0)); fromNodes.put(f.network.getNodes().get(Id.create(4, Node.class)), new InitialNode(4.0, 4.0)); Map<Node, InitialNode> toNodes = new HashMap<Node, InitialNode>(); toNodes.put(f.network.getNodes().get(Id.create(5, Node.class)), new InitialNode(0.0, 0.0)); Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); assertNotNull("no path found!", p); assertEquals(3, p.links.size()); assertEquals("1", p.links.get(0).getId().toString()); assertEquals("7", p.links.get(1).getId().toString()); assertEquals("5", p.links.get(2).getId().toString()); }
List<InitialNode> toNodes = new ArrayList<InitialNode>(); fromNodes.add(new InitialNode(f.network.getNodes().get(Id.create(2, Node.class)), 2.0, 2.0)); fromNodes.add(new InitialNode(f.network.getNodes().get(Id.create(1, Node.class)), 3.0, 3.0)); toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(5, Node.class)), 1.0, 1.0)); toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(3, Node.class)), 3.0, 3.0)); // cannot be reached!
List<InitialNode> toNodes = new ArrayList<InitialNode>(); fromNodes.add(new InitialNode(f.network.getNodes().get(Id.create(2, Node.class)), 2.0, 2.0)); fromNodes.add(new InitialNode(f.network.getNodes().get(Id.create(4, Node.class)), 1.0, 1.0)); toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(4, Node.class)), 1.0, 1.0)); toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(6, Node.class)), 3.0, 3.0));
List<InitialNode> toNodes = new ArrayList<InitialNode>(); fromNodes.add(new InitialNode(f.network.getNodes().get(Id.create(1, Node.class)), 1.0, 1.0)); fromNodes.add(new InitialNode(f.network.getNodes().get(Id.create(4, Node.class)), 4.0, 4.0)); toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(5, Node.class)), 0.0, 0.0));
public void testOnlyFromToSameNode() { Fixture f = new Fixture(); TestTimeCost tc = new TestTimeCost(); tc.setData(Id.create(1, Link.class), 2.0, 2.0); tc.setData(Id.create(2, Link.class), 1.0, 1.0); tc.setData(Id.create(3, Link.class), 3.0, 3.0); tc.setData(Id.create(4, Link.class), 2.0, 2.0); tc.setData(Id.create(5, Link.class), 1.0, 1.0); tc.setData(Id.create(6, Link.class), 3.0, 3.0); tc.setData(Id.create(7, Link.class), 4.0, 4.0); MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); Map<Node, InitialNode> fromNodes = new HashMap<Node, InitialNode>(); fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(1.0, 1.0)); Map<Node, InitialNode> toNodes = new HashMap<Node, InitialNode>(); toNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(3.0, 3.0)); Path p = dijkstra.calcLeastCostPath(fromNodes, toNodes, null); assertNotNull("no path found!", p); assertEquals(0, p.links.size()); assertEquals(1, p.nodes.size()); assertEquals("2", p.nodes.get(0).getId().toString()); }
MultiNodeDijkstra dijkstra = new MultiNodeDijkstra(f.network, tc, tc); Map<Node, InitialNode> fromNodes = new HashMap<Node, InitialNode>(); fromNodes.put(f.network.getNodes().get(Id.create(2, Node.class)), new InitialNode(0.0, 0.0)); Map<Node, InitialNode> toNodes = new HashMap<Node, InitialNode>(); toNodes.put(f.network.getNodes().get(Id.create(4, Node.class)), new InitialNode(5.0, 5.0)); toNodes.put(f.network.getNodes().get(Id.create(5, Node.class)), new InitialNode(4.0, 4.0)); toNodes.put(f.network.getNodes().get(Id.create(6, Node.class)), new InitialNode(1.0, 1.0));
List<InitialNode> toNodes = new ArrayList<InitialNode>(); fromNodes.add(new InitialNode(f.network.getNodes().get(Id.create(2, Node.class)), 0.0, 0.0)); toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(4, Node.class)), 5.0, 5.0)); toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(5, Node.class)), 4.0, 4.0)); toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(6, Node.class)), 1.0, 1.0));