21 package org.matsim.core.router;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.HashMap;
28 import org.apache.logging.log4j.LogManager;
29 import org.apache.logging.log4j.Logger;
81 super(network, costFunction, timeFunction);
87 super(network, costFunction, timeFunction, preProcessData);
109 void checkNodeBelongToNetwork(
Node node) {
111 ImaginaryNode imaginaryNode = (ImaginaryNode) node;
112 for (
InitialNode initialNode : imaginaryNode.initialNodes) super.checkNodeBelongToNetwork(initialNode.
node);
113 }
else super.checkNodeBelongToNetwork(node);
123 Map<Id<Node>,
InitialNode> endNodes =
new HashMap<>();
125 Collection<? extends InitialNode> initialNodes = ((ImaginaryNode) toNode).initialNodes;
126 for (
InitialNode initialNode : initialNodes) endNodes.put(initialNode.node.getId(), initialNode);
129 double minCost = Double.POSITIVE_INFINITY;
130 Node minCostNode = null;
133 boolean stillSearching = endNodes.size() > 0;
135 while (stillSearching) {
138 if (outNode == null) {
144 if (minCostNode == null) {
145 if ( log.isTraceEnabled() ) {
146 log.trace(
"No route was found from node " + fromNode.
getId() +
" to any of the destination nodes was found.");
147 log.trace(
Dijkstra.createInfoMessage( person, vehicle ) );
149 StringBuffer sb =
new StringBuffer(
"\tnot reached destionation nodes: ");
151 sb.append(endNode.node.getId().toString());
154 log.trace(sb.toString());
158 if (searchAllEndNodes && endNodes.size() > 0) {
160 log.trace(
"No route was found from node " + fromNode.
getId() +
" to destination node " + endNode.node.getId() +
".");
161 log.trace(
Dijkstra.createInfoMessage( person, vehicle ) );
166 stillSearching =
false;
178 if (initData != null) {
180 if (cost < minCost) {
182 minCostNode = outNode;
186 if (searchAllEndNodes) {
188 stillSearching = endNodes.size() > 0;
190 if (data.
getCost() > minCost) {
192 stillSearching =
false;
203 else return super.searchLogic(fromNode, toNode, pendingNodes, person, vehicle );
211 void initFromNode(
final Node fromNode,
final Node toNode,
final double startTime,
219 else super.initFromNode(fromNode, toNode, startTime, pendingNodes);
223 final double currTime) {
225 double currCost = 0.0;
227 for (
InitialNode initialNode : outNode.initialNodes) {
232 visitNode(initialNode.
node, data, pendingNodes, currTime + travelTime, currCost + travelCost, l);
238 ArrayList<Node> nodes =
new ArrayList<Node>();
239 ArrayList<Link> links =
new ArrayList<Link>();
241 nodes.add(0, toNode);
245 while (tmpLink != null) {
246 links.add(0, tmpLink);
253 Path path =
new Path(nodes, links, toNodeData.getTime() - startNodeData.
getTime(), toNodeData.getCost() - startNodeData.
getCost());
269 if (toNode == null || fromNode == null)
return null;
272 if (!toData.
isVisited(
this.getIterationId()))
return null;
275 if (!fromData.
isVisited(
this.getIterationId()))
return null;
277 double arrivalTime = toData.
getTime();
280 return constructPath(fromNode, toNode, startTime, arrivalTime);
void visitNode(final Node n, final DijkstraNodeData data, final RouterPriorityQueue< Node > pendingNodes, final double time, final double cost, final Link outLink)
DijkstraNodeData getData(final Node n)
void relaxImaginaryNode(final ImaginaryNode outNode, final RouterPriorityQueue< Node > pendingNodes, final double currTime)
boolean isSearchAllEndNodes()
final PreProcessDijkstra preProcessData
final TravelDisutility costFunction
static ImaginaryNode createImaginaryNode(Collection<? extends InitialNode > nodes, Coord coord)
final TravelTime timeFunction
void setSearchAllEndNodes(boolean searchAllEndNodes)
Path constructPath(Node fromNode, Node toNode, double startTime)
boolean isVisited(final int iterID)
void relaxNode(final Node outNode, final Node toNode, final RouterPriorityQueue< Node > pendingNodes)
boolean searchAllEndNodes
static ImaginaryNode createImaginaryNode(Collection<? extends InitialNode > nodes)
Path constructPath(Node fromNode, Node toNode, double startTime, double arrivalTime)