();
-
- public void addListener(BackwardInTimeListener l){
- listeners.add(l);
- }
-
- public void start(VehicleRoute route, End end, double latestArrivalTime){
- for(BackwardInTimeListener l : listeners){ l.start(route, end, latestArrivalTime); }
- }
-
- /**
- * Informs listener about nextActivity.
- *
- * LatestDepartureTime is the theoretical latest departureTime to meet the latestOperationStartTimeWindow at the nextActivity (forward in time), i.e.
- * assume act_i and act_j are two successive activities and the latestDepTime of act_j is 10pm. With a travelTime from act_i to act_j of 1h the latestDepartureTime at act_i is 9pm.
- * However, the latestOperationStartTime of act_i is 8pm, then (with a serviceTime of 0) the latestOperationStartTime at act_i amounts to 8pm.
- *
- * @param act
- * @param latestDepartureTime
- * @param latestArrivalTime
- */
- public void prevActivity(TourActivity act, double latestDepartureTime, double latestArrivalTime){
- for(BackwardInTimeListener l : listeners){ l.prevActivity(act,latestDepartureTime,latestArrivalTime); }
- }
-
- public void end(Start start, double latestDepartureTime){
- for(BackwardInTimeListener l : listeners){ l.end(start, latestDepartureTime); }
- }
-
- public boolean isEmpty() {
- return listeners.isEmpty();
- }
-
-}
diff --git a/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java b/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java
index b13773ff..b43e7f8b 100644
--- a/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java
+++ b/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java
@@ -4,7 +4,6 @@ import java.util.ArrayList;
import java.util.List;
import basics.VehicleRoutingProblem;
-import basics.VehicleRoutingProblem.Constraint;
import basics.algo.InsertionListener;
import basics.algo.VehicleRoutingAlgorithmListeners.PrioritizedVRAListener;
import basics.route.VehicleFleetManager;
@@ -35,55 +34,15 @@ public class BestInsertionBuilder implements InsertionStrategyBuilder{
super();
this.vrp = vrp;
this.stateManager = stateManager;
- this.constraintManager = new ConstraintManager();
+ this.constraintManager = new ConstraintManager(vrp,stateManager);
this.fleetManager = vehicleFleetManager;
- addCoreStateUpdaters();
}
-
- 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));
- if(vrp.getProblemConstraints().contains(Constraint.DELIVERIES_FIRST)){
- constraintManager.addConstraint(new HardPickupAndDeliveryBackhaulActivityLevelConstraint(stateManager));
- }
- else{
- constraintManager.addConstraint(new HardPickupAndDeliveryActivityLevelConstraint(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);
- return this;
- };
-
- public BestInsertionBuilder addConstraint(HardRouteLevelConstraint hardRouteLevelConstraint){
- constraintManager.addConstraint(hardRouteLevelConstraint);
- return this;
- };
-
- public void setRouteLevel(int forwardLooking, int memory){
+ public BestInsertionBuilder setRouteLevel(int forwardLooking, int memory){
local = false;
this.forwaredLooking = forwardLooking;
this.memory = memory;
+ return this;
};
public BestInsertionBuilder setLocalLevel(){
@@ -126,4 +85,8 @@ public class BestInsertionBuilder implements InsertionStrategyBuilder{
return bestInsertion;
}
+ public void setConstraintManager(ConstraintManager constraintManager) {
+ this.constraintManager = constraintManager;
+ }
+
}
diff --git a/jsprit-core/src/main/java/algorithms/ConstraintManager.java b/jsprit-core/src/main/java/algorithms/ConstraintManager.java
index d7713776..030e2b8b 100644
--- a/jsprit-core/src/main/java/algorithms/ConstraintManager.java
+++ b/jsprit-core/src/main/java/algorithms/ConstraintManager.java
@@ -1,18 +1,53 @@
package algorithms;
+import basics.VehicleRoutingProblem;
import basics.route.TourActivity;
-class ConstraintManager implements HardActivityLevelConstraint, HardRouteLevelConstraint{
+public class ConstraintManager implements HardActivityStateLevelConstraint, HardRouteStateLevelConstraint{
private HardActivityLevelConstraintManager actLevelConstraintManager = new HardActivityLevelConstraintManager();
private HardRouteLevelConstraintManager routeLevelConstraintManager = new HardRouteLevelConstraintManager();
- public void addConstraint(HardActivityLevelConstraint actLevelConstraint){
+ private VehicleRoutingProblem vrp;
+
+ private StateManager stateManager;
+
+ private boolean loadConstraintsSet = false;
+
+ private boolean timeWindowConstraintsSet = false;
+
+ public ConstraintManager(VehicleRoutingProblem vrp, StateManager stateManager) {
+ this.vrp = vrp;
+ this.stateManager = stateManager;
+ }
+
+ public void addTimeWindowConstraint(){
+ if(!timeWindowConstraintsSet){
+ addConstraint(new TimeWindowConstraint(stateManager, vrp.getTransportCosts()));
+ stateManager.addActivityVisitor(new TimeWindowUpdater(stateManager, vrp.getTransportCosts()));
+ timeWindowConstraintsSet = true;
+ }
+ }
+
+ public void addLoadConstraint(){
+ if(!loadConstraintsSet){
+ addConstraint(new ServiceLoadRouteLevelConstraint(stateManager));
+ addConstraint(new ServiceLoadActivityLevelConstraint(stateManager));
+ UpdateLoads updateLoads = new UpdateLoads(stateManager);
+ stateManager.addActivityVisitor(updateLoads);
+ stateManager.addListener(updateLoads);
+ stateManager.addActivityVisitor(new UpdateFuturePickups(stateManager));
+ stateManager.addActivityVisitor(new UpdateOccuredDeliveries(stateManager));
+ loadConstraintsSet=true;
+ }
+ }
+
+ public void addConstraint(HardActivityStateLevelConstraint actLevelConstraint){
actLevelConstraintManager.addConstraint(actLevelConstraint);
}
- public void addConstraint(HardRouteLevelConstraint routeLevelConstraint){
+ public void addConstraint(HardRouteStateLevelConstraint routeLevelConstraint){
routeLevelConstraintManager.addConstraint(routeLevelConstraint);
}
diff --git a/jsprit-core/src/main/java/algorithms/ForwardInTimeListeners.java b/jsprit-core/src/main/java/algorithms/ForwardInTimeListeners.java
deleted file mode 100644
index 97bde621..00000000
--- a/jsprit-core/src/main/java/algorithms/ForwardInTimeListeners.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (C) 2013 Stefan Schroeder
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3.0 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library. If not, see .
- ******************************************************************************/
-package algorithms;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import basics.route.End;
-import basics.route.Start;
-import basics.route.TourActivity;
-import basics.route.VehicleRoute;
-
-class ForwardInTimeListeners {
-
- interface ForwardInTimeListener{
-
- public void start(VehicleRoute route, Start start, double departureTime);
-
- public void nextActivity(TourActivity act, double arrTime,double endTime);
-
- public void end(End end, double arrivalTime);
-
- }
-
- private Collection listeners = new ArrayList();
-
- public void addListener(ForwardInTimeListener l){
- listeners.add(l);
- }
-
- public void start(VehicleRoute route, Start start, double departureTime){
- for(ForwardInTimeListener l : listeners){ l.start(route, start, departureTime); }
- }
-
- public void nextActivity(TourActivity act, double arrTime, double endTime){
- for(ForwardInTimeListener l : listeners){ l.nextActivity(act,arrTime,endTime); }
- }
-
- public void end(End end, double arrivalTime){
- for(ForwardInTimeListener l : listeners){ l.end(end, arrivalTime); }
- }
-
- public boolean isEmpty() {
- return listeners.isEmpty();
- }
-
-}
diff --git a/jsprit-core/src/main/java/algorithms/HardActivityLevelConstraintManager.java b/jsprit-core/src/main/java/algorithms/HardActivityLevelConstraintManager.java
index da5dc409..42a041c8 100644
--- a/jsprit-core/src/main/java/algorithms/HardActivityLevelConstraintManager.java
+++ b/jsprit-core/src/main/java/algorithms/HardActivityLevelConstraintManager.java
@@ -5,17 +5,17 @@ import java.util.Collection;
import basics.route.TourActivity;
-class HardActivityLevelConstraintManager implements HardActivityLevelConstraint {
+class HardActivityLevelConstraintManager implements HardActivityStateLevelConstraint {
- private Collection hardConstraints = new ArrayList();
+ private Collection hardConstraints = new ArrayList();
- public void addConstraint(HardActivityLevelConstraint constraint){
+ public void addConstraint(HardActivityStateLevelConstraint constraint){
hardConstraints.add(constraint);
}
@Override
public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) {
- for(HardActivityLevelConstraint constraint : hardConstraints){
+ for(HardActivityStateLevelConstraint constraint : hardConstraints){
ConstraintsStatus status = constraint.fulfilled(iFacts, prevAct, newAct, nextAct, prevActDepTime);
if(status.equals(ConstraintsStatus.NOT_FULFILLED_BREAK) || status.equals(ConstraintsStatus.NOT_FULFILLED)){
return status;
diff --git a/jsprit-core/src/main/java/algorithms/HardActivityLevelConstraint.java b/jsprit-core/src/main/java/algorithms/HardActivityStateLevelConstraint.java
similarity index 84%
rename from jsprit-core/src/main/java/algorithms/HardActivityLevelConstraint.java
rename to jsprit-core/src/main/java/algorithms/HardActivityStateLevelConstraint.java
index fc3e878c..ed0147cf 100644
--- a/jsprit-core/src/main/java/algorithms/HardActivityLevelConstraint.java
+++ b/jsprit-core/src/main/java/algorithms/HardActivityStateLevelConstraint.java
@@ -2,7 +2,7 @@ package algorithms;
import basics.route.TourActivity;
-public interface HardActivityLevelConstraint {
+public interface HardActivityStateLevelConstraint {
static enum ConstraintsStatus {
diff --git a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryBackhaulActivityLevelConstraint.java b/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryBackhaulActivityLevelConstraint.java
deleted file mode 100644
index 007912f2..00000000
--- a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryBackhaulActivityLevelConstraint.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package algorithms;
-
-import basics.route.DeliveryActivity;
-import basics.route.PickupActivity;
-import basics.route.ServiceActivity;
-import basics.route.Start;
-import basics.route.TourActivity;
-
-class HardPickupAndDeliveryBackhaulActivityLevelConstraint implements HardActivityLevelConstraint {
-
- private StateGetter stateManager;
-
- public HardPickupAndDeliveryBackhaulActivityLevelConstraint(StateGetter stateManager) {
- super();
- this.stateManager = stateManager;
- }
-
- @Override
- public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) {
- if(newAct instanceof PickupActivity && nextAct instanceof DeliveryActivity){ return ConstraintsStatus.NOT_FULFILLED; }
- if(newAct instanceof ServiceActivity && nextAct instanceof DeliveryActivity){ return ConstraintsStatus.NOT_FULFILLED; }
- if(newAct instanceof DeliveryActivity && prevAct instanceof PickupActivity){ return ConstraintsStatus.NOT_FULFILLED; }
- if(newAct instanceof DeliveryActivity && prevAct instanceof ServiceActivity){ return ConstraintsStatus.NOT_FULFILLED; }
- int loadAtPrevAct;
- int futurePicks;
- int pastDeliveries;
- if(prevAct instanceof Start){
- 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, 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()){
- return ConstraintsStatus.NOT_FULFILLED;
- }
- }
- if(newAct instanceof DeliveryActivity){
- if(loadAtPrevAct + Math.abs(newAct.getCapacityDemand()) + pastDeliveries > iFacts.getNewVehicle().getCapacity()){
- return ConstraintsStatus.NOT_FULFILLED;
- }
-
- }
- return ConstraintsStatus.FULFILLED;
- }
-
-}
\ No newline at end of file
diff --git a/jsprit-core/src/main/java/algorithms/HardRouteLevelConstraintManager.java b/jsprit-core/src/main/java/algorithms/HardRouteLevelConstraintManager.java
index c9fe37fb..6da5aad8 100644
--- a/jsprit-core/src/main/java/algorithms/HardRouteLevelConstraintManager.java
+++ b/jsprit-core/src/main/java/algorithms/HardRouteLevelConstraintManager.java
@@ -4,17 +4,17 @@ import java.util.ArrayList;
import java.util.Collection;
-class HardRouteLevelConstraintManager implements HardRouteLevelConstraint {
+class HardRouteLevelConstraintManager implements HardRouteStateLevelConstraint {
- private Collection hardConstraints = new ArrayList();
+ private Collection hardConstraints = new ArrayList();
- public void addConstraint(HardRouteLevelConstraint constraint){
+ public void addConstraint(HardRouteStateLevelConstraint constraint){
hardConstraints.add(constraint);
}
@Override
public boolean fulfilled(InsertionContext insertionContext) {
- for(HardRouteLevelConstraint constraint : hardConstraints){
+ for(HardRouteStateLevelConstraint constraint : hardConstraints){
if(!constraint.fulfilled(insertionContext)){
return false;
}
diff --git a/jsprit-core/src/main/java/algorithms/HardRouteLevelConstraint.java b/jsprit-core/src/main/java/algorithms/HardRouteStateLevelConstraint.java
similarity index 63%
rename from jsprit-core/src/main/java/algorithms/HardRouteLevelConstraint.java
rename to jsprit-core/src/main/java/algorithms/HardRouteStateLevelConstraint.java
index 9cbd6258..0f414f1d 100644
--- a/jsprit-core/src/main/java/algorithms/HardRouteLevelConstraint.java
+++ b/jsprit-core/src/main/java/algorithms/HardRouteStateLevelConstraint.java
@@ -1,7 +1,7 @@
package algorithms;
-public interface HardRouteLevelConstraint {
+public interface HardRouteStateLevelConstraint {
public boolean fulfilled(InsertionContext insertionContext);
diff --git a/jsprit-core/src/main/java/algorithms/JobDistanceAvgCosts.java b/jsprit-core/src/main/java/algorithms/JobDistanceAvgCosts.java
index 66194819..38dcee47 100644
--- a/jsprit-core/src/main/java/algorithms/JobDistanceAvgCosts.java
+++ b/jsprit-core/src/main/java/algorithms/JobDistanceAvgCosts.java
@@ -31,7 +31,7 @@ import basics.costs.VehicleRoutingTransportCosts;
* @author stefan schroeder
*
*/
-class JobDistanceAvgCosts implements JobDistance {
+public class JobDistanceAvgCosts implements JobDistance {
private static Logger log = Logger.getLogger(JobDistanceAvgCosts.class);
diff --git a/jsprit-core/src/main/java/algorithms/LocalActivityInsertionCostsCalculator.java b/jsprit-core/src/main/java/algorithms/LocalActivityInsertionCostsCalculator.java
index 550d5456..a8ea2197 100644
--- a/jsprit-core/src/main/java/algorithms/LocalActivityInsertionCostsCalculator.java
+++ b/jsprit-core/src/main/java/algorithms/LocalActivityInsertionCostsCalculator.java
@@ -34,7 +34,7 @@ import basics.route.TourActivity;
* @author stefan
*
*/
-class LocalActivityInsertionCostsCalculator implements ActivityInsertionCostsCalculator{
+public class LocalActivityInsertionCostsCalculator implements ActivityInsertionCostsCalculator{
private VehicleRoutingTransportCosts routingCosts;
private VehicleRoutingActivityCosts activityCosts;
diff --git a/jsprit-core/src/main/java/algorithms/ServiceBackhaulConstraint.java b/jsprit-core/src/main/java/algorithms/ServiceBackhaulConstraint.java
new file mode 100644
index 00000000..548c6395
--- /dev/null
+++ b/jsprit-core/src/main/java/algorithms/ServiceBackhaulConstraint.java
@@ -0,0 +1,20 @@
+package algorithms;
+
+import basics.route.DeliveryActivity;
+import basics.route.PickupActivity;
+import basics.route.ServiceActivity;
+import basics.route.Start;
+import basics.route.TourActivity;
+
+public class ServiceBackhaulConstraint implements HardActivityStateLevelConstraint {
+
+ @Override
+ public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) {
+ if(newAct instanceof PickupActivity && nextAct instanceof DeliveryActivity){ return ConstraintsStatus.NOT_FULFILLED; }
+ if(newAct instanceof ServiceActivity && nextAct instanceof DeliveryActivity){ return ConstraintsStatus.NOT_FULFILLED; }
+ if(newAct instanceof DeliveryActivity && prevAct instanceof PickupActivity){ return ConstraintsStatus.NOT_FULFILLED; }
+ if(newAct instanceof DeliveryActivity && prevAct instanceof ServiceActivity){ return ConstraintsStatus.NOT_FULFILLED; }
+ return ConstraintsStatus.FULFILLED;
+ }
+
+}
\ No newline at end of file
diff --git a/jsprit-core/src/main/java/algorithms/ServiceInsertionCalculator.java b/jsprit-core/src/main/java/algorithms/ServiceInsertionCalculator.java
index 1c1193e8..30e33d2b 100644
--- a/jsprit-core/src/main/java/algorithms/ServiceInsertionCalculator.java
+++ b/jsprit-core/src/main/java/algorithms/ServiceInsertionCalculator.java
@@ -20,7 +20,7 @@ import org.apache.log4j.Logger;
import util.Neighborhood;
import algorithms.ActivityInsertionCostsCalculator.ActivityInsertionCosts;
-import algorithms.HardActivityLevelConstraint.ConstraintsStatus;
+import algorithms.HardActivityStateLevelConstraint.ConstraintsStatus;
import basics.Job;
import basics.Service;
import basics.costs.VehicleRoutingTransportCosts;
@@ -40,9 +40,9 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{
private static final Logger logger = Logger.getLogger(ServiceInsertionCalculator.class);
- private HardRouteLevelConstraint hardRouteLevelConstraint;
+ private HardRouteStateLevelConstraint hardRouteLevelConstraint;
- private HardActivityLevelConstraint hardActivityLevelConstraint;
+ private HardActivityStateLevelConstraint hardActivityLevelConstraint;
private Neighborhood neighborhood = new Neighborhood() {
@@ -64,7 +64,7 @@ final class ServiceInsertionCalculator implements JobInsertionCostsCalculator{
}
- public ServiceInsertionCalculator(VehicleRoutingTransportCosts routingCosts, ActivityInsertionCostsCalculator activityInsertionCostsCalculator, HardRouteLevelConstraint hardRouteLevelConstraint, HardActivityLevelConstraint hardActivityLevelConstraint) {
+ public ServiceInsertionCalculator(VehicleRoutingTransportCosts routingCosts, ActivityInsertionCostsCalculator activityInsertionCostsCalculator, HardRouteStateLevelConstraint hardRouteLevelConstraint, HardActivityStateLevelConstraint hardActivityLevelConstraint) {
super();
this.activityInsertionCostsCalculator = activityInsertionCostsCalculator;
this.hardRouteLevelConstraint = hardRouteLevelConstraint;
diff --git a/jsprit-core/src/main/java/algorithms/ServiceInsertionOnRouteLevelCalculator.java b/jsprit-core/src/main/java/algorithms/ServiceInsertionOnRouteLevelCalculator.java
index 843f5d40..7b420ebd 100644
--- a/jsprit-core/src/main/java/algorithms/ServiceInsertionOnRouteLevelCalculator.java
+++ b/jsprit-core/src/main/java/algorithms/ServiceInsertionOnRouteLevelCalculator.java
@@ -27,7 +27,7 @@ import org.apache.log4j.Logger;
import util.Neighborhood;
import algorithms.ActivityInsertionCostsCalculator.ActivityInsertionCosts;
-import algorithms.HardActivityLevelConstraint.ConstraintsStatus;
+import algorithms.HardActivityStateLevelConstraint.ConstraintsStatus;
import basics.Job;
import basics.Service;
import basics.costs.VehicleRoutingActivityCosts;
@@ -59,9 +59,9 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCostsC
private StateGetter stateManager;
- private HardRouteLevelConstraint hardRouteLevelConstraint;
+ private HardRouteStateLevelConstraint hardRouteLevelConstraint;
- private HardActivityLevelConstraint hardActivityLevelConstraint;
+ private HardActivityStateLevelConstraint hardActivityLevelConstraint;
private ActivityInsertionCostsCalculator activityInsertionCostsCalculator;
@@ -96,7 +96,7 @@ final class ServiceInsertionOnRouteLevelCalculator implements JobInsertionCostsC
logger.info("set [solutionMemory="+memorySize+"]");
}
- public ServiceInsertionOnRouteLevelCalculator(VehicleRoutingTransportCosts vehicleRoutingCosts, VehicleRoutingActivityCosts costFunc, ActivityInsertionCostsCalculator activityInsertionCostsCalculator, HardRouteLevelConstraint hardRouteLevelConstraint, HardActivityLevelConstraint hardActivityLevelConstraint) {
+ public ServiceInsertionOnRouteLevelCalculator(VehicleRoutingTransportCosts vehicleRoutingCosts, VehicleRoutingActivityCosts costFunc, ActivityInsertionCostsCalculator activityInsertionCostsCalculator, HardRouteStateLevelConstraint hardRouteLevelConstraint, HardActivityStateLevelConstraint hardActivityLevelConstraint) {
super();
this.transportCosts = vehicleRoutingCosts;
this.activityCosts = costFunc;
diff --git a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryActivityLevelConstraint.java b/jsprit-core/src/main/java/algorithms/ServiceLoadActivityLevelConstraint.java
similarity index 84%
rename from jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryActivityLevelConstraint.java
rename to jsprit-core/src/main/java/algorithms/ServiceLoadActivityLevelConstraint.java
index f7b9e06c..73a9f085 100644
--- a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryActivityLevelConstraint.java
+++ b/jsprit-core/src/main/java/algorithms/ServiceLoadActivityLevelConstraint.java
@@ -6,11 +6,20 @@ import basics.route.ServiceActivity;
import basics.route.Start;
import basics.route.TourActivity;
-class HardPickupAndDeliveryActivityLevelConstraint implements HardActivityLevelConstraint {
+/**
+ * Ensures load constraint for inserting ServiceActivity.
+ *
+ * When using this, you need to use
+ *
+ *
+ * @author schroeder
+ *
+ */
+class ServiceLoadActivityLevelConstraint implements HardActivityStateLevelConstraint {
private StateGetter stateManager;
- public HardPickupAndDeliveryActivityLevelConstraint(StateGetter stateManager) {
+ public ServiceLoadActivityLevelConstraint(StateGetter stateManager) {
super();
this.stateManager = stateManager;
}
diff --git a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryLoadRouteLevelConstraint.java b/jsprit-core/src/main/java/algorithms/ServiceLoadRouteLevelConstraint.java
similarity index 85%
rename from jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryLoadRouteLevelConstraint.java
rename to jsprit-core/src/main/java/algorithms/ServiceLoadRouteLevelConstraint.java
index b5281620..f6ede2f7 100644
--- a/jsprit-core/src/main/java/algorithms/HardPickupAndDeliveryLoadRouteLevelConstraint.java
+++ b/jsprit-core/src/main/java/algorithms/ServiceLoadRouteLevelConstraint.java
@@ -10,11 +10,11 @@ import basics.Service;
* @author stefan
*
*/
-class HardPickupAndDeliveryLoadRouteLevelConstraint implements HardRouteLevelConstraint {
+class ServiceLoadRouteLevelConstraint implements HardRouteStateLevelConstraint {
private StateGetter stateManager;
- public HardPickupAndDeliveryLoadRouteLevelConstraint(StateGetter stateManager) {
+ public ServiceLoadRouteLevelConstraint(StateGetter stateManager) {
super();
this.stateManager = stateManager;
}
diff --git a/jsprit-core/src/main/java/algorithms/StateUtils.java b/jsprit-core/src/main/java/algorithms/StateUtils.java
deleted file mode 100644
index 86ee258d..00000000
--- a/jsprit-core/src/main/java/algorithms/StateUtils.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package algorithms;
-
-import basics.VehicleRoutingProblem;
-
-class StateUtils {
-
- public static void addCoreStateUpdaters(VehicleRoutingProblem vrp, StateManager stateManager){
- stateManager.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts(stateManager));
- stateManager.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(stateManager));
-
- stateManager.addActivityVisitor(new UpdateActivityTimes(vrp.getTransportCosts()));
- stateManager.addActivityVisitor(new UpdateLoadAtActivityLevel(stateManager));
-
- stateManager.addActivityVisitor(new UpdateCostsAtAllLevels(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager));
-
- stateManager.addActivityVisitor(new UpdateOccuredDeliveriesAtActivityLevel(stateManager));
-
- stateManager.addActivityVisitor(new UpdateLatestOperationStartTimeAtActLocations(stateManager, vrp.getTransportCosts()));
-
- stateManager.addActivityVisitor(new UpdateFuturePickupsAtActivityLevel(stateManager));
-
- }
-
-}
diff --git a/jsprit-core/src/main/java/algorithms/HardTimeWindowActivityLevelConstraint.java b/jsprit-core/src/main/java/algorithms/TimeWindowConstraint.java
similarity index 87%
rename from jsprit-core/src/main/java/algorithms/HardTimeWindowActivityLevelConstraint.java
rename to jsprit-core/src/main/java/algorithms/TimeWindowConstraint.java
index 137b0a81..fa159a6f 100644
--- a/jsprit-core/src/main/java/algorithms/HardTimeWindowActivityLevelConstraint.java
+++ b/jsprit-core/src/main/java/algorithms/TimeWindowConstraint.java
@@ -10,15 +10,15 @@ import basics.route.TourActivity;
* @author stefan
*
*/
- class HardTimeWindowActivityLevelConstraint implements HardActivityLevelConstraint {
+ class TimeWindowConstraint implements HardActivityStateLevelConstraint {
- private static Logger log = Logger.getLogger(HardTimeWindowActivityLevelConstraint.class);
+ private static Logger log = Logger.getLogger(TimeWindowConstraint.class);
private StateGetter states;
private VehicleRoutingTransportCosts routingCosts;
- public HardTimeWindowActivityLevelConstraint(StateGetter states, VehicleRoutingTransportCosts routingCosts) {
+ public TimeWindowConstraint(StateGetter states, VehicleRoutingTransportCosts routingCosts) {
super();
this.states = states;
this.routingCosts = routingCosts;
diff --git a/jsprit-core/src/main/java/algorithms/UpdateLatestOperationStartTimeAtActLocations.java b/jsprit-core/src/main/java/algorithms/TimeWindowUpdater.java
similarity index 81%
rename from jsprit-core/src/main/java/algorithms/UpdateLatestOperationStartTimeAtActLocations.java
rename to jsprit-core/src/main/java/algorithms/TimeWindowUpdater.java
index 3e1c0d01..e174e5e3 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateLatestOperationStartTimeAtActLocations.java
+++ b/jsprit-core/src/main/java/algorithms/TimeWindowUpdater.java
@@ -8,9 +8,9 @@ import basics.route.ReverseActivityVisitor;
import basics.route.TourActivity;
import basics.route.VehicleRoute;
-class UpdateLatestOperationStartTimeAtActLocations implements ReverseActivityVisitor, StateUpdater{
+class TimeWindowUpdater implements ReverseActivityVisitor, StateUpdater{
- private static Logger log = Logger.getLogger(UpdateLatestOperationStartTimeAtActLocations.class);
+ private static Logger log = Logger.getLogger(TimeWindowUpdater.class);
private StateManager states;
@@ -22,7 +22,7 @@ class UpdateLatestOperationStartTimeAtActLocations implements ReverseActivityVis
private TourActivity prevAct;
- public UpdateLatestOperationStartTimeAtActLocations(StateManager states, VehicleRoutingTransportCosts tpCosts) {
+ public TimeWindowUpdater(StateManager states, VehicleRoutingTransportCosts tpCosts) {
super();
this.states = states;
this.transportCosts = tpCosts;
diff --git a/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTimeWindowAtActLocations.java b/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTime.java
similarity index 79%
rename from jsprit-core/src/main/java/algorithms/UpdateEarliestStartTimeWindowAtActLocations.java
rename to jsprit-core/src/main/java/algorithms/UpdateEarliestStartTime.java
index 56c790dd..8faa8f08 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTimeWindowAtActLocations.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateEarliestStartTime.java
@@ -7,13 +7,13 @@ import basics.route.ActivityVisitor;
import basics.route.TourActivity;
import basics.route.VehicleRoute;
-class UpdateEarliestStartTimeWindowAtActLocations implements ActivityVisitor,StateUpdater{
+class UpdateEarliestStartTime implements ActivityVisitor,StateUpdater{
private StateManager states;
private ActivityTimeTracker timeTracker;
- public UpdateEarliestStartTimeWindowAtActLocations(StateManager states, VehicleRoutingTransportCosts transportCosts) {
+ public UpdateEarliestStartTime(StateManager states, VehicleRoutingTransportCosts transportCosts) {
super();
this.states = states;
timeTracker = new ActivityTimeTracker(transportCosts);
diff --git a/jsprit-core/src/main/java/algorithms/UpdateFuturePickupsAtActivityLevel.java b/jsprit-core/src/main/java/algorithms/UpdateFuturePickups.java
similarity index 85%
rename from jsprit-core/src/main/java/algorithms/UpdateFuturePickupsAtActivityLevel.java
rename to jsprit-core/src/main/java/algorithms/UpdateFuturePickups.java
index 3e402e20..7ebcfd8e 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateFuturePickupsAtActivityLevel.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateFuturePickups.java
@@ -6,12 +6,12 @@ import basics.route.ServiceActivity;
import basics.route.TourActivity;
import basics.route.VehicleRoute;
-class UpdateFuturePickupsAtActivityLevel implements ReverseActivityVisitor, StateUpdater {
+class UpdateFuturePickups implements ReverseActivityVisitor, StateUpdater {
private StateManager stateManager;
private int futurePicks = 0;
private VehicleRoute route;
- public UpdateFuturePickupsAtActivityLevel(StateManager stateManager) {
+ public UpdateFuturePickups(StateManager stateManager) {
super();
this.stateManager = stateManager;
}
diff --git a/jsprit-core/src/main/java/algorithms/UpdateLoadAtActivityLevel.java b/jsprit-core/src/main/java/algorithms/UpdateLoadAtActivityLevel.java
deleted file mode 100644
index 73f9fb76..00000000
--- a/jsprit-core/src/main/java/algorithms/UpdateLoadAtActivityLevel.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package algorithms;
-
-import algorithms.StateManager.StateImpl;
-import basics.route.ActivityVisitor;
-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 UpdateLoadAtActivityLevel implements ActivityVisitor, StateUpdater {
- private StateManager stateManager;
- private int currentLoad = 0;
- private VehicleRoute route;
-
- /**
- * 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 UpdateLoadAtActivityLevel(StateManager stateManager) {
- super();
- this.stateManager = stateManager;
- }
-
- @Override
- public void begin(VehicleRoute route) {
- 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, 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
deleted file mode 100644
index d38b3cb2..00000000
--- a/jsprit-core/src/main/java/algorithms/UpdateLoadAtAllLevels.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package algorithms;
-
-import algorithms.StateManager.StateImpl;
-import basics.route.ActivityVisitor;
-import basics.route.TourActivity;
-import basics.route.VehicleRoute;
-
-class UpdateLoadAtAllLevels implements ActivityVisitor,StateUpdater{
-
- private double load = 0.0;
-
- private StateManager states;
-
- private VehicleRoute vehicleRoute;
-
- public UpdateLoadAtAllLevels(StateManager 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, StateFactory.LOAD, new StateImpl(load));
- }
-
- @Override
- public void finish() {
- states.putRouteState(vehicleRoute, StateFactory.LOAD, new StateImpl(load));
- load=0;
- vehicleRoute = null;
- }
-
-}
\ No newline at end of file
diff --git a/jsprit-core/src/main/java/algorithms/UpdateLoads.java b/jsprit-core/src/main/java/algorithms/UpdateLoads.java
new file mode 100644
index 00000000..9b17f35b
--- /dev/null
+++ b/jsprit-core/src/main/java/algorithms/UpdateLoads.java
@@ -0,0 +1,104 @@
+package algorithms;
+
+import java.util.Collection;
+
+import basics.Delivery;
+import basics.Job;
+import basics.Pickup;
+import basics.Service;
+import basics.algo.InsertionStartsListener;
+import basics.algo.JobInsertedListener;
+import basics.route.ActivityVisitor;
+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 UpdateLoads implements ActivityVisitor, StateUpdater, InsertionStartsListener, JobInsertedListener {
+ private StateManager stateManager;
+ private int currentLoad = 0;
+ private VehicleRoute route;
+
+ /**
+ * 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
+ *
+ *
The loads can be retrieved by
+ * stateManager.getActivityState(activity,StateTypes.LOAD);
+ *
+ * @author stefan
+ *
+ */
+ public UpdateLoads(StateManager stateManager) {
+ super();
+ this.stateManager = stateManager;
+ }
+
+ @Override
+ public void begin(VehicleRoute route) {
+ 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, 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;
+ }
+
+ 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, StateFactory.LOAD_AT_BEGINNING, StateFactory.createState(loadAtDepot));
+ stateManager.putRouteState(route, StateFactory.LOAD_AT_END, StateFactory.createState(loadAtEnd));
+ }
+
+ @Override
+ public void informInsertionStarts(Collection vehicleRoutes, Collection unassignedJobs) {
+ for(VehicleRoute route : vehicleRoutes){ insertionStarts(route); }
+ }
+
+ @Override
+ public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
+ if(job2insert instanceof Delivery){
+ int loadAtDepot = (int) stateManager.getRouteState(inRoute, StateFactory.LOAD_AT_BEGINNING).toDouble();
+// log.info("loadAtDepot="+loadAtDepot);
+ 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, StateFactory.LOAD_AT_END).toDouble();
+// log.info("loadAtEnd="+loadAtEnd);
+ stateManager.putRouteState(inRoute, StateFactory.LOAD_AT_END, StateFactory.createState(loadAtEnd + job2insert.getCapacityDemand()));
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts.java b/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts.java
deleted file mode 100644
index 8b652430..00000000
--- a/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package algorithms;
-
-import java.util.Collection;
-
-import algorithms.StateManager.StateImpl;
-import basics.Delivery;
-import basics.Job;
-import basics.Pickup;
-import basics.Service;
-import basics.algo.InsertionStartsListener;
-import basics.route.VehicleRoute;
-
-/**
- * Initializes the load of each route/vehicle at start- and end-location before insertion starts.
- *
- * StateTypes.LOAD_AT_DEPOT and StateTypes.LOAD are modified for each route
- *
These states can be retrieved by
- * stateManager.getRouteState(route, StateTypes.LOAD_AT_DEPOT) for LOAD_AT_DEPOT and
- * stateManager.getRouteState(route, StateTypes.LOAD) for LOAD (i.e. load at end)
- *
- * @param stateManager
- */
-class UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts implements InsertionStartsListener {
-
- private StateManager stateManager;
-
- /**
- * Initializes the load of each route/vehicle at start- and end-location before insertion starts.
- *
- *
StateTypes.LOAD_AT_DEPOT and StateTypes.LOAD are modified for each route
- *
These states can be retrieved by
- * stateManager.getRouteState(route, StateTypes.LOAD_AT_DEPOT) for LOAD_AT_DEPOT and
- * stateManager.getRouteState(route, StateTypes.LOAD) for LOAD (i.e. load at end)
- *
- * @param stateManager
- */
- public UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts(StateManager stateManager) {
- super();
- this.stateManager = stateManager;
- }
-
- 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, StateFactory.LOAD_AT_BEGINNING, StateFactory.createState(loadAtDepot));
- stateManager.putRouteState(route, StateFactory.LOAD_AT_END, StateFactory.createState(loadAtEnd));
- }
-
- @Override
- public void informInsertionStarts(Collection vehicleRoutes, Collection unassignedJobs) {
- for(VehicleRoute route : vehicleRoutes){ insertionStarts(route); }
- }
-
-}
\ No newline at end of file
diff --git a/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted.java b/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted.java
deleted file mode 100644
index e73fa7b2..00000000
--- a/jsprit-core/src/main/java/algorithms/UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package algorithms;
-
-import algorithms.StateManager.StateImpl;
-import basics.Delivery;
-import basics.Job;
-import basics.Pickup;
-import basics.Service;
-import basics.algo.JobInsertedListener;
-import basics.route.VehicleRoute;
-
-/**
- * Updates loads at start and end of a route if a job has been inserted in that route.
- *
- * These states can be retrieved by
- * stateManager.getRouteState(route, StateTypes.LOAD_AT_DEPOT) for LOAD_AT_DEPOT and
- * stateManager.getRouteState(route, StateTypes.LOAD) for LOAD (i.e. load at end)
- *
- * @param stateManager
- */
-class UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted implements JobInsertedListener, StateUpdater {
-
- private StateManager stateManager;
-
- /**
- * Updates loads at start and end of a route if a job has been inserted in that route.
- *
- *
These states can be retrieved by
- * stateManager.getRouteState(route, StateTypes.LOAD_AT_DEPOT) for LOAD_AT_DEPOT and
- * stateManager.getRouteState(route, StateTypes.LOAD) for LOAD (i.e. load at end)
- *
- * @param stateManager
- */
- public UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(StateManager stateManager) {
- super();
- this.stateManager = stateManager;
- }
-
- @Override
- public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) {
- if(job2insert instanceof Delivery){
- int loadAtDepot = (int) stateManager.getRouteState(inRoute, StateFactory.LOAD_AT_BEGINNING).toDouble();
-// log.info("loadAtDepot="+loadAtDepot);
- 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, StateFactory.LOAD_AT_END).toDouble();
-// log.info("loadAtEnd="+loadAtEnd);
- stateManager.putRouteState(inRoute, StateFactory.LOAD_AT_END, StateFactory.createState(loadAtEnd + job2insert.getCapacityDemand()));
- }
- }
-
- }
\ No newline at end of file
diff --git a/jsprit-core/src/main/java/algorithms/UpdateMaxLoad.java b/jsprit-core/src/main/java/algorithms/UpdateMaxLoad.java
index 9975ae8f..9bd3b800 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateMaxLoad.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateMaxLoad.java
@@ -29,14 +29,12 @@ class UpdateMaxLoad implements ActivityVisitor, StateUpdater {
*
*
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
*
*/
diff --git a/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveriesAtActivityLevel.java b/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveries.java
similarity index 80%
rename from jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveriesAtActivityLevel.java
rename to jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveries.java
index 8e58a0c8..a2cf8237 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveriesAtActivityLevel.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateOccuredDeliveries.java
@@ -1,17 +1,16 @@
package algorithms;
-import algorithms.StateManager.StateImpl;
import basics.route.ActivityVisitor;
import basics.route.DeliveryActivity;
import basics.route.TourActivity;
import basics.route.VehicleRoute;
-class UpdateOccuredDeliveriesAtActivityLevel implements ActivityVisitor, StateUpdater {
+class UpdateOccuredDeliveries implements ActivityVisitor, StateUpdater {
private StateManager stateManager;
private int deliveries = 0;
private VehicleRoute route;
- public UpdateOccuredDeliveriesAtActivityLevel(StateManager stateManager) {
+ public UpdateOccuredDeliveries(StateManager stateManager) {
super();
this.stateManager = stateManager;
}
diff --git a/jsprit-core/src/main/java/algorithms/UpdateCostsAtAllLevels.java b/jsprit-core/src/main/java/algorithms/UpdateVariableCosts.java
similarity index 89%
rename from jsprit-core/src/main/java/algorithms/UpdateCostsAtAllLevels.java
rename to jsprit-core/src/main/java/algorithms/UpdateVariableCosts.java
index a9e57c0a..893813b4 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateCostsAtAllLevels.java
+++ b/jsprit-core/src/main/java/algorithms/UpdateVariableCosts.java
@@ -24,9 +24,9 @@ import basics.route.VehicleRoute;
* @param transportCost
* @param states
*/
-class UpdateCostsAtAllLevels implements ActivityVisitor,StateUpdater{
+class UpdateVariableCosts implements ActivityVisitor,StateUpdater{
- private static Logger log = Logger.getLogger(UpdateCostsAtAllLevels.class);
+ private static Logger log = Logger.getLogger(UpdateVariableCosts.class);
private VehicleRoutingActivityCosts activityCost;
@@ -55,7 +55,7 @@ class UpdateCostsAtAllLevels implements ActivityVisitor,StateUpdater{
* @param transportCost
* @param states
*/
- public UpdateCostsAtAllLevels(VehicleRoutingActivityCosts activityCost, VehicleRoutingTransportCosts transportCost, StateManager states) {
+ public UpdateVariableCosts(VehicleRoutingActivityCosts activityCost, VehicleRoutingTransportCosts transportCost, StateManager states) {
super();
this.activityCost = activityCost;
this.transportCost = transportCost;
@@ -117,10 +117,4 @@ class UpdateCostsAtAllLevels implements ActivityVisitor,StateUpdater{
totalOperationCost = 0.0;
}
- private double getFixCosts(Vehicle vehicle) {
- if(vehicle == null) return 0.0;
- if(vehicle.getType() == null) return 0.0;
- return vehicle.getType().getVehicleCostParams().fix;
- }
-
}
\ No newline at end of file
diff --git a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithmBuilder.java b/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithmFactoryImpl.java
similarity index 53%
rename from jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithmBuilder.java
rename to jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithmFactoryImpl.java
index 57800da8..c7cbe92b 100644
--- a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithmBuilder.java
+++ b/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithmFactoryImpl.java
@@ -1,44 +1,36 @@
package algorithms;
-import java.util.ArrayList;
-import java.util.Collection;
-
import basics.VehicleRoutingAlgorithm;
import basics.VehicleRoutingProblem;
import basics.algo.SearchStrategyManager;
-import basics.algo.VehicleRoutingAlgorithmListener;
+import basics.algo.VehicleRoutingAlgorithmFactory;
import basics.route.VehicleFleetManager;
-public class VehicleRoutingAlgorithmBuilder {
+public class VehicleRoutingAlgorithmFactoryImpl implements VehicleRoutingAlgorithmFactory{
- private VehicleRoutingProblem vrp;
-
private SearchStrategyManager searchStrategyManager;
private StateManager stateManager;
-
- private Collection listeners = new ArrayList();
private VehicleFleetManager fleetManager;
- public VehicleRoutingAlgorithmBuilder(VehicleRoutingProblem vrp, SearchStrategyManager searchStrategyManager, StateManager stateManager, VehicleFleetManager vehicleFleetManager) {
+ public VehicleRoutingAlgorithmFactoryImpl(SearchStrategyManager searchStrategyManager,
+ StateManager stateManager, VehicleFleetManager fleetManager) {
super();
- this.vrp = vrp;
this.searchStrategyManager = searchStrategyManager;
this.stateManager = stateManager;
- this.fleetManager = vehicleFleetManager;
+ this.fleetManager = fleetManager;
}
-
- public void addListener(VehicleRoutingAlgorithmListener listener){
- listeners.add(listener);
- }
-
- public VehicleRoutingAlgorithm build(){
+
+ @Override
+ public VehicleRoutingAlgorithm createAlgorithm(VehicleRoutingProblem vrp) {
+ this.stateManager.addActivityVisitor(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), this.stateManager));
+ this.stateManager.addActivityVisitor(new UpdateMaxLoad(this.stateManager));
VehicleRoutingAlgorithm algorithm = new VehicleRoutingAlgorithm(vrp, searchStrategyManager);
algorithm.getAlgorithmListeners().addListener(stateManager);
algorithm.getSearchStrategyManager().addSearchStrategyModuleListener(stateManager);
algorithm.getSearchStrategyManager().addSearchStrategyModuleListener(new RemoveEmptyVehicles(fleetManager));
return algorithm;
}
-
+
}
diff --git a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java b/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java
index bd8e6db4..41862ca3 100644
--- a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java
+++ b/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java
@@ -445,17 +445,17 @@ public class VehicleRoutingAlgorithms {
* define constraints
*/
//constraint manager
- ConstraintManager constraintManager = new ConstraintManager();
- constraintManager.addConstraint(new HardTimeWindowActivityLevelConstraint(stateManager, vrp.getTransportCosts()));
+ ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager);
+ constraintManager.addConstraint(new TimeWindowConstraint(stateManager, vrp.getTransportCosts()));
if(vrp.getProblemConstraints().contains(Constraint.DELIVERIES_FIRST)){
- constraintManager.addConstraint(new HardPickupAndDeliveryBackhaulActivityLevelConstraint(stateManager));
+ constraintManager.addConstraint(new ServiceBackhaulConstraint());
}
else{
- constraintManager.addConstraint(new HardPickupAndDeliveryActivityLevelConstraint(stateManager));
+ constraintManager.addConstraint(new ServiceLoadActivityLevelConstraint(stateManager));
}
- constraintManager.addConstraint(new HardPickupAndDeliveryLoadRouteLevelConstraint(stateManager));
+ constraintManager.addConstraint(new ServiceLoadRouteLevelConstraint(stateManager));
//construct initial solution creator
AlgorithmStartsListener createInitialSolution = createInitialSolution(config,vrp,vehicleFleetManager,stateManager,algorithmListeners,definedClasses,executorService,nuOfThreads,constraintManager);
@@ -493,17 +493,22 @@ public class VehicleRoutingAlgorithms {
* define stateUpdates
*/
- stateManager.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts(stateManager));
- stateManager.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(stateManager));
-
+// stateManager.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenInsertionStarts(stateManager));
+// stateManager.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(stateManager));
+//
+
+ UpdateLoads loadUpdater = new UpdateLoads(stateManager);
+ stateManager.addListener(loadUpdater);
+ stateManager.addActivityVisitor(loadUpdater);
+
stateManager.addActivityVisitor(new UpdateActivityTimes(vrp.getTransportCosts()));
- stateManager.addActivityVisitor(new UpdateLoadAtActivityLevel(stateManager));
- stateManager.addActivityVisitor(new UpdateCostsAtAllLevels(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager));
- stateManager.addActivityVisitor(new UpdateOccuredDeliveriesAtActivityLevel(stateManager));
- stateManager.addActivityVisitor(new UpdateLatestOperationStartTimeAtActLocations(stateManager, vrp.getTransportCosts()));
- stateManager.addActivityVisitor(new UpdateFuturePickupsAtActivityLevel(stateManager));
+ stateManager.addActivityVisitor(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager));
+
+ stateManager.addActivityVisitor(new UpdateOccuredDeliveries(stateManager));
+ stateManager.addActivityVisitor(new TimeWindowUpdater(stateManager, vrp.getTransportCosts()));
+ stateManager.addActivityVisitor(new UpdateFuturePickups(stateManager));
metaAlgorithm.getSearchStrategyManager().addSearchStrategyModuleListener(stateManager);
diff --git a/jsprit-core/src/main/java/basics/VehicleRoutingProblem.java b/jsprit-core/src/main/java/basics/VehicleRoutingProblem.java
index 78035117..f8bf8153 100644
--- a/jsprit-core/src/main/java/basics/VehicleRoutingProblem.java
+++ b/jsprit-core/src/main/java/basics/VehicleRoutingProblem.java
@@ -260,9 +260,11 @@ public class VehicleRoutingProblem {
/**
* Adds a vehicleType.
*
+ * @deprecated use add vehicle instead
* @param type
* @return builder
*/
+ @Deprecated
public Builder addVehicleType(VehicleType type){
vehicleTypes.add(type);
return this;
diff --git a/jsprit-core/src/main/java/basics/algo/InsertionListeners.java b/jsprit-core/src/main/java/basics/algo/InsertionListeners.java
index 63afa67b..821f166d 100644
--- a/jsprit-core/src/main/java/basics/algo/InsertionListeners.java
+++ b/jsprit-core/src/main/java/basics/algo/InsertionListeners.java
@@ -16,16 +16,16 @@ public class InsertionListeners {
public void addListener(InsertionListener insertionListener){
if(insertionListener instanceof InsertionStartsListener) startListeners.add((InsertionStartsListener) insertionListener);
- else if(insertionListener instanceof JobInsertedListener) jobInsertedListeners.add((JobInsertedListener) insertionListener);
- else if(insertionListener instanceof InsertionEndsListener) endListeners.add((InsertionEndsListener) insertionListener);
- else throw new IllegalStateException("cannot add this type of insertionListener");
+ if(insertionListener instanceof JobInsertedListener) jobInsertedListeners.add((JobInsertedListener) insertionListener);
+ if(insertionListener instanceof InsertionEndsListener) endListeners.add((InsertionEndsListener) insertionListener);
+// else throw new IllegalStateException("cannot add this type of insertionListener");
}
public void removeListener(InsertionListener insertionListener){
if(insertionListener instanceof InsertionStartsListener) startListeners.remove((InsertionStartsListener) insertionListener);
- else if(insertionListener instanceof JobInsertedListener) jobInsertedListeners.remove((JobInsertedListener) insertionListener);
- else if(insertionListener instanceof InsertionEndsListener) endListeners.remove((InsertionEndsListener) insertionListener);
- else throw new IllegalStateException("cannot remove this type of insertionListener");
+ if(insertionListener instanceof JobInsertedListener) jobInsertedListeners.remove((JobInsertedListener) insertionListener);
+ if(insertionListener instanceof InsertionEndsListener) endListeners.remove((InsertionEndsListener) insertionListener);
+// else throw new IllegalStateException("cannot remove this type of insertionListener");
}
public void insertionStarts(Collection vehicleRoutes, Collection unassignedJobs){
diff --git a/jsprit-core/src/main/java/basics/costs/DefaultVehicleRoutingActivityCosts.java b/jsprit-core/src/main/java/basics/costs/DefaultVehicleRoutingActivityCosts.java
index d5218662..f9a91b4b 100644
--- a/jsprit-core/src/main/java/basics/costs/DefaultVehicleRoutingActivityCosts.java
+++ b/jsprit-core/src/main/java/basics/costs/DefaultVehicleRoutingActivityCosts.java
@@ -22,7 +22,7 @@ import basics.route.Vehicle;
/**
- * Function that basically does not allow soft time-windows. Actually, it is allowed but it is penalized with Double.MaxValue().
+ * DefaultActivityCosts = 0.0, i.e. activities do not induce costs at all.
*
* @author schroeder
*
@@ -31,15 +31,12 @@ public class DefaultVehicleRoutingActivityCosts implements VehicleRoutingActivit
@Override
public double getActivityCost(TourActivity tourAct, double arrivalTime, Driver driver, Vehicle vehicle) {
- if(arrivalTime > tourAct.getTheoreticalLatestOperationStartTime()){
- return Double.MAX_VALUE;
- }
return 0;
}
@Override
public String toString() {
- return "[name=hardTimeWindowActCosts]";
+ return "[name=defaultActivityCosts]";
}
}
diff --git a/jsprit-core/src/main/java/basics/io/VrpXMLReader.java b/jsprit-core/src/main/java/basics/io/VrpXMLReader.java
index 523c265d..c85f9e8b 100644
--- a/jsprit-core/src/main/java/basics/io/VrpXMLReader.java
+++ b/jsprit-core/src/main/java/basics/io/VrpXMLReader.java
@@ -301,7 +301,7 @@ public class VrpXMLReader{
if(distC != null) typeBuilder.setCostPerDistance(distC);
VehicleTypeImpl type = typeBuilder.build();
types.put(type.getTypeId(), type);
- vrpBuilder.addVehicleType(type);
+// vrpBuilder.addVehicleType(type);
}
//read vehicles
diff --git a/jsprit-core/src/main/java/basics/route/ReverseRouteActivityVisitor.java b/jsprit-core/src/main/java/basics/route/ReverseRouteActivityVisitor.java
index ddb9508c..0f9be0ee 100644
--- a/jsprit-core/src/main/java/basics/route/ReverseRouteActivityVisitor.java
+++ b/jsprit-core/src/main/java/basics/route/ReverseRouteActivityVisitor.java
@@ -59,6 +59,8 @@ public class ReverseRouteActivityVisitor implements RouteVisitor{
}
public void addActivityVisitor(ReverseActivityVisitor activityVisitor){
- visitors.add(activityVisitor);
+ if(!visitors.contains(activityVisitor)){
+ visitors.add(activityVisitor);
+ }
}
}
diff --git a/jsprit-core/src/main/java/basics/route/RouteActivityVisitor.java b/jsprit-core/src/main/java/basics/route/RouteActivityVisitor.java
index cef22424..2ac45a03 100644
--- a/jsprit-core/src/main/java/basics/route/RouteActivityVisitor.java
+++ b/jsprit-core/src/main/java/basics/route/RouteActivityVisitor.java
@@ -56,6 +56,8 @@ public class RouteActivityVisitor implements RouteVisitor{
}
public void addActivityVisitor(ActivityVisitor activityVisitor){
- visitors.add(activityVisitor);
+ if(!visitors.contains(activityVisitor)){
+ visitors.add(activityVisitor);
+ }
}
}
diff --git a/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java b/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java
index 6f4eed89..f8744c5b 100644
--- a/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java
+++ b/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java
@@ -52,7 +52,7 @@ public class BuildCVRPAlgoFromScratchTest {
vrp = builder.build();
final StateManager stateManager = new StateManager();
- HardActivityLevelConstraint hardActLevelConstraint = new HardActivityLevelConstraint() {
+ HardActivityStateLevelConstraint hardActLevelConstraint = new HardActivityStateLevelConstraint() {
@Override
public ConstraintsStatus fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) {
@@ -61,7 +61,7 @@ public class BuildCVRPAlgoFromScratchTest {
};
ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts());
- ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new HardLoadConstraint(stateManager), hardActLevelConstraint);
+ ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new LoadConstraint(stateManager), hardActLevelConstraint);
VehicleFleetManager fleetManager = new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager();
diff --git a/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java b/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java
index d5af0e88..b669beb5 100644
--- a/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java
+++ b/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java
@@ -61,14 +61,13 @@ public class BuildPDVRPAlgoFromScratchTest {
final StateManager stateManager = new StateManager();
- ConstraintManager actLevelConstraintAccumulator = new ConstraintManager();
- actLevelConstraintAccumulator.addConstraint(new HardPickupAndDeliveryActivityLevelConstraint(stateManager));
- actLevelConstraintAccumulator.addConstraint(new HardTimeWindowActivityLevelConstraint(stateManager, vrp.getTransportCosts()));
+ ConstraintManager actLevelConstraintAccumulator = new ConstraintManager(vrp,stateManager);
+ actLevelConstraintAccumulator.addConstraint(new ServiceLoadActivityLevelConstraint(stateManager));
+ actLevelConstraintAccumulator.addConstraint(new TimeWindowConstraint(stateManager, vrp.getTransportCosts()));
ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts());
-
- ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new HardPickupAndDeliveryLoadRouteLevelConstraint(stateManager), actLevelConstraintAccumulator);
+ ServiceInsertionCalculator serviceInsertion = new ServiceInsertionCalculator(vrp.getTransportCosts(), marginalCalculus, new ServiceLoadRouteLevelConstraint(stateManager), actLevelConstraintAccumulator);
// CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardLoadConstraint(stateManager));
VehicleFleetManager fleetManager = new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager();
@@ -110,15 +109,15 @@ public class BuildPDVRPAlgoFromScratchTest {
final RouteActivityVisitor iterateForward = new RouteActivityVisitor();
iterateForward.addActivityVisitor(new UpdateActivityTimes(vrp.getTransportCosts()));
- iterateForward.addActivityVisitor(new UpdateEarliestStartTimeWindowAtActLocations(stateManager, vrp.getTransportCosts()));
- iterateForward.addActivityVisitor(new UpdateCostsAtAllLevels(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager));
+// iterateForward.addActivityVisitor(new UpdateEarliestStartTime(stateManager, vrp.getTransportCosts()));
+ iterateForward.addActivityVisitor(new UpdateVariableCosts(vrp.getActivityCosts(), vrp.getTransportCosts(), stateManager));
- iterateForward.addActivityVisitor(new UpdateOccuredDeliveriesAtActivityLevel(stateManager));
- iterateForward.addActivityVisitor(new UpdateLoadAtActivityLevel(stateManager));
+ iterateForward.addActivityVisitor(new UpdateOccuredDeliveries(stateManager));
+ iterateForward.addActivityVisitor(new UpdateLoads(stateManager));
final ReverseRouteActivityVisitor iterateBackward = new ReverseRouteActivityVisitor();
- iterateBackward.addActivityVisitor(new UpdateLatestOperationStartTimeAtActLocations(stateManager, vrp.getTransportCosts()));
- iterateBackward.addActivityVisitor(new UpdateFuturePickupsAtActivityLevel(stateManager));
+ iterateBackward.addActivityVisitor(new TimeWindowUpdater(stateManager, vrp.getTransportCosts()));
+ iterateBackward.addActivityVisitor(new UpdateFuturePickups(stateManager));
InsertionStartsListener loadVehicleInDepot = new InsertionStartsListener() {
@@ -175,7 +174,6 @@ public class BuildPDVRPAlgoFromScratchTest {
// System.out.println("ini: costs="+iniSolution.getCost()+";#routes="+iniSolution.getRoutes().size());
vra.addInitialSolution(iniSolution);
-
vra.setNuOfIterations(10000);
vra.setPrematureBreak(1000);
diff --git a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java b/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java
index b2ee4691..7de97ee0 100644
--- a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java
+++ b/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java
@@ -149,7 +149,7 @@ public class GendreauPostOptTest {
activityCosts = new ExampleActivityCostFunction();
- ServiceInsertionCalculator standardServiceInsertion = new ServiceInsertionCalculator(cost, new LocalActivityInsertionCostsCalculator(cost, activityCosts), new HardLoadConstraint(states), new HardTimeWindowActivityLevelConstraint(states, cost));
+ ServiceInsertionCalculator standardServiceInsertion = new ServiceInsertionCalculator(cost, new LocalActivityInsertionCostsCalculator(cost, activityCosts), new LoadConstraint(states), new TimeWindowConstraint(states, cost));
JobInsertionConsideringFixCostsCalculator withFixCost = new JobInsertionConsideringFixCostsCalculator(standardServiceInsertion, states);
diff --git a/jsprit-core/src/main/java/algorithms/HardLoadConstraint.java b/jsprit-core/src/test/java/algorithms/LoadConstraint.java
similarity index 81%
rename from jsprit-core/src/main/java/algorithms/HardLoadConstraint.java
rename to jsprit-core/src/test/java/algorithms/LoadConstraint.java
index 0cc1dbd2..967743e1 100644
--- a/jsprit-core/src/main/java/algorithms/HardLoadConstraint.java
+++ b/jsprit-core/src/test/java/algorithms/LoadConstraint.java
@@ -2,11 +2,11 @@ package algorithms;
import basics.Service;
-class HardLoadConstraint implements HardRouteLevelConstraint{
+class LoadConstraint implements HardRouteStateLevelConstraint{
private StateGetter states;
- public HardLoadConstraint(StateGetter states) {
+ public LoadConstraint(StateGetter states) {
super();
this.states = states;
}
diff --git a/jsprit-core/src/test/java/algorithms/StateUpdates.java b/jsprit-core/src/test/java/algorithms/StateUpdates.java
index 475f3405..4d6af67c 100644
--- a/jsprit-core/src/test/java/algorithms/StateUpdates.java
+++ b/jsprit-core/src/test/java/algorithms/StateUpdates.java
@@ -43,13 +43,13 @@ class UpdateStates implements JobInsertedListener, InsertionStartsListener{
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 UpdateVariableCosts(activityCosts, routingCosts, states));
+ routeActivityVisitor.addActivityVisitor(new UpdateLoads(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));
+ revRouteActivityVisitor.addActivityVisitor(new TimeWindowUpdater(states, routingCosts));
+ insertionListeners.addListener(new UpdateLoads(states));
+// insertionListeners.addListener(new UpdateLoadsAtStartAndEndOfRouteWhenJobHasBeenInserted(states));
}
public void update(VehicleRoute route){
diff --git a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java
index 1009a1fb..d2ca9aab 100644
--- a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java
+++ b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java
@@ -152,7 +152,7 @@ public class TestCalculatesServiceInsertion {
ExampleActivityCostFunction activityCosts = new ExampleActivityCostFunction();
- serviceInsertion = new ServiceInsertionCalculator(costs, new LocalActivityInsertionCostsCalculator(costs, activityCosts), new HardLoadConstraint(states), new HardTimeWindowActivityLevelConstraint(states, costs));
+ serviceInsertion = new ServiceInsertionCalculator(costs, new LocalActivityInsertionCostsCalculator(costs, activityCosts), new LoadConstraint(states), new TimeWindowConstraint(states, costs));
stateUpdater = new UpdateStates(states, costs, activityCosts);
diff --git a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java
index 6e26383f..96b09292 100644
--- a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java
+++ b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java
@@ -143,7 +143,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
ExampleActivityCostFunction activityCosts = new ExampleActivityCostFunction();
ActivityInsertionCostsCalculator actInsertionCostCalculator = new RouteLevelActivityInsertionCostsEstimator(costs, activityCosts, states);
- serviceInsertion = new ServiceInsertionOnRouteLevelCalculator(costs,activityCosts, actInsertionCostCalculator, new HardLoadConstraint(states), new HardTimeWindowActivityLevelConstraint(states, costs));
+ serviceInsertion = new ServiceInsertionOnRouteLevelCalculator(costs,activityCosts, actInsertionCostCalculator, new LoadConstraint(states), new TimeWindowConstraint(states, costs));
serviceInsertion.setNuOfActsForwardLooking(4);
serviceInsertion.setStates(states);
diff --git a/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java b/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java
index 476167b0..e19bab8f 100644
--- a/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java
+++ b/jsprit-core/src/test/java/algorithms/TestTourStateUpdaterWithService.java
@@ -119,7 +119,7 @@ public class TestTourStateUpdaterWithService {
public void testCalculatedCost() {
updateStates.update(vehicleRoute);
assertEquals(40.0, states.getRouteState(vehicleRoute,StateFactory.COSTS).toDouble(), 0.05);
- assertEquals(10, states.getRouteState(vehicleRoute, StateFactory.LOAD).toDouble(), 0.05);
+ assertEquals(10, states.getRouteState(vehicleRoute, StateFactory.LOAD_AT_END).toDouble(), 0.05);
}
@Test
diff --git a/jsprit-core/src/main/java/algorithms/UpdateCostsAtRouteLevel.java b/jsprit-core/src/test/java/algorithms/UpdateCostsAtRouteLevel.java
similarity index 95%
rename from jsprit-core/src/main/java/algorithms/UpdateCostsAtRouteLevel.java
rename to jsprit-core/src/test/java/algorithms/UpdateCostsAtRouteLevel.java
index 5f6392a9..247f095a 100644
--- a/jsprit-core/src/main/java/algorithms/UpdateCostsAtRouteLevel.java
+++ b/jsprit-core/src/test/java/algorithms/UpdateCostsAtRouteLevel.java
@@ -38,7 +38,7 @@ class UpdateCostsAtRouteLevel implements StateUpdater,JobInsertedListener, Inser
@Override
public void informInsertionStarts(Collection vehicleRoutes, Collection unassignedJobs) {
RouteActivityVisitor forwardInTime = new RouteActivityVisitor();
- forwardInTime.addActivityVisitor(new UpdateCostsAtAllLevels(actCosts, tpCosts, states));
+ forwardInTime.addActivityVisitor(new UpdateVariableCosts(actCosts, tpCosts, states));
for(VehicleRoute route : vehicleRoutes){
forwardInTime.visit(route);
}
diff --git a/jsprit-core/src/main/java/algorithms/UpdateLoadAtRouteLevel.java b/jsprit-core/src/test/java/algorithms/UpdateLoadAtRouteLevel.java
similarity index 100%
rename from jsprit-core/src/main/java/algorithms/UpdateLoadAtRouteLevel.java
rename to jsprit-core/src/test/java/algorithms/UpdateLoadAtRouteLevel.java