From 1e520f3269b749ba5c3b22940a858cc4982db808 Mon Sep 17 00:00:00 2001
From: Stefan Schroeder <4sschroeder@gmail.com>
Date: Tue, 22 Oct 2013 15:31:02 +0200
Subject: [PATCH] relax api
---
.../java/algorithms/BestInsertionBuilder.java | 35 +-
.../java/algorithms/CalculatorBuilder.java | 4 +-
.../ConfigureFixCostCalculator.java | 4 +-
.../algorithms/FindCheaperVehicleAlgo.java | 4 +-
.../java/algorithms/HardLoadConstraint.java | 2 +-
...kupAndDeliveryActivityLevelConstraint.java | 10 +-
...liveryBackhaulActivityLevelConstraint.java | 10 +-
...upAndDeliveryLoadRouteLevelConstraint.java | 4 +-
...HardTimeWindowActivityLevelConstraint.java | 4 +-
...sertionConsideringFixCostsCalculator.java} | 18 +-
...eLevelActivityInsertionCostsEstimator.java | 4 +-
...erviceInsertionOnRouteLevelCalculator.java | 6 +-
.../SolutionCostCalculatorFactory.java | 31 +
...{StateIdFactory.java => StateFactory.java} | 12 +-
.../main/java/algorithms/StateManager.java | 38 +-
.../main/java/algorithms/StateUpdates.java | 811 ------------------
.../src/main/java/algorithms/StateUtils.java | 6 +-
.../algorithms/UpdateCostsAtAllLevels.java | 4 +-
.../algorithms/UpdateCostsAtRouteLevel.java | 6 +-
...EarliestStartTimeWindowAtActLocations.java | 2 +-
.../UpdateFuturePickupsAtActivityLevel.java | 3 +-
...atestOperationStartTimeAtActLocations.java | 2 +-
.../algorithms/UpdateLoadAtActivityLevel.java | 9 +-
.../algorithms/UpdateLoadAtAllLevels.java | 4 +-
.../algorithms/UpdateLoadAtRouteLevel.java | 6 +-
...tartAndEndOfRouteWhenInsertionStarts.java} | 8 +-
...rtAndEndOfRouteWhenJobHasBeenInserted.java | 8 +-
.../main/java/algorithms/UpdateMaxLoad.java | 68 ++
...pdateOccuredDeliveriesAtActivityLevel.java | 2 +-
.../VehicleRoutingAlgorithmBuilder.java | 39 +
.../algorithms/VehicleRoutingAlgorithms.java | 4 +-
...eTypeDependentJobInsertionCalculator.java} | 6 +-
.../BuildCVRPAlgoFromScratchTest.java | 4 +-
.../BuildPDVRPAlgoFromScratchTest.java | 16 +-
...icleTypeDependentServiceInsertionTest.java | 4 +-
.../java/algorithms/GendreauPostOptTest.java | 11 +-
.../test/java/algorithms/StateUpdates.java | 78 ++
.../TestCalculatesServiceInsertion.java | 1 -
...alculatesServiceInsertionOnRouteLevel.java | 1 -
.../TestIterateRouteForwardInTime.java | 18 +-
.../TestTourStateUpdaterWithService.java | 21 +-
.../main/java/examples/SolomonExample.java | 2 +-
42 files changed, 382 insertions(+), 948 deletions(-)
rename jsprit-core/src/main/java/algorithms/{CalculatesServiceInsertionConsideringFixCost.java => JobInsertionConsideringFixCostsCalculator.java} (86%)
create mode 100644 jsprit-core/src/main/java/algorithms/SolutionCostCalculatorFactory.java
rename jsprit-core/src/main/java/algorithms/{StateIdFactory.java => StateFactory.java} (88%)
delete mode 100644 jsprit-core/src/main/java/algorithms/StateUpdates.java
rename jsprit-core/src/main/java/algorithms/{InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts.java => UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts.java} (81%)
create mode 100644 jsprit-core/src/main/java/algorithms/UpdateMaxLoad.java
create mode 100644 jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithmBuilder.java
rename jsprit-core/src/main/java/algorithms/{CalculatesVehTypeDepServiceInsertion.java => VehicleTypeDependentJobInsertionCalculator.java} (89%)
create mode 100644 jsprit-core/src/test/java/algorithms/StateUpdates.java
diff --git a/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java b/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java
index 65e2553d..e62fe8ef 100644
--- a/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java
+++ b/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java
@@ -32,29 +32,38 @@ public class BestInsertionBuilder implements InsertionStrategyBuilder{
this.stateManager = stateManager;
this.constraintManager = new ConstraintManager();
this.fleetManager = vehicleFleetManager;
+ addCoreStateUpdaters();
}
- /**
- * Adds core constraints, i.e.
- *
- *
HardPickupAndDeliveryLoadRouteLevelConstraint
- * HardTimeWindowActivityLevelConstraint
- * if(Constraint.DELIVERIES_FIRST) HardPickupAndDeliveryBackhaulActivityLevelConstraint
- * else HardPickupAndDeliveryActivityLevelConstraint
- * @return
- */
- public BestInsertionBuilder addCoreConstraints(){
+ private void addCoreStateUpdaters(){
+ stateManager.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts(stateManager));
+ stateManager.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(stateManager));
+
+ stateManager.addActivityVisitor(new UpdateMaxLoad(stateManager));
+ stateManager.addActivityVisitor(new UpdateActivityTimes(vrp.getTransportCosts()));
+ stateManager.addActivityVisitor(new UpdateCostsAtAllLevels(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager));
+ }
+
+ public BestInsertionBuilder addHardLoadConstraints(){
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);
+ stateManager.addActivityVisitor(new UpdateOccuredDeliveriesAtActivityLevel(stateManager));
+ stateManager.addActivityVisitor(new UpdateFuturePickupsAtActivityLevel(stateManager));
return this;
}
+
+ public BestInsertionBuilder addHardTimeWindowConstraint(){
+ constraintManager.addConstraint(new HardTimeWindowActivityLevelConstraint(stateManager, vrp.getTransportCosts()));
+ stateManager.addActivityVisitor(new UpdateEarliestStartTimeWindowAtActLocations(stateManager, vrp.getTransportCosts()));
+ stateManager.addActivityVisitor(new UpdateLatestOperationStartTimeAtActLocations(stateManager, vrp.getTransportCosts()));
+ return this;
+ }
+
public BestInsertionBuilder addConstraint(HardActivityLevelConstraint hardActvitiyLevelConstraint){
constraintManager.addConstraint(hardActvitiyLevelConstraint);
@@ -115,7 +124,7 @@ public class BestInsertionBuilder implements InsertionStrategyBuilder{
private void addCoreUpdater() {
if(!hasActivityTimeUpdater()){
- stateManager.addActivityVisitor(new UpdateActivityTimes(vrp.getTransportCosts()));
+
}
// if(!hasLoadUpdater()){
// stateManager.addActivityVisitor(new UpdateLoadAtActivityLevel(stateManager));
diff --git a/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java b/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java
index be3856ff..92091b6c 100644
--- a/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java
+++ b/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java
@@ -236,7 +236,7 @@ class CalculatorBuilder {
}
private CalculatorPlusListeners createCalculatorConsideringFixedCosts(VehicleRoutingProblem vrp, JobInsertionCalculator baseCalculator, StateGetter activityStates2, double weightOfFixedCosts){
- final CalculatesServiceInsertionConsideringFixCost withFixCost = new CalculatesServiceInsertionConsideringFixCost(baseCalculator, activityStates2);
+ final JobInsertionConsideringFixCostsCalculator withFixCost = new JobInsertionConsideringFixCostsCalculator(baseCalculator, activityStates2);
withFixCost.setWeightOfFixCost(weightOfFixedCosts);
CalculatorPlusListeners calcPlusListeners = new CalculatorPlusListeners(withFixCost);
calcPlusListeners.getInsertionListener().add(new ConfigureFixCostCalculator(vrp, withFixCost));
@@ -262,7 +262,7 @@ class CalculatorBuilder {
}
private JobInsertionCalculator createFinalInsertion(VehicleFleetManager fleetManager, JobInsertionCalculator baseCalc, StateGetter activityStates2){
- return new CalculatesVehTypeDepServiceInsertion(fleetManager, baseCalc);
+ return new VehicleTypeDependentJobInsertionCalculator(fleetManager, baseCalc);
}
public void setConstraintManager(ConstraintManager constraintManager) {
diff --git a/jsprit-core/src/main/java/algorithms/ConfigureFixCostCalculator.java b/jsprit-core/src/main/java/algorithms/ConfigureFixCostCalculator.java
index 80b06a15..ed9fb977 100644
--- a/jsprit-core/src/main/java/algorithms/ConfigureFixCostCalculator.java
+++ b/jsprit-core/src/main/java/algorithms/ConfigureFixCostCalculator.java
@@ -37,11 +37,11 @@ final class ConfigureFixCostCalculator implements InsertionStartsListener, JobIn
VehicleRoutingProblem vrp;
- CalculatesServiceInsertionConsideringFixCost calcConsideringFix;
+ JobInsertionConsideringFixCostsCalculator calcConsideringFix;
private int nuOfJobsToRecreate;
- public ConfigureFixCostCalculator(VehicleRoutingProblem vrp, CalculatesServiceInsertionConsideringFixCost calcConsideringFix) {
+ public ConfigureFixCostCalculator(VehicleRoutingProblem vrp, JobInsertionConsideringFixCostsCalculator calcConsideringFix) {
super();
this.vrp = vrp;
this.calcConsideringFix = calcConsideringFix;
diff --git a/jsprit-core/src/main/java/algorithms/FindCheaperVehicleAlgo.java b/jsprit-core/src/main/java/algorithms/FindCheaperVehicleAlgo.java
index db0b82dd..84ce8961 100644
--- a/jsprit-core/src/main/java/algorithms/FindCheaperVehicleAlgo.java
+++ b/jsprit-core/src/main/java/algorithms/FindCheaperVehicleAlgo.java
@@ -79,11 +79,11 @@ final class FindCheaperVehicleAlgo {
if(vehicle.getType().getTypeId().equals(vehicleRoute.getVehicle().getType().getTypeId())){
continue;
}
- if(states.getRouteState(vehicleRoute,StateIdFactory.LOAD).toDouble() <= vehicle.getCapacity()){
+ if(states.getRouteState(vehicleRoute,StateFactory.LOAD).toDouble() <= vehicle.getCapacity()){
double fixCostSaving = vehicleRoute.getVehicle().getType().getVehicleCostParams().fix - vehicle.getType().getVehicleCostParams().fix;
double departureTime = vehicleRoute.getStart().getEndTime();
double newCost = auxilliaryCostCalculator.costOfPath(path, departureTime, vehicleRoute.getDriver(), vehicle);
- double varCostSaving = states.getRouteState(vehicleRoute, StateIdFactory.COSTS).toDouble() - newCost;
+ double varCostSaving = states.getRouteState(vehicleRoute, StateFactory.COSTS).toDouble() - newCost;
double totalCostSaving = varCostSaving + weightFixCosts*fixCostSaving;
if(totalCostSaving > bestSaving){
bestSaving = totalCostSaving;
diff --git a/jsprit-core/src/main/java/algorithms/HardLoadConstraint.java b/jsprit-core/src/main/java/algorithms/HardLoadConstraint.java
index 78a8037b..0cc1dbd2 100644
--- a/jsprit-core/src/main/java/algorithms/HardLoadConstraint.java
+++ b/jsprit-core/src/main/java/algorithms/HardLoadConstraint.java
@@ -13,7 +13,7 @@ class HardLoadConstraint implements HardRouteLevelConstraint{
@Override
public boolean fulfilled(InsertionContext insertionContext) {
- int currentLoad = (int) states.getRouteState(insertionContext.getRoute(), StateIdFactory.LOAD).toDouble();
+ int currentLoad = (int) states.getRouteState(insertionContext.getRoute(), StateFactory.LOAD).toDouble();
Service service = (Service) insertionContext.getJob();
if(currentLoad + service.getCapacityDemand() > insertionContext.getNewVehicle().getCapacity()){
return false;
diff --git a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryActivityLevelConstraint.java b/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryActivityLevelConstraint.java
index 4a5645bd..fc0997b1 100644
--- a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryActivityLevelConstraint.java
+++ b/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryActivityLevelConstraint.java
@@ -21,14 +21,14 @@ class HardPickupAndDeliveryActivityLevelConstraint implements HardActivityLevelC
int futurePicks;
int pastDeliveries;
if(prevAct instanceof Start){
- loadAtPrevAct = (int)stateManager.getRouteState(iFacts.getRoute(), StateIdFactory.LOAD_AT_BEGINNING).toDouble();
- futurePicks = (int)stateManager.getRouteState(iFacts.getRoute(), StateIdFactory.LOAD).toDouble();
+ loadAtPrevAct = (int)stateManager.getRouteState(iFacts.getRoute(), StateFactory.LOAD_AT_BEGINNING).toDouble();
+ futurePicks = (int)stateManager.getRouteState(iFacts.getRoute(), StateFactory.LOAD_AT_END).toDouble();
pastDeliveries = 0;
}
else{
- loadAtPrevAct = (int) stateManager.getActivityState(prevAct, StateIdFactory.LOAD).toDouble();
- futurePicks = (int) stateManager.getActivityState(prevAct, StateIdFactory.FUTURE_PICKS).toDouble();
- pastDeliveries = (int) stateManager.getActivityState(prevAct, StateIdFactory.PAST_DELIVERIES).toDouble();
+ loadAtPrevAct = (int) stateManager.getActivityState(prevAct, StateFactory.LOAD).toDouble();
+ futurePicks = (int) stateManager.getActivityState(prevAct, StateFactory.FUTURE_PICKS).toDouble();
+ pastDeliveries = (int) stateManager.getActivityState(prevAct, StateFactory.PAST_DELIVERIES).toDouble();
}
if(newAct instanceof PickupActivity || newAct instanceof ServiceActivity){
if(loadAtPrevAct + newAct.getCapacityDemand() + futurePicks > iFacts.getNewVehicle().getCapacity()){
diff --git a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryBackhaulActivityLevelConstraint.java b/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryBackhaulActivityLevelConstraint.java
index 89b293a1..a99b4862 100644
--- a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryBackhaulActivityLevelConstraint.java
+++ b/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryBackhaulActivityLevelConstraint.java
@@ -25,14 +25,14 @@ class HardPickupAndDeliveryBackhaulActivityLevelConstraint implements HardActivi
int futurePicks;
int pastDeliveries;
if(prevAct instanceof Start){
- loadAtPrevAct = (int)stateManager.getRouteState(iFacts.getRoute(), StateIdFactory.LOAD_AT_BEGINNING).toDouble();
- futurePicks = (int)stateManager.getRouteState(iFacts.getRoute(), StateIdFactory.LOAD).toDouble();
+ loadAtPrevAct = (int)stateManager.getRouteState(iFacts.getRoute(), StateFactory.LOAD_AT_BEGINNING).toDouble();
+ futurePicks = (int)stateManager.getRouteState(iFacts.getRoute(), StateFactory.LOAD_AT_END).toDouble();
pastDeliveries = 0;
}
else{
- loadAtPrevAct = (int) stateManager.getActivityState(prevAct, StateIdFactory.LOAD).toDouble();
- futurePicks = (int) stateManager.getActivityState(prevAct, StateIdFactory.FUTURE_PICKS).toDouble();
- pastDeliveries = (int) stateManager.getActivityState(prevAct, StateIdFactory.PAST_DELIVERIES).toDouble();
+ loadAtPrevAct = (int) stateManager.getActivityState(prevAct, StateFactory.LOAD).toDouble();
+ futurePicks = (int) stateManager.getActivityState(prevAct, StateFactory.FUTURE_PICKS).toDouble();
+ pastDeliveries = (int) stateManager.getActivityState(prevAct, StateFactory.PAST_DELIVERIES).toDouble();
}
if(newAct instanceof PickupActivity || newAct instanceof ServiceActivity){
if(loadAtPrevAct + newAct.getCapacityDemand() + futurePicks > iFacts.getNewVehicle().getCapacity()){
diff --git a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryLoadRouteLevelConstraint.java b/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryLoadRouteLevelConstraint.java
index c43d1e7d..b5281620 100644
--- a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryLoadRouteLevelConstraint.java
+++ b/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryLoadRouteLevelConstraint.java
@@ -22,13 +22,13 @@ class HardPickupAndDeliveryLoadRouteLevelConstraint implements HardRouteLevelCon
@Override
public boolean fulfilled(InsertionContext insertionContext) {
if(insertionContext.getJob() instanceof Delivery){
- int loadAtDepot = (int) stateManager.getRouteState(insertionContext.getRoute(), StateIdFactory.LOAD_AT_BEGINNING).toDouble();
+ int loadAtDepot = (int) stateManager.getRouteState(insertionContext.getRoute(), StateFactory.LOAD_AT_BEGINNING).toDouble();
if(loadAtDepot + insertionContext.getJob().getCapacityDemand() > insertionContext.getNewVehicle().getCapacity()){
return false;
}
}
else if(insertionContext.getJob() instanceof Pickup || insertionContext.getJob() instanceof Service){
- int loadAtEnd = (int) stateManager.getRouteState(insertionContext.getRoute(), StateIdFactory.LOAD).toDouble();
+ int loadAtEnd = (int) stateManager.getRouteState(insertionContext.getRoute(), StateFactory.LOAD_AT_END).toDouble();
if(loadAtEnd + insertionContext.getJob().getCapacityDemand() > insertionContext.getNewVehicle().getCapacity()){
return false;
}
diff --git a/jsprit-core/src/main/java/algorithms/HardTimeWindowActivityLevelConstraint.java b/jsprit-core/src/main/java/algorithms/HardTimeWindowActivityLevelConstraint.java
index f30698de..9393cceb 100644
--- a/jsprit-core/src/main/java/algorithms/HardTimeWindowActivityLevelConstraint.java
+++ b/jsprit-core/src/main/java/algorithms/HardTimeWindowActivityLevelConstraint.java
@@ -28,14 +28,14 @@ import basics.route.TourActivity;
public boolean fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) {
// log.info("check insertion of " + newAct + " between " + prevAct + " and " + nextAct + ". prevActDepTime=" + prevActDepTime);
double arrTimeAtNewAct = prevActDepTime + routingCosts.getTransportTime(prevAct.getLocationId(), newAct.getLocationId(), prevActDepTime, iFacts.getNewDriver(), iFacts.getNewVehicle());
- double latestArrTimeAtNewAct = states.getActivityState(newAct, StateIdFactory.LATEST_OPERATION_START_TIME).toDouble();
+ double latestArrTimeAtNewAct = states.getActivityState(newAct, StateFactory.LATEST_OPERATION_START_TIME).toDouble();
if(arrTimeAtNewAct > latestArrTimeAtNewAct){
return false;
}
// log.info(newAct + " arrTime=" + arrTimeAtNewAct);
double endTimeAtNewAct = CalculationUtils.getActivityEndTime(arrTimeAtNewAct, newAct);
double arrTimeAtNextAct = endTimeAtNewAct + routingCosts.getTransportTime(newAct.getLocationId(), nextAct.getLocationId(), endTimeAtNewAct, iFacts.getNewDriver(), iFacts.getNewVehicle());
- double latestArrTimeAtNextAct = states.getActivityState(nextAct, StateIdFactory.LATEST_OPERATION_START_TIME).toDouble();
+ double latestArrTimeAtNextAct = states.getActivityState(nextAct, StateFactory.LATEST_OPERATION_START_TIME).toDouble();
if(arrTimeAtNextAct > latestArrTimeAtNextAct){
return false;
}
diff --git a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionConsideringFixCost.java b/jsprit-core/src/main/java/algorithms/JobInsertionConsideringFixCostsCalculator.java
similarity index 86%
rename from jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionConsideringFixCost.java
rename to jsprit-core/src/main/java/algorithms/JobInsertionConsideringFixCostsCalculator.java
index ba3b1415..336dce5f 100644
--- a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionConsideringFixCost.java
+++ b/jsprit-core/src/main/java/algorithms/JobInsertionConsideringFixCostsCalculator.java
@@ -27,9 +27,9 @@ import basics.route.VehicleRoute;
-final class CalculatesServiceInsertionConsideringFixCost implements JobInsertionCalculator{
+final class JobInsertionConsideringFixCostsCalculator implements JobInsertionCalculator{
- private static final Logger logger = Logger.getLogger(CalculatesServiceInsertionConsideringFixCost.class);
+ private static final Logger logger = Logger.getLogger(JobInsertionConsideringFixCostsCalculator.class);
private final JobInsertionCalculator standardServiceInsertion;
@@ -37,12 +37,12 @@ final class CalculatesServiceInsertionConsideringFixCost implements JobInsertion
private double solution_completeness_ratio = 0.5;
- private StateGetter states;
+ private StateGetter stateGetter;
- public CalculatesServiceInsertionConsideringFixCost(final JobInsertionCalculator standardInsertionCalculator, StateGetter activityStates2) {
+ public JobInsertionConsideringFixCostsCalculator(final JobInsertionCalculator standardInsertionCalculator, StateGetter stateGetter) {
super();
this.standardServiceInsertion = standardInsertionCalculator;
- this.states = activityStates2;
+ this.stateGetter = stateGetter;
logger.info("inialise " + this);
}
@@ -80,7 +80,7 @@ final class CalculatesServiceInsertionConsideringFixCost implements JobInsertion
}
private double getDeltaAbsoluteFixCost(VehicleRoute route, Vehicle newVehicle, Job job) {
- double load = getCurrentLoad(route) + job.getCapacityDemand();
+ double load = getCurrentMaxLoadInRoute(route) + job.getCapacityDemand();
double currentFix = 0.0;
if(route.getVehicle() != null){
if(!(route.getVehicle() instanceof NoVehicle)){
@@ -94,7 +94,7 @@ final class CalculatesServiceInsertionConsideringFixCost implements JobInsertion
}
private double getDeltaRelativeFixCost(VehicleRoute route, Vehicle newVehicle, Job job) {
- int currentLoad = getCurrentLoad(route);
+ int currentLoad = getCurrentMaxLoadInRoute(route);
double load = currentLoad + job.getCapacityDemand();
double currentRelFix = 0.0;
if(route.getVehicle() != null){
@@ -109,8 +109,8 @@ final class CalculatesServiceInsertionConsideringFixCost implements JobInsertion
return relativeFixCost;
}
- private int getCurrentLoad(VehicleRoute route) {
- return (int) states.getRouteState(route, StateIdFactory.LOAD).toDouble();
+ private int getCurrentMaxLoadInRoute(VehicleRoute route) {
+ return (int) stateGetter.getRouteState(route, StateFactory.MAXLOAD).toDouble();
}
}
diff --git a/jsprit-core/src/main/java/algorithms/RouteLevelActivityInsertionCostsEstimator.java b/jsprit-core/src/main/java/algorithms/RouteLevelActivityInsertionCostsEstimator.java
index 8d5e396c..e26ab258 100644
--- a/jsprit-core/src/main/java/algorithms/RouteLevelActivityInsertionCostsEstimator.java
+++ b/jsprit-core/src/main/java/algorithms/RouteLevelActivityInsertionCostsEstimator.java
@@ -69,9 +69,9 @@ class RouteLevelActivityInsertionCostsEstimator implements ActivityInsertionCost
private double actCostsOld(VehicleRoute vehicleRoute, TourActivity act) {
if(act instanceof End){
- return stateManager.getRouteState(vehicleRoute,StateIdFactory.COSTS).toDouble();
+ return stateManager.getRouteState(vehicleRoute,StateFactory.COSTS).toDouble();
}
- return stateManager.getActivityState(act,StateIdFactory.COSTS).toDouble();
+ return stateManager.getActivityState(act,StateFactory.COSTS).toDouble();
}
private List getForwardLookingPath(VehicleRoute route, int actIndex) {
diff --git a/jsprit-core/src/main/java/algorithms/ServiceInsertionOnRouteLevelCalculator.java b/jsprit-core/src/main/java/algorithms/ServiceInsertionOnRouteLevelCalculator.java
index 67c3e9f3..7aa36653 100644
--- a/jsprit-core/src/main/java/algorithms/ServiceInsertionOnRouteLevelCalculator.java
+++ b/jsprit-core/src/main/java/algorithms/ServiceInsertionOnRouteLevelCalculator.java
@@ -276,7 +276,7 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCalcul
/**
* compute cost-diff of tour with and without new activity --> insertion_costs
*/
- double insertion_costs = auxilliaryPathCostCalculator.costOfPath(wholeTour, start.getEndTime(), newDriver, newVehicle) - stateManager.getRouteState(currentRoute,StateIdFactory.COSTS).toDouble();
+ double insertion_costs = auxilliaryPathCostCalculator.costOfPath(wholeTour, start.getEndTime(), newDriver, newVehicle) - stateManager.getRouteState(currentRoute,StateFactory.COSTS).toDouble();
/**
* if better than best known, make it the best known
@@ -321,9 +321,9 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCalcul
private double sumOf_prevCosts_oldVehicle(VehicleRoute vehicleRoute, TourActivity act) {
if(act instanceof End){
- return stateManager.getRouteState(vehicleRoute,StateIdFactory.COSTS).toDouble();
+ return stateManager.getRouteState(vehicleRoute,StateFactory.COSTS).toDouble();
}
- return stateManager.getActivityState(act,StateIdFactory.COSTS).toDouble();
+ return stateManager.getActivityState(act,StateFactory.COSTS).toDouble();
}
/**
diff --git a/jsprit-core/src/main/java/algorithms/SolutionCostCalculatorFactory.java b/jsprit-core/src/main/java/algorithms/SolutionCostCalculatorFactory.java
new file mode 100644
index 00000000..89a5b59c
--- /dev/null
+++ b/jsprit-core/src/main/java/algorithms/SolutionCostCalculatorFactory.java
@@ -0,0 +1,31 @@
+package algorithms;
+
+import basics.VehicleRoutingProblemSolution;
+import basics.algo.SolutionCostCalculator;
+import basics.route.VehicleRoute;
+
+public class SolutionCostCalculatorFactory {
+
+ private StateManager stateManager;
+
+ public SolutionCostCalculatorFactory(StateManager stateManager) {
+ super();
+ this.stateManager = stateManager;
+ }
+
+ public SolutionCostCalculator createCalculator(){
+ return new SolutionCostCalculator() {
+
+ @Override
+ public void calculateCosts(VehicleRoutingProblemSolution solution) {
+ double c = 0.0;
+ for(VehicleRoute r : solution.getRoutes()){
+ c += stateManager.getRouteState(r, StateFactory.COSTS).toDouble();
+ c += r.getVehicle().getType().getVehicleCostParams().fix;
+ }
+ solution.setCost(c);
+ }
+ };
+ }
+
+}
diff --git a/jsprit-core/src/main/java/algorithms/StateIdFactory.java b/jsprit-core/src/main/java/algorithms/StateFactory.java
similarity index 88%
rename from jsprit-core/src/main/java/algorithms/StateIdFactory.java
rename to jsprit-core/src/main/java/algorithms/StateFactory.java
index 67c33258..dc2fb84f 100644
--- a/jsprit-core/src/main/java/algorithms/StateIdFactory.java
+++ b/jsprit-core/src/main/java/algorithms/StateFactory.java
@@ -23,9 +23,13 @@ package algorithms;
import java.util.Arrays;
import java.util.List;
+import algorithms.StateGetter.State;
import algorithms.StateGetter.StateId;
+import algorithms.StateManager.StateImpl;
-public class StateIdFactory {
+public class StateFactory {
+
+ final static StateId MAXLOAD = new StateIdImpl("maxload");
final static StateId LOAD = new StateIdImpl("load");
@@ -45,7 +49,7 @@ public class StateIdFactory {
final static StateId PAST_DELIVERIES = new StateIdImpl("pastDeliveries");
- final static List reservedIds = Arrays.asList("load","costs","loadAtBeginning","loadAtEnd","duration","latestOST","earliestOST"
+ final static List reservedIds = Arrays.asList("maxload","load","costs","loadAtBeginning","loadAtEnd","duration","latestOST","earliestOST"
,"futurePicks","pastDeliveries");
@@ -53,6 +57,10 @@ public class StateIdFactory {
if(reservedIds.contains(name)){ throwException(name); }
return new StateIdImpl(name);
}
+
+ public static State createState(double value){
+ return new StateImpl(value);
+ }
private static void throwException(String name) {
throw new IllegalStateException("state-id with name '" + name + "' cannot be created. it is already reserved internally.");
diff --git a/jsprit-core/src/main/java/algorithms/StateManager.java b/jsprit-core/src/main/java/algorithms/StateManager.java
index dc2a8e03..3a934be5 100644
--- a/jsprit-core/src/main/java/algorithms/StateManager.java
+++ b/jsprit-core/src/main/java/algorithms/StateManager.java
@@ -46,7 +46,7 @@ public class StateManager implements StateGetter, IterationStartsListener, RuinL
}
- public static class StateImpl implements State{
+ static class StateImpl implements State{
double state;
public StateImpl(double state) {
@@ -92,6 +92,18 @@ public class StateManager implements StateGetter, IterationStartsListener, RuinL
private Collection updaters = new ArrayList();
+ private Map defaultRouteStates = new HashMap();
+
+ private Map defaultActivityStates = new HashMap();
+
+ public void addDefaultRouteState(StateId stateId, State defaultState){
+ defaultRouteStates.put(stateId, defaultState);
+ }
+
+ public void addDefaultActivityState(StateId stateId, State defaultState){
+ defaultActivityStates.put(stateId, defaultState);
+ }
+
public void clear(){
vehicleRouteStates.clear();
activityStates.clear();
@@ -208,21 +220,23 @@ public class StateManager implements StateGetter, IterationStartsListener, RuinL
}
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);
+ if(stateId.equals(StateFactory.LOAD)) return new StateImpl(0);
+ if(stateId.equals(StateFactory.COSTS)) return new StateImpl(0);
+ if(stateId.equals(StateFactory.DURATION)) return new StateImpl(0);
+ if(stateId.equals(StateFactory.EARLIEST_OPERATION_START_TIME)) return new StateImpl(act.getTheoreticalEarliestOperationStartTime());
+ if(stateId.equals(StateFactory.LATEST_OPERATION_START_TIME)) return new StateImpl(act.getTheoreticalLatestOperationStartTime());
+ if(stateId.equals(StateFactory.FUTURE_PICKS)) return new StateImpl(0);
+ if(stateId.equals(StateFactory.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);
+ if(stateId.equals(StateFactory.MAXLOAD)) return new StateImpl(0);
+ if(stateId.equals(StateFactory.LOAD)) return new StateImpl(0);
+ if(stateId.equals(StateFactory.LOAD_AT_END)) return new StateImpl(0);
+ if(stateId.equals(StateFactory.LOAD_AT_BEGINNING)) return new StateImpl(0);
+ if(stateId.equals(StateFactory.COSTS)) return new StateImpl(0);
+ if(stateId.equals(StateFactory.DURATION)) return new StateImpl(0);
return null;
}
diff --git a/jsprit-core/src/main/java/algorithms/StateUpdates.java b/jsprit-core/src/main/java/algorithms/StateUpdates.java
deleted file mode 100644
index 79c73ad2..00000000
--- a/jsprit-core/src/main/java/algorithms/StateUpdates.java
+++ /dev/null
@@ -1,811 +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.Collection;
-
-import basics.Job;
-import basics.algo.JobInsertedListener;
-import basics.algo.RuinListener;
-import basics.costs.VehicleRoutingActivityCosts;
-import basics.costs.VehicleRoutingTransportCosts;
-import basics.route.VehicleRoute;
-
-
-class StateUpdates {
-
-// static class UpdateCostsAtRouteLevel implements JobInsertedListener, InsertionStartsListener, InsertionEndsListener{
-//
-// private StateManagerImpl states;
-//
-// private VehicleRoutingTransportCosts tpCosts;
-//
-// private VehicleRoutingActivityCosts actCosts;
-//
-// public UpdateCostsAtRouteLevel(StateManagerImpl states, VehicleRoutingTransportCosts tpCosts, VehicleRoutingActivityCosts actCosts) {
-// super();
-// this.states = states;
-// this.tpCosts = tpCosts;
-// this.actCosts = actCosts;
-// }
-//
-// @Override
-// public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
-//// inRoute.getVehicleRouteCostCalculator().addTransportCost(additionalCosts);
-// double oldCosts = states.getRouteState(inRoute, StateTypes.COSTS).toDouble();
-// oldCosts += additionalCosts;
-// states.putRouteState(inRoute, StateTypes.COSTS, new StateImpl(oldCosts));
-// }
-//
-// @Override
-// public void informInsertionStarts(Collection vehicleRoutes, Collection unassignedJobs) {
-// RouteActivityVisitor forwardInTime = new RouteActivityVisitor();
-// forwardInTime.addActivityVisitor(new UpdateCostsAtAllLevels(actCosts, tpCosts, states));
-// for(VehicleRoute route : vehicleRoutes){
-// forwardInTime.visit(route);
-// }
-
-//
-// }
-//
-// @Override
-// public void informInsertionEnds(Collection vehicleRoutes) {
-//
-//// IterateRouteForwardInTime forwardInTime = new IterateRouteForwardInTime(tpCosts);
-//// forwardInTime.addListener(new UpdateCostsAtAllLevels(actCosts, tpCosts, states));
-//// for(VehicleRoute route : vehicleRoutes){
-//// if(route.isEmpty()) continue;
-//// route.getVehicleRouteCostCalculator().reset();
-//// route.getVehicleRouteCostCalculator().addOtherCost(states.getRouteState(route, StateTypes.COSTS).toDouble());
-//// route.getVehicleRouteCostCalculator().price(route.getVehicle());
-//// forwardInTime.iterate(route);
-//// }
-//
-// }
-//
-// }
-//
-// static class UpdateActivityTimes implements ActivityVisitor{
-//
-// private Logger log = Logger.getLogger(UpdateActivityTimes.class);
-//
-// private ActivityTimeTracker timeTracker;
-//
-// private VehicleRoute route;
-//
-// public UpdateActivityTimes(ForwardTransportTime transportTime) {
-// super();
-// timeTracker = new ActivityTimeTracker(transportTime);
-// }
-//
-// @Override
-// public void begin(VehicleRoute route) {
-// timeTracker.begin(route);
-// this.route = route;
-// route.getStart().setEndTime(timeTracker.getActEndTime());
-// }
-//
-// @Override
-// public void visit(TourActivity activity) {
-// timeTracker.visit(activity);
-// activity.setArrTime(timeTracker.getActArrTime());
-// activity.setEndTime(timeTracker.getActEndTime());
-// }
-//
-// @Override
-// public void finish() {
-// timeTracker.finish();
-// route.getEnd().setArrTime(timeTracker.getActArrTime());
-// }
-//
-// }
-//
-// static class UpdateCostsAtAllLevels implements ActivityVisitor{
-//
-// private static Logger log = Logger.getLogger(UpdateCostsAtAllLevels.class);
-//
-// private VehicleRoutingActivityCosts activityCost;
-//
-// private ForwardTransportCost transportCost;
-//
-// private StateManagerImpl states;
-//
-// private double totalOperationCost = 0.0;
-//
-// private VehicleRoute vehicleRoute = null;
-//
-// private TourActivity prevAct = null;
-//
-// private double startTimeAtPrevAct = 0.0;
-//
-// private ActivityTimeTracker timeTracker;
-//
-// public UpdateCostsAtAllLevels(VehicleRoutingActivityCosts activityCost, VehicleRoutingTransportCosts transportCost, StateManagerImpl states) {
-// super();
-// this.activityCost = activityCost;
-// this.transportCost = transportCost;
-// this.states = states;
-// timeTracker = new ActivityTimeTracker(transportCost);
-// }
-//
-// @Override
-// public void begin(VehicleRoute route) {
-// vehicleRoute = route;
-// vehicleRoute.getVehicleRouteCostCalculator().reset();
-// timeTracker.begin(route);
-// prevAct = route.getStart();
-// startTimeAtPrevAct = timeTracker.getActEndTime();
-// }
-//
-// @Override
-// public void visit(TourActivity act) {
-// timeTracker.visit(act);
-//
-// double transportCost = this.transportCost.getTransportCost(prevAct.getLocationId(), act.getLocationId(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle());
-// double actCost = activityCost.getActivityCost(act, timeTracker.getActArrTime(), 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 = timeTracker.getActEndTime();
-// }
-//
-// @Override
-// public void finish() {
-// timeTracker.finish();
-// double transportCost = this.transportCost.getTransportCost(prevAct.getLocationId(), vehicleRoute.getEnd().getLocationId(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle());
-// double actCost = activityCost.getActivityCost(vehicleRoute.getEnd(), timeTracker.getActEndTime(), vehicleRoute.getDriver(), vehicleRoute.getVehicle());
-//
-//// vehicleRoute.getVehicleRouteCostCalculator().addTransportCost(transportCost);
-//// vehicleRoute.getVehicleRouteCostCalculator().addActivityCost(actCost);
-//
-// totalOperationCost += transportCost;
-// totalOperationCost += actCost;
-// totalOperationCost += getFixCosts();
-//
-// states.putRouteState(vehicleRoute, StateTypes.COSTS, new StateImpl(totalOperationCost));
-//
-// //this is rather strange and likely to change
-//// vehicleRoute.getVehicleRouteCostCalculator().price(vehicleRoute.getDriver());
-//// vehicleRoute.getVehicleRouteCostCalculator().price(vehicleRoute.getVehicle());
-//// vehicleRoute.getVehicleRouteCostCalculator().finish();
-//
-// startTimeAtPrevAct = 0.0;
-// prevAct = null;
-// vehicleRoute = null;
-// totalOperationCost = 0.0;
-// }
-//
-// private double getFixCosts() {
-// Vehicle vehicle = vehicleRoute.getVehicle();
-// if(vehicle == null) return 0.0;
-// VehicleType type = vehicle.getType();
-// if(type == null) return 0.0;
-// return type.getVehicleCostParams().fix;
-// }
-//
-// }
-//
-// static class UpdateEarliestStartTimeWindowAtActLocations implements ActivityVisitor{
-//
-// private StateManagerImpl states;
-//
-// private ActivityTimeTracker timeTracker;
-//
-// public UpdateEarliestStartTimeWindowAtActLocations(StateManagerImpl states, VehicleRoutingTransportCosts transportCosts) {
-// super();
-// this.states = states;
-// timeTracker = new ActivityTimeTracker(transportCosts);
-// }
-//
-// @Override
-// public void begin(VehicleRoute route) {
-// timeTracker.begin(route);
-// }
-//
-// @Override
-// public void visit(TourActivity activity) {
-// timeTracker.visit(activity);
-// states.putActivityState(activity, StateTypes.EARLIEST_OPERATION_START_TIME, new StateImpl(Math.max(timeTracker.getActArrTime(), activity.getTheoreticalEarliestOperationStartTime())));
-//
-// }
-//
-// @Override
-// public void finish() {}
-//
-// }
-//
-// static class UpdateLatestOperationStartTimeAtActLocations implements ReverseActivityVisitor{
-//
-// private static Logger log = Logger.getLogger(UpdateLatestOperationStartTimeAtActLocations.class);
-//
-// private StateManagerImpl states;
-//
-// private VehicleRoute route;
-//
-// private VehicleRoutingTransportCosts transportCosts;
-//
-// private double latestArrTimeAtPrevAct;
-//
-// private TourActivity prevAct;
-//
-// public UpdateLatestOperationStartTimeAtActLocations(StateManagerImpl states, VehicleRoutingTransportCosts tpCosts) {
-// super();
-// this.states = states;
-// this.transportCosts = tpCosts;
-// }
-//
-// @Override
-// public void begin(VehicleRoute route) {
-// this.route = route;
-// latestArrTimeAtPrevAct = route.getEnd().getTheoreticalLatestOperationStartTime();
-// prevAct = route.getEnd();
-// }
-//
-// @Override
-// public void visit(TourActivity activity) {
-// double potentialLatestArrivalTimeAtCurrAct = latestArrTimeAtPrevAct - transportCosts.getBackwardTransportTime(activity.getLocationId(), prevAct.getLocationId(), latestArrTimeAtPrevAct, route.getDriver(),route.getVehicle()) - activity.getOperationTime();
-// double latestArrivalTime = Math.min(activity.getTheoreticalLatestOperationStartTime(), potentialLatestArrivalTimeAtCurrAct);
-//
-// states.putActivityState(activity, StateTypes.LATEST_OPERATION_START_TIME, new StateImpl(latestArrivalTime));
-//
-// latestArrTimeAtPrevAct = latestArrivalTime;
-// prevAct = activity;
-// }
-//
-// @Override
-// public void finish() {}
-// }
-//
-// static class UpdateLoadAtAllLevels implements ActivityVisitor{
-//
-// private double load = 0.0;
-//
-// private StateManagerImpl states;
-//
-// private VehicleRoute vehicleRoute;
-//
-// public UpdateLoadAtAllLevels(StateManagerImpl states) {
-// super();
-// this.states = states;
-// }
-//
-// @Override
-// public void begin(VehicleRoute route) {
-// vehicleRoute = route;
-// }
-//
-// @Override
-// public void visit(TourActivity activity) {
-// load += (double)activity.getCapacityDemand();
-// states.putActivityState(activity, StateTypes.LOAD, new StateImpl(load));
-// }
-//
-// @Override
-// public void finish() {
-// states.putRouteState(vehicleRoute, StateTypes.LOAD, new StateImpl(load));
-// load=0;
-// vehicleRoute = null;
-// }
-//
-// }
-//
-// static class UpdateLoadAtRouteLevel implements JobInsertedListener, InsertionStartsListener{
-//
-// private StateManagerImpl states;
-//
-// public UpdateLoadAtRouteLevel(StateManagerImpl states) {
-// super();
-// this.states = states;
-// }
-//
-// @Override
-// public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
-// if(!(job2insert instanceof Service)){
-// return;
-// }
-// double oldLoad = states.getRouteState(inRoute, StateTypes.LOAD).toDouble();
-// states.putRouteState(inRoute, StateTypes.LOAD, new StateImpl(oldLoad + job2insert.getCapacityDemand()));
-// }
-//
-// @Override
-// public void informInsertionStarts(Collection vehicleRoutes, Collection unassignedJobs) {
-// for(VehicleRoute route : vehicleRoutes){
-// int load = 0;
-// for(Job j : route.getTourActivities().getJobs()){
-// load += j.getCapacityDemand();
-// }
-// states.putRouteState(route, StateTypes.LOAD, new StateImpl(load));
-// }
-//
-// }
-//
-// }
-//
-//=======
-//
-// }
-//
-// }
-//
-// static class UpdateActivityTimes implements ActivityVisitor{
-//
-// private Logger log = Logger.getLogger(UpdateActivityTimes.class);
-//
-// private ActivityTimeTracker timeTracker;
-//
-// private VehicleRoute route;
-//
-// public UpdateActivityTimes(ForwardTransportTime transportTime) {
-// super();
-// timeTracker = new ActivityTimeTracker(transportTime);
-// }
-//
-// @Override
-// public void begin(VehicleRoute route) {
-// timeTracker.begin(route);
-// this.route = route;
-// route.getStart().setEndTime(timeTracker.getActEndTime());
-// }
-//
-// @Override
-// public void visit(TourActivity activity) {
-// timeTracker.visit(activity);
-// activity.setArrTime(timeTracker.getActArrTime());
-// activity.setEndTime(timeTracker.getActEndTime());
-// }
-//
-// @Override
-// public void finish() {
-// timeTracker.finish();
-// route.getEnd().setArrTime(timeTracker.getActArrTime());
-// }
-//
-// }
-//
-// static class UpdateCostsAtAllLevels implements ActivityVisitor{
-//
-// private static Logger log = Logger.getLogger(UpdateCostsAtAllLevels.class);
-//
-// private VehicleRoutingActivityCosts activityCost;
-//
-// private ForwardTransportCost transportCost;
-//
-// private StateManagerImpl states;
-//
-// private double totalOperationCost = 0.0;
-//
-// private VehicleRoute vehicleRoute = null;
-//
-// private TourActivity prevAct = null;
-//
-// private double startTimeAtPrevAct = 0.0;
-//
-// private ActivityTimeTracker timeTracker;
-//
-// public UpdateCostsAtAllLevels(VehicleRoutingActivityCosts activityCost, VehicleRoutingTransportCosts transportCost, StateManagerImpl states) {
-// super();
-// this.activityCost = activityCost;
-// this.transportCost = transportCost;
-// this.states = states;
-// timeTracker = new ActivityTimeTracker(transportCost);
-// }
-//
-// @Override
-// public void begin(VehicleRoute route) {
-// vehicleRoute = route;
-// vehicleRoute.getVehicleRouteCostCalculator().reset();
-// timeTracker.begin(route);
-// prevAct = route.getStart();
-// startTimeAtPrevAct = timeTracker.getActEndTime();
-// }
-//
-// @Override
-// public void visit(TourActivity act) {
-// timeTracker.visit(act);
-//
-// double transportCost = this.transportCost.getTransportCost(prevAct.getLocationId(), act.getLocationId(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle());
-// double actCost = activityCost.getActivityCost(act, timeTracker.getActArrTime(), 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 = timeTracker.getActEndTime();
-// }
-//
-// @Override
-// public void finish() {
-// timeTracker.finish();
-// double transportCost = this.transportCost.getTransportCost(prevAct.getLocationId(), vehicleRoute.getEnd().getLocationId(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle());
-// double actCost = activityCost.getActivityCost(vehicleRoute.getEnd(), timeTracker.getActEndTime(), vehicleRoute.getDriver(), vehicleRoute.getVehicle());
-//
-// vehicleRoute.getVehicleRouteCostCalculator().addTransportCost(transportCost);
-// vehicleRoute.getVehicleRouteCostCalculator().addActivityCost(actCost);
-//
-// totalOperationCost += transportCost;
-// totalOperationCost += actCost;
-//// totalOperationCost += getFixCosts();
-//
-// states.putRouteState(vehicleRoute, StateTypes.COSTS, new StateImpl(totalOperationCost));
-//
-//// this is rather strange and likely to change
-// vehicleRoute.getVehicleRouteCostCalculator().price(vehicleRoute.getDriver());
-// vehicleRoute.getVehicleRouteCostCalculator().price(vehicleRoute.getVehicle());
-// vehicleRoute.getVehicleRouteCostCalculator().finish();
-//
-// startTimeAtPrevAct = 0.0;
-// prevAct = null;
-// vehicleRoute = null;
-// totalOperationCost = 0.0;
-// }
-//
-// private double getFixCosts() {
-// Vehicle vehicle = vehicleRoute.getVehicle();
-// if(vehicle == null) return 0.0;
-// VehicleType type = vehicle.getType();
-// if(type == null) return 0.0;
-// return type.getVehicleCostParams().fix;
-// }
-//
-// }
-//
-// static class UpdateEarliestStartTimeWindowAtActLocations implements ActivityVisitor{
-//
-// private StateManagerImpl states;
-//
-// private ActivityTimeTracker timeTracker;
-//
-// public UpdateEarliestStartTimeWindowAtActLocations(StateManagerImpl states, VehicleRoutingTransportCosts transportCosts) {
-// super();
-// this.states = states;
-// timeTracker = new ActivityTimeTracker(transportCosts);
-// }
-//
-// @Override
-// public void begin(VehicleRoute route) {
-// timeTracker.begin(route);
-// }
-//
-// @Override
-// public void visit(TourActivity activity) {
-// timeTracker.visit(activity);
-// states.putActivityState(activity, StateTypes.EARLIEST_OPERATION_START_TIME, new StateImpl(Math.max(timeTracker.getActArrTime(), activity.getTheoreticalEarliestOperationStartTime())));
-//
-// }
-//
-// @Override
-// public void finish() {}
-//
-// }
-//
-// static class UpdateLatestOperationStartTimeAtActLocations implements ReverseActivityVisitor{
-//
-// private static Logger log = Logger.getLogger(UpdateLatestOperationStartTimeAtActLocations.class);
-//
-// private StateManagerImpl states;
-//
-// private VehicleRoute route;
-//
-// private VehicleRoutingTransportCosts transportCosts;
-//
-// private double latestArrTimeAtPrevAct;
-//
-// private TourActivity prevAct;
-//
-// public UpdateLatestOperationStartTimeAtActLocations(StateManagerImpl states, VehicleRoutingTransportCosts tpCosts) {
-// super();
-// this.states = states;
-// this.transportCosts = tpCosts;
-// }
-//
-// @Override
-// public void begin(VehicleRoute route) {
-// this.route = route;
-// latestArrTimeAtPrevAct = route.getEnd().getTheoreticalLatestOperationStartTime();
-// prevAct = route.getEnd();
-// }
-//
-// @Override
-// public void visit(TourActivity activity) {
-// double potentialLatestArrivalTimeAtCurrAct = latestArrTimeAtPrevAct - transportCosts.getBackwardTransportTime(activity.getLocationId(), prevAct.getLocationId(), latestArrTimeAtPrevAct, route.getDriver(),route.getVehicle()) - activity.getOperationTime();
-// double latestArrivalTime = Math.min(activity.getTheoreticalLatestOperationStartTime(), potentialLatestArrivalTimeAtCurrAct);
-//
-// states.putActivityState(activity, StateTypes.LATEST_OPERATION_START_TIME, new StateImpl(latestArrivalTime));
-//
-// latestArrTimeAtPrevAct = latestArrivalTime;
-// prevAct = activity;
-// }
-//
-// @Override
-// public void finish() {}
-// }
-//
-// static class UpdateLoadAtAllLevels implements ActivityVisitor{
-//
-// private double load = 0.0;
-//
-// private StateManagerImpl states;
-//
-// private VehicleRoute vehicleRoute;
-//
-// public UpdateLoadAtAllLevels(StateManagerImpl states) {
-// super();
-// this.states = states;
-// }
-//
-// @Override
-// public void begin(VehicleRoute route) {
-// vehicleRoute = route;
-// }
-//
-// @Override
-// public void visit(TourActivity activity) {
-// load += (double)activity.getCapacityDemand();
-// states.putActivityState(activity, StateTypes.LOAD, new StateImpl(load));
-// }
-//
-// @Override
-// public void finish() {
-// states.putRouteState(vehicleRoute, StateTypes.LOAD, new StateImpl(load));
-// load=0;
-// vehicleRoute = null;
-// }
-//
-// }
-//
-// static class UpdateLoadAtRouteLevel implements JobInsertedListener, InsertionStartsListener{
-//
-// private StateManagerImpl states;
-//
-// public UpdateLoadAtRouteLevel(StateManagerImpl states) {
-// super();
-// this.states = states;
-// }
-//
-// @Override
-// public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
-// if(!(job2insert instanceof Service)){
-// return;
-// }
-// double oldLoad = states.getRouteState(inRoute, StateTypes.LOAD).toDouble();
-// states.putRouteState(inRoute, StateTypes.LOAD, new StateImpl(oldLoad + job2insert.getCapacityDemand()));
-// }
-//
-// @Override
-// public void informInsertionStarts(Collection vehicleRoutes, Collection unassignedJobs) {
-// for(VehicleRoute route : vehicleRoutes){
-// int load = 0;
-// for(Job j : route.getTourActivities().getJobs()){
-// load += j.getCapacityDemand();
-// }
-// states.putRouteState(route, StateTypes.LOAD, new StateImpl(load));
-// }
-//
-// }
-//
-// }
-//
-//>>>>>>> refs/heads/master
- static class UpdateStates implements JobInsertedListener, RuinListener{
-
- private RouteActivityVisitor routeActivityVisitor;
-
- private ReverseRouteActivityVisitor revRouteActivityVisitor;
-
- public UpdateStates(StateManager states, VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts activityCosts) {
- routeActivityVisitor = new RouteActivityVisitor();
- routeActivityVisitor.addActivityVisitor(new UpdateActivityTimes(routingCosts));
- routeActivityVisitor.addActivityVisitor(new UpdateCostsAtAllLevels(activityCosts, routingCosts, states));
- routeActivityVisitor.addActivityVisitor(new UpdateLoadAtAllLevels(states));
-
- revRouteActivityVisitor = new ReverseRouteActivityVisitor();
- revRouteActivityVisitor.addActivityVisitor(new UpdateLatestOperationStartTimeAtActLocations(states, routingCosts));
-
- }
-
- public void update(VehicleRoute route){
- routeActivityVisitor.visit(route);
- revRouteActivityVisitor.visit(route);
- }
-
- @Override
- public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
- routeActivityVisitor.visit(inRoute);
- revRouteActivityVisitor.visit(inRoute);
- }
-
- @Override
- public void ruinStarts(Collection routes) {}
-
- @Override
- public void ruinEnds(Collection routes,Collection unassignedJobs) {
- for(VehicleRoute route : routes) {
- routeActivityVisitor.visit(route);
- revRouteActivityVisitor.visit(route);
- }
- }
-
- @Override
- public void removed(Job job, VehicleRoute fromRoute) {}
-
- }
-//
-// static class UpdateFuturePickupsAtActivityLevel implements ReverseActivityVisitor {
-// private StateManagerImpl stateManager;
-// private int futurePicks = 0;
-// private VehicleRoute route;
-//
-// public UpdateFuturePickupsAtActivityLevel(StateManagerImpl stateManager) {
-// super();
-// this.stateManager = stateManager;
-// }
-//
-// @Override
-// public void begin(VehicleRoute route) {
-// this.route = route;
-// }
-//
-// @Override
-// public void visit(TourActivity act) {
-// stateManager.putActivityState(act, StateTypes.FUTURE_PICKS, new StateImpl(futurePicks));
-// if(act instanceof PickupActivity || act instanceof ServiceActivity){
-// futurePicks += act.getCapacityDemand();
-// }
-// assert futurePicks <= route.getVehicle().getCapacity() : "sum of pickups must not be > vehicleCap";
-// assert futurePicks >= 0 : "sum of pickups must not < 0";
-// }
-//
-// @Override
-// public void finish() {
-// futurePicks = 0;
-// route = null;
-// }
-// }
-//
-// static class UpdateOccuredDeliveriesAtActivityLevel implements ActivityVisitor {
-// private StateManagerImpl stateManager;
-// private int deliveries = 0;
-// private VehicleRoute route;
-//
-// public UpdateOccuredDeliveriesAtActivityLevel(StateManagerImpl stateManager) {
-// super();
-// this.stateManager = stateManager;
-// }
-//
-// @Override
-// public void begin(VehicleRoute route) {
-// this.route = route;
-// }
-//
-// @Override
-// public void visit(TourActivity act) {
-// if(act instanceof DeliveryActivity){
-// deliveries += Math.abs(act.getCapacityDemand());
-// }
-// stateManager.putActivityState(act, StateTypes.PAST_DELIVERIES, new StateImpl(deliveries));
-// assert deliveries >= 0 : "deliveries < 0";
-// assert deliveries <= route.getVehicle().getCapacity() : "deliveries > vehicleCap";
-// }
-//
-// @Override
-// public void finish() {
-// deliveries = 0;
-// route = null;
-// }
-// }
-//
-// /**
-// * Updates load at activity level. Note that this assumed that StateTypes.LOAD_AT_DEPOT is already updated, i.e. it starts by setting loadAtDepot to StateTypes.LOAD_AT_DEPOT.
-// * If StateTypes.LOAD_AT_DEPOT is not set, it starts with 0 load at depot.
-// *
-// * @author stefan
-// *
-// */
-// static class UpdateLoadAtActivityLevel implements ActivityVisitor {
-// private StateManagerImpl stateManager;
-// private int currentLoad = 0;
-// private VehicleRoute route;
-//
-// public UpdateLoadAtActivityLevel(StateManagerImpl stateManager) {
-// super();
-// this.stateManager = stateManager;
-// }
-//
-// @Override
-// public void begin(VehicleRoute route) {
-// currentLoad = (int) stateManager.getRouteState(route, StateTypes.LOAD_AT_DEPOT).toDouble();
-// this.route = route;
-// }
-//
-// @Override
-// public void visit(TourActivity act) {
-// currentLoad += act.getCapacityDemand();
-// stateManager.putActivityState(act, StateTypes.LOAD, new StateImpl(currentLoad));
-// assert currentLoad <= route.getVehicle().getCapacity() : "currentLoad at activity must not be > vehicleCapacity";
-// assert currentLoad >= 0 : "currentLoad at act must not be < 0";
-// }
-//
-// @Override
-// public void finish() {
-// currentLoad = 0;
-// }
-// }
-//
-// static class ResetStateManager implements IterationStartsListener {
-//
-// private StateManagerImpl stateManager;
-//
-// public ResetStateManager(StateManagerImpl stateManager) {
-// super();
-// this.stateManager = stateManager;
-// }
-//
-// @Override
-// public void informIterationStarts(int i, VehicleRoutingProblem problem, Collection solutions) {
-// stateManager.clear();
-// }
-// }
-//
-// static interface InsertionStarts {
-//
-// void insertionStarts(VehicleRoute route);
-//
-// }
-//
-// static class UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts implements InsertionStarts {
-//
-// private StateManagerImpl stateManager;
-//
-// public UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts(StateManagerImpl stateManager) {
-// super();
-// this.stateManager = stateManager;
-// }
-//
-// @Override
-// public void insertionStarts(VehicleRoute route) {
-// int loadAtDepot = 0;
-// int loadAtEnd = 0;
-// for(Job j : route.getTourActivities().getJobs()){
-// if(j instanceof Delivery){
-// loadAtDepot += j.getCapacityDemand();
-// }
-// else if(j instanceof Pickup || j instanceof Service){
-// loadAtEnd += j.getCapacityDemand();
-// }
-// }
-// stateManager.putRouteState(route, StateTypes.LOAD_AT_DEPOT, new StateImpl(loadAtDepot));
-// stateManager.putRouteState(route, StateTypes.LOAD, new StateImpl(loadAtEnd));
-// }
-//
-// }
-//
-
-
-
-}
diff --git a/jsprit-core/src/main/java/algorithms/StateUtils.java b/jsprit-core/src/main/java/algorithms/StateUtils.java
index e1d8e4cb..86ee258d 100644
--- a/jsprit-core/src/main/java/algorithms/StateUtils.java
+++ b/jsprit-core/src/main/java/algorithms/StateUtils.java
@@ -2,10 +2,10 @@ package algorithms;
import basics.VehicleRoutingProblem;
-public class StateUtils {
+class StateUtils {
public static void addCoreStateUpdaters(VehicleRoutingProblem vrp, StateManager stateManager){
- stateManager.addListener(new InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts(stateManager));
+ stateManager.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts(stateManager));
stateManager.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(stateManager));
stateManager.addActivityVisitor(new UpdateActivityTimes(vrp.getTransportCosts()));
@@ -14,7 +14,9 @@ public class StateUtils {
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/UpdateCostsAtAllLevels.java b/jsprit-core/src/main/java/algorithms/UpdateCostsAtAllLevels.java
index dfc2bcb9..0bc22252 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateCostsAtAllLevels.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateCostsAtAllLevels.java
@@ -82,7 +82,7 @@ class UpdateCostsAtAllLevels implements ActivityVisitor,StateUpdater{
totalOperationCost += transportCost;
totalOperationCost += actCost;
- states.putActivityState(act, StateIdFactory.COSTS, new StateImpl(totalOperationCost));
+ states.putActivityState(act, StateFactory.COSTS, new StateImpl(totalOperationCost));
prevAct = act;
startTimeAtPrevAct = timeTracker.getActEndTime();
@@ -101,7 +101,7 @@ class UpdateCostsAtAllLevels implements ActivityVisitor,StateUpdater{
totalOperationCost += actCost;
// totalOperationCost += getFixCosts(vehicleRoute.getVehicle());
- states.putRouteState(vehicleRoute, StateIdFactory.COSTS, new StateImpl(totalOperationCost));
+ states.putRouteState(vehicleRoute, StateFactory.COSTS, new StateImpl(totalOperationCost));
//this is rather strange and likely to change
vehicleRoute.getVehicleRouteCostCalculator().price(vehicleRoute.getDriver());
diff --git a/jsprit-core/src/main/java/algorithms/UpdateCostsAtRouteLevel.java b/jsprit-core/src/main/java/algorithms/UpdateCostsAtRouteLevel.java
index 86b5144e..9f15f920 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateCostsAtRouteLevel.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateCostsAtRouteLevel.java
@@ -29,9 +29,9 @@ class UpdateCostsAtRouteLevel implements StateUpdater,JobInsertedListener, Inser
@Override
public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
// inRoute.getVehicleRouteCostCalculator().addTransportCost(additionalCosts);
- double oldCosts = states.getRouteState(inRoute, StateIdFactory.COSTS).toDouble();
+ double oldCosts = states.getRouteState(inRoute, StateFactory.COSTS).toDouble();
oldCosts += additionalCosts;
- states.putRouteState(inRoute, StateIdFactory.COSTS, new StateImpl(oldCosts));
+ states.putRouteState(inRoute, StateFactory.COSTS, new StateImpl(oldCosts));
}
@Override
@@ -52,7 +52,7 @@ class UpdateCostsAtRouteLevel implements StateUpdater,JobInsertedListener, Inser
for(VehicleRoute route : vehicleRoutes){
if(route.isEmpty()) continue;
route.getVehicleRouteCostCalculator().reset();
- route.getVehicleRouteCostCalculator().addOtherCost(states.getRouteState(route, StateIdFactory.COSTS).toDouble());
+ route.getVehicleRouteCostCalculator().addOtherCost(states.getRouteState(route, StateFactory.COSTS).toDouble());
route.getVehicleRouteCostCalculator().price(route.getVehicle());
// forwardInTime.iterate(route);
}
diff --git a/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTimeWindowAtActLocations.java b/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTimeWindowAtActLocations.java
index 4665c45a..722072ea 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTimeWindowAtActLocations.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTimeWindowAtActLocations.java
@@ -25,7 +25,7 @@ class UpdateEarliestStartTimeWindowAtActLocations implements ActivityVisitor,Sta
@Override
public void visit(TourActivity activity) {
timeTracker.visit(activity);
- states.putActivityState(activity, StateIdFactory.EARLIEST_OPERATION_START_TIME, new StateImpl(Math.max(timeTracker.getActArrTime(), activity.getTheoreticalEarliestOperationStartTime())));
+ states.putActivityState(activity, StateFactory.EARLIEST_OPERATION_START_TIME, new StateImpl(Math.max(timeTracker.getActArrTime(), activity.getTheoreticalEarliestOperationStartTime())));
}
diff --git a/jsprit-core/src/main/java/algorithms/UpdateFuturePickupsAtActivityLevel.java b/jsprit-core/src/main/java/algorithms/UpdateFuturePickupsAtActivityLevel.java
index bfc0afff..cb6ddafe 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateFuturePickupsAtActivityLevel.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateFuturePickupsAtActivityLevel.java
@@ -1,6 +1,5 @@
package algorithms;
-import algorithms.StateManager.StateImpl;
import basics.route.PickupActivity;
import basics.route.ServiceActivity;
import basics.route.TourActivity;
@@ -23,7 +22,7 @@ class UpdateFuturePickupsAtActivityLevel implements ReverseActivityVisitor, Stat
@Override
public void visit(TourActivity act) {
- stateManager.putActivityState(act, StateIdFactory.FUTURE_PICKS, new StateImpl(futurePicks));
+ stateManager.putActivityState(act, StateFactory.FUTURE_PICKS, StateFactory.createState(futurePicks));
if(act instanceof PickupActivity || act instanceof ServiceActivity){
futurePicks += act.getCapacityDemand();
}
diff --git a/jsprit-core/src/main/java/algorithms/UpdateLatestOperationStartTimeAtActLocations.java b/jsprit-core/src/main/java/algorithms/UpdateLatestOperationStartTimeAtActLocations.java
index 413d3df0..51d31afd 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateLatestOperationStartTimeAtActLocations.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateLatestOperationStartTimeAtActLocations.java
@@ -39,7 +39,7 @@ class UpdateLatestOperationStartTimeAtActLocations implements ReverseActivityVis
double potentialLatestArrivalTimeAtCurrAct = latestArrTimeAtPrevAct - transportCosts.getBackwardTransportTime(activity.getLocationId(), prevAct.getLocationId(), latestArrTimeAtPrevAct, route.getDriver(),route.getVehicle()) - activity.getOperationTime();
double latestArrivalTime = Math.min(activity.getTheoreticalLatestOperationStartTime(), potentialLatestArrivalTimeAtCurrAct);
- states.putActivityState(activity, StateIdFactory.LATEST_OPERATION_START_TIME, new StateImpl(latestArrivalTime));
+ states.putActivityState(activity, StateFactory.LATEST_OPERATION_START_TIME, new StateImpl(latestArrivalTime));
latestArrTimeAtPrevAct = latestArrivalTime;
prevAct = activity;
diff --git a/jsprit-core/src/main/java/algorithms/UpdateLoadAtActivityLevel.java b/jsprit-core/src/main/java/algorithms/UpdateLoadAtActivityLevel.java
index ae063604..48dc890b 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateLoadAtActivityLevel.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateLoadAtActivityLevel.java
@@ -28,14 +28,14 @@ class UpdateLoadAtActivityLevel implements ActivityVisitor, StateUpdater {
*
* Thus it DEPENDS on StateTypes.LOAD_AT_DEPOT
*
- *
If you want to update StateTypes.LOAD_AT_DEPOT see {@link InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts}, {@link UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted}
+ *
If you want to update StateTypes.LOAD_AT_DEPOT see {@link UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts}, {@link UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted}
*
*
The loads can be retrieved by
* stateManager.getActivityState(activity,StateTypes.LOAD);
*
*
*
- * @see {@link InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts}, {@link UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted}
+ * @see {@link UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts}, {@link UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted}
* @author stefan
*
*/
@@ -46,20 +46,21 @@ class UpdateLoadAtActivityLevel implements ActivityVisitor, StateUpdater {
@Override
public void begin(VehicleRoute route) {
- currentLoad = (int) stateManager.getRouteState(route, StateIdFactory.LOAD_AT_BEGINNING).toDouble();
+ currentLoad = (int) stateManager.getRouteState(route, StateFactory.LOAD_AT_BEGINNING).toDouble();
this.route = route;
}
@Override
public void visit(TourActivity act) {
currentLoad += act.getCapacityDemand();
- stateManager.putActivityState(act, StateIdFactory.LOAD, new StateImpl(currentLoad));
+ stateManager.putActivityState(act, StateFactory.LOAD, StateFactory.createState(currentLoad));
assert currentLoad <= route.getVehicle().getCapacity() : "currentLoad at activity must not be > vehicleCapacity";
assert currentLoad >= 0 : "currentLoad at act must not be < 0";
}
@Override
public void finish() {
+// stateManager.putRouteState(route, StateFactory., state)
currentLoad = 0;
}
}
\ No newline at end of file
diff --git a/jsprit-core/src/main/java/algorithms/UpdateLoadAtAllLevels.java b/jsprit-core/src/main/java/algorithms/UpdateLoadAtAllLevels.java
index 0ee7e189..f4e15523 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateLoadAtAllLevels.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateLoadAtAllLevels.java
@@ -25,12 +25,12 @@ class UpdateLoadAtAllLevels implements ActivityVisitor,StateUpdater{
@Override
public void visit(TourActivity activity) {
load += (double)activity.getCapacityDemand();
- states.putActivityState(activity, StateIdFactory.LOAD, new StateImpl(load));
+ states.putActivityState(activity, StateFactory.LOAD, new StateImpl(load));
}
@Override
public void finish() {
- states.putRouteState(vehicleRoute, StateIdFactory.LOAD, new StateImpl(load));
+ states.putRouteState(vehicleRoute, StateFactory.LOAD, new StateImpl(load));
load=0;
vehicleRoute = null;
}
diff --git a/jsprit-core/src/main/java/algorithms/UpdateLoadAtRouteLevel.java b/jsprit-core/src/main/java/algorithms/UpdateLoadAtRouteLevel.java
index eda51bb4..a80130af 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateLoadAtRouteLevel.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateLoadAtRouteLevel.java
@@ -35,8 +35,8 @@ class UpdateLoadAtRouteLevel implements JobInsertedListener, InsertionStartsList
if(!(job2insert instanceof Service)){
return;
}
- double oldLoad = states.getRouteState(inRoute, StateIdFactory.LOAD).toDouble();
- states.putRouteState(inRoute, StateIdFactory.LOAD, new StateImpl(oldLoad + job2insert.getCapacityDemand()));
+ double oldLoad = states.getRouteState(inRoute, StateFactory.LOAD).toDouble();
+ states.putRouteState(inRoute, StateFactory.LOAD, StateFactory.createState(oldLoad + job2insert.getCapacityDemand()));
}
@Override
@@ -46,7 +46,7 @@ class UpdateLoadAtRouteLevel implements JobInsertedListener, InsertionStartsList
for(Job j : route.getTourActivities().getJobs()){
load += j.getCapacityDemand();
}
- states.putRouteState(route, StateIdFactory.LOAD, new StateImpl(load));
+ states.putRouteState(route, StateFactory.LOAD, new StateImpl(load));
}
}
diff --git a/jsprit-core/src/main/java/algorithms/InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts.java b/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts.java
similarity index 81%
rename from jsprit-core/src/main/java/algorithms/InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts.java
rename to jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts.java
index 60d65678..8b652430 100644
--- a/jsprit-core/src/main/java/algorithms/InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts.java
@@ -20,7 +20,7 @@ import basics.route.VehicleRoute;
*
* @param stateManager
*/
-class InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts implements InsertionStartsListener {
+class UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts implements InsertionStartsListener {
private StateManager stateManager;
@@ -34,7 +34,7 @@ class InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts implements Insertio
*
* @param stateManager
*/
- public InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts(StateManager stateManager) {
+ public UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts(StateManager stateManager) {
super();
this.stateManager = stateManager;
}
@@ -50,8 +50,8 @@ class InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts implements Insertio
loadAtEnd += j.getCapacityDemand();
}
}
- stateManager.putRouteState(route, StateIdFactory.LOAD_AT_BEGINNING, new StateImpl(loadAtDepot));
- stateManager.putRouteState(route, StateIdFactory.LOAD, new StateImpl(loadAtEnd));
+ stateManager.putRouteState(route, StateFactory.LOAD_AT_BEGINNING, StateFactory.createState(loadAtDepot));
+ stateManager.putRouteState(route, StateFactory.LOAD_AT_END, StateFactory.createState(loadAtEnd));
}
@Override
diff --git a/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted.java b/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted.java
index 75fa3760..e73fa7b2 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted.java
@@ -38,14 +38,14 @@ class UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted implements JobInsert
@Override
public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
if(job2insert instanceof Delivery){
- int loadAtDepot = (int) stateManager.getRouteState(inRoute, StateIdFactory.LOAD_AT_BEGINNING).toDouble();
+ int loadAtDepot = (int) stateManager.getRouteState(inRoute, StateFactory.LOAD_AT_BEGINNING).toDouble();
// log.info("loadAtDepot="+loadAtDepot);
- stateManager.putRouteState(inRoute, StateIdFactory.LOAD_AT_BEGINNING, new StateImpl(loadAtDepot + job2insert.getCapacityDemand()));
+ stateManager.putRouteState(inRoute, StateFactory.LOAD_AT_BEGINNING, StateFactory.createState(loadAtDepot + job2insert.getCapacityDemand()));
}
else if(job2insert instanceof Pickup || job2insert instanceof Service){
- int loadAtEnd = (int) stateManager.getRouteState(inRoute, StateIdFactory.LOAD).toDouble();
+ int loadAtEnd = (int) stateManager.getRouteState(inRoute, StateFactory.LOAD_AT_END).toDouble();
// log.info("loadAtEnd="+loadAtEnd);
- stateManager.putRouteState(inRoute, StateIdFactory.LOAD, new StateImpl(loadAtEnd + job2insert.getCapacityDemand()));
+ stateManager.putRouteState(inRoute, StateFactory.LOAD_AT_END, StateFactory.createState(loadAtEnd + job2insert.getCapacityDemand()));
}
}
diff --git a/jsprit-core/src/main/java/algorithms/UpdateMaxLoad.java b/jsprit-core/src/main/java/algorithms/UpdateMaxLoad.java
new file mode 100644
index 00000000..66457641
--- /dev/null
+++ b/jsprit-core/src/main/java/algorithms/UpdateMaxLoad.java
@@ -0,0 +1,68 @@
+package algorithms;
+
+import basics.route.TourActivity;
+import basics.route.VehicleRoute;
+
+/**
+ * Updates load at activity level.
+ *
+ *
Note that this assumes that StateTypes.LOAD_AT_DEPOT is already updated, i.e. it starts by setting loadAtDepot to StateTypes.LOAD_AT_DEPOT.
+ * If StateTypes.LOAD_AT_DEPOT is not set, it starts with 0 load at depot.
+ *
+ *
Thus it DEPENDS on StateTypes.LOAD_AT_DEPOT
+ *
+ * @author stefan
+ *
+ */
+class UpdateMaxLoad implements ActivityVisitor, StateUpdater {
+ private StateManager stateManager;
+ private int currentLoad = 0;
+ private VehicleRoute route;
+ private int maxLoad = 0;
+
+ /**
+ * Updates load at activity level.
+ *
+ *
Note that this assumes that StateTypes.LOAD_AT_DEPOT is already updated, i.e. it starts by setting loadAtDepot to StateTypes.LOAD_AT_DEPOT.
+ * If StateTypes.LOAD_AT_DEPOT is not set, it starts with 0 load at depot.
+ *
+ *
Thus it DEPENDS on StateTypes.LOAD_AT_DEPOT
+ *
+ *
If you want to update StateTypes.LOAD_AT_DEPOT see {@link UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts}, {@link UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted}
+ *
+ *
The loads can be retrieved by
+ * stateManager.getActivityState(activity,StateTypes.LOAD);
+ *
+ *
+ *
+ * @see {@link UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts}, {@link UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted}
+ * @author stefan
+ *
+ */
+ public UpdateMaxLoad(StateManager stateManager) {
+ super();
+ this.stateManager = stateManager;
+ }
+
+ @Override
+ public void begin(VehicleRoute route) {
+ currentLoad = (int) stateManager.getRouteState(route, StateFactory.LOAD_AT_BEGINNING).toDouble();
+ maxLoad = currentLoad;
+ this.route = route;
+ }
+
+ @Override
+ public void visit(TourActivity act) {
+ currentLoad += act.getCapacityDemand();
+ maxLoad = Math.max(maxLoad, currentLoad);
+ assert currentLoad <= route.getVehicle().getCapacity() : "currentLoad at activity must not be > vehicleCapacity";
+ assert currentLoad >= 0 : "currentLoad at act must not be < 0";
+ }
+
+ @Override
+ public void finish() {
+ stateManager.putRouteState(route, StateFactory.MAXLOAD, StateFactory.createState(maxLoad));
+ currentLoad = 0;
+ maxLoad = 0;
+ }
+}
\ No newline at end of file
diff --git a/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveriesAtActivityLevel.java b/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveriesAtActivityLevel.java
index 2daf175d..f1572a33 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveriesAtActivityLevel.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveriesAtActivityLevel.java
@@ -25,7 +25,7 @@ class UpdateOccuredDeliveriesAtActivityLevel implements ActivityVisitor, StateUp
if(act instanceof DeliveryActivity){
deliveries += Math.abs(act.getCapacityDemand());
}
- stateManager.putActivityState(act, StateIdFactory.PAST_DELIVERIES, new StateImpl(deliveries));
+ stateManager.putActivityState(act, StateFactory.PAST_DELIVERIES, StateFactory.createState(deliveries));
assert deliveries >= 0 : "deliveries < 0";
assert deliveries <= route.getVehicle().getCapacity() : "deliveries > vehicleCap";
}
diff --git a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithmBuilder.java b/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithmBuilder.java
new file mode 100644
index 00000000..45e50de7
--- /dev/null
+++ b/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithmBuilder.java
@@ -0,0 +1,39 @@
+package algorithms;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import basics.VehicleRoutingAlgorithm;
+import basics.VehicleRoutingProblem;
+import basics.algo.SearchStrategyManager;
+import basics.algo.VehicleRoutingAlgorithmListener;
+
+public class VehicleRoutingAlgorithmBuilder {
+
+ private VehicleRoutingProblem vrp;
+
+ private SearchStrategyManager searchStrategyManager;
+
+ private StateManager stateManager;
+
+ private Collection listeners = new ArrayList();
+
+ public VehicleRoutingAlgorithmBuilder(VehicleRoutingProblem vrp, SearchStrategyManager searchStrategyManager, StateManager stateManager) {
+ super();
+ this.vrp = vrp;
+ this.searchStrategyManager = searchStrategyManager;
+ this.stateManager = stateManager;
+ }
+
+ public void addListener(VehicleRoutingAlgorithmListener listener){
+ listeners.add(listener);
+ }
+
+ public VehicleRoutingAlgorithm build(){
+ VehicleRoutingAlgorithm algorithm = new VehicleRoutingAlgorithm(vrp, searchStrategyManager);
+ algorithm.getAlgorithmListeners().addListener(stateManager);
+ algorithm.getSearchStrategyManager().addSearchStrategyModuleListener(stateManager);
+ return algorithm;
+ }
+
+}
diff --git a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java b/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java
index 0a090d26..dc90bf93 100644
--- a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java
+++ b/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java
@@ -509,7 +509,7 @@ public class VehicleRoutingAlgorithms {
// routeChangedListener.addVisitor(new StateUpdates.UpdateLatestOperationStartTimeAtActLocations(stateManager, vrp.getTransportCosts()));
// routeChangedListener.addVisitor(new StateUpdates.UpdateFuturePickupsAtActivityLevel(stateManager));
- stateManager.addListener(new InitializeLoadsAtStartAndEndOfRouteWhenInsertionStarts(stateManager));
+ stateManager.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts(stateManager));
stateManager.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(stateManager));
stateManager.addActivityVisitor(new UpdateActivityTimes(vrp.getTransportCosts()));
@@ -550,7 +550,7 @@ public class VehicleRoutingAlgorithms {
double costs = 0.0;
for(VehicleRoute route : solution.getRoutes()){
- costs += stateManager.getRouteState(route, StateIdFactory.COSTS).toDouble() + getFixedCosts(route.getVehicle());
+ costs += stateManager.getRouteState(route, StateFactory.COSTS).toDouble() + getFixedCosts(route.getVehicle());
}
solution.setCost(costs);
diff --git a/jsprit-core/src/main/java/algorithms/CalculatesVehTypeDepServiceInsertion.java b/jsprit-core/src/main/java/algorithms/VehicleTypeDependentJobInsertionCalculator.java
similarity index 89%
rename from jsprit-core/src/main/java/algorithms/CalculatesVehTypeDepServiceInsertion.java
rename to jsprit-core/src/main/java/algorithms/VehicleTypeDependentJobInsertionCalculator.java
index 63ca251d..32e401d3 100644
--- a/jsprit-core/src/main/java/algorithms/CalculatesVehTypeDepServiceInsertion.java
+++ b/jsprit-core/src/main/java/algorithms/VehicleTypeDependentJobInsertionCalculator.java
@@ -30,15 +30,15 @@ import basics.route.VehicleRoute;
-final class CalculatesVehTypeDepServiceInsertion implements JobInsertionCalculator{
+final class VehicleTypeDependentJobInsertionCalculator implements JobInsertionCalculator{
- private Logger logger = Logger.getLogger(CalculatesVehTypeDepServiceInsertion.class);
+ private Logger logger = Logger.getLogger(VehicleTypeDependentJobInsertionCalculator.class);
private final VehicleFleetManager fleetManager;
private final JobInsertionCalculator insertionCalculator;
- public CalculatesVehTypeDepServiceInsertion(final VehicleFleetManager fleetManager, final JobInsertionCalculator jobInsertionCalc) {
+ public VehicleTypeDependentJobInsertionCalculator(final VehicleFleetManager fleetManager, final JobInsertionCalculator jobInsertionCalc) {
this.fleetManager = fleetManager;
this.insertionCalculator = jobInsertionCalc;
logger.info("inialise " + this);
diff --git a/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java b/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java
index dbc92c3a..cf5d58a0 100644
--- a/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java
+++ b/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java
@@ -63,7 +63,7 @@ public class BuildCVRPAlgoFromScratchTest {
VehicleFleetManager fleetManager = new InfiniteVehicles(vrp.getVehicles());
- JobInsertionCalculator finalServiceInsertion = new CalculatesVehTypeDepServiceInsertion(fleetManager, serviceInsertion);
+ JobInsertionCalculator finalServiceInsertion = new VehicleTypeDependentJobInsertionCalculator(fleetManager, serviceInsertion);
BestInsertion bestInsertion = new BestInsertion(finalServiceInsertion);
@@ -76,7 +76,7 @@ public class BuildCVRPAlgoFromScratchTest {
public void calculateCosts(VehicleRoutingProblemSolution solution) {
double costs = 0.0;
for(VehicleRoute route : solution.getRoutes()){
- costs += stateManager.getRouteState(route, StateIdFactory.COSTS).toDouble();
+ costs += stateManager.getRouteState(route, StateFactory.COSTS).toDouble();
}
solution.setCost(costs);
}
diff --git a/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java b/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java
index 3ef7be5a..44e4f841 100644
--- a/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java
+++ b/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java
@@ -67,7 +67,7 @@ public class BuildPDVRPAlgoFromScratchTest {
// CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardLoadConstraint(stateManager));
VehicleFleetManager fleetManager = new InfiniteVehicles(vrp.getVehicles());
- JobInsertionCalculator finalServiceInsertion = new CalculatesVehTypeDepServiceInsertion(fleetManager, serviceInsertion);
+ JobInsertionCalculator finalServiceInsertion = new VehicleTypeDependentJobInsertionCalculator(fleetManager, serviceInsertion);
BestInsertion bestInsertion = new BestInsertion(finalServiceInsertion);
@@ -80,7 +80,7 @@ public class BuildPDVRPAlgoFromScratchTest {
public void calculateCosts(VehicleRoutingProblemSolution solution) {
double costs = 0.0;
for(VehicleRoute route : solution.getRoutes()){
- costs += stateManager.getRouteState(route, StateIdFactory.COSTS).toDouble();
+ costs += stateManager.getRouteState(route, StateFactory.COSTS).toDouble();
}
solution.setCost(costs);
}
@@ -131,8 +131,8 @@ public class BuildPDVRPAlgoFromScratchTest {
loadAtEnd += j.getCapacityDemand();
}
}
- stateManager.putRouteState(route, StateIdFactory.LOAD_AT_BEGINNING, new StateImpl(loadAtDepot));
- stateManager.putRouteState(route, StateIdFactory.LOAD, new StateImpl(loadAtEnd));
+ stateManager.putRouteState(route, StateFactory.LOAD_AT_BEGINNING, new StateImpl(loadAtDepot));
+ stateManager.putRouteState(route, StateFactory.LOAD, new StateImpl(loadAtEnd));
iterateForward.visit(route);
iterateBackward.visit(route);
}
@@ -149,14 +149,14 @@ public class BuildPDVRPAlgoFromScratchTest {
// log.info("insert job " + job2insert.getClass().toString() + " job " + job2insert + "" + job2insert.getCapacityDemand() + " in route " + inRoute.getTourActivities());
if(job2insert instanceof Delivery){
- int loadAtDepot = (int) stateManager.getRouteState(inRoute, StateIdFactory.LOAD_AT_BEGINNING).toDouble();
+ int loadAtDepot = (int) stateManager.getRouteState(inRoute, StateFactory.LOAD_AT_BEGINNING).toDouble();
// log.info("loadAtDepot="+loadAtDepot);
- stateManager.putRouteState(inRoute, StateIdFactory.LOAD_AT_BEGINNING, new StateImpl(loadAtDepot + job2insert.getCapacityDemand()));
+ stateManager.putRouteState(inRoute, StateFactory.LOAD_AT_BEGINNING, StateFactory.createState(loadAtDepot + job2insert.getCapacityDemand()));
}
if(job2insert instanceof Pickup){
- int loadAtEnd = (int) stateManager.getRouteState(inRoute, StateIdFactory.LOAD).toDouble();
+ int loadAtEnd = (int) stateManager.getRouteState(inRoute, StateFactory.LOAD_AT_END).toDouble();
// log.info("loadAtEnd="+loadAtEnd);
- stateManager.putRouteState(inRoute, StateIdFactory.LOAD, new StateImpl(loadAtEnd + job2insert.getCapacityDemand()));
+ stateManager.putRouteState(inRoute, StateFactory.LOAD_AT_END, StateFactory.createState(loadAtEnd + job2insert.getCapacityDemand()));
}
iterateForward.visit(inRoute);
iterateBackward.visit(inRoute);
diff --git a/jsprit-core/src/test/java/algorithms/CalcVehicleTypeDependentServiceInsertionTest.java b/jsprit-core/src/test/java/algorithms/CalcVehicleTypeDependentServiceInsertionTest.java
index 46ae53a6..4f7c1f34 100644
--- a/jsprit-core/src/test/java/algorithms/CalcVehicleTypeDependentServiceInsertionTest.java
+++ b/jsprit-core/src/test/java/algorithms/CalcVehicleTypeDependentServiceInsertionTest.java
@@ -77,7 +77,7 @@ public class CalcVehicleTypeDependentServiceInsertionTest {
when(calc.calculate(vehicleRoute, service, veh1, veh1.getEarliestDeparture(), null, Double.MAX_VALUE)).thenReturn(iDataVeh1);
when(calc.calculate(vehicleRoute, service, veh2, veh2.getEarliestDeparture(), null, Double.MAX_VALUE)).thenReturn(iDataVeh2);
when(calc.calculate(vehicleRoute, service, veh2, veh2.getEarliestDeparture(), null, 10.0)).thenReturn(iDataVeh2);
- CalculatesVehTypeDepServiceInsertion insertion = new CalculatesVehTypeDepServiceInsertion(fleetManager,calc);
+ VehicleTypeDependentJobInsertionCalculator insertion = new VehicleTypeDependentJobInsertionCalculator(fleetManager,calc);
InsertionData iData = insertion.calculate(vehicleRoute, service, null, 0.0, null, Double.MAX_VALUE);
assertThat(iData.getSelectedVehicle(), is(veh1));
@@ -91,7 +91,7 @@ public class CalcVehicleTypeDependentServiceInsertionTest {
when(calc.calculate(vehicleRoute, service, veh1, veh1.getEarliestDeparture(), null, Double.MAX_VALUE)).thenReturn(iDataVeh1);
when(calc.calculate(vehicleRoute, service, veh2, veh2.getEarliestDeparture(), null, Double.MAX_VALUE)).thenReturn(iDataVeh2);
when(calc.calculate(vehicleRoute, service, veh2, veh2.getEarliestDeparture(), null, 20.0)).thenReturn(iDataVeh2);
- CalculatesVehTypeDepServiceInsertion insertion = new CalculatesVehTypeDepServiceInsertion(fleetManager,calc);
+ VehicleTypeDependentJobInsertionCalculator insertion = new VehicleTypeDependentJobInsertionCalculator(fleetManager,calc);
InsertionData iData = insertion.calculate(vehicleRoute, service, null, 0.0, null, Double.MAX_VALUE);
assertThat(iData.getSelectedVehicle(), is(veh2));
diff --git a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java b/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java
index fcc78bb3..6c1f00a6 100644
--- a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java
+++ b/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java
@@ -29,7 +29,6 @@ import org.junit.Test;
import util.Coordinate;
import util.ManhattanDistanceCalculator;
import util.RouteUtils;
-import algorithms.StateUpdates.UpdateStates;
import basics.Job;
import basics.Service;
import basics.VehicleRoutingProblem;
@@ -151,10 +150,10 @@ public class GendreauPostOptTest {
ServiceInsertionCalculator standardServiceInsertion = new ServiceInsertionCalculator(cost, new LocalActivityInsertionCostsCalculator(cost, activityCosts), new HardLoadConstraint(states), new HardTimeWindowActivityLevelConstraint(states, cost));
- CalculatesServiceInsertionConsideringFixCost withFixCost = new CalculatesServiceInsertionConsideringFixCost(standardServiceInsertion, states);
+ JobInsertionConsideringFixCostsCalculator withFixCost = new JobInsertionConsideringFixCostsCalculator(standardServiceInsertion, states);
withFixCost.setWeightOfFixCost(1.2);
- insertionCalc = new CalculatesVehTypeDepServiceInsertion(fleetManager, withFixCost);
+ insertionCalc = new VehicleTypeDependentJobInsertionCalculator(fleetManager, withFixCost);
// updater = new TourStateUpdater(states, cost, activityCosts);
@@ -185,14 +184,14 @@ public class GendreauPostOptTest {
// routes.add(new VehicleRoute(getEmptyTour(),getDriver(),getNoVehicle()));
- VehicleRoutingProblemSolution sol = new VehicleRoutingProblemSolution(routes, states.getRouteState(route, StateIdFactory.COSTS).toDouble() + getFixedCosts(routes));
+ VehicleRoutingProblemSolution sol = new VehicleRoutingProblemSolution(routes, states.getRouteState(route, StateFactory.COSTS).toDouble() + getFixedCosts(routes));
assertEquals(110.0, sol.getCost(), 0.5);
RuinRadial radialRuin = new RuinRadial(vrp, 0.2, new JobDistanceAvgCosts(vrp.getTransportCosts()));
- radialRuin.addListener(stateUpdater);
+// radialRuin.addListener(stateUpdater);
InsertionStrategy insertionStrategy = new BestInsertion(insertionCalc);
insertionStrategy.addListener(stateUpdater);
@@ -218,7 +217,7 @@ public class GendreauPostOptTest {
double c = 0.0;
for(VehicleRoute r : newSolution.getRoutes()){
- c += states.getRouteState(r, StateIdFactory.COSTS).toDouble() + r.getVehicle().getType().getVehicleCostParams().fix;
+ c += states.getRouteState(r, StateFactory.COSTS).toDouble() + r.getVehicle().getType().getVehicleCostParams().fix;
}
return c;
diff --git a/jsprit-core/src/test/java/algorithms/StateUpdates.java b/jsprit-core/src/test/java/algorithms/StateUpdates.java
new file mode 100644
index 00000000..2d974a0a
--- /dev/null
+++ b/jsprit-core/src/test/java/algorithms/StateUpdates.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * 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.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import basics.Job;
+import basics.algo.InsertionStartsListener;
+import basics.algo.JobInsertedListener;
+import basics.costs.VehicleRoutingActivityCosts;
+import basics.costs.VehicleRoutingTransportCosts;
+import basics.route.VehicleRoute;
+
+
+
+class UpdateStates implements JobInsertedListener, InsertionStartsListener{
+
+ private RouteActivityVisitor routeActivityVisitor;
+
+ private ReverseRouteActivityVisitor revRouteActivityVisitor;
+
+ private InsertionListeners insertionListeners = new InsertionListeners();
+
+ public UpdateStates(StateManager states, VehicleRoutingTransportCosts routingCosts, VehicleRoutingActivityCosts activityCosts) {
+ routeActivityVisitor = new RouteActivityVisitor();
+ routeActivityVisitor.addActivityVisitor(new UpdateActivityTimes(routingCosts));
+ routeActivityVisitor.addActivityVisitor(new UpdateCostsAtAllLevels(activityCosts, routingCosts, states));
+ routeActivityVisitor.addActivityVisitor(new UpdateLoadAtAllLevels(states));
+ routeActivityVisitor.addActivityVisitor(new UpdateMaxLoad(states));
+ revRouteActivityVisitor = new ReverseRouteActivityVisitor();
+ revRouteActivityVisitor.addActivityVisitor(new UpdateLatestOperationStartTimeAtActLocations(states, routingCosts));
+ insertionListeners.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts(states));
+ insertionListeners.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(states));
+ }
+
+ public void update(VehicleRoute route){
+ List routes = Arrays.asList(route);
+ insertionListeners.informInsertionStarts(routes, Collections.EMPTY_LIST);
+ routeActivityVisitor.visit(route);
+ revRouteActivityVisitor.visit(route);
+ }
+
+ @Override
+ public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
+ insertionListeners.informJobInserted(job2insert, inRoute, additionalCosts, additionalTime);
+ routeActivityVisitor.visit(inRoute);
+ revRouteActivityVisitor.visit(inRoute);
+ }
+
+ @Override
+ public void informInsertionStarts(Collection vehicleRoutes,Collection unassignedJobs) {
+ insertionListeners.informInsertionStarts(vehicleRoutes, unassignedJobs);
+ for(VehicleRoute route : vehicleRoutes) {
+ routeActivityVisitor.visit(route);
+ revRouteActivityVisitor.visit(route);
+ }
+ }
+
+ }
+
+
diff --git a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java
index f2077750..c7208987 100644
--- a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java
+++ b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java
@@ -28,7 +28,6 @@ import org.apache.log4j.Logger;
import org.junit.Before;
import org.junit.Test;
-import algorithms.StateUpdates.UpdateStates;
import basics.Job;
import basics.Service;
import basics.costs.VehicleRoutingTransportCosts;
diff --git a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java
index bb6302a3..2f69c137 100644
--- a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java
+++ b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java
@@ -30,7 +30,6 @@ import org.junit.Test;
import util.Coordinate;
import util.ManhattanDistanceCalculator;
-import algorithms.StateUpdates.UpdateStates;
import basics.Job;
import basics.Service;
import basics.costs.VehicleRoutingTransportCosts;
diff --git a/jsprit-core/src/test/java/algorithms/TestIterateRouteForwardInTime.java b/jsprit-core/src/test/java/algorithms/TestIterateRouteForwardInTime.java
index 90ddd2c5..489a9d0b 100644
--- a/jsprit-core/src/test/java/algorithms/TestIterateRouteForwardInTime.java
+++ b/jsprit-core/src/test/java/algorithms/TestIterateRouteForwardInTime.java
@@ -148,8 +148,8 @@ public class TestIterateRouteForwardInTime {
forwardInTime.addActivityVisitor(new UpdateLoadAtAllLevels(stateManager));
forwardInTime.visit(vehicleRoute);
- assertEquals(5.0, stateManager.getActivityState(firstAct,StateIdFactory.LOAD).toDouble(), 0.01);
- assertEquals(10.0, stateManager.getActivityState(secondAct,StateIdFactory.LOAD).toDouble(), 0.01);
+ assertEquals(5.0, stateManager.getActivityState(firstAct,StateFactory.LOAD).toDouble(), 0.01);
+ assertEquals(10.0, stateManager.getActivityState(secondAct,StateFactory.LOAD).toDouble(), 0.01);
}
@@ -173,9 +173,9 @@ public class TestIterateRouteForwardInTime {
forwardInTime.addActivityVisitor(new UpdateCostsAtAllLevels(new DefaultVehicleRoutingActivityCosts(), cost, stateManager));
forwardInTime.visit(vehicleRoute);
- assertEquals(10.0, stateManager.getActivityState(firstAct, StateIdFactory.COSTS).toDouble(),0.05);
- assertEquals(5.0, stateManager.getActivityState(firstAct, StateIdFactory.LOAD).toDouble(),0.05);
- assertEquals(10.0, stateManager.getActivityState(firstAct, StateIdFactory.EARLIEST_OPERATION_START_TIME).toDouble(),0.05);
+ assertEquals(10.0, stateManager.getActivityState(firstAct, StateFactory.COSTS).toDouble(),0.05);
+ assertEquals(5.0, stateManager.getActivityState(firstAct, StateFactory.LOAD).toDouble(),0.05);
+ assertEquals(10.0, stateManager.getActivityState(firstAct, StateFactory.EARLIEST_OPERATION_START_TIME).toDouble(),0.05);
// assertEquals(20.0, states.getState(tour.getActivities().get(0)).getLatestOperationStart(),0.05);
}
@@ -188,9 +188,9 @@ public class TestIterateRouteForwardInTime {
forwardInTime.addActivityVisitor(new UpdateCostsAtAllLevels(new DefaultVehicleRoutingActivityCosts(), cost, stateManager));
forwardInTime.visit(vehicleRoute);
- assertEquals(30.0, stateManager.getActivityState(secondAct, StateIdFactory.COSTS).toDouble(),0.05);
- assertEquals(10.0, stateManager.getActivityState(secondAct, StateIdFactory.LOAD).toDouble(),0.05);
- assertEquals(30.0, stateManager.getActivityState(secondAct, StateIdFactory.EARLIEST_OPERATION_START_TIME).toDouble(),0.05);
+ assertEquals(30.0, stateManager.getActivityState(secondAct, StateFactory.COSTS).toDouble(),0.05);
+ assertEquals(10.0, stateManager.getActivityState(secondAct, StateFactory.LOAD).toDouble(),0.05);
+ assertEquals(30.0, stateManager.getActivityState(secondAct, StateFactory.EARLIEST_OPERATION_START_TIME).toDouble(),0.05);
// assertEquals(40.0, states.getState(tour.getActivities().get(1)).getLatestOperationStart(),0.05);
}
@@ -202,7 +202,7 @@ public class TestIterateRouteForwardInTime {
forwardInTime.addActivityVisitor(new UpdateCostsAtAllLevels(new DefaultVehicleRoutingActivityCosts(), cost, stateManager));
forwardInTime.visit(vehicleRoute);
- assertEquals(40.0, stateManager.getRouteState(vehicleRoute,StateIdFactory.COSTS).toDouble(), 0.05);
+ assertEquals(40.0, stateManager.getRouteState(vehicleRoute,StateFactory.COSTS).toDouble(), 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 8ee6d005..476167b0 100644
--- a/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java
+++ b/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java
@@ -26,7 +26,6 @@ import org.junit.Test;
import util.Coordinate;
import util.ManhattanDistanceCalculator;
-import algorithms.StateUpdates.UpdateStates;
import basics.Job;
import basics.Service;
import basics.costs.VehicleRoutingTransportCosts;
@@ -102,7 +101,7 @@ public class TestTourStateUpdaterWithService {
states = new StateManager();
- VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("test", 0).build();
+ VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("test", 10).build();
vehicle = VehicleImpl.Builder.newInstance("testvehicle").setType(type).setLocationId("0,0")
.setEarliestStart(0.0).setLatestArrival(50.0).build();
@@ -119,8 +118,8 @@ public class TestTourStateUpdaterWithService {
@Test
public void testCalculatedCost() {
updateStates.update(vehicleRoute);
- assertEquals(40.0, states.getRouteState(vehicleRoute,StateIdFactory.COSTS).toDouble(), 0.05);
- assertEquals(10, states.getRouteState(vehicleRoute, StateIdFactory.LOAD).toDouble(), 0.05);
+ assertEquals(40.0, states.getRouteState(vehicleRoute,StateFactory.COSTS).toDouble(), 0.05);
+ assertEquals(10, states.getRouteState(vehicleRoute, StateFactory.LOAD).toDouble(), 0.05);
}
@Test
@@ -136,27 +135,27 @@ public class TestTourStateUpdaterWithService {
@Test
public void testStatesOfAct1(){
updateStates.update(vehicleRoute);
- assertEquals(10.0, states.getActivityState(tour.getActivities().get(0), StateIdFactory.COSTS).toDouble(),0.05);
- assertEquals(5.0, states.getActivityState(tour.getActivities().get(0), StateIdFactory.LOAD).toDouble(),0.05);
+ assertEquals(10.0, states.getActivityState(tour.getActivities().get(0), StateFactory.COSTS).toDouble(),0.05);
+ assertEquals(5.0, states.getActivityState(tour.getActivities().get(0), StateFactory.LOAD).toDouble(),0.05);
// assertEquals(10.0, states.getActivityState(tour.getActivities().get(0), StateTypes.EARLIEST_OPERATION_START_TIME).toDouble(),0.05);
- assertEquals(20.0, states.getActivityState(tour.getActivities().get(0), StateIdFactory.LATEST_OPERATION_START_TIME).toDouble(),0.05);
+ assertEquals(20.0, states.getActivityState(tour.getActivities().get(0), StateFactory.LATEST_OPERATION_START_TIME).toDouble(),0.05);
}
@Test
public void testStatesOfAct2(){
updateStates.update(vehicleRoute);
- assertEquals(30.0, states.getActivityState(tour.getActivities().get(1), StateIdFactory.COSTS).toDouble(),0.05);
- assertEquals(10.0, states.getActivityState(tour.getActivities().get(1), StateIdFactory.LOAD).toDouble(),0.05);
+ assertEquals(30.0, states.getActivityState(tour.getActivities().get(1), StateFactory.COSTS).toDouble(),0.05);
+ assertEquals(10.0, states.getActivityState(tour.getActivities().get(1), StateFactory.LOAD).toDouble(),0.05);
// assertEquals(10.0, states.getActivityState(tour.getActivities().get(0), StateTypes.EARLIEST_OPERATION_START_TIME).toDouble(),0.05);
- assertEquals(40.0, states.getActivityState(tour.getActivities().get(1), StateIdFactory.LATEST_OPERATION_START_TIME).toDouble(),0.05);
+ assertEquals(40.0, states.getActivityState(tour.getActivities().get(1), StateFactory.LATEST_OPERATION_START_TIME).toDouble(),0.05);
}
@Test
public void testStatesOfAct3(){
updateStates.update(vehicleRoute);
- assertEquals(40.0, states.getRouteState(vehicleRoute, StateIdFactory.COSTS).toDouble(), 0.05);
+ assertEquals(40.0, states.getRouteState(vehicleRoute, StateFactory.COSTS).toDouble(), 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 013dc833..d72997bc 100644
--- a/jsprit-examples/src/main/java/examples/SolomonExample.java
+++ b/jsprit-examples/src/main/java/examples/SolomonExample.java
@@ -69,7 +69,7 @@ public class SolomonExample {
*/
// VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfig_solomon.xml");
- vra.setPrematureBreak(100);
+// vra.setPrematureBreak(100);
// vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
/*
* Solve the problem.