From 211d56d9285a98483125d26c74744d4daaad5cda Mon Sep 17 00:00:00 2001 From: Stefan Schroeder <4sschroeder@gmail.com> Date: Thu, 22 Aug 2013 11:01:03 +0200 Subject: [PATCH] internal improvement of insertionCalc --- .../algorithms/BackwardInTimeListeners.java | 20 ++++---- ...alculatesServiceInsertionOnRouteLevel.java | 8 +++ .../algorithms/ForwardInTimeListeners.java | 14 +++--- .../IterateRouteBackwardInTime.java | 25 ++++++---- .../algorithms/IterateRouteForwardInTime.java | 8 +-- .../java/algorithms/UpdateActivityTimes.java | 13 +++-- .../algorithms/UpdateCostsAtAllLevels.java | 49 ++++++++++--------- ...EarliestStartTimeWindowAtActLocations.java | 5 +- ...atestOperationStartTimeAtActLocations.java | 8 +-- .../algorithms/UpdateLoadAtAllLevels.java | 5 +- .../java/algorithms/BuildFastCVRPTest.java | 27 ++++++++++ .../TestIterateRouteForwardInTime.java | 2 +- .../TestTourStateUpdaterWithService.java | 2 +- .../main/java/examples/SolomonExample.java | 4 +- 14 files changed, 120 insertions(+), 70 deletions(-) create mode 100644 jsprit-core/src/test/java/algorithms/BuildFastCVRPTest.java diff --git a/jsprit-core/src/main/java/algorithms/BackwardInTimeListeners.java b/jsprit-core/src/main/java/algorithms/BackwardInTimeListeners.java index 1904155b..effaa07a 100644 --- a/jsprit-core/src/main/java/algorithms/BackwardInTimeListeners.java +++ b/jsprit-core/src/main/java/algorithms/BackwardInTimeListeners.java @@ -3,6 +3,8 @@ package algorithms; import java.util.ArrayList; import java.util.Collection; +import basics.route.End; +import basics.route.Start; import basics.route.TourActivity; import basics.route.VehicleRoute; @@ -10,11 +12,11 @@ class BackwardInTimeListeners { interface BackwardInTimeListener{ - public void start(VehicleRoute route); + public void start(VehicleRoute route, End end, double latestArrivalTime); public void prevActivity(TourActivity act, double latestDepartureTime, double latestOperationStartTime); - public void finnish(); + public void end(Start start, double latestDepartureTime); } @@ -24,8 +26,8 @@ class BackwardInTimeListeners { listeners.add(l); } - public void start(VehicleRoute route){ - for(BackwardInTimeListener l : listeners){ l.start(route); } + public void start(VehicleRoute route, End end, double latestArrivalTime){ + for(BackwardInTimeListener l : listeners){ l.start(route, end, latestArrivalTime); } } /** @@ -37,14 +39,14 @@ class BackwardInTimeListeners { * * @param act * @param latestDepartureTime - * @param latestOperationStartTime + * @param latestArrivalTime */ - public void prevActivity(TourActivity act, double latestDepartureTime, double latestOperationStartTime){ - for(BackwardInTimeListener l : listeners){ l.prevActivity(act,latestDepartureTime,latestOperationStartTime); } + public void prevActivity(TourActivity act, double latestDepartureTime, double latestArrivalTime){ + for(BackwardInTimeListener l : listeners){ l.prevActivity(act,latestDepartureTime,latestArrivalTime); } } - public void finnish(){ - for(BackwardInTimeListener l : listeners){ l.finnish(); } + public void end(Start start, double latestDepartureTime){ + for(BackwardInTimeListener l : listeners){ l.end(start, latestDepartureTime); } } } diff --git a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionOnRouteLevel.java b/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionOnRouteLevel.java index 3b03dabf..85164555 100644 --- a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionOnRouteLevel.java +++ b/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionOnRouteLevel.java @@ -241,6 +241,14 @@ final class CalculatesServiceInsertionOnRouteLevel implements JobInsertionCalcul * */ + if(memorySize==0){ + InsertionData insertion = bestInsertionsQueue.poll(); + if(insertion != null){ + best_insertion_index = insertion.getDeliveryInsertionIndex(); + best_insertion_costs = insertion.getInsertionCost(); + } + } + for(int i=0;i reverseActIter = vehicleRoute.getTourActivities().reverseActivityIterator(); TourActivity prevAct; prevAct = vehicleRoute.getEnd(); - double startAtPrevAct = prevAct.getTheoreticalLatestOperationStartTime(); - listeners.prevActivity(prevAct, startAtPrevAct, startAtPrevAct); + double latestArrivalTimeAtPrevAct = prevAct.getTheoreticalLatestOperationStartTime(); + while(reverseActIter.hasNext()){ TourActivity currAct = reverseActIter.next(); - double latestDepTimeAtCurrAct = startAtPrevAct - transportTime.getBackwardTransportTime(currAct.getLocationId(), prevAct.getLocationId(), startAtPrevAct, vehicleRoute.getDriver(),vehicleRoute.getVehicle()); - double potentialLatestOperationStartTimeAtCurrAct = latestDepTimeAtCurrAct - currAct.getOperationTime(); - double latestOperationStartTime = Math.min(currAct.getTheoreticalLatestOperationStartTime(), potentialLatestOperationStartTimeAtCurrAct); - listeners.prevActivity(currAct, latestDepTimeAtCurrAct, latestOperationStartTime); + double latestDepTimeAtCurrAct = latestArrivalTimeAtPrevAct - transportTime.getBackwardTransportTime(currAct.getLocationId(), prevAct.getLocationId(), latestArrivalTimeAtPrevAct, vehicleRoute.getDriver(),vehicleRoute.getVehicle()); + double potentialLatestArrivalTimeAtCurrAct = latestDepTimeAtCurrAct - currAct.getOperationTime(); + double latestArrivalTime = Math.min(currAct.getTheoreticalLatestOperationStartTime(), potentialLatestArrivalTimeAtCurrAct); + + listeners.prevActivity(currAct, latestDepTimeAtCurrAct, latestArrivalTime); + prevAct = currAct; - startAtPrevAct = latestOperationStartTime; + latestArrivalTimeAtPrevAct = latestArrivalTime; } - listeners.finnish(); + + TourActivity currAct = vehicleRoute.getStart(); + double latestDepTimeAtCurrAct = latestArrivalTimeAtPrevAct - transportTime.getBackwardTransportTime(currAct.getLocationId(), prevAct.getLocationId(), latestArrivalTimeAtPrevAct, vehicleRoute.getDriver(),vehicleRoute.getVehicle()); + + listeners.end(vehicleRoute.getStart(), latestDepTimeAtCurrAct); } public void addListener(BackwardInTimeListener l){ listeners.addListener(l); } diff --git a/jsprit-core/src/main/java/algorithms/IterateRouteForwardInTime.java b/jsprit-core/src/main/java/algorithms/IterateRouteForwardInTime.java index a0521034..868a84d7 100644 --- a/jsprit-core/src/main/java/algorithms/IterateRouteForwardInTime.java +++ b/jsprit-core/src/main/java/algorithms/IterateRouteForwardInTime.java @@ -48,15 +48,13 @@ class IterateRouteForwardInTime implements VehicleRouteUpdater{ * */ public void iterate(VehicleRoute vehicleRoute) { - listeners.start(vehicleRoute); + listeners.start(vehicleRoute, vehicleRoute.getStart(), vehicleRoute.getStart().getEndTime()); Vehicle vehicle = vehicleRoute.getVehicle(); Driver driver = vehicleRoute.getDriver(); TourActivity prevAct = vehicleRoute.getStart(); double startAtPrevAct = prevAct.getEndTime(); - listeners.nextActivity(prevAct,startAtPrevAct,startAtPrevAct); - for(TourActivity currentAct : vehicleRoute.getTourActivities().getActivities()){ double transportTime = this.transportTime.getTransportTime(prevAct.getLocationId(), currentAct.getLocationId(), startAtPrevAct, driver, vehicle); double arrivalTimeAtCurrAct = startAtPrevAct + transportTime; @@ -73,9 +71,7 @@ class IterateRouteForwardInTime implements VehicleRouteUpdater{ double transportTime = this.transportTime.getTransportTime(prevAct.getLocationId(), currentAct.getLocationId(), startAtPrevAct, driver, vehicle); double arrivalTimeAtCurrAct = startAtPrevAct + transportTime; - listeners.nextActivity(currentAct,arrivalTimeAtCurrAct,arrivalTimeAtCurrAct); - listeners.finnish(); - + listeners.end(vehicleRoute.getEnd(), arrivalTimeAtCurrAct); } public void addListener(ForwardInTimeListener l){ diff --git a/jsprit-core/src/main/java/algorithms/UpdateActivityTimes.java b/jsprit-core/src/main/java/algorithms/UpdateActivityTimes.java index 41a5b251..308739c6 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateActivityTimes.java +++ b/jsprit-core/src/main/java/algorithms/UpdateActivityTimes.java @@ -2,25 +2,30 @@ package algorithms; import org.apache.log4j.Logger; +import algorithms.ForwardInTimeListeners.ForwardInTimeListener; +import basics.route.End; +import basics.route.Start; import basics.route.TourActivity; import basics.route.VehicleRoute; -import algorithms.ForwardInTimeListeners.ForwardInTimeListener; class UpdateActivityTimes implements ForwardInTimeListener{ private Logger log = Logger.getLogger(UpdateActivityTimes.class); @Override - public void start(VehicleRoute route) {} + public void start(VehicleRoute route, Start start, double departureTime) { + start.setEndTime(departureTime); + } @Override public void nextActivity(TourActivity act, double arrTime, double endTime) { -// log.debug(act.toString() + " arrTime="+ arrTime + " endTime=" + endTime); act.setArrTime(arrTime); act.setEndTime(endTime); } @Override - public void finnish() {} + public void end(End end, double arrivalTime) { + end.setArrTime(arrivalTime); + } } diff --git a/jsprit-core/src/main/java/algorithms/UpdateCostsAtAllLevels.java b/jsprit-core/src/main/java/algorithms/UpdateCostsAtAllLevels.java index 679a294d..38b511e9 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateCostsAtAllLevels.java +++ b/jsprit-core/src/main/java/algorithms/UpdateCostsAtAllLevels.java @@ -33,38 +33,41 @@ class UpdateCostsAtAllLevels implements ForwardInTimeListener{ } @Override - public void start(VehicleRoute route) { + public void start(VehicleRoute route, Start start, double departureTime) { vehicleRoute = route; vehicleRoute.getVehicleRouteCostCalculator().reset(); + prevAct = start; + startTimeAtPrevAct = departureTime; } @Override public void nextActivity(TourActivity act, double arrTime, double endTime) { - if(prevAct == null){ - prevAct = act; - startTimeAtPrevAct = endTime; - } - else{ - double transportCost = this.transportCost.getTransportCost(prevAct.getLocationId(), act.getLocationId(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle()); - double actCost = activityCost.getActivityCost(act, arrTime, vehicleRoute.getDriver(), vehicleRoute.getVehicle()); - - vehicleRoute.getVehicleRouteCostCalculator().addTransportCost(transportCost); - vehicleRoute.getVehicleRouteCostCalculator().addActivityCost(actCost); - - totalOperationCost += transportCost; - totalOperationCost += actCost; - - if(!(act instanceof End)){ - states.putActivityState(act, StateTypes.COSTS, new StateImpl(totalOperationCost)); - } - - prevAct = act; - startTimeAtPrevAct = endTime; - } + double transportCost = this.transportCost.getTransportCost(prevAct.getLocationId(), act.getLocationId(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle()); + double actCost = activityCost.getActivityCost(act, arrTime, vehicleRoute.getDriver(), vehicleRoute.getVehicle()); + + vehicleRoute.getVehicleRouteCostCalculator().addTransportCost(transportCost); + vehicleRoute.getVehicleRouteCostCalculator().addActivityCost(actCost); + + totalOperationCost += transportCost; + totalOperationCost += actCost; + + states.putActivityState(act, StateTypes.COSTS, new StateImpl(totalOperationCost)); + + prevAct = act; + startTimeAtPrevAct = endTime; } @Override - public void finnish() { + public void end(End end, double arrivalTime) { + double transportCost = this.transportCost.getTransportCost(prevAct.getLocationId(), end.getLocationId(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle()); + double actCost = activityCost.getActivityCost(end, arrivalTime, vehicleRoute.getDriver(), vehicleRoute.getVehicle()); + + vehicleRoute.getVehicleRouteCostCalculator().addTransportCost(transportCost); + vehicleRoute.getVehicleRouteCostCalculator().addActivityCost(actCost); + + totalOperationCost += transportCost; + totalOperationCost += actCost; + states.putRouteState(vehicleRoute, StateTypes.COSTS, new StateImpl(totalOperationCost)); //this is rather strange and likely to change diff --git a/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTimeWindowAtActLocations.java b/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTimeWindowAtActLocations.java index dee0a67b..98a0fab1 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTimeWindowAtActLocations.java +++ b/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTimeWindowAtActLocations.java @@ -17,15 +17,14 @@ class UpdateEarliestStartTimeWindowAtActLocations implements ForwardInTimeListen } @Override - public void start(VehicleRoute route) {} + public void start(VehicleRoute route, Start start, double departureTime) {} @Override public void nextActivity(TourActivity act, double arrTime, double endTime) { - if(act instanceof Start || act instanceof End) return; states.putActivityState(act, StateTypes.EARLIEST_OPERATION_START_TIME, new StateImpl(Math.max(arrTime, act.getTheoreticalEarliestOperationStartTime()))); } @Override - public void finnish() {} + public void end(End end, double arrivalTime) {} } diff --git a/jsprit-core/src/main/java/algorithms/UpdateLatestOperationStartTimeAtActLocations.java b/jsprit-core/src/main/java/algorithms/UpdateLatestOperationStartTimeAtActLocations.java index 69d6a209..a4a1be95 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateLatestOperationStartTimeAtActLocations.java +++ b/jsprit-core/src/main/java/algorithms/UpdateLatestOperationStartTimeAtActLocations.java @@ -17,16 +17,16 @@ class UpdateLatestOperationStartTimeAtActLocations implements BackwardInTimeList } @Override - public void start(VehicleRoute route) {} + public void start(VehicleRoute route, End end, double latestArrivalTime) {} @Override public void prevActivity(TourActivity act,double latestDepartureTime, double latestOperationStartTime) { -// if(latestOperationStartTime < act.getArrTime()) throw new IllegalStateException(act.toString() + "; latestStart="+latestOperationStartTime+";actArrTime="+act.getArrTime()); - if(act instanceof Start || act instanceof End) return; states.putActivityState(act, StateTypes.LATEST_OPERATION_START_TIME, new StateImpl(latestOperationStartTime)); } @Override - public void finnish() {} + public void end(Start start, double latestDepartureTime) {} + + } diff --git a/jsprit-core/src/main/java/algorithms/UpdateLoadAtAllLevels.java b/jsprit-core/src/main/java/algorithms/UpdateLoadAtAllLevels.java index d2e43f8f..200b320a 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateLoadAtAllLevels.java +++ b/jsprit-core/src/main/java/algorithms/UpdateLoadAtAllLevels.java @@ -27,17 +27,16 @@ class UpdateLoadAtAllLevels implements ForwardInTimeListener{ } @Override - public void start(VehicleRoute route) { vehicleRoute = route; } + public void start(VehicleRoute route, Start start, double departureTime) { vehicleRoute = route; } @Override public void nextActivity(TourActivity act, double arrTime, double endTime) { - if(act instanceof Start || act instanceof End){ return; } load += (double)act.getCapacityDemand(); states.putActivityState(act, StateTypes.LOAD, new StateImpl(load)); } @Override - public void finnish() { + public void end(End end, double arrivalTime) { states.putRouteState(vehicleRoute, StateTypes.LOAD, new StateImpl(load)); load=0; vehicleRoute = null; diff --git a/jsprit-core/src/test/java/algorithms/BuildFastCVRPTest.java b/jsprit-core/src/test/java/algorithms/BuildFastCVRPTest.java new file mode 100644 index 00000000..c5a806d8 --- /dev/null +++ b/jsprit-core/src/test/java/algorithms/BuildFastCVRPTest.java @@ -0,0 +1,27 @@ +package algorithms; + +import org.junit.Test; + +import basics.VehicleRoutingAlgorithm; +import basics.VehicleRoutingProblem; + +public class BuildFastCVRPTest { + + @Test + public void buildFastCVRPAlgoTest(){ + + VehicleRoutingProblem vrp = null; + + VehicleRoutingAlgorithm vra = createVRA(vrp); + + + + } + + public VehicleRoutingAlgorithm createVRA(VehicleRoutingProblem vrp){ + VehicleFleetManager fleetManager = new InfiniteVehicles(vrp.getVehicles()); + + return null; + } + +} diff --git a/jsprit-core/src/test/java/algorithms/TestIterateRouteForwardInTime.java b/jsprit-core/src/test/java/algorithms/TestIterateRouteForwardInTime.java index c987e94e..74d13242 100644 --- a/jsprit-core/src/test/java/algorithms/TestIterateRouteForwardInTime.java +++ b/jsprit-core/src/test/java/algorithms/TestIterateRouteForwardInTime.java @@ -189,7 +189,7 @@ public class TestIterateRouteForwardInTime { forwardInTime.iterate(vehicleRoute); assertEquals(40.0, states.getRouteStates(vehicleRoute).getState(StateTypes.COSTS).toDouble(), 0.05); - assertEquals(40.0, vehicleRoute.getEnd().getEndTime(),0.05); + assertEquals(40.0, vehicleRoute.getEnd().getArrTime(),0.05); assertEquals(50.0, vehicleRoute.getEnd().getTheoreticalLatestOperationStartTime(),0.05); } diff --git a/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java b/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java index 2ac1aeb7..518a075f 100644 --- a/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java +++ b/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java @@ -158,7 +158,7 @@ public class TestTourStateUpdaterWithService { updateStates.update(vehicleRoute); assertEquals(40.0, states.getRouteState(vehicleRoute, StateTypes.COSTS).toDouble(), 0.05); - assertEquals(40.0, vehicleRoute.getEnd().getEndTime(),0.05); + assertEquals(40.0, vehicleRoute.getEnd().getArrTime(),0.05); assertEquals(50.0, vehicleRoute.getEnd().getTheoreticalLatestOperationStartTime(),0.05); } diff --git a/jsprit-examples/src/main/java/examples/SolomonExample.java b/jsprit-examples/src/main/java/examples/SolomonExample.java index baabd7c2..6897a833 100644 --- a/jsprit-examples/src/main/java/examples/SolomonExample.java +++ b/jsprit-examples/src/main/java/examples/SolomonExample.java @@ -26,6 +26,7 @@ import java.util.Collection; import readers.SolomonReader; import algorithms.GreedySchrimpfFactory; import algorithms.SchrimpfFactory; +import algorithms.VehicleRoutingAlgorithms; import algorithms.selectors.SelectBest; import analysis.AlgorithmSearchProgressChartListener; import analysis.SolutionPlotter; @@ -75,7 +76,8 @@ public class SolomonExample { * * The algorithm can be defined and configured in an xml-file. */ - VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp); +// VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp); + VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfig_solomon.xml"); vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png")); /* * Solve the problem.