Skip to content

Commit

Permalink
Merge pull request #1711 from opentripplanner/heuristic
Browse files Browse the repository at this point in the history
Fix DefaultRemainingWeightHeuristic distance issue
  • Loading branch information
abyrd committed Jan 30, 2015
2 parents 2b92ba7 + 40244fd commit 40efb56
Showing 1 changed file with 40 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,30 +13,22 @@ the License, or (props, at your option) any later version.

package org.opentripplanner.routing.algorithm.strategies;

import com.fasterxml.jackson.jaxrs.json.annotation.JSONP;
import com.google.common.collect.Maps;
import com.google.common.collect.Iterables;
import org.opentripplanner.common.geometry.DistanceLibrary;
import org.opentripplanner.common.geometry.SphericalDistanceLibrary;
import org.opentripplanner.profile.StopAtDistance;
import org.opentripplanner.profile.StopCluster;
import org.opentripplanner.routing.algorithm.GenericAStar;
import org.opentripplanner.routing.algorithm.GenericDijkstra;
import org.opentripplanner.routing.algorithm.TraverseVisitor;
import org.opentripplanner.routing.core.OptimizeType;
import org.opentripplanner.routing.core.State;
import org.opentripplanner.routing.core.TraverseMode;
import org.opentripplanner.routing.core.RoutingRequest;
import org.opentripplanner.routing.core.State;
import org.opentripplanner.routing.edgetype.FreeEdge;
import org.opentripplanner.routing.edgetype.StreetTransitLink;
import org.opentripplanner.routing.graph.Edge;
import org.opentripplanner.routing.graph.Graph;
import org.opentripplanner.routing.graph.Vertex;
import org.opentripplanner.routing.spt.ShortestPathTree;
import org.opentripplanner.routing.vertextype.IntersectionVertex;
import org.opentripplanner.routing.vertextype.TransitStop;
import org.opentripplanner.routing.vertextype.TransitStationStop;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;

/**
* A Euclidean remaining weight strategy that takes into account transit boarding costs where applicable.
*
Expand All @@ -47,8 +39,8 @@ public class DefaultRemainingWeightHeuristic implements RemainingWeightHeuristic
private static Logger LOG = LoggerFactory.getLogger(DefaultRemainingWeightHeuristic.class);

private DistanceLibrary distanceLibrary = SphericalDistanceLibrary.getInstance();
private double targetX;
private double targetY;
private double lat;
private double lon;
private boolean transit;
private double walkReluctance;
private double maxStreetSpeed;
Expand All @@ -61,8 +53,17 @@ public void initialize(RoutingRequest options, Vertex origin, Vertex target, lon
this.transit = req.modes.isTransit();
maxStreetSpeed = req.getStreetSpeedUpperBound();
maxTransitSpeed = req.getTransitSpeedUpperBound();
targetX = target.getX();
targetY = target.getY();

if (target.getDegreeIn() == 1) {
Edge edge = Iterables.getOnlyElement(target.getIncoming());

if (edge instanceof FreeEdge) {
target = edge.getFromVertex();
}
}

lat = target.getLat();
lon = target.getLon();
requiredWalkDistance = determineRequiredWalkDistance(req);
walkReluctance = req.walkReluctance;
}
Expand All @@ -82,7 +83,7 @@ public void initialize(RoutingRequest options, Vertex origin, Vertex target, lon
@Override
public double computeForwardWeight(State s, Vertex target) {
Vertex sv = s.getVertex();
double euclideanDistance = distanceLibrary.fastDistance(sv.getY(), sv.getX(), targetY, targetX);
double euclideanDistance = distanceLibrary.fastDistance(sv.getLat(), sv.getLon(), lat, lon);
if (transit) {
if (euclideanDistance < requiredWalkDistance) {
return walkReluctance * euclideanDistance / maxStreetSpeed;
Expand All @@ -101,13 +102,13 @@ public double computeForwardWeight(State s, Vertex target) {
* Figure out the minimum amount of walking to reach the destination from transit.
* This is done by doing a Dijkstra search for the first reachable transit stop.
*/
private double determineRequiredWalkDistance(RoutingRequest req) {
if ( ! req.modes.isTransit()) return 0; // required walk distance will be unused.
req = req.clone();
req.setArriveBy(!req.arriveBy);
req.setRoutingContext(req.rctx.graph, req.rctx.fromVertex, req.rctx.toVertex);
GenericDijkstra gd = new GenericDijkstra(req);
State s = new State(req);
private double determineRequiredWalkDistance(final RoutingRequest req) {
if (!transit) return 0; // required walk distance will be unused.
RoutingRequest options = req.clone();
options.setArriveBy(!req.arriveBy);
options.setRoutingContext(req.rctx.graph, req.rctx.fromVertex, req.rctx.toVertex);
GenericDijkstra gd = new GenericDijkstra(options);
State s = new State(options);
gd.setHeuristic(new TrivialRemainingWeightHeuristic());
final ClosestStopTraverseVisitor visitor = new ClosestStopTraverseVisitor();
gd.traverseVisitor = visitor;
Expand All @@ -121,14 +122,23 @@ private double determineRequiredWalkDistance(RoutingRequest req) {
return visitor.distanceToClosestStop;
}

static class ClosestStopTraverseVisitor implements TraverseVisitor {
public double distanceToClosestStop = Double.POSITIVE_INFINITY;
private class ClosestStopTraverseVisitor implements TraverseVisitor {
private double distanceToClosestStop = Double.POSITIVE_INFINITY;

@Override public void visitEdge(Edge edge, State state) { }
@Override public void visitEnqueue(State state) { }
@Override public void visitVertex(State state) {
if (state.getVertex() instanceof TransitStop) {
distanceToClosestStop = state.getWalkDistance();
LOG.debug("Found closest stop to search target: {} at {}m", state.getVertex(), (int) distanceToClosestStop);
Edge backEdge = state.getBackEdge();

if (backEdge instanceof StreetTransitLink) {
Vertex backVertex = state.getBackState().getVertex();
distanceToClosestStop = distanceLibrary.fastDistance(
backVertex.getLat(), backVertex.getLon(), lat, lon);
LOG.debug("Found closest stop to search target: {} at {}m",
state.getVertex(), (int) distanceToClosestStop);
} else if (state.getVertex() instanceof TransitStationStop && backEdge == null) {
LOG.debug("Search target is a transit stop, no walking is required at end of trip");
distanceToClosestStop = 0;
}
}
}
Expand Down

0 comments on commit 40efb56

Please sign in to comment.