21 package org.matsim.pt.router;
23 import java.util.ArrayList;
24 import java.util.HashMap;
25 import java.util.HashSet;
26 import java.util.LinkedList;
27 import java.util.List;
98 final Map<Node, InitialNode> fromNodes,
final Person person) {
103 this.nodeData =
new HashMap<>((int)(network.
getNodes().size() * 1.1), 0.95f);
108 this.customDataManager.
reset();
114 visitNode(entry.getKey(), data,
pendingNodes, entry.getValue().initialTime, entry.getValue().initialCost, null);
118 while (pendingNodes.
size() > 0) {
126 final Map<Node, InitialNode> fromNodes,
final Map<Node, InitialNode> toNodes,
132 this.nodeData =
new HashMap<>((int)(network.
getNodes().size() * 1.1), 0.95f);
137 this.customDataManager.
reset();
143 visitNode(entry.getKey(), data,
pendingNodes, entry.getValue().initialTime, entry.getValue().initialCost, null);
166 Set<Node> endNodes =
new HashSet<>(toNodes.keySet());
167 double minCost = Double.POSITIVE_INFINITY;
170 while (endNodes.size() > 0) {
173 if (outNode == null) {
178 boolean isEndNode = endNodes.remove(outNode);
182 if (cost < minCost) {
186 if (data.
getCost() > minCost) {
208 double minCost = Double.POSITIVE_INFINITY;
209 Node minCostNode = null;
211 Node currentNode = e.getKey();
219 if (data.
getCost() != 0.0 || fromNodes.containsKey(currentNode)) {
220 if (cost < minCost) {
222 minCostNode = currentNode;
227 if (minCostNode == null) {
232 List<RouteSegment> routeSegments =
new ArrayList<>();
236 Node previousFromNode = minCostNode;
237 double transferCost = 0.;
239 while (link != null) {
247 boolean isTransferLeg =
false;
248 if (link.line==null) isTransferLeg =
true;
250 transitLineId = link.line.getId();
251 routeId = link.route.getId();
254 if (downstreamLink==null && isTransferLeg) {
257 double tempTravelTime = 0.;
260 if (routeSegments.size()==0) {
264 travelTime = routeSegment.travelTime;
265 toStop = routeSegment.toStop;
271 tempTravelTime+travelTime,
275 }
else if (downstreamLink == null
283 }
else if (downstreamLink.line.
getId() == link.line.getId() && downstreamLink.route.
getId() == link.route.getId() ){
288 routeSegment.travelTime+travelTime,
296 throw new RuntimeException(
"TransitTravelDisutility is not instance of "+TransitRouterNetworkTravelTimeAndDisutility.class.getSimpleName()
300 transferCost += ((TransitRouterNetworkTravelTimeAndDisutility) this.costFunction).defaultTransferCost(link,
301 Double.NEGATIVE_INFINITY,null,null);
303 downstreamLink = null;
305 downstreamLink = link;
308 previousFromNode = fromNode;
316 + this.fromNodes.get(previousFromNode).initialCost
317 + toNodes.get(minCostNode).initialCost
321 if (routeSegments.size()==0)
return null;
339 double minCost = Double.POSITIVE_INFINITY;
340 Node minCostNode = null;
342 Node currentNode = e.getKey();
350 if (data.
getCost() != 0.0 || fromNodes.containsKey(currentNode)) {
351 if (cost < minCost) {
353 minCostNode = currentNode;
358 if (minCostNode == null) {
363 List<Node> nodes =
new LinkedList<>();
364 List<Link> links =
new LinkedList<>();
366 nodes.add(0, minCostNode);
368 while (tmpLink != null) {
369 links.add(0, tmpLink);
377 return new Path(nodes, links, toNodeData.getTime() - startNodeData.
getTime(),
378 toNodeData.getCost() - startNodeData.
getCost());
407 final Link outLink) {
424 double currTime = outData.
getTime();
425 double currCost = outData.
getCost();
427 relaxNodeLogic(l, pendingNodes, currTime, currCost);
436 final double currTime,
final double currCost) {
459 final double currCost) {
462 double travelTime = this.timeFunction.
getLinkTravelTime(l, currTime, this.person, this.vehicle);
463 double travelCost = this.costFunction.
getLinkTravelDisutility(l, currTime, this.person, this.vehicle, this.customDataManager);
467 visitNode(n, data, pendingNodes, currTime + travelTime, currCost + travelCost, l);
471 double totalCost = currCost + travelCost;
472 if (totalCost < nCost) {
473 revisitNode(n, data, pendingNodes, currTime + travelTime, totalCost, l);
500 final Link outLink) {
528 this.nodeData.put(n.
getId(), r);
boolean addToPendingNodes(final Link l, final Node n, final RouterPriorityQueue< Node > pendingNodes, final double currTime, final double currCost)
void resetNetworkVisited()
Map< Id< Node >, ? extends Node > getNodes()
CustomDataManager customDataManager
boolean remove(final E o)
final TransitTravelDisutility costFunction
TransitLeastCostPathTree(final Network network, final TransitTravelDisutility costFunction, final TravelTime timeFunction, final Map< Node, InitialNode > fromNodes, final Person person)
double getLinkTravelTime(Link link, double time, Person person, Vehicle vehicle)
DijkstraNodeData getData(final Node n)
Path getPath(final Map< Node, InitialNode > toNodes)
TransitLeastCostPathTree(final Network network, final TransitTravelDisutility costFunction, final TravelTime timeFunction, final Map< Node, InitialNode > fromNodes, final Map< Node, InitialNode > toNodes, final Person person)
final TravelTime timeFunction
void visit(final Link comingFrom, final double cost, final double time, final int iterID)
void visitNode(final Node n, final DijkstraNodeData data, final RouterPriorityQueue< Node > pendingNodes, final double time, final double cost, final Link outLink)
InternalTransitPassengerRoute getTransitPassengerRoute(final Map< Node, InitialNode > toNodes)
double getPriority(final DijkstraNodeData data)
final TransitRouteStop stop
final HashMap< Id< Node >, DijkstraNodeData > nodeData
abstract TransitStopFacility getStopFacility()
double getLinkTravelDisutility(final Link link, final double time, final Person person, final Vehicle vehicle, final CustomDataManager dataManager)
RouterPriorityQueue< Node > pendingNodes
void initForLink(final Link link)
Map< Node, InitialNode > fromNodes
Map< Id< Link >, ? extends Link > getOutLinks()
boolean isVisited(final int iterID)
boolean add(final E o, final double priority)
void relaxNode(final Node outNode, final RouterPriorityQueue< Node > pendingNodes)
void expandNodeData(final Map< Node, InitialNode > toNodes)