@Test public void testShortestPathSkipNode() { createExampleGraph(); final double normalDist = new Dijkstra(graph, weighting, traversalMode).calcPath(4, 2).getDistance(); DijkstraOneToMany algo = new DijkstraOneToMany(graph, weighting, traversalMode); CHGraph lg = graph.getGraph(CHGraph.class); setMaxLevelOnAllNodes(); algo.setEdgeFilter(createIgnoreNodeFilter(3)); algo.setWeightLimit(100); int nodeEntry = algo.findEndNode(4, 2); assertTrue(algo.getWeight(nodeEntry) > normalDist); algo.clear(); algo.setMaxVisitedNodes(1); nodeEntry = algo.findEndNode(4, 2); assertEquals(-1, nodeEntry); }
return to; if (heap.isEmpty() || isMaxVisitedNodesExceeded()) return NOT_FOUND; if (finished()) { int adjNode = iter.getAdjNode(); int prevEdgeId = edgeIds[adjNode]; if (!accept(iter, prevEdgeId)) continue; if (heap.isEmpty() || isMaxVisitedNodesExceeded() || isWeightLimitExceeded()) return NOT_FOUND; if (finished()) return currNode;
@Override public void close() { super.close(); prepareAlgo.close(); }
@Override public Path calcPath(int from, int to) { fromNode = from; endNode = findEndNode(from, to); return extractPath(); }
@Test public void testShortestPathLimit() { createExampleGraph(); DijkstraOneToMany algo = new DijkstraOneToMany(graph, weighting, traversalMode); setMaxLevelOnAllNodes(); algo.setEdgeFilter(createIgnoreNodeFilter(0)); algo.setWeightLimit(2); int endNode = algo.findEndNode(4, 1); // did not reach endNode assertNotEquals(1, endNode); }
@Test public void testDifferentEdgeFilter() { GraphHopperStorage g = new GraphBuilder(encodingManager).setCHGraph(new FastestWeighting(carEncoder)).create(); g.edge(4, 3, 10, true); g.edge(3, 6, 10, true); g.edge(4, 5, 10, true); g.edge(5, 6, 10, true); DijkstraOneToMany algo = (DijkstraOneToMany) createAlgo(g); algo.setEdgeFilter(new EdgeFilter() { @Override public boolean accept(EdgeIteratorState iter) { return iter.getAdjNode() != 5; } }); Path p = algo.calcPath(4, 6); assertEquals(IntArrayList.from(new int[]{4, 3, 6}), p.calcNodes()); // important call! algo.clear(); algo.setEdgeFilter(new EdgeFilter() { @Override public boolean accept(EdgeIteratorState iter) { return iter.getAdjNode() != 3; } }); p = algo.calcPath(4, 6); assertEquals(IntArrayList.from(new int[]{4, 5, 6}), p.calcNodes()); }
@Override public RoutingAlgorithm createAlgo(Graph g, AlgorithmOptions opts) { return new DijkstraOneToMany(g, opts.getWeighting(), traversalMode); } };
@Test public void testWeightLimit_issue380() { GraphHopperStorage graph = createGHStorage(false); initGraphWeightLimit(graph); DijkstraOneToMany algo = (DijkstraOneToMany) createAlgo(graph); algo.setWeightLimit(3); Path p = algo.calcPath(0, 4); assertTrue(p.isFound()); assertEquals(3.0, p.getWeight(), 1e-6); algo = (DijkstraOneToMany) createAlgo(graph); p = algo.calcPath(0, 3); assertTrue(p.isFound()); assertEquals(3.0, p.getWeight(), 1e-6); }
@Test public void testIssue239_and362() { GraphHopperStorage g = createGHStorage(false); g.edge(0, 1, 1, true); g.edge(1, 2, 1, true); g.edge(2, 0, 1, true); g.edge(4, 5, 1, true); g.edge(5, 6, 1, true); g.edge(6, 4, 1, true); DijkstraOneToMany algo = (DijkstraOneToMany) createAlgo(g); assertEquals(-1, algo.findEndNode(0, 4)); assertEquals(-1, algo.findEndNode(0, 4)); assertEquals(1, algo.findEndNode(0, 1)); assertEquals(1, algo.findEndNode(0, 1)); }
@Test public void testShortestPathSkipNode2() { createExampleGraph(); final double normalDist = new Dijkstra(graph, weighting, traversalMode).calcPath(4, 2).getDistance(); assertEquals(3, normalDist, 1e-5); DijkstraOneToMany algo = new DijkstraOneToMany(graph, weighting, traversalMode); setMaxLevelOnAllNodes(); algo.setEdgeFilter(createIgnoreNodeFilter(3)); algo.setWeightLimit(10); int nodeEntry = algo.findEndNode(4, 2); assertEquals(4, algo.getWeight(nodeEntry), 1e-5); nodeEntry = algo.findEndNode(4, 1); assertEquals(4, algo.getWeight(nodeEntry), 1e-5); }
@Override public Path calcPath(int from, int to) { fromNode = from; endNode = findEndNode(from, to); return extractPath(); }
@Override public void initFromGraph() { super.initFromGraph(); ignoreNodeFilter = new IgnoreNodeFilter(prepareGraph, maxLevel); final EdgeFilter allFilter = DefaultEdgeFilter.allEdges(encoder); final EdgeFilter remainingNodesFilter = new LevelEdgeFilter(prepareGraph) { @Override public final boolean accept(EdgeIteratorState edgeState) { return super.accept(edgeState) && allFilter.accept(edgeState); } }; remainingEdgeExplorer = prepareGraph.createEdgeExplorer(remainingNodesFilter); prepareAlgo = new DijkstraOneToMany(prepareGraph, prepareWeighting, TraversalMode.NODE_BASED); }
prepareAlgo.clear(); degree++; while (outgoingEdges.next()) { prepareAlgo.setWeightLimit(existingDirectWeight); prepareAlgo.setMaxVisitedNodes(maxVisitedNodes); prepareAlgo.setEdgeFilter(ignoreNodeFilter.setAvoidNode(sch.getNode())); int endNode = prepareAlgo.findEndNode(fromNode, toNode); dijkstraSW.stop(); if (endNode == toNode && prepareAlgo.getWeight(endNode) <= existingDirectWeight)
return to; if (heap.isEmpty() || isMaxVisitedNodesExceeded()) return NOT_FOUND; if (finished()) { int adjNode = iter.getAdjNode(); int prevEdgeId = edgeIds[adjNode]; if (!accept(iter, prevEdgeId)) continue; if (heap.isEmpty() || isMaxVisitedNodesExceeded() || isWeightLimitExceeded()) return NOT_FOUND; if (finished()) return currNode;
@Override public Path calcPath(int from, int to) { fromNode = from; endNode = findEndNode(from, to); return extractPath(); }
ra = new DijkstraOneToMany(g, opts.getWeighting(), opts.getTraversalMode());
public void close() { prepareAlgo.close(); originalEdges.close(); sortedNodes = null; oldPriorities = null; }
prepareAlgo.clear(); tmpDegreeCounter++; while (outgoingEdges.next()) prepareAlgo.setWeightLimit(existingDirectWeight); prepareAlgo.setMaxVisitedNodes((int) meanDegree * 100); prepareAlgo.setEdgeFilter(ignoreNodeFilter.setAvoidNode(sch.getNode())); int endNode = prepareAlgo.findEndNode(u_fromNode, w_toNode); dijkstraSW.stop(); if (endNode == w_toNode && prepareAlgo.getWeight(endNode) <= existingDirectWeight)
return to; if (heap.isEmpty() || isMaxVisitedNodesExceeded()) return NOT_FOUND; if (finished()) { int adjNode = iter.getAdjNode(); int prevEdgeId = edgeIds[adjNode]; if (!accept(iter, prevEdgeId)) continue; if (heap.isEmpty() || isMaxVisitedNodesExceeded() || isWeightLimitExceeded()) return NOT_FOUND; if (finished()) return currNode;
@Override public Path calcPath( int from, int to ) { fromNode = from; endNode = findEndNode(from, to); return extractPath(); }