diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionCalculator.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionCalculator.java index 9b04d438..88f9122f 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionCalculator.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/ServiceInsertionCalculator.java @@ -33,6 +33,8 @@ import jsprit.core.util.CalculationUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.util.Iterator; + /** * Calculator that calculates the best insertion position for a {@link Service}. * @@ -119,8 +121,15 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{ TourActivity prevAct = start; double prevActStartTime = newVehicleDepartureTime; int actIndex = 0; - boolean loopBroken = false; - for(TourActivity nextAct : currentRoute.getTourActivities().getActivities()){ + Iterator activityIterator = currentRoute.getActivities().iterator(); + boolean tourEnd = false; + while(!tourEnd){ + TourActivity nextAct; + if(activityIterator.hasNext()) nextAct = activityIterator.next(); + else{ + nextAct = end; + tourEnd = true; + } ConstraintsStatus status = hardActivityLevelConstraint.fulfilled(insertionContext, prevAct, deliveryAct2Insert, nextAct, prevActStartTime); if(status.equals(ConstraintsStatus.FULFILLED)){ //from job2insert induced costs at activity level @@ -132,7 +141,6 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{ } } else if(status.equals(ConstraintsStatus.NOT_FULFILLED_BREAK)){ - loopBroken = true; break; } double nextActArrTime = prevActStartTime + transportCosts.getTransportTime(prevAct.getLocation(), nextAct.getLocation(), prevActStartTime, newDriver, newVehicle); @@ -140,17 +148,6 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{ prevAct = nextAct; actIndex++; } - if(!loopBroken){ - ConstraintsStatus status = hardActivityLevelConstraint.fulfilled(insertionContext, prevAct, deliveryAct2Insert, end, prevActStartTime); - if(status.equals(ConstraintsStatus.FULFILLED)){ - double additionalICostsAtActLevel = softActivityConstraint.getCosts(insertionContext, prevAct, deliveryAct2Insert, end, prevActStartTime); - double additionalTransportationCosts = additionalTransportCostsCalculator.getCosts(insertionContext, prevAct, end, deliveryAct2Insert, prevActStartTime); - if(additionalICostsAtRouteLevel + additionalICostsAtActLevel + additionalTransportationCosts < bestCost){ - bestCost = additionalICostsAtRouteLevel + additionalICostsAtActLevel + additionalTransportationCosts; - insertionIndex = actIndex; - } - } - } if(insertionIndex == InsertionData.NO_INDEX) { return InsertionData.createEmptyInsertionData(); } diff --git a/jsprit-core/src/test/resources/infiniteWriterV2Test.xml b/jsprit-core/src/test/resources/infiniteWriterV2Test.xml index 2d9058ab..07c5406a 100644 --- a/jsprit-core/src/test/resources/infiniteWriterV2Test.xml +++ b/jsprit-core/src/test/resources/infiniteWriterV2Test.xml @@ -2,9 +2,24 @@ - INFINITE + FINITE + + v2 + vehType2 + + loc + + + loc + + + 0.0 + 1.7976931348623157E308 + + true + v1 vehType @@ -33,58 +48,16 @@ + + vehType2 + + 200 + + + 0.0 + 1.0 + + + - - - - loc - - - 1 - - 2.0 - - - 0.0 - 1.7976931348623157E308 - - - - - - loc2 - - - 1 - - 4.0 - - - 0.0 - 1.7976931348623157E308 - - - - - - - 10.0 - - - noDriver - v1 - 0.0 - - 1 - 0.0 - 0.0 - - 0.0 - - - - - - -