diff --git a/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java b/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java index ce58d233..65e2553d 100644 --- a/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java +++ b/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import basics.VehicleRoutingProblem; +import basics.VehicleRoutingProblem.Constraint; import basics.algo.InsertionListener; import basics.algo.VehicleRoutingAlgorithmListeners.PrioritizedVRAListener; @@ -25,11 +26,34 @@ public class BestInsertionBuilder implements InsertionStrategyBuilder{ private ActivityInsertionCostsCalculator actInsertionCostsCalculator = null; - public BestInsertionBuilder(VehicleRoutingProblem vrp, StateManager stateManager) { + public BestInsertionBuilder(VehicleRoutingProblem vrp, VehicleFleetManager vehicleFleetManager, StateManager stateManager) { super(); this.vrp = vrp; this.stateManager = stateManager; this.constraintManager = new ConstraintManager(); + this.fleetManager = vehicleFleetManager; + } + + /** + * Adds core constraints, i.e. + * + *

HardPickupAndDeliveryLoadRouteLevelConstraint
+ * HardTimeWindowActivityLevelConstraint
+ * if(Constraint.DELIVERIES_FIRST) HardPickupAndDeliveryBackhaulActivityLevelConstraint
+ * else HardPickupAndDeliveryActivityLevelConstraint + * @return + */ + public BestInsertionBuilder addCoreConstraints(){ + constraintManager.addConstraint(new HardPickupAndDeliveryLoadRouteLevelConstraint(stateManager)); + constraintManager.addConstraint(new HardTimeWindowActivityLevelConstraint(stateManager, vrp.getTransportCosts())); + if(vrp.getProblemConstraints().contains(Constraint.DELIVERIES_FIRST)){ + constraintManager.addConstraint(new HardPickupAndDeliveryBackhaulActivityLevelConstraint(stateManager)); + } + else{ + constraintManager.addConstraint(new HardPickupAndDeliveryActivityLevelConstraint(stateManager)); + } + StateUtils.addCoreStateUpdaters(vrp, stateManager); + return this; } public BestInsertionBuilder addConstraint(HardActivityLevelConstraint hardActvitiyLevelConstraint){ @@ -55,11 +79,6 @@ public class BestInsertionBuilder implements InsertionStrategyBuilder{ return this; } - public BestInsertionBuilder setFleetManager(VehicleFleetManager fleetManager){ - this.fleetManager = fleetManager; - return this; - } - public void setActivityInsertionCostCalculator(ActivityInsertionCostsCalculator activityInsertionCostsCalculator){ this.actInsertionCostsCalculator = activityInsertionCostsCalculator; }; @@ -69,19 +88,53 @@ public class BestInsertionBuilder implements InsertionStrategyBuilder{ List iListeners = new ArrayList(); List algorithmListeners = new ArrayList(); CalculatorBuilder calcBuilder = new CalculatorBuilder(iListeners, algorithmListeners); + addCoreUpdater(); + if(local){ calcBuilder.setLocalLevel(); } + else { + //add CostsUpdater + + } +// calcBuilder.setRouteLevel(forwardLooking, memory); +// } calcBuilder.setConstraintManager(constraintManager); calcBuilder.setStates(stateManager); calcBuilder.setVehicleRoutingProblem(vrp); calcBuilder.setVehicleFleetManager(fleetManager); calcBuilder.setActivityInsertionCostsCalculator(actInsertionCostsCalculator); - if(considerFixedCosts) calcBuilder.considerFixedCosts(weightOfFixedCosts); + if(considerFixedCosts) { + calcBuilder.considerFixedCosts(weightOfFixedCosts); + } JobInsertionCalculator jobInsertions = calcBuilder.build(); BestInsertion bestInsertion = new BestInsertion(jobInsertions); for(InsertionListener l : iListeners) bestInsertion.addListener(l); return bestInsertion; } + private void addCoreUpdater() { + if(!hasActivityTimeUpdater()){ + stateManager.addActivityVisitor(new UpdateActivityTimes(vrp.getTransportCosts())); + } +// if(!hasLoadUpdater()){ +// stateManager.addActivityVisitor(new UpdateLoadAtActivityLevel(stateManager)); +// } + + } + + private boolean hasLoadUpdater() { + for(StateUpdater updater : stateManager.getStateUpdaters()){ + if(updater instanceof UpdateLoadAtActivityLevel) return true; + } + return false; + } + + private boolean hasActivityTimeUpdater() { + for(StateUpdater updater : stateManager.getStateUpdaters()){ + if(updater instanceof UpdateActivityTimes) return true; + } + return false; + } + } diff --git a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionConsideringFixCost.java b/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionConsideringFixCost.java index a77d01b9..ba3b1415 100644 --- a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionConsideringFixCost.java +++ b/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionConsideringFixCost.java @@ -37,9 +37,9 @@ final class CalculatesServiceInsertionConsideringFixCost implements JobInsertion private double solution_completeness_ratio = 0.5; - private StateManager states; + private StateGetter states; - public CalculatesServiceInsertionConsideringFixCost(final JobInsertionCalculator standardInsertionCalculator, StateManager activityStates2) { + public CalculatesServiceInsertionConsideringFixCost(final JobInsertionCalculator standardInsertionCalculator, StateGetter activityStates2) { super(); this.standardServiceInsertion = standardInsertionCalculator; this.states = activityStates2; diff --git a/jsprit-core/src/main/java/algorithms/CalculationUtils.java b/jsprit-core/src/main/java/algorithms/CalculationUtils.java index bfa26b14..d584578c 100644 --- a/jsprit-core/src/main/java/algorithms/CalculationUtils.java +++ b/jsprit-core/src/main/java/algorithms/CalculationUtils.java @@ -22,7 +22,7 @@ package algorithms; import basics.route.TourActivity; -public class CalculationUtils { +class CalculationUtils { /** diff --git a/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java b/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java index 8a2073b1..be3856ff 100644 --- a/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java +++ b/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java @@ -58,7 +58,7 @@ class CalculatorBuilder { private VehicleRoutingProblem vrp; - private StateManager states; + private StateGetter states; private boolean local = true; @@ -103,7 +103,7 @@ class CalculatorBuilder { * * @return */ - public CalculatorBuilder setStates(StateManager states){ + public CalculatorBuilder setStates(StateGetter states){ this.states = states; return this; } @@ -217,7 +217,7 @@ class CalculatorBuilder { } } - private CalculatorPlusListeners createStandardLocal(VehicleRoutingProblem vrp, StateManager statesManager){ + private CalculatorPlusListeners createStandardLocal(VehicleRoutingProblem vrp, StateGetter statesManager){ if(constraintManager == null) throw new IllegalStateException("constraint-manager is null"); ActivityInsertionCostsCalculator actInsertionCalc; @@ -235,7 +235,7 @@ class CalculatorBuilder { return calcPlusListeners; } - private CalculatorPlusListeners createCalculatorConsideringFixedCosts(VehicleRoutingProblem vrp, JobInsertionCalculator baseCalculator, StateManager activityStates2, double weightOfFixedCosts){ + private CalculatorPlusListeners createCalculatorConsideringFixedCosts(VehicleRoutingProblem vrp, JobInsertionCalculator baseCalculator, StateGetter activityStates2, double weightOfFixedCosts){ final CalculatesServiceInsertionConsideringFixCost withFixCost = new CalculatesServiceInsertionConsideringFixCost(baseCalculator, activityStates2); withFixCost.setWeightOfFixCost(weightOfFixedCosts); CalculatorPlusListeners calcPlusListeners = new CalculatorPlusListeners(withFixCost); @@ -243,7 +243,7 @@ class CalculatorBuilder { return calcPlusListeners; } - private CalculatorPlusListeners createStandardRoute(VehicleRoutingProblem vrp, StateManager activityStates2, int forwardLooking, int solutionMemory){ + private CalculatorPlusListeners createStandardRoute(VehicleRoutingProblem vrp, StateGetter activityStates2, int forwardLooking, int solutionMemory){ int after = forwardLooking; ActivityInsertionCostsCalculator routeLevelCostEstimator; if(activityInsertionCostCalculator == null){ @@ -261,7 +261,7 @@ class CalculatorBuilder { return calcPlusListener; } - private JobInsertionCalculator createFinalInsertion(VehicleFleetManager fleetManager, JobInsertionCalculator baseCalc, StateManager activityStates2){ + private JobInsertionCalculator createFinalInsertion(VehicleFleetManager fleetManager, JobInsertionCalculator baseCalc, StateGetter activityStates2){ return new CalculatesVehTypeDepServiceInsertion(fleetManager, baseCalc); } diff --git a/jsprit-core/src/main/java/algorithms/ConstraintManager.java b/jsprit-core/src/main/java/algorithms/ConstraintManager.java index 58b6288c..87ad352b 100644 --- a/jsprit-core/src/main/java/algorithms/ConstraintManager.java +++ b/jsprit-core/src/main/java/algorithms/ConstraintManager.java @@ -2,7 +2,7 @@ package algorithms; import basics.route.TourActivity; -public class ConstraintManager implements HardActivityLevelConstraint, HardRouteLevelConstraint{ +class ConstraintManager implements HardActivityLevelConstraint, HardRouteLevelConstraint{ private HardActivityLevelConstraintManager actLevelConstraintManager = new HardActivityLevelConstraintManager(); diff --git a/jsprit-core/src/main/java/algorithms/FindCheaperVehicleAlgo.java b/jsprit-core/src/main/java/algorithms/FindCheaperVehicleAlgo.java index 29dbfe97..db0b82dd 100644 --- a/jsprit-core/src/main/java/algorithms/FindCheaperVehicleAlgo.java +++ b/jsprit-core/src/main/java/algorithms/FindCheaperVehicleAlgo.java @@ -41,13 +41,13 @@ final class FindCheaperVehicleAlgo { private double weightFixCosts = 1.0; - private StateManager states; + private StateGetter states; public void setWeightFixCosts(double weightFixCosts) { this.weightFixCosts = weightFixCosts; } - public void setStates(StateManager states) { + public void setStates(StateGetter states) { this.states = states; } diff --git a/jsprit-core/src/main/java/algorithms/HardLoadConstraint.java b/jsprit-core/src/main/java/algorithms/HardLoadConstraint.java index 85d13fda..78a8037b 100644 --- a/jsprit-core/src/main/java/algorithms/HardLoadConstraint.java +++ b/jsprit-core/src/main/java/algorithms/HardLoadConstraint.java @@ -2,11 +2,11 @@ package algorithms; import basics.Service; -public class HardLoadConstraint implements HardRouteLevelConstraint{ +class HardLoadConstraint implements HardRouteLevelConstraint{ - private StateManager states; + private StateGetter states; - public HardLoadConstraint(StateManager states) { + public HardLoadConstraint(StateGetter states) { super(); this.states = states; } diff --git a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryActivityLevelConstraint.java b/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryActivityLevelConstraint.java index 33d7f20e..4a5645bd 100644 --- a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryActivityLevelConstraint.java +++ b/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryActivityLevelConstraint.java @@ -6,11 +6,11 @@ import basics.route.ServiceActivity; import basics.route.Start; import basics.route.TourActivity; -public class HardPickupAndDeliveryActivityLevelConstraint implements HardActivityLevelConstraint { +class HardPickupAndDeliveryActivityLevelConstraint implements HardActivityLevelConstraint { - private StateManager stateManager; + private StateGetter stateManager; - public HardPickupAndDeliveryActivityLevelConstraint(StateManager stateManager) { + public HardPickupAndDeliveryActivityLevelConstraint(StateGetter stateManager) { super(); this.stateManager = stateManager; } diff --git a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryBackhaulActivityLevelConstraint.java b/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryBackhaulActivityLevelConstraint.java index 96fea881..89b293a1 100644 --- a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryBackhaulActivityLevelConstraint.java +++ b/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryBackhaulActivityLevelConstraint.java @@ -6,11 +6,11 @@ import basics.route.ServiceActivity; import basics.route.Start; import basics.route.TourActivity; -public class HardPickupAndDeliveryBackhaulActivityLevelConstraint implements HardActivityLevelConstraint { +class HardPickupAndDeliveryBackhaulActivityLevelConstraint implements HardActivityLevelConstraint { - private StateManager stateManager; + private StateGetter stateManager; - public HardPickupAndDeliveryBackhaulActivityLevelConstraint(StateManager stateManager) { + public HardPickupAndDeliveryBackhaulActivityLevelConstraint(StateGetter stateManager) { super(); this.stateManager = stateManager; } diff --git a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryLoadConstraint.java b/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryLoadRouteLevelConstraint.java similarity index 82% rename from jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryLoadConstraint.java rename to jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryLoadRouteLevelConstraint.java index 326838a0..c43d1e7d 100644 --- a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryLoadConstraint.java +++ b/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryLoadRouteLevelConstraint.java @@ -10,11 +10,11 @@ import basics.Service; * @author stefan * */ -public class HardPickupAndDeliveryLoadConstraint implements HardRouteLevelConstraint { +class HardPickupAndDeliveryLoadRouteLevelConstraint implements HardRouteLevelConstraint { - private StateManager stateManager; + private StateGetter stateManager; - public HardPickupAndDeliveryLoadConstraint(StateManager stateManager) { + public HardPickupAndDeliveryLoadRouteLevelConstraint(StateGetter stateManager) { super(); this.stateManager = stateManager; } diff --git a/jsprit-core/src/main/java/algorithms/HardTimeWindowActivityLevelConstraint.java b/jsprit-core/src/main/java/algorithms/HardTimeWindowActivityLevelConstraint.java index d12d0ecc..f30698de 100644 --- a/jsprit-core/src/main/java/algorithms/HardTimeWindowActivityLevelConstraint.java +++ b/jsprit-core/src/main/java/algorithms/HardTimeWindowActivityLevelConstraint.java @@ -10,15 +10,15 @@ import basics.route.TourActivity; * @author stefan * */ - public class HardTimeWindowActivityLevelConstraint implements HardActivityLevelConstraint { + class HardTimeWindowActivityLevelConstraint implements HardActivityLevelConstraint { private static Logger log = Logger.getLogger(HardTimeWindowActivityLevelConstraint.class); - private StateManager states; + private StateGetter states; private VehicleRoutingTransportCosts routingCosts; - public HardTimeWindowActivityLevelConstraint(StateManager states, VehicleRoutingTransportCosts routingCosts) { + public HardTimeWindowActivityLevelConstraint(StateGetter states, VehicleRoutingTransportCosts routingCosts) { super(); this.states = states; this.routingCosts = routingCosts; diff --git a/jsprit-core/src/main/java/algorithms/InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts.java b/jsprit-core/src/main/java/algorithms/InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts.java index 3651d8b9..60d65678 100644 --- a/jsprit-core/src/main/java/algorithms/InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts.java +++ b/jsprit-core/src/main/java/algorithms/InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts.java @@ -2,7 +2,7 @@ package algorithms; import java.util.Collection; -import algorithms.StateManagerImpl.StateImpl; +import algorithms.StateManager.StateImpl; import basics.Delivery; import basics.Job; import basics.Pickup; @@ -20,9 +20,9 @@ import basics.route.VehicleRoute; * * @param stateManager */ -public class InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts implements InsertionStartsListener { +class InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts implements InsertionStartsListener { - private StateManagerImpl stateManager; + private StateManager stateManager; /** * Initializes the load of each route/vehicle at start- and end-location before insertion starts. @@ -34,7 +34,7 @@ public class InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts implements I * * @param stateManager */ - public InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts(StateManagerImpl stateManager) { + public InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts(StateManager stateManager) { super(); this.stateManager = stateManager; } diff --git a/jsprit-core/src/main/java/algorithms/InsertionFactory.java b/jsprit-core/src/main/java/algorithms/InsertionFactory.java index 21d38d23..f2a07052 100644 --- a/jsprit-core/src/main/java/algorithms/InsertionFactory.java +++ b/jsprit-core/src/main/java/algorithms/InsertionFactory.java @@ -32,7 +32,7 @@ class InsertionFactory { private static Logger log = Logger.getLogger(InsertionFactory.class); public static InsertionStrategy createInsertion(VehicleRoutingProblem vrp, HierarchicalConfiguration config, - VehicleFleetManager vehicleFleetManager, StateManagerImpl routeStates, List algorithmListeners, ExecutorService executorService, int nuOfThreads, ConstraintManager constraintManager){ + VehicleFleetManager vehicleFleetManager, StateManager routeStates, List algorithmListeners, ExecutorService executorService, int nuOfThreads, ConstraintManager constraintManager){ if(config.containsKey("[@name]")){ String insertionName = config.getString("[@name]"); diff --git a/jsprit-core/src/main/java/algorithms/LocalActivityInsertionCostsCalculator.java b/jsprit-core/src/main/java/algorithms/LocalActivityInsertionCostsCalculator.java index 2f619c5e..ddc8b069 100644 --- a/jsprit-core/src/main/java/algorithms/LocalActivityInsertionCostsCalculator.java +++ b/jsprit-core/src/main/java/algorithms/LocalActivityInsertionCostsCalculator.java @@ -24,11 +24,22 @@ import basics.costs.VehicleRoutingActivityCosts; import basics.costs.VehicleRoutingTransportCosts; import basics.route.TourActivity; +/** + * Calculates activity insertion costs locally, i.e. by comparing the additional costs of insertion the new activity k between + * activity i (prevAct) and j (nextAct). + * Additional costs are then basically calculated as delta c = c_ik + c_kj - c_ij. + * + *

Note once time has an effect on costs this class requires activity endTimes. + * + * @author stefan + * + */ class LocalActivityInsertionCostsCalculator implements ActivityInsertionCostsCalculator{ private VehicleRoutingTransportCosts routingCosts; private VehicleRoutingActivityCosts activityCosts; + public LocalActivityInsertionCostsCalculator(VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts actCosts) { super(); this.routingCosts = routingCosts; diff --git a/jsprit-core/src/main/java/algorithms/RouteLevelActivityInsertionCostsEstimator.java b/jsprit-core/src/main/java/algorithms/RouteLevelActivityInsertionCostsEstimator.java index a92a58cb..8d5e396c 100644 --- a/jsprit-core/src/main/java/algorithms/RouteLevelActivityInsertionCostsEstimator.java +++ b/jsprit-core/src/main/java/algorithms/RouteLevelActivityInsertionCostsEstimator.java @@ -36,11 +36,11 @@ class RouteLevelActivityInsertionCostsEstimator implements ActivityInsertionCost private AuxilliaryCostCalculator auxilliaryPathCostCalculator; - private StateManager stateManager; + private StateGetter stateManager; private int nuOfActivities2LookForward = 0; - public RouteLevelActivityInsertionCostsEstimator(VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts actCosts, StateManager stateManager) { + public RouteLevelActivityInsertionCostsEstimator(VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts actCosts, StateGetter stateManager) { super(); this.activityCosts = actCosts; this.stateManager = stateManager; diff --git a/jsprit-core/src/main/java/algorithms/ServiceInsertionOnRouteLevelCalculator.java b/jsprit-core/src/main/java/algorithms/ServiceInsertionOnRouteLevelCalculator.java index 8b0ad111..67c3e9f3 100644 --- a/jsprit-core/src/main/java/algorithms/ServiceInsertionOnRouteLevelCalculator.java +++ b/jsprit-core/src/main/java/algorithms/ServiceInsertionOnRouteLevelCalculator.java @@ -56,7 +56,7 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCalcul private TourActivityFactory tourActivityFactory = new DefaultTourActivityFactory(); - private StateManager stateManager; + private StateGetter stateManager; private HardRouteLevelConstraint hardRouteLevelConstraint; @@ -107,7 +107,7 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCalcul } - public void setStates(StateManager stateManager){ + public void setStates(StateGetter stateManager){ this.stateManager = stateManager; } diff --git a/jsprit-core/src/main/java/algorithms/HardConstraints.java b/jsprit-core/src/main/java/algorithms/StateGetter.java similarity index 59% rename from jsprit-core/src/main/java/algorithms/HardConstraints.java rename to jsprit-core/src/main/java/algorithms/StateGetter.java index 05b30f37..32a88e0e 100644 --- a/jsprit-core/src/main/java/algorithms/HardConstraints.java +++ b/jsprit-core/src/main/java/algorithms/StateGetter.java @@ -16,25 +16,23 @@ ******************************************************************************/ package algorithms; +import basics.route.TourActivity; +import basics.route.VehicleRoute; - - -/** - * collection of hard constrainters bot at activity and at route level. - * - *

HardPickupAndDeliveryLoadConstraint requires LOAD_AT_DEPOT and LOAD (i.e. load at end) at route-level - * - *

HardTimeWindowConstraint requires LATEST_OPERATION_START_TIME - * - *

HardPickupAndDeliveryConstraint requires LOAD_AT_DEPOT and LOAD at route-level and FUTURE_PICKS and PAST_DELIVIERS on activity-level - * - *

HardPickupAndDeliveryBackhaulConstraint requires LOAD_AT_DEPOT and LOAD at route-level and FUTURE_PICKS and PAST_DELIVIERS on activity-level - * - * @author stefan - * - */ -class HardConstraints { +public interface StateGetter { + public interface StateId { + + } + public interface State { + double toDouble(); + } + + + State getActivityState(TourActivity act, StateId stateId); + + State getRouteState(VehicleRoute route, StateId stateId); + } diff --git a/jsprit-core/src/main/java/algorithms/StateIdFactory.java b/jsprit-core/src/main/java/algorithms/StateIdFactory.java index 30220d33..67c33258 100644 --- a/jsprit-core/src/main/java/algorithms/StateIdFactory.java +++ b/jsprit-core/src/main/java/algorithms/StateIdFactory.java @@ -23,7 +23,7 @@ package algorithms; import java.util.Arrays; import java.util.List; -import algorithms.StateManager.StateId; +import algorithms.StateGetter.StateId; public class StateIdFactory { diff --git a/jsprit-core/src/main/java/algorithms/StateManager.java b/jsprit-core/src/main/java/algorithms/StateManager.java index 2d81919b..dc2a8e03 100644 --- a/jsprit-core/src/main/java/algorithms/StateManager.java +++ b/jsprit-core/src/main/java/algorithms/StateManager.java @@ -16,23 +16,256 @@ ******************************************************************************/ package algorithms; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import basics.Job; +import basics.VehicleRoutingProblem; +import basics.VehicleRoutingProblemSolution; +import basics.algo.InsertionEndsListener; +import basics.algo.InsertionListener; +import basics.algo.InsertionListeners; +import basics.algo.InsertionStartsListener; +import basics.algo.IterationStartsListener; +import basics.algo.JobInsertedListener; +import basics.algo.RuinListener; +import basics.algo.RuinListeners; import basics.route.TourActivity; import basics.route.VehicleRoute; -public interface StateManager { +public class StateManager implements StateGetter, IterationStartsListener, RuinListener, InsertionStartsListener, JobInsertedListener, InsertionEndsListener { + - public interface StateId { + + private interface States { + + State getState(StateId key); } - public interface State { - double toDouble(); + public static class StateImpl implements State{ + double state; + + public StateImpl(double state) { + super(); + this.state = state; + } + + @Override + public double toDouble() { + return state; + } + } + private static class StatesImpl implements States{ - State getActivityState(TourActivity act, StateId stateId); + private Map states = new HashMap(); + + public void putState(StateId key, State state) { + states.put(key, state); + } - State getRouteState(VehicleRoute route, StateId stateId); + @Override + public State getState(StateId key) { + return states.get(key); + } + } + + private Map vehicleRouteStates = new HashMap(); + + private Map activityStates = new HashMap(); + + private RouteActivityVisitor routeActivityVisitor = new RouteActivityVisitor(); + + private ReverseRouteActivityVisitor revRouteActivityVisitor = new ReverseRouteActivityVisitor(); + + private Collection routeVisitors = new ArrayList(); + + private RuinListeners ruinListeners = new RuinListeners(); + + private InsertionListeners insertionListeners = new InsertionListeners(); + + private Collection updaters = new ArrayList(); + + public void clear(){ + vehicleRouteStates.clear(); + activityStates.clear(); + } + @Override + public State getActivityState(TourActivity act, StateId stateId) { + if(!activityStates.containsKey(act)){ + return getDefaultActState(stateId,act); + } + StatesImpl actStates = (StatesImpl) activityStates.get(act); + State state = actStates.getState(stateId); + if(state == null){ + return getDefaultActState(stateId,act); + } + return state; + } + + public void putActivityState(TourActivity act, StateId stateId, State state){ + if(!activityStates.containsKey(act)){ + activityStates.put(act, new StatesImpl()); + } + StatesImpl actStates = (StatesImpl) activityStates.get(act); + actStates.putState(stateId, state); + } + + + public void putRouteState(VehicleRoute route, StateId stateId, State state){ + if(!vehicleRouteStates.containsKey(route)){ + vehicleRouteStates.put(route, new StatesImpl()); + } + StatesImpl routeStates = (StatesImpl) vehicleRouteStates.get(route); + routeStates.putState(stateId, state); + } + + @Override + public State getRouteState(VehicleRoute route, StateId stateId) { + if(!vehicleRouteStates.containsKey(route)){ + return getDefaultRouteState(stateId,route); + } + StatesImpl routeStates = (StatesImpl) vehicleRouteStates.get(route); + State state = routeStates.getState(stateId); + if(state == null){ + return getDefaultRouteState(stateId, route); + } + return state; + } + + /** + * Adds state updater. + * + *

Note that a state update occurs if route and/or activity states change, i.e. if jobs are removed + * or inserted into a route. Thus here, it is assumed that a state updater is either of type InsertionListener, + * RuinListener, ActivityVisitor, ReverseActivityVisitor, RouteVisitor, ReverseRouteVisitor. + * + *

The following rule pertain for activity/route visitors:These visitors visits all activities/route in a route subsequently in two cases. First, if insertionStart (after ruinStrategies have removed activities from routes) + * and, second, if a job has been inserted and thus if a route has changed. + * + * @param updater + */ + public void addStateUpdater(StateUpdater updater){ + if(updater instanceof ActivityVisitor) addActivityVisitor((ActivityVisitor) updater); + if(updater instanceof ReverseActivityVisitor) addActivityVisitor((ReverseActivityVisitor)updater); + if(updater instanceof RouteVisitor) addRouteVisitor((RouteVisitor) updater); + if(updater instanceof InsertionListener) addListener((InsertionListener) updater); + if(updater instanceof RuinListener) addListener((RuinListener) updater); + updaters.add(updater); + } + + Collection getStateUpdaters(){ + return Collections.unmodifiableCollection(updaters); + } + + /** + * Adds an activityVisitor. + *

This visitor visits all activities in a route subsequently in two cases. First, if insertionStart (after ruinStrategies have removed activities from routes) + * and, second, if a job has been inserted and thus if a route has changed. + * + * @param activityVistor + */ + void addActivityVisitor(ActivityVisitor activityVistor){ + routeActivityVisitor.addActivityVisitor(activityVistor); + } + + /** + * Adds an reverseActivityVisitor. + *

This reverseVisitor visits all activities in a route subsequently (starting from the end of the route) in two cases. First, if insertionStart (after ruinStrategies have removed activities from routes) + * and, second, if a job has been inserted and thus if a route has changed. + * + * @param reverseActivityVistor + */ + void addActivityVisitor(ReverseActivityVisitor activityVistor){ + revRouteActivityVisitor.addActivityVisitor(activityVistor); + } + + void addRouteVisitor(RouteVisitor routeVisitor){ + routeVisitors.add(routeVisitor); + } + + void addListener(RuinListener ruinListener){ + ruinListeners.addListener(ruinListener); + } + + void removeListener(RuinListener ruinListener){ + ruinListeners.removeListener(ruinListener); + } + + void addListener(InsertionListener insertionListener){ + insertionListeners.addListener(insertionListener); + } + + void removeListener(InsertionListener insertionListener){ + insertionListeners.removeListener(insertionListener); + } + + private State getDefaultActState(StateId stateId, TourActivity act){ + if(stateId.equals(StateIdFactory.LOAD)) return new StateImpl(0); + if(stateId.equals(StateIdFactory.COSTS)) return new StateImpl(0); + if(stateId.equals(StateIdFactory.DURATION)) return new StateImpl(0); + if(stateId.equals(StateIdFactory.EARLIEST_OPERATION_START_TIME)) return new StateImpl(act.getTheoreticalEarliestOperationStartTime()); + if(stateId.equals(StateIdFactory.LATEST_OPERATION_START_TIME)) return new StateImpl(act.getTheoreticalLatestOperationStartTime()); + if(stateId.equals(StateIdFactory.FUTURE_PICKS)) return new StateImpl(0); + if(stateId.equals(StateIdFactory.PAST_DELIVERIES)) return new StateImpl(0); + return null; + } + + private State getDefaultRouteState(StateId stateId, VehicleRoute route){ + if(stateId.equals(StateIdFactory.LOAD)) return new StateImpl(0); + if(stateId.equals(StateIdFactory.LOAD_AT_BEGINNING)) return new StateImpl(0); + if(stateId.equals(StateIdFactory.COSTS)) return new StateImpl(0); + if(stateId.equals(StateIdFactory.DURATION)) return new StateImpl(0); + return null; + } + + @Override + public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { + insertionListeners.jobInserted(job2insert, inRoute, additionalCosts, additionalTime); + for(RouteVisitor v : routeVisitors){ v.visit(inRoute); } + routeActivityVisitor.visit(inRoute); + revRouteActivityVisitor.visit(inRoute); + } + + @Override + public void informInsertionStarts(Collection vehicleRoutes,Collection unassignedJobs) { + insertionListeners.insertionStarts(vehicleRoutes, unassignedJobs); + for(VehicleRoute route : vehicleRoutes){ + for(RouteVisitor v : routeVisitors){ v.visit(route); } + routeActivityVisitor.visit(route); + revRouteActivityVisitor.visit(route); + } + } + + @Override + public void informIterationStarts(int i, VehicleRoutingProblem problem, Collection solutions) { + clear(); + } + + @Override + public void ruinStarts(Collection routes) { + ruinListeners.ruinStarts(routes); + } + + @Override + public void ruinEnds(Collection routes, Collection unassignedJobs) { + ruinListeners.ruinEnds(routes, unassignedJobs); + } + + @Override + public void removed(Job job, VehicleRoute fromRoute) { + ruinListeners.removed(job, fromRoute); + } + + @Override + public void informInsertionEnds(Collection vehicleRoutes) { + insertionListeners.insertionEnds(vehicleRoutes); + } } diff --git a/jsprit-core/src/main/java/algorithms/StateManagerImpl.java b/jsprit-core/src/main/java/algorithms/StateManagerImpl.java deleted file mode 100644 index ed8d3ebd..00000000 --- a/jsprit-core/src/main/java/algorithms/StateManagerImpl.java +++ /dev/null @@ -1,242 +0,0 @@ -/******************************************************************************* - * Copyright (C) 2013 Stefan Schroeder - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3.0 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - ******************************************************************************/ -package algorithms; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -import basics.Job; -import basics.VehicleRoutingProblem; -import basics.VehicleRoutingProblemSolution; -import basics.algo.InsertionEndsListener; -import basics.algo.InsertionListener; -import basics.algo.InsertionListeners; -import basics.algo.InsertionStartsListener; -import basics.algo.IterationStartsListener; -import basics.algo.JobInsertedListener; -import basics.algo.RuinListener; -import basics.algo.RuinListeners; -import basics.route.TourActivity; -import basics.route.VehicleRoute; - -public class StateManagerImpl implements StateManager, IterationStartsListener, RuinListener, InsertionStartsListener, JobInsertedListener, InsertionEndsListener { - - private interface States { - - State getState(StateId key); - - } - - public static class StateImpl implements State{ - double state; - - public StateImpl(double state) { - super(); - this.state = state; - } - - @Override - public double toDouble() { - return state; - } - - } - - private static class StatesImpl implements States{ - - private Map states = new HashMap(); - - public void putState(StateId key, State state) { - states.put(key, state); - } - - @Override - public State getState(StateId key) { - return states.get(key); - } - - } - - private Map vehicleRouteStates = new HashMap(); - - private Map activityStates = new HashMap(); - - private RouteActivityVisitor routeActivityVisitor = new RouteActivityVisitor(); - - private ReverseRouteActivityVisitor revRouteActivityVisitor = new ReverseRouteActivityVisitor(); - - private Collection routeVisitors = new ArrayList(); - - private RuinListeners ruinListeners = new RuinListeners(); - - private InsertionListeners insertionListeners = new InsertionListeners(); - - public void addListener(RuinListener ruinListener){ - ruinListeners.addListener(ruinListener); - } - - public void removeListener(RuinListener ruinListener){ - ruinListeners.removeListener(ruinListener); - } - - public void addListener(InsertionListener insertionListener){ - insertionListeners.addListener(insertionListener); - } - - public void removeListener(InsertionListener insertionListener){ - insertionListeners.removeListener(insertionListener); - } - - - public void clear(){ - vehicleRouteStates.clear(); - activityStates.clear(); - } - - @Override - public State getActivityState(TourActivity act, StateId stateId) { - if(!activityStates.containsKey(act)){ - return getDefaultActState(stateId,act); - } - StatesImpl actStates = (StatesImpl) activityStates.get(act); - State state = actStates.getState(stateId); - if(state == null){ - return getDefaultActState(stateId,act); - } - return state; - } - - public void putActivityState(TourActivity act, StateId stateId, State state){ - if(!activityStates.containsKey(act)){ - activityStates.put(act, new StatesImpl()); - } - StatesImpl actStates = (StatesImpl) activityStates.get(act); - actStates.putState(stateId, state); - } - - - private State getDefaultActState(StateId stateId, TourActivity act){ - if(stateId.equals(StateIdFactory.LOAD)) return new StateImpl(0); - if(stateId.equals(StateIdFactory.COSTS)) return new StateImpl(0); - if(stateId.equals(StateIdFactory.DURATION)) return new StateImpl(0); - if(stateId.equals(StateIdFactory.EARLIEST_OPERATION_START_TIME)) return new StateImpl(act.getTheoreticalEarliestOperationStartTime()); - if(stateId.equals(StateIdFactory.LATEST_OPERATION_START_TIME)) return new StateImpl(act.getTheoreticalLatestOperationStartTime()); - if(stateId.equals(StateIdFactory.FUTURE_PICKS)) return new StateImpl(0); - if(stateId.equals(StateIdFactory.PAST_DELIVERIES)) return new StateImpl(0); - return null; - } - - private State getDefaultRouteState(StateId stateId, VehicleRoute route){ - if(stateId.equals(StateIdFactory.LOAD)) return new StateImpl(0); - if(stateId.equals(StateIdFactory.LOAD_AT_BEGINNING)) return new StateImpl(0); - if(stateId.equals(StateIdFactory.COSTS)) return new StateImpl(0); - if(stateId.equals(StateIdFactory.DURATION)) return new StateImpl(0); - return null; - } - - @Override - public State getRouteState(VehicleRoute route, StateId stateId) { - if(!vehicleRouteStates.containsKey(route)){ - return getDefaultRouteState(stateId,route); - } - StatesImpl routeStates = (StatesImpl) vehicleRouteStates.get(route); - State state = routeStates.getState(stateId); - if(state == null){ - return getDefaultRouteState(stateId, route); - } - return state; - } - - public void putRouteState(VehicleRoute route, StateId stateId, State state){ - if(!vehicleRouteStates.containsKey(route)){ - vehicleRouteStates.put(route, new StatesImpl()); - } - StatesImpl routeStates = (StatesImpl) vehicleRouteStates.get(route); - routeStates.putState(stateId, state); - } - - @Override - public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { - insertionListeners.jobInserted(job2insert, inRoute, additionalCosts, additionalTime); - for(RouteVisitor v : routeVisitors){ v.visit(inRoute); } - routeActivityVisitor.visit(inRoute); - revRouteActivityVisitor.visit(inRoute); - } - - @Override - public void informInsertionStarts(Collection vehicleRoutes,Collection unassignedJobs) { - insertionListeners.insertionStarts(vehicleRoutes, unassignedJobs); - for(VehicleRoute route : vehicleRoutes){ - for(RouteVisitor v : routeVisitors){ v.visit(route); } - routeActivityVisitor.visit(route); - revRouteActivityVisitor.visit(route); - } - } - - /** - * Adds an activityVisitor. - *

This visitor visits all activities in a route subsequently in two cases. First, if insertionStart (after ruinStrategies have removed activities from routes) - * and, second, if a job has been inserted and thus if a route has changed. - * - * @param activityVistor - */ - public void addActivityVisitor(ActivityVisitor activityVistor){ - routeActivityVisitor.addActivityVisitor(activityVistor); - } - - /** - * Adds an reverseActivityVisitor. - *

This reverseVisitor visits all activities in a route subsequently (starting from the end of the route) in two cases. First, if insertionStart (after ruinStrategies have removed activities from routes) - * and, second, if a job has been inserted and thus if a route has changed. - * - * @param reverseActivityVistor - */ - public void addActivityVisitor(ReverseActivityVisitor activityVistor){ - revRouteActivityVisitor.addActivityVisitor(activityVistor); - } - - public void addRouteVisitor(RouteVisitor routeVisitor){ - routeVisitors.add(routeVisitor); - } - - @Override - public void informIterationStarts(int i, VehicleRoutingProblem problem, Collection solutions) { - clear(); - } - - @Override - public void ruinStarts(Collection routes) { - ruinListeners.ruinStarts(routes); - } - - @Override - public void ruinEnds(Collection routes, Collection unassignedJobs) { - ruinListeners.ruinEnds(routes, unassignedJobs); - } - - @Override - public void removed(Job job, VehicleRoute fromRoute) { - ruinListeners.removed(job, fromRoute); - } - - @Override - public void informInsertionEnds(Collection vehicleRoutes) { - insertionListeners.insertionEnds(vehicleRoutes); - } -} diff --git a/jsprit-core/src/main/java/algorithms/StateUpdater.java b/jsprit-core/src/main/java/algorithms/StateUpdater.java new file mode 100644 index 00000000..9fd80a19 --- /dev/null +++ b/jsprit-core/src/main/java/algorithms/StateUpdater.java @@ -0,0 +1,5 @@ +package algorithms; + +public interface StateUpdater { + +} diff --git a/jsprit-core/src/main/java/algorithms/StateUpdates.java b/jsprit-core/src/main/java/algorithms/StateUpdates.java index 5b74106f..79c73ad2 100644 --- a/jsprit-core/src/main/java/algorithms/StateUpdates.java +++ b/jsprit-core/src/main/java/algorithms/StateUpdates.java @@ -618,7 +618,7 @@ class StateUpdates { private ReverseRouteActivityVisitor revRouteActivityVisitor; - public UpdateStates(StateManagerImpl states, VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts activityCosts) { + public UpdateStates(StateManager states, VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts activityCosts) { routeActivityVisitor = new RouteActivityVisitor(); routeActivityVisitor.addActivityVisitor(new UpdateActivityTimes(routingCosts)); routeActivityVisitor.addActivityVisitor(new UpdateCostsAtAllLevels(activityCosts, routingCosts, states)); diff --git a/jsprit-core/src/main/java/algorithms/StateUtils.java b/jsprit-core/src/main/java/algorithms/StateUtils.java new file mode 100644 index 00000000..e1d8e4cb --- /dev/null +++ b/jsprit-core/src/main/java/algorithms/StateUtils.java @@ -0,0 +1,22 @@ +package algorithms; + +import basics.VehicleRoutingProblem; + +public class StateUtils { + + public static void addCoreStateUpdaters(VehicleRoutingProblem vrp, StateManager stateManager){ + stateManager.addListener(new InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts(stateManager)); + stateManager.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(stateManager)); + + stateManager.addActivityVisitor(new UpdateActivityTimes(vrp.getTransportCosts())); + stateManager.addActivityVisitor(new UpdateLoadAtActivityLevel(stateManager)); + + stateManager.addActivityVisitor(new UpdateCostsAtAllLevels(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager)); + + stateManager.addActivityVisitor(new UpdateOccuredDeliveriesAtActivityLevel(stateManager)); + stateManager.addActivityVisitor(new UpdateLatestOperationStartTimeAtActLocations(stateManager, vrp.getTransportCosts())); + stateManager.addActivityVisitor(new UpdateFuturePickupsAtActivityLevel(stateManager)); + + } + +} diff --git a/jsprit-core/src/main/java/algorithms/UpdateActivityTimes.java b/jsprit-core/src/main/java/algorithms/UpdateActivityTimes.java index b51c871b..48a88965 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateActivityTimes.java +++ b/jsprit-core/src/main/java/algorithms/UpdateActivityTimes.java @@ -14,7 +14,7 @@ import basics.route.VehicleRoute; * @author stefan * */ -public class UpdateActivityTimes implements ActivityVisitor{ +class UpdateActivityTimes implements ActivityVisitor, StateUpdater{ private Logger log = Logger.getLogger(UpdateActivityTimes.class); diff --git a/jsprit-core/src/main/java/algorithms/UpdateCostsAtAllLevels.java b/jsprit-core/src/main/java/algorithms/UpdateCostsAtAllLevels.java index d054fb5b..dfc2bcb9 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateCostsAtAllLevels.java +++ b/jsprit-core/src/main/java/algorithms/UpdateCostsAtAllLevels.java @@ -2,7 +2,7 @@ package algorithms; import org.apache.log4j.Logger; -import algorithms.StateManagerImpl.StateImpl; +import algorithms.StateManager.StateImpl; import basics.costs.ForwardTransportCost; import basics.costs.VehicleRoutingActivityCosts; import basics.costs.VehicleRoutingTransportCosts; @@ -21,7 +21,7 @@ import basics.route.VehicleRoute; * @param transportCost * @param states */ -public class UpdateCostsAtAllLevels implements ActivityVisitor{ +class UpdateCostsAtAllLevels implements ActivityVisitor,StateUpdater{ private static Logger log = Logger.getLogger(UpdateCostsAtAllLevels.class); @@ -29,7 +29,7 @@ public class UpdateCostsAtAllLevels implements ActivityVisitor{ private ForwardTransportCost transportCost; - private StateManagerImpl states; + private StateManager states; private double totalOperationCost = 0.0; @@ -52,7 +52,7 @@ public class UpdateCostsAtAllLevels implements ActivityVisitor{ * @param transportCost * @param states */ - public UpdateCostsAtAllLevels(VehicleRoutingActivityCosts activityCost, VehicleRoutingTransportCosts transportCost, StateManagerImpl states) { + public UpdateCostsAtAllLevels(VehicleRoutingActivityCosts activityCost, VehicleRoutingTransportCosts transportCost, StateManager states) { super(); this.activityCost = activityCost; this.transportCost = transportCost; diff --git a/jsprit-core/src/main/java/algorithms/UpdateCostsAtRouteLevel.java b/jsprit-core/src/main/java/algorithms/UpdateCostsAtRouteLevel.java index 7239d0f5..86b5144e 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateCostsAtRouteLevel.java +++ b/jsprit-core/src/main/java/algorithms/UpdateCostsAtRouteLevel.java @@ -2,7 +2,7 @@ package algorithms; import java.util.Collection; -import algorithms.StateManagerImpl.StateImpl; +import algorithms.StateManager.StateImpl; import basics.Job; import basics.algo.InsertionEndsListener; import basics.algo.InsertionStartsListener; @@ -11,15 +11,15 @@ import basics.costs.VehicleRoutingActivityCosts; import basics.costs.VehicleRoutingTransportCosts; import basics.route.VehicleRoute; -public class UpdateCostsAtRouteLevel implements JobInsertedListener, InsertionStartsListener, InsertionEndsListener{ +class UpdateCostsAtRouteLevel implements StateUpdater,JobInsertedListener, InsertionStartsListener, InsertionEndsListener{ - private StateManagerImpl states; + private StateManager states; private VehicleRoutingTransportCosts tpCosts; private VehicleRoutingActivityCosts actCosts; - public UpdateCostsAtRouteLevel(StateManagerImpl states, VehicleRoutingTransportCosts tpCosts, VehicleRoutingActivityCosts actCosts) { + public UpdateCostsAtRouteLevel(StateManager states, VehicleRoutingTransportCosts tpCosts, VehicleRoutingActivityCosts actCosts) { super(); this.states = states; this.tpCosts = tpCosts; diff --git a/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTimeWindowAtActLocations.java b/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTimeWindowAtActLocations.java index b6f2011d..4665c45a 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTimeWindowAtActLocations.java +++ b/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTimeWindowAtActLocations.java @@ -1,17 +1,17 @@ package algorithms; -import algorithms.StateManagerImpl.StateImpl; +import algorithms.StateManager.StateImpl; import basics.costs.VehicleRoutingTransportCosts; import basics.route.TourActivity; import basics.route.VehicleRoute; -public class UpdateEarliestStartTimeWindowAtActLocations implements ActivityVisitor{ +class UpdateEarliestStartTimeWindowAtActLocations implements ActivityVisitor,StateUpdater{ - private StateManagerImpl states; + private StateManager states; private ActivityTimeTracker timeTracker; - public UpdateEarliestStartTimeWindowAtActLocations(StateManagerImpl states, VehicleRoutingTransportCosts transportCosts) { + public UpdateEarliestStartTimeWindowAtActLocations(StateManager states, VehicleRoutingTransportCosts transportCosts) { super(); this.states = states; timeTracker = new ActivityTimeTracker(transportCosts); diff --git a/jsprit-core/src/main/java/algorithms/UpdateFuturePickupsAtActivityLevel.java b/jsprit-core/src/main/java/algorithms/UpdateFuturePickupsAtActivityLevel.java index 71404dde..bfc0afff 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateFuturePickupsAtActivityLevel.java +++ b/jsprit-core/src/main/java/algorithms/UpdateFuturePickupsAtActivityLevel.java @@ -1,17 +1,17 @@ package algorithms; -import algorithms.StateManagerImpl.StateImpl; +import algorithms.StateManager.StateImpl; import basics.route.PickupActivity; import basics.route.ServiceActivity; import basics.route.TourActivity; import basics.route.VehicleRoute; -public class UpdateFuturePickupsAtActivityLevel implements ReverseActivityVisitor { - private StateManagerImpl stateManager; +class UpdateFuturePickupsAtActivityLevel implements ReverseActivityVisitor, StateUpdater { + private StateManager stateManager; private int futurePicks = 0; private VehicleRoute route; - public UpdateFuturePickupsAtActivityLevel(StateManagerImpl stateManager) { + public UpdateFuturePickupsAtActivityLevel(StateManager stateManager) { super(); this.stateManager = stateManager; } diff --git a/jsprit-core/src/main/java/algorithms/UpdateLatestOperationStartTimeAtActLocations.java b/jsprit-core/src/main/java/algorithms/UpdateLatestOperationStartTimeAtActLocations.java index b8bb15a6..413d3df0 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateLatestOperationStartTimeAtActLocations.java +++ b/jsprit-core/src/main/java/algorithms/UpdateLatestOperationStartTimeAtActLocations.java @@ -2,16 +2,16 @@ package algorithms; import org.apache.log4j.Logger; -import algorithms.StateManagerImpl.StateImpl; +import algorithms.StateManager.StateImpl; import basics.costs.VehicleRoutingTransportCosts; import basics.route.TourActivity; import basics.route.VehicleRoute; -public class UpdateLatestOperationStartTimeAtActLocations implements ReverseActivityVisitor{ +class UpdateLatestOperationStartTimeAtActLocations implements ReverseActivityVisitor, StateUpdater{ private static Logger log = Logger.getLogger(UpdateLatestOperationStartTimeAtActLocations.class); - private StateManagerImpl states; + private StateManager states; private VehicleRoute route; @@ -21,7 +21,7 @@ public class UpdateLatestOperationStartTimeAtActLocations implements ReverseActi private TourActivity prevAct; - public UpdateLatestOperationStartTimeAtActLocations(StateManagerImpl states, VehicleRoutingTransportCosts tpCosts) { + public UpdateLatestOperationStartTimeAtActLocations(StateManager states, VehicleRoutingTransportCosts tpCosts) { super(); this.states = states; this.transportCosts = tpCosts; diff --git a/jsprit-core/src/main/java/algorithms/UpdateLoadAtActivityLevel.java b/jsprit-core/src/main/java/algorithms/UpdateLoadAtActivityLevel.java index eced7b67..ae063604 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateLoadAtActivityLevel.java +++ b/jsprit-core/src/main/java/algorithms/UpdateLoadAtActivityLevel.java @@ -1,6 +1,6 @@ package algorithms; -import algorithms.StateManagerImpl.StateImpl; +import algorithms.StateManager.StateImpl; import basics.route.TourActivity; import basics.route.VehicleRoute; @@ -15,8 +15,8 @@ import basics.route.VehicleRoute; * @author stefan * */ -public class UpdateLoadAtActivityLevel implements ActivityVisitor { - private StateManagerImpl stateManager; +class UpdateLoadAtActivityLevel implements ActivityVisitor, StateUpdater { + private StateManager stateManager; private int currentLoad = 0; private VehicleRoute route; @@ -39,7 +39,7 @@ public class UpdateLoadAtActivityLevel implements ActivityVisitor { * @author stefan * */ - public UpdateLoadAtActivityLevel(StateManagerImpl stateManager) { + public UpdateLoadAtActivityLevel(StateManager stateManager) { super(); this.stateManager = stateManager; } diff --git a/jsprit-core/src/main/java/algorithms/UpdateLoadAtAllLevels.java b/jsprit-core/src/main/java/algorithms/UpdateLoadAtAllLevels.java index 145a37ca..0ee7e189 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateLoadAtAllLevels.java +++ b/jsprit-core/src/main/java/algorithms/UpdateLoadAtAllLevels.java @@ -1,18 +1,18 @@ package algorithms; -import algorithms.StateManagerImpl.StateImpl; +import algorithms.StateManager.StateImpl; import basics.route.TourActivity; import basics.route.VehicleRoute; -public class UpdateLoadAtAllLevels implements ActivityVisitor{ +class UpdateLoadAtAllLevels implements ActivityVisitor,StateUpdater{ private double load = 0.0; - private StateManagerImpl states; + private StateManager states; private VehicleRoute vehicleRoute; - public UpdateLoadAtAllLevels(StateManagerImpl states) { + public UpdateLoadAtAllLevels(StateManager states) { super(); this.states = states; } diff --git a/jsprit-core/src/main/java/algorithms/UpdateLoadAtRouteLevel.java b/jsprit-core/src/main/java/algorithms/UpdateLoadAtRouteLevel.java index 6ab2dc9b..eda51bb4 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateLoadAtRouteLevel.java +++ b/jsprit-core/src/main/java/algorithms/UpdateLoadAtRouteLevel.java @@ -2,7 +2,7 @@ package algorithms; import java.util.Collection; -import algorithms.StateManagerImpl.StateImpl; +import algorithms.StateManager.StateImpl; import basics.Job; import basics.Service; import basics.algo.InsertionStartsListener; @@ -15,9 +15,9 @@ import basics.route.VehicleRoute; * @author stefan * */ -public class UpdateLoadAtRouteLevel implements JobInsertedListener, InsertionStartsListener{ +class UpdateLoadAtRouteLevel implements JobInsertedListener, InsertionStartsListener, StateUpdater{ - private StateManagerImpl states; + private StateManager states; /** * Updates load at route level, i.e. modifies StateTypes.LOAD for each route. @@ -25,7 +25,7 @@ public class UpdateLoadAtRouteLevel implements JobInsertedListener, InsertionSta * @author stefan * */ - public UpdateLoadAtRouteLevel(StateManagerImpl states) { + public UpdateLoadAtRouteLevel(StateManager states) { super(); this.states = states; } diff --git a/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted.java b/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted.java index 8b18f439..75fa3760 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted.java +++ b/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted.java @@ -1,6 +1,6 @@ package algorithms; -import algorithms.StateManagerImpl.StateImpl; +import algorithms.StateManager.StateImpl; import basics.Delivery; import basics.Job; import basics.Pickup; @@ -17,9 +17,9 @@ import basics.route.VehicleRoute; * * @param stateManager */ -public class UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted implements JobInsertedListener { +class UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted implements JobInsertedListener, StateUpdater { - private StateManagerImpl stateManager; + private StateManager stateManager; /** * Updates loads at start and end of a route if a job has been inserted in that route. @@ -30,7 +30,7 @@ public class UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted implements Jo * * @param stateManager */ - public UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(StateManagerImpl stateManager) { + public UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(StateManager stateManager) { super(); this.stateManager = stateManager; } diff --git a/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveriesAtActivityLevel.java b/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveriesAtActivityLevel.java index c68e7476..2daf175d 100644 --- a/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveriesAtActivityLevel.java +++ b/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveriesAtActivityLevel.java @@ -1,16 +1,16 @@ package algorithms; -import algorithms.StateManagerImpl.StateImpl; +import algorithms.StateManager.StateImpl; import basics.route.DeliveryActivity; import basics.route.TourActivity; import basics.route.VehicleRoute; -public class UpdateOccuredDeliveriesAtActivityLevel implements ActivityVisitor { - private StateManagerImpl stateManager; +class UpdateOccuredDeliveriesAtActivityLevel implements ActivityVisitor, StateUpdater { + private StateManager stateManager; private int deliveries = 0; private VehicleRoute route; - public UpdateOccuredDeliveriesAtActivityLevel(StateManagerImpl stateManager) { + public UpdateOccuredDeliveriesAtActivityLevel(StateManager stateManager) { super(); this.stateManager = stateManager; } diff --git a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java b/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java index 4be95fb4..0a090d26 100644 --- a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java +++ b/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java @@ -438,7 +438,7 @@ public class VehicleRoutingAlgorithms { final VehicleFleetManager vehicleFleetManager = createFleetManager(vrp); //create state-manager - final StateManagerImpl stateManager = new StateManagerImpl(); + final StateManager stateManager = new StateManager(); /* * define constraints @@ -454,7 +454,7 @@ public class VehicleRoutingAlgorithms { constraintManager.addConstraint(new HardPickupAndDeliveryActivityLevelConstraint(stateManager)); } - constraintManager.addConstraint(new HardPickupAndDeliveryLoadConstraint(stateManager)); + constraintManager.addConstraint(new HardPickupAndDeliveryLoadRouteLevelConstraint(stateManager)); //construct initial solution creator AlgorithmStartsListener createInitialSolution = createInitialSolution(config,vrp,vehicleFleetManager,stateManager,algorithmListeners,definedClasses,executorService,nuOfThreads,constraintManager); @@ -542,7 +542,7 @@ public class VehicleRoutingAlgorithms { return metaAlgorithm; } - private static SolutionCostCalculator getCostCalculator(final StateManagerImpl stateManager) { + private static SolutionCostCalculator getCostCalculator(final StateManager stateManager) { SolutionCostCalculator calc = new SolutionCostCalculator() { @Override @@ -644,7 +644,7 @@ public class VehicleRoutingAlgorithms { metaAlgorithm.getAlgorithmListeners().addAll(algorithmListeners); } - private static AlgorithmStartsListener createInitialSolution(XMLConfiguration config, final VehicleRoutingProblem vrp, VehicleFleetManager vehicleFleetManager, final StateManagerImpl routeStates, Set algorithmListeners, TypedMap definedClasses, ExecutorService executorService, int nuOfThreads, ConstraintManager constraintManager) { + private static AlgorithmStartsListener createInitialSolution(XMLConfiguration config, final VehicleRoutingProblem vrp, VehicleFleetManager vehicleFleetManager, final StateManager routeStates, Set algorithmListeners, TypedMap definedClasses, ExecutorService executorService, int nuOfThreads, ConstraintManager constraintManager) { List modConfigs = config.configurationsAt("construction.insertion"); if(modConfigs == null) return null; if(modConfigs.isEmpty()) return null; @@ -741,7 +741,7 @@ public class VehicleRoutingAlgorithms { } private static SearchStrategyModule buildModule(HierarchicalConfiguration moduleConfig, final VehicleRoutingProblem vrp, VehicleFleetManager vehicleFleetManager, - final StateManagerImpl routeStates, Set algorithmListeners, TypedMap definedClasses, ExecutorService executorService, int nuOfThreads, ConstraintManager constraintManager) { + final StateManager routeStates, Set algorithmListeners, TypedMap definedClasses, ExecutorService executorService, int nuOfThreads, ConstraintManager constraintManager) { String moduleName = moduleConfig.getString("[@name]"); if(moduleName == null) throw new IllegalStateException("module(-name) is missing."); String moduleId = moduleConfig.getString("[@id]"); @@ -843,7 +843,7 @@ public class VehicleRoutingAlgorithms { "\n\tgendreauPostOpt"); } - private static RuinStrategy getRadialRuin(final VehicleRoutingProblem vrp, final StateManagerImpl routeStates, TypedMap definedClasses, ModKey modKey, double shareToRuin, JobDistance jobDistance) { + private static RuinStrategy getRadialRuin(final VehicleRoutingProblem vrp, final StateManager routeStates, TypedMap definedClasses, ModKey modKey, double shareToRuin, JobDistance jobDistance) { RuinStrategyKey stratKey = new RuinStrategyKey(modKey); RuinStrategy ruin = definedClasses.get(stratKey); if(ruin == null){ @@ -853,7 +853,7 @@ public class VehicleRoutingAlgorithms { return ruin; } - private static RuinStrategy getRandomRuin(final VehicleRoutingProblem vrp, final StateManagerImpl routeStates, TypedMap definedClasses, ModKey modKey, double shareToRuin) { + private static RuinStrategy getRandomRuin(final VehicleRoutingProblem vrp, final StateManager routeStates, TypedMap definedClasses, ModKey modKey, double shareToRuin) { RuinStrategyKey stratKey = new RuinStrategyKey(modKey); RuinStrategy ruin = definedClasses.get(stratKey); if(ruin == null){ @@ -863,7 +863,7 @@ public class VehicleRoutingAlgorithms { return ruin; } - private static InsertionStrategy createInsertionStrategy(HierarchicalConfiguration moduleConfig, VehicleRoutingProblem vrp,VehicleFleetManager vehicleFleetManager, StateManagerImpl routeStates, List algorithmListeners, ExecutorService executorService, int nuOfThreads, ConstraintManager constraintManager) { + private static InsertionStrategy createInsertionStrategy(HierarchicalConfiguration moduleConfig, VehicleRoutingProblem vrp,VehicleFleetManager vehicleFleetManager, StateManager routeStates, List algorithmListeners, ExecutorService executorService, int nuOfThreads, ConstraintManager constraintManager) { InsertionStrategy insertion = InsertionFactory.createInsertion(vrp, moduleConfig, vehicleFleetManager, routeStates, algorithmListeners, executorService, nuOfThreads, constraintManager); return insertion; } diff --git a/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java b/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java index 5c453f5d..dbc92c3a 100644 --- a/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java +++ b/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java @@ -49,7 +49,7 @@ public class BuildCVRPAlgoFromScratchTest { new VrpXMLReader(builder).read("src/test/resources/vrpnc1-jsprit.xml"); vrp = builder.build(); - final StateManagerImpl stateManager = new StateManagerImpl(); + final StateManager stateManager = new StateManager(); HardActivityLevelConstraint hardActLevelConstraint = new HardActivityLevelConstraint() { @Override diff --git a/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java b/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java index 777d2fb3..3ef7be5a 100644 --- a/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java +++ b/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java @@ -22,7 +22,7 @@ import org.apache.log4j.Logger; import org.junit.Before; import org.junit.Test; -import algorithms.StateManagerImpl.StateImpl; +import algorithms.StateManager.StateImpl; import algorithms.acceptors.AcceptNewIfBetterThanWorst; import algorithms.selectors.SelectBest; import basics.Delivery; @@ -54,7 +54,7 @@ public class BuildPDVRPAlgoFromScratchTest { new VrpXMLReader(builder).read("src/test/resources/pd_solomon_r101.xml"); vrp = builder.build(); - final StateManagerImpl stateManager = new StateManagerImpl(); + final StateManager stateManager = new StateManager(); ConstraintManager actLevelConstraintAccumulator = new ConstraintManager(); actLevelConstraintAccumulator.addConstraint(new HardPickupAndDeliveryActivityLevelConstraint(stateManager)); @@ -63,7 +63,7 @@ public class BuildPDVRPAlgoFromScratchTest { ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts()); - ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new HardPickupAndDeliveryLoadConstraint(stateManager), actLevelConstraintAccumulator); + ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new HardPickupAndDeliveryLoadRouteLevelConstraint(stateManager), actLevelConstraintAccumulator); // CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardLoadConstraint(stateManager)); VehicleFleetManager fleetManager = new InfiniteVehicles(vrp.getVehicles()); diff --git a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java b/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java index 0a0dcdbc..fcc78bb3 100644 --- a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java +++ b/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java @@ -68,7 +68,7 @@ public class GendreauPostOptTest { Service job3; - private StateManagerImpl states; + private StateManager states; private List vehicles; @@ -144,7 +144,7 @@ public class GendreauPostOptTest { // Collection vehicles = Arrays.asList(lightVehicle1,lightVehicle2, heavyVehicle); fleetManager = new VehicleFleetManagerImpl(vehicles); - states = new StateManagerImpl(); + states = new StateManager(); activityCosts = new ExampleActivityCostFunction(); @@ -214,7 +214,7 @@ public class GendreauPostOptTest { return c; } - private double getCosts(VehicleRoutingProblemSolution newSolution, StateManagerImpl states) { + private double getCosts(VehicleRoutingProblemSolution newSolution, StateManager states) { double c = 0.0; for(VehicleRoute r : newSolution.getRoutes()){ diff --git a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java index d4cd0fbf..f2077750 100644 --- a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java +++ b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java @@ -59,7 +59,7 @@ public class TestCalculatesServiceInsertion { private Service third; - private StateManagerImpl states; + private StateManager states; private NoDriver driver; @@ -149,7 +149,7 @@ public class TestCalculatesServiceInsertion { jobs.add(second); jobs.add(third); - states = new StateManagerImpl(); + states = new StateManager(); ExampleActivityCostFunction activityCosts = new ExampleActivityCostFunction(); diff --git a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java index bd00b572..bb6302a3 100644 --- a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java +++ b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java @@ -62,7 +62,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel { private Service third; - private StateManagerImpl states; + private StateManager states; private NoDriver driver; @@ -140,7 +140,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel { jobs.add(second); jobs.add(third); - states = new StateManagerImpl(); + states = new StateManager(); ExampleActivityCostFunction activityCosts = new ExampleActivityCostFunction(); ActivityInsertionCostsCalculator actInsertionCostCalculator = new RouteLevelActivityInsertionCostsEstimator(costs, activityCosts, states); diff --git a/jsprit-core/src/test/java/algorithms/TestIterateRouteForwardInTime.java b/jsprit-core/src/test/java/algorithms/TestIterateRouteForwardInTime.java index d4791b87..90ddd2c5 100644 --- a/jsprit-core/src/test/java/algorithms/TestIterateRouteForwardInTime.java +++ b/jsprit-core/src/test/java/algorithms/TestIterateRouteForwardInTime.java @@ -58,7 +58,7 @@ public class TestIterateRouteForwardInTime { ServiceActivity secondAct; - StateManagerImpl stateManager; + StateManager stateManager; @Before public void setUp(){ @@ -114,7 +114,7 @@ public class TestIterateRouteForwardInTime { vehicleRoute = VehicleRoute.newInstance(tour,DriverImpl.noDriver(),vehicle); - stateManager = new StateManagerImpl(); + stateManager = new StateManager(); } @Test diff --git a/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java b/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java index 48c4d397..8ee6d005 100644 --- a/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java +++ b/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java @@ -53,7 +53,7 @@ public class TestTourStateUpdaterWithService { UpdateStates updateStates; - StateManagerImpl states; + StateManager states; private VehicleRoute vehicleRoute; @@ -100,7 +100,7 @@ public class TestTourStateUpdaterWithService { services.add(firstService); services.add(secondService); - states = new StateManagerImpl(); + states = new StateManager(); VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("test", 0).build(); vehicle = VehicleImpl.Builder.newInstance("testvehicle").setType(type).setLocationId("0,0")