21 package org.matsim.core.router.util;
23 import java.awt.geom.Rectangle2D;
24 import java.util.Comparator;
26 import java.util.PriorityQueue;
27 import java.util.concurrent.ExecutorService;
28 import java.util.concurrent.Executors;
29 import java.util.concurrent.TimeUnit;
31 import org.apache.logging.log4j.LogManager;
32 import org.apache.logging.log4j.Logger;
73 final Rectangle2D.Double travelZone) {
102 final int landmarkCount) {
113 log.info(
"Putting landmarks on network...");
114 long now = System.currentTimeMillis();
116 log.info(
"done in " + (System.currentTimeMillis() - now) +
" ms");
118 log.info(
"Initializing landmarks data");
124 if (nOfThreads > this.landmarks.length) {
125 nOfThreads = this.landmarks.length;
127 if (nOfThreads < 2) {
130 log.info(
"Calculating distance from each node to each of the " + this.landmarkCount +
" landmarks using " + nOfThreads +
" threads...");
131 now = System.currentTimeMillis();
134 ExecutorService executor = Executors.newFixedThreadPool(nOfThreads);
135 for (
int i = 0; i < this.landmarks.length; i++) {
139 while (!executor.isTerminated()) {
140 log.info(
"wait for landmarks Calculator to finish...");
142 if (!executor.awaitTermination(10, TimeUnit.MINUTES)) {
145 }
catch (InterruptedException e) {
152 r.updateMinMaxTravelTimes();
157 for (
int i = 0; i < this.landmarks.length; i++) {
159 log.info(
"Min > max for node " + node.getId() +
" and landmark " + i);
164 log.info(
"done in " + (System.currentTimeMillis() - now) +
" ms");
189 PriorityQueue<Node> pendingNodes =
new PriorityQueue<>(100, comparator);
191 role.setToLandmarkTravelTime(this.landmarkIdx, 0.0);
192 role.setFromLandmarkTravelTime(this.landmarkIdx, 0.0);
193 pendingNodes.add(this.landmark);
194 while (!pendingNodes.isEmpty()) {
195 Node node = pendingNodes.poll();
196 double fromTravTime = ((
LandmarksData) this.nodeData.get(node)).getFromLandmarkTravelTime(this.landmarkIdx);
203 double totalTravelTime = fromTravTime + linkTravTime;
204 if (role2.getFromLandmarkTravelTime(
this.landmarkIdx) > totalTravelTime) {
205 role2.setFromLandmarkTravelTime(this.landmarkIdx, totalTravelTime);
214 PriorityQueue<Node> pendingNodes =
new PriorityQueue<>(100, comparator);
216 role.setToLandmarkTravelTime(this.landmarkIdx, 0.0);
217 role.setFromLandmarkTravelTime(this.landmarkIdx, 0.0);
218 pendingNodes.add(this.landmark);
219 while (!pendingNodes.isEmpty()) {
220 Node node = pendingNodes.poll();
221 double toTravTime = ((
LandmarksData) this.nodeData.get(node)).getToLandmarkTravelTime(this.landmarkIdx);
224 Node n = l.getFromNode();
227 double totalTravelTime = toTravTime + linkTravTime;
228 if (role2.getToLandmarkTravelTime(
this.landmarkIdx) > totalTravelTime) {
229 role2.setToLandmarkTravelTime(this.landmarkIdx, totalTravelTime);
239 return this.landmarks.clone();
265 for (
int i = 0; i < this.landmarkTravelTime2.length; i++) {
266 this.landmarkTravelTime2[i] = Double.POSITIVE_INFINITY;
267 this.landmarkTravelTime1[i] = Double.POSITIVE_INFINITY;
271 void setToLandmarkTravelTime(
final int landmarkIndex,
final double travelTime) {
272 this.landmarkTravelTime2[landmarkIndex] = travelTime;
275 void setFromLandmarkTravelTime(
final int landmarkIndex,
final double travelTime) {
276 this.landmarkTravelTime1[landmarkIndex] = travelTime;
279 double getToLandmarkTravelTime(
final int landmarkIndex) {
280 return this.landmarkTravelTime2[landmarkIndex];
283 double getFromLandmarkTravelTime(
final int landmarkIndex) {
284 return this.landmarkTravelTime1[landmarkIndex];
287 void updateMinMaxTravelTimes() {
288 for (
int i = 0; i < this.landmarkTravelTime1.length; i++) {
289 setTravelTimes(i, this.landmarkTravelTime2[i], this.landmarkTravelTime1[i]);
294 final double travelTime2) {
295 if (travelTime1 > travelTime2) {
296 this.landmarkTravelTime2[landmarkIndex] = travelTime1;
297 this.landmarkTravelTime1[landmarkIndex] = travelTime2;
299 this.landmarkTravelTime1[landmarkIndex] = travelTime1;
300 this.landmarkTravelTime2[landmarkIndex] = travelTime2;
305 return this.landmarkTravelTime1[landmarkIndex];
309 return this.landmarkTravelTime2[landmarkIndex];
324 this.roleData = roleData;
325 this.landmarkIndex = landmarkIndex;
331 double c1 = ((
LandmarksData) this.roleData.get(n1)).getToLandmarkTravelTime(this.landmarkIndex);
332 double c2 = ((
LandmarksData) this.roleData.get(n2)).getToLandmarkTravelTime(this.landmarkIndex);
355 this.roleData = roleData;
356 this.landmarkIndex = landmarkIndex;
362 double c1 = ((
LandmarksData) this.roleData.get(n1)).getFromLandmarkTravelTime(this.landmarkIndex);
363 double c2 = ((
LandmarksData) this.roleData.get(n2)).getFromLandmarkTravelTime(this.landmarkIndex);
double getMaxLandmarkTravelTime(final int landmarkIndex)
Map< Id< Node >, ? extends Node > getNodes()
TravelDisutility costFunction
int compare(final Node n1, final Node n2)
LandmarksToTravelTimeComparator(final Map< Node, DeadEndData > roleData, final int landmarkIndex)
int compare(final Node n1, final Node n2)
Map< Id< Link >, ? extends Link > getInLinks()
final double [] landmarkTravelTime1
final Map< Node, DeadEndData > nodeData
final TravelDisutility costFunction
PreProcessLandmarks(final TravelDisutility costFunction)
PreProcessLandmarks(final TravelDisutility costFunction, final Rectangle2D.Double travelZone, final int landmarkCount)
PreProcessLandmarks(final TravelDisutility costFunction, final Rectangle2D.Double travelZone)
final Landmarker landmarker
Node [] identifyLandmarks(int nLandmarks, Network network)
void setTravelTimes(final int landmarkIndex, final double travelTime1, final double travelTime2)
final Map< Node, DeadEndData > roleData
Map< Node, DeadEndData > nodeData
LandmarksFromTravelTimeComparator(final Map< Node, DeadEndData > roleData, final int landmarkIndex)
final double [] landmarkTravelTime2
PreProcessLandmarks(final TravelDisutility costFunction, final Landmarker landmarker, final int landmarkCount)
void run(final Network network)
double getMinLandmarkTravelTime(final int landmarkIndex)
void setNumberOfThreads(int numberOfThreads)
double getLinkMinimumTravelDisutility(final Link link)
final Map< Node, DeadEndData > roleData
Map< Id< Link >, ? extends Link > getOutLinks()
void expandLandmarkFrom()
PreProcessLandmarks(final TravelDisutility costFunction, final int landmarkCount)
Calculator(final int landmarkIdx, final Node landmark, final Map< Node, DeadEndData > nodeData, final TravelDisutility costFunction)
LandmarksData getNodeData(final Node n)