21 package org.matsim.core.router;
23 import java.util.ArrayList;
24 import java.util.Iterator;
25 import java.util.List;
72 static final int controlInterval = 40;
73 int controlCounter = 0;
110 super(network, preProcessData, costFunction, timeFunction, overdoFactor);
117 this.controlCounter = 0;
119 if (this.landmarks.length >= 2) {
120 initializeActiveLandmarks(fromNode, toNode, 2);
122 initializeActiveLandmarks(fromNode, toNode, this.landmarks.length);
124 return super.calcLeastCostPath(fromNode, toNode, startTime, person, vehicle);
129 this.controlCounter++;
130 if (this.controlCounter == controlInterval) {
131 int newLandmarkIndex = checkToAddLandmark(outNode, toNode);
132 if (newLandmarkIndex > 0) {
133 updatePendingNodes(newLandmarkIndex, toNode, pendingNodes);
135 this.controlCounter = 0;
137 super.relaxNode(outNode, toNode, pendingNodes);
147 void initializeActiveLandmarks(
final Node fromNode,
final Node toNode,
final int actLandmarkCount) {
152 double[] estTravelTimes =
new double[actLandmarkCount];
153 this.activeLandmarkIndexes =
new int[actLandmarkCount];
154 for (
int i = 0; i < estTravelTimes.length; i++) {
155 estTravelTimes[i] = Double.NEGATIVE_INFINITY;
158 for (
int i = 0; i < this.landmarks.length; i++) {
160 for (
int j = 0; j < estTravelTimes.length; j++) {
161 if (tmpTravTime > estTravelTimes[j]) {
162 for (
int k = estTravelTimes.length - 1; k > j; k--) {
163 estTravelTimes[k] = estTravelTimes[k - 1];
164 this.activeLandmarkIndexes[k] = this.activeLandmarkIndexes[k - 1];
166 estTravelTimes[j] = tmpTravTime;
167 this.activeLandmarkIndexes[j] = i;
193 for (
int i = 0, n = this.activeLandmarkIndexes.length; i < n; i++) {
195 if (tmpTravCost > travCost) {
196 travCost = tmpTravCost;
199 tmpTravCost = super.estimateRemainingTravelCost(fromNode, toNode);
200 if (travCost > tmpTravCost) {
217 Iterator<Node> it = pendingNodes.
iterator();
219 List<Double> newEstRemTravCosts =
new ArrayList<>();
220 List<Node> nodesToBeUpdated =
new ArrayList<>();
221 while (it.hasNext()) {
222 Node node = it.next();
227 if (newEstRemTravCost > estRemTravCost) {
228 nodesToBeUpdated.add(node);
229 newEstRemTravCosts.add(newEstRemTravCost);
232 for (
Node node : nodesToBeUpdated) {
233 pendingNodes.
remove(node);
235 for (
int i = 0; i < nodesToBeUpdated.size(); i++) {
236 Node node = nodesToBeUpdated.get(i);
251 int checkToAddLandmark(
final Node fromNode,
final Node toNode) {
256 for (
int i = 0; i < this.landmarks.length; i++) {
258 if (tmpTravTime > bestTravCostEst) {
260 bestTravCostEst = tmpTravTime;
263 if (bestIndex != -1) {
264 int[] newActiveLandmarks =
new int[this.activeLandmarkIndexes.length + 1];
265 System.arraycopy(this.activeLandmarkIndexes, 0, newActiveLandmarks, 0, this.activeLandmarkIndexes.length);
266 newActiveLandmarks[this.activeLandmarkIndexes.length] = bestIndex;
267 this.activeLandmarkIndexes = newActiveLandmarks;
284 final double fromMinLandmarkTravelTime = fromRole.getMinLandmarkTravelTime(index);
285 final double toMaxLandmarkTravelTime = toRole.getMaxLandmarkTravelTime(index);
286 tmpTravTime = fromMinLandmarkTravelTime - toMaxLandmarkTravelTime;
287 if (tmpTravTime < 0) {
288 tmpTravTime = toRole.getMinLandmarkTravelTime(index) - fromRole.getMaxLandmarkTravelTime(index);
289 if (tmpTravTime <= 0) {
final double overdoFactor
double estimateRemainingTravelCost(final Node fromNode, final Node toNode)
int [] activeLandmarkIndexes
PreProcessLandmarks.LandmarksData getPreProcessData(final Node n)
boolean remove(final E o)
void setExpectedRemainingCost(final double expectedCost)
Path calcLeastCostPath(final Node fromNode, final Node toNode, final double startTime, final Person person, final Vehicle vehicle)
double getExpectedRemainingCost()
final PreProcessDijkstra preProcessData
final TravelDisutility costFunction
final TravelTime timeFunction
void relaxNode(final Node outNode, final Node toNode, final RouterPriorityQueue< Node > pendingNodes)
double getPriority(final DijkstraNodeData data)
AStarNodeData getData(final Node n)
boolean add(final E o, final double priority)
double estimateRemainingTravelCost(final PreProcessLandmarks.LandmarksData fromRole, final PreProcessLandmarks.LandmarksData toRole, final int index)