@Override public synchronized LeastCostPathCalculator createPathCalculator(final Network network, final TravelDisutility travelCosts, final TravelTime travelTimes) { if (this.usePreProcessData) { PreProcessDijkstra preProcessDijkstra = this.preProcessData.get(network); if (preProcessDijkstra == null) { preProcessDijkstra = new PreProcessDijkstra(); preProcessDijkstra.run(network); this.preProcessData.put(network, preProcessDijkstra); } return new MultiNodeDijkstra(network, travelCosts, travelTimes, preProcessDijkstra, this.searchAllEndNodes); } return new MultiNodeDijkstra(network, travelCosts, travelTimes, this.searchAllEndNodes); } }
/** * This method should only be called from outside after calcLeastCostPath(...) has * been executed. After that, the paths between the multiple start and/or end nodes * can be constructed using this method. * * Is there a way to check whether this method is called as intended?? * cdobler, oct'13 */ public Path constructPath(Node fromNode, Node toNode, double startTime) { if (toNode == null || fromNode == null) return null; else { DijkstraNodeData toData = getData(toNode); if (!toData.isVisited(this.getIterationId())) return null; DijkstraNodeData fromData = getData(fromNode); if (!fromData.isVisited(this.getIterationId())) return null; double arrivalTime = toData.getTime(); // now construct and return the path return constructPath(fromNode, toNode, startTime, arrivalTime); } }
@Override /*package*/ RouterPriorityQueue<? extends Node> createRouterPriorityQueue() { /* * Re-use existing BinaryMinHeap instead of creating a new one. For large networks (> 10^6 nodes and links) this reduced * the computation time by 40%! cdobler, oct'15 */ if (this.routingNetwork instanceof ArrayRoutingNetwork) { int size = this.routingNetwork.getNodes().size(); if (this.heap == null || this.maxSize != size) { this.maxSize = size; this.heap = new BinaryMinHeap<>(maxSize); return this.heap; } else { this.heap.reset(); return this.heap; } // int maxSize = this.routingNetwork.getNodes().size(); // return new BinaryMinHeap<ArrayRoutingNetworkNode>(maxSize); } else { return super.createRouterPriorityQueue(); } }
protected void relaxImaginaryNode(final ImaginaryNode outNode, final RouterPriorityQueue<Node> pendingNodes, final double currTime) { double currCost = 0.0; // should be 0 for (InitialNode initialNode : outNode.initialNodes) { double travelTime = initialNode.initialTime; double travelCost = initialNode.initialCost; DijkstraNodeData data = getData(initialNode.node); Link l = null; // fromLink - use a dummy link here?? visitNode(initialNode.node, data, pendingNodes, currTime + travelTime, currCost + travelCost, l); } }
public void testOnlyFromToSameNode(boolean fastRouter) { 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 = makeMultiNodeDikstra(f.network, tc, tc, fastRouter); List<InitialNode> fromNodes = new ArrayList<InitialNode>(); List<InitialNode> toNodes = new ArrayList<InitialNode>(); fromNodes.add(new InitialNode(f.network.getNodes().get(Id.create(2, Node.class)), 1.0, 1.0)); toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(2, Node.class)), 3.0, 3.0)); Node fromNode = dijkstra.createImaginaryNode(fromNodes); Node toNode = dijkstra.createImaginaryNode(toNodes); Path p = createPath(dijkstra, fromNode, toNode); Assert.assertNotNull("no path found!", p); Assert.assertEquals(0, p.links.size()); Assert.assertEquals(1, p.nodes.size()); Assert.assertEquals("2", p.nodes.get(0).getId().toString()); }
destinationNodes.add(initialToNode); ImaginaryNode destinationNode = forwardMultiNodeDijkstra.createImaginaryNode(destinationNodes); fromNode = this.network.getLinks().get(previousActivity.getLinkId()).getToNode(); forwardMultiNodeDijkstra.calcLeastCostPath(fromNode, destinationNode, previousActivity.getEndTime(), plan.getPerson(), null);
@Override public Path calcLeastCostPath(final Node fromNode, final Node toNode, final double startTime, final Person person, final Vehicle vehicle) { this.fastRouter.initialize(); this.routingNetwork.initialize(); Node routingNetworkFromNode; Node routingNetworkToNode; if (fromNode instanceof ImaginaryNode) { Collection<? extends InitialNode> initialNodes = ((ImaginaryNode) fromNode).initialNodes; for (InitialNode initialNode : initialNodes) initialNode.node = routingNetwork.getNodes().get(initialNode.node.getId()); routingNetworkFromNode = fromNode; } else routingNetworkFromNode = routingNetwork.getNodes().get(fromNode.getId()); if (toNode instanceof ImaginaryNode) { Collection<? extends InitialNode> initialNodes = ((ImaginaryNode) toNode).initialNodes; for (InitialNode initialNode : initialNodes) initialNode.node = routingNetwork.getNodes().get(initialNode.node.getId()); routingNetworkToNode = toNode; } else routingNetworkToNode = routingNetwork.getNodes().get(toNode.getId()); return super.calcLeastCostPath(routingNetworkFromNode, routingNetworkToNode, startTime, person, vehicle); }
@Override /*package*/ void initFromNode(final Node fromNode, final Node toNode, final double startTime, final RouterPriorityQueue<Node> pendingNodes) { // If it is an imaginary node, we relax it. if (fromNode instanceof ImaginaryNode) { relaxImaginaryNode((ImaginaryNode) fromNode, pendingNodes, startTime); } // ... otherwise: default behaviour. else super.initFromNode(fromNode, toNode, startTime, pendingNodes); }
@Override public Path constructPath(Node fromNode, Node toNode, double startTime) { if (toNode == null || fromNode == null) return null; if (!(fromNode instanceof RoutingNetworkNode)) fromNode = this.routingNetwork.getNodes().get(fromNode.getId()); if (!(toNode instanceof RoutingNetworkNode)) toNode = this.routingNetwork.getNodes().get(toNode.getId()); return super.constructPath(fromNode, toNode, startTime); }
@Override protected Path constructPath(Node fromNode, Node toNode, double startTime, double arrivalTime) { ArrayList<Node> nodes = new ArrayList<Node>(); ArrayList<Link> links = new ArrayList<Link>(); nodes.add(0, toNode); Link tmpLink = getData(toNode).getPrevLink(); // Only this part has been adapted. Could probably also be changed in the super class. while (tmpLink != null) { links.add(0, tmpLink); nodes.add(0, tmpLink.getFromNode()); tmpLink = getData(tmpLink.getFromNode()).getPrevLink(); } // Ignore the initial time and cost of the start node! DijkstraNodeData startNodeData = getData(nodes.get(0)); DijkstraNodeData toNodeData = getData(toNode); Path path = new Path(nodes, links, toNodeData.getTime() - startNodeData.getTime(), toNodeData.getCost() - startNodeData.getCost()); // double travelTime = arrivalTime - startTime; // Path path = new Path(nodes, links, travelTime, toNodeData.getCost()); return path; }
toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(3, Node.class)), 3.0, 3.0)); // cannot be reached! Node fromNode = dijkstra.createImaginaryNode(fromNodes); Node toNode = dijkstra.createImaginaryNode(toNodes);
toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(6, Node.class)), 3.0, 3.0)); Node fromNode = dijkstra.createImaginaryNode(fromNodes); Node toNode = dijkstra.createImaginaryNode(toNodes);
toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(3, Node.class)), 3.0, 3.0)); Node fromNode = dijkstra.createImaginaryNode(fromNodes); Node toNode = dijkstra.createImaginaryNode(toNodes);
toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(6, Node.class)), 3.0, 3.0)); Node fromNode = dijkstra.createImaginaryNode(fromNodes); Node toNode = dijkstra.createImaginaryNode(toNodes);
toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(5, Node.class)), 1.0, 1.0)); Node fromNode = dijkstra.createImaginaryNode(fromNodes); Node toNode = dijkstra.createImaginaryNode(toNodes);
toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(5, Node.class)), 0.0, 0.0)); Node fromNode = dijkstra.createImaginaryNode(fromNodes); Node toNode = dijkstra.createImaginaryNode(toNodes);
public void testImpossibleRoute(boolean fastRouter) { 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 = makeMultiNodeDikstra(f.network, tc, tc, fastRouter); List<InitialNode> fromNodes = new ArrayList<InitialNode>(); List<InitialNode> toNodes = new ArrayList<InitialNode>(); fromNodes.add(new InitialNode(f.network.getNodes().get(Id.create(1, Node.class)), 1.0, 1.0)); toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(2, Node.class)), 3.0, 3.0)); Node fromNode = dijkstra.createImaginaryNode(fromNodes); Node toNode = dijkstra.createImaginaryNode(toNodes); Path p = createPath(dijkstra, fromNode, toNode); Assert.assertNull("wow, impossible path found!", p); }
toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(6, Node.class)), 1.0, 1.0)); Node fromNode = dijkstra.createImaginaryNode(fromNodes); Node toNode = dijkstra.createImaginaryNode(toNodes);
toNodes.add(new InitialNode(f.network.getNodes().get(Id.create(5, Node.class)), 0.0, 0.0)); Node fromNode = dijkstra.createImaginaryNode(fromNodes); Node toNode = dijkstra.createImaginaryNode(toNodes);