Commit 8d14d16e authored by Julian Zobel's avatar Julian Zobel 🦄
Browse files

Add probability to take an alternative route to a target location.

parent 6c9ef8af
...@@ -54,11 +54,13 @@ import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator; ...@@ -54,11 +54,13 @@ import de.tud.kom.p2psim.api.topology.movement.SimLocationActuator;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.GPSCalculation; import de.tud.kom.p2psim.impl.topology.movement.modularosm.GPSCalculation;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.ModularMovementModelViz; import de.tud.kom.p2psim.impl.topology.movement.modularosm.ModularMovementModelViz;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.RouteSensorComponent; import de.tud.kom.p2psim.impl.topology.movement.modularosm.RouteSensorComponent;
import de.tud.kom.p2psim.impl.topology.movement.modularosm.attraction.RandomAttractionGenerator;
import de.tud.kom.p2psim.impl.topology.util.PositionVector; import de.tud.kom.p2psim.impl.topology.util.PositionVector;
import de.tud.kom.p2psim.impl.util.Either; import de.tud.kom.p2psim.impl.util.Either;
import de.tud.kom.p2psim.impl.util.Left; import de.tud.kom.p2psim.impl.util.Left;
import de.tudarmstadt.maki.simonstrator.api.Binder; import de.tudarmstadt.maki.simonstrator.api.Binder;
import de.tudarmstadt.maki.simonstrator.api.Monitor; import de.tudarmstadt.maki.simonstrator.api.Monitor;
import de.tudarmstadt.maki.simonstrator.api.Randoms;
import de.tudarmstadt.maki.simonstrator.api.Monitor.Level; import de.tudarmstadt.maki.simonstrator.api.Monitor.Level;
import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException; import de.tudarmstadt.maki.simonstrator.api.component.ComponentNotAvailableException;
import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor; import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
...@@ -71,9 +73,20 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor; ...@@ -71,9 +73,20 @@ import de.tudarmstadt.maki.simonstrator.api.util.XMLConfigurableConstructor;
* *
* @author Martin Hellwig * @author Martin Hellwig
* @version 1.0, 07.07.2015 * @version 1.0, 07.07.2015
*
* - added a possibility to allow the usage of alternative routes
* - set the probability for this alternatives
* - allow a dynamic reload of graphhopper files when switching routing algorithms
* - allow to define blocked areas, that are not used for routing
*
* @author Julian Zobel
* @version 02.04.2020
*
*/ */
public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy { public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy {
private Random random = Randoms.getRandom(RealWorldStreetsMovement.class);
private static PositionVector worldDimensions; private static PositionVector worldDimensions;
private GraphHopper hopper; private GraphHopper hopper;
private LocationIndex index; private LocationIndex index;
...@@ -94,6 +107,9 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy { ...@@ -94,6 +107,9 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy {
private static double lonLeft; //Values from -180 to 180; Always smaller than lonRight private static double lonLeft; //Values from -180 to 180; Always smaller than lonRight
private static double lonRight; //Values from -180 to 180 private static double lonRight; //Values from -180 to 180
private boolean uniqueFolders; private boolean uniqueFolders;
private boolean allowAlternativeRoutes = false;
private double probabilityForAlternativeRoute = 0.0;
/** /**
* Tolerance in meters (if the node reached a waypoint up to "tolerance" * Tolerance in meters (if the node reached a waypoint up to "tolerance"
...@@ -135,7 +151,7 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy { ...@@ -135,7 +151,7 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy {
// if we have blocked areas defined, the CH in Graphhopper needs to be disabled! // if we have blocked areas defined, the CH in Graphhopper needs to be disabled!
// this also requires a new import // this also requires a new import
if(blockedAreas != null && !blockedAreas.isEmpty()) { if((blockedAreas != null && !blockedAreas.isEmpty()) || allowAlternativeRoutes) {
hopper.setCHEnabled(false); hopper.setCHEnabled(false);
} }
...@@ -202,8 +218,10 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy { ...@@ -202,8 +218,10 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy {
if(blockedAreas != null && !blockedAreas.isEmpty()) { if(blockedAreas != null && !blockedAreas.isEmpty()) {
req.getHints().put(Routing.BLOCK_AREA, blockedAreas); req.getHints().put(Routing.BLOCK_AREA, blockedAreas);
} }
if(allowAlternativeRoutes) {
req.setAlgorithm(Parameters.Algorithms.ALT_ROUTE);
}
req.setAlgorithm(Parameters.Algorithms.ALT_ROUTE);
GHResponse rsp = hopper.route(req); GHResponse rsp = hopper.route(req);
...@@ -222,18 +240,12 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy { ...@@ -222,18 +240,12 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy {
PointList pointList = rsp.getBest().getPoints(); PointList pointList = rsp.getBest().getPoints();
if(rsp.hasAlternatives()) { // alternatives for routing are allowed for distances bigger than 50
// System.out.println(" >>"); if(allowAlternativeRoutes && rsp.hasAlternatives() && rsp.getBest().getDistance() > 50) {
// for (PathWrapper pw : rsp.getAll()) { // alternative route is taken with a certain chance
// System.out.println(pw.getDistance()); if(random.nextDouble() <= probabilityForAlternativeRoute) {
// ModularMovementModelViz.paths.add(pw.getPoints());
// }
// System.out.println(" ");
if(Math.random() < 0.01) {
pointList = rsp.getAll().get(1).getPoints(); pointList = rsp.getAll().get(1).getPoints();
} }
} }
//PointList pointList = rsp.getBest().getPoints(); //PointList pointList = rsp.getBest().getPoints();
...@@ -459,6 +471,15 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy { ...@@ -459,6 +471,15 @@ public class RealWorldStreetsMovement extends AbstractLocalMovementStrategy {
public void setBlockedAreas(String blockedAreas) { public void setBlockedAreas(String blockedAreas) {
if(!blockedAreas.isEmpty()) { if(!blockedAreas.isEmpty()) {
this.blockedAreas = blockedAreas; this.blockedAreas = blockedAreas;
} }
}
public void setAllowAlternativeRoutes(boolean allowAlternativeRoutes) {
this.allowAlternativeRoutes = allowAlternativeRoutes;
}
public void setProbabilityForAlternativeRoute(double p) {
this.probabilityForAlternativeRoute = p;
} }
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment