From 32bf4e63c17526be173a093f0d410d1b1b498e16 Mon Sep 17 00:00:00 2001 From: He Huang Date: Wed, 6 Sep 2017 14:37:32 +0800 Subject: [PATCH] fix the route version inconsistency issue; add comparison of job ids when scores are equal. --- .../recreate/InsertionDataUpdater.java | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/InsertionDataUpdater.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/InsertionDataUpdater.java index 8d019e2c2..617b13ca6 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/InsertionDataUpdater.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/recreate/InsertionDataUpdater.java @@ -40,20 +40,31 @@ static boolean update(boolean addAllAvailable, Set initialVehicleIds, Ve relevantVehicles.addAll(fleetManager.getAvailableVehicles(route.getVehicle())); } } else relevantVehicles.addAll(fleetManager.getAvailableVehicles()); + double bestCost = Double.MAX_VALUE; + InsertionData bestIData = new InsertionData.NoInsertionFound(); for (Vehicle v : relevantVehicles) { double depTime = v.getEarliestDeparture(); InsertionData iData = insertionCostsCalculator.getInsertionData(route, unassignedJob, v, depTime, route.getDriver(), Double.MAX_VALUE); if (iData instanceof InsertionData.NoInsertionFound) { continue; } - insertionDataSet.add(new VersionedInsertionData(iData, updateRound, route)); + if (iData.getInsertionCost() < bestCost) { + bestIData = iData; + bestCost = iData.getInsertionCost(); + } + } + Iterator iterator = insertionDataSet.iterator(); + while (iterator.hasNext()) { + VersionedInsertionData versionedInsertionData = iterator.next(); + if (versionedInsertionData.getRoute() == route && + versionedInsertionData.getVersion() != updateRound) + iterator.remove(); } + insertionDataSet.add(new VersionedInsertionData(bestIData, updateRound, route)); } return true; } - - static VehicleRoute findRoute(Collection routes, Job job) { for(VehicleRoute r : routes){ if(r.getVehicle().getBreak() == job) return r; @@ -115,16 +126,13 @@ static ScoredJob getBest(boolean switchAllowed, Set initialVehicleIds, V } else continue; } } - int currentDataVersion = updates.get(versionedIData.getRoute()); - if(versionedIData.getVersion() == currentDataVersion){ - if(best == null) { - best = versionedIData.getiData(); - bestRoute = versionedIData.getRoute(); - } - else { - secondBest = versionedIData.getiData(); - break; - } + if(best == null) { + best = versionedIData.getiData(); + bestRoute = versionedIData.getRoute(); + } + else { + secondBest = versionedIData.getiData(); + break; } } VehicleRoute emptyRoute = VehicleRoute.emptyRoute(); @@ -157,6 +165,11 @@ static ScoredJob getBest(boolean switchAllowed, Set initialVehicleIds, V else if(scoredJob.getScore() > bestScoredJob.getScore()){ bestScoredJob = scoredJob; } + else if (scoredJob.getScore() == bestScoredJob.getScore()) { + if (scoredJob.getJob().getId().compareTo(bestScoredJob.getJob().getId()) <= 0) { + bestScoredJob = scoredJob; + } + } } return bestScoredJob; }