Hi… I have some origin-destination pairs for which i need to find out the shortest paths (fastest). I need to increase the weight of the edges that were used for the shortest path of a pair and thus those specific edges will have a little increased weight for the next path calculation. I do not want to block those, just increase the weights.
e.g. i have 1000 origin-dest pairs. I stored the edges (EGE - int) used in a path calculation and a corresponding value (VAL - float) in a hashmap. So, in path calculation of the next pair, the weights of EGEs will be = weight + weight * VAL. The problem is I don’t understand how to access that hashmap and use in path calculation.
I crated a custom weighting class (MyCustomWeighting by copying “FastestWeighting”) and added:
private double dynamicEdgePenaltyFactor = 5.0 ;
public IntFloatHashMap myWeighedEdges = new IntFloatHashMap(); //contains EGE & VAL
......
@Override
public double calcWeight(EdgeIteratorState edge, boolean reverse, int prevOrNextEdgeId) {
double speed = reverse ? edge.getReverse(avSpeedEnc) : edge.get(avSpeedEnc);
if (speed == 0)
return Double.POSITIVE_INFINITY;
double time = edge.getDistance() / speed * SPEED_CONV;
// add direction penalties at start/stop/via points
boolean unfavoredEdge = edge.get(EdgeIteratorState.UNFAVORED_EDGE);
if (unfavoredEdge)
time += headingPenalty;
**// get the VAL of the edge**
if (myWeighedEdges.containsKey(edge.getEdge()))
time= time + time * dynamicEdgePenaltyFactor * myWeighedEdges.get(edge.getEdge());
return time ;
}
I also added the following to GraphHopper class
public Weighting createWeighting(HintsMap hintsMap, FlagEncoder encoder, Graph graph) {
…
else if ("MyCustomWeight ".equalsIgnoreCase(weightingStr)) {
weighting = new MyCustomWeighting (encoder, hintsMap);
My q is: if in the main class I create a hashmap (myWeighedEdges) to store the EGE and VALs, how to connect that to the myWeighedEdges in MyCustomWeighting class?
GHResponse rsp = new GHResponse();
IntFloatHashMap myWeighedEdges = new IntFloatHashMap();
…
List paths = graphHopper.calcPaths (new GHReques t(or-lat, or-lng, des-lat, des-lng).setWeighting("MyCustomWeight ").setVehicle(“car”), rsp)
Is there any other better way to do it? please note that, I am still using the previous version of graphhopper because I am getting errors with SDK while trying to use the new one.
Thanks in advance