From f1213994e402fbd28511c3eb00e173175f2855fd Mon Sep 17 00:00:00 2001 From: Stefan Schroeder <4sschroeder@gmail.com> Date: Fri, 29 Nov 2013 15:31:02 +0100 Subject: [PATCH] add infrastructure to easily add soft and hard constraints --- .../io/VehicleRoutingAlgorithms.java | 2 +- .../core/problem/VehicleRoutingProblem.java | 14 +++++++++ .../core/problem/constraint/Constraint.java | 5 ++++ .../problem/constraint/ConstraintManager.java | 30 +++++++++++++++++++ .../HardActivityStateLevelConstraint.java | 2 +- .../problem/constraint/HardConstraint.java | 5 ++++ .../HardRouteStateLevelConstraint.java | 2 +- .../problem/constraint/SoftConstraint.java | 5 ++++ 8 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 jsprit-core/src/main/java/jsprit/core/problem/constraint/Constraint.java create mode 100644 jsprit-core/src/main/java/jsprit/core/problem/constraint/HardConstraint.java create mode 100644 jsprit-core/src/main/java/jsprit/core/problem/constraint/SoftConstraint.java diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java b/jsprit-core/src/main/java/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java index faa84ee3..61abdda8 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java @@ -492,7 +492,7 @@ public class VehicleRoutingAlgorithms { * define constraints */ //constraint manager - ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager); + ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager,vrp.getConstraints()); constraintManager.addTimeWindowConstraint(); constraintManager.addLoadConstraint(); diff --git a/jsprit-core/src/main/java/jsprit/core/problem/VehicleRoutingProblem.java b/jsprit-core/src/main/java/jsprit/core/problem/VehicleRoutingProblem.java index 5aa28690..8a2bf8fd 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/VehicleRoutingProblem.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/VehicleRoutingProblem.java @@ -117,6 +117,8 @@ public class VehicleRoutingProblem { private Collection vehicleTypes; private Collection problemConstraints; + + private Collection constraints; /** * by default all locations are neighbors @@ -136,6 +138,7 @@ public class VehicleRoutingProblem { vehicleTypes = new ArrayList(); services = new ArrayList(); problemConstraints = new ArrayList(); + constraints = new ArrayList(); } /** @@ -388,6 +391,10 @@ public class VehicleRoutingProblem { return Collections.unmodifiableCollection(vehicles); } + public void addConstraint(jsprit.core.problem.constraint.Constraint constraint){ + constraints.add(constraint); + } + /** * Gets an unmodifiable collection of already added services. * @@ -456,6 +463,8 @@ public class VehicleRoutingProblem { private Collection problemConstraints; + private Collection constraints; + private VehicleRoutingProblem(Builder builder) { this.jobs = builder.jobs; this.fleetComposition = builder.fleetComposition; @@ -466,6 +475,7 @@ public class VehicleRoutingProblem { this.activityCosts = builder.activityCosts; this.neighborhood = builder.neighborhood; this.problemConstraints = builder.problemConstraints; + this.constraints = builder.constraints; logger.info("initialise " + this); } @@ -558,5 +568,9 @@ public class VehicleRoutingProblem { return activityCosts; } + public Collection getConstraints(){ + return Collections.unmodifiableCollection(constraints); + } + } diff --git a/jsprit-core/src/main/java/jsprit/core/problem/constraint/Constraint.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/Constraint.java new file mode 100644 index 00000000..ee1feca1 --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/Constraint.java @@ -0,0 +1,5 @@ +package jsprit.core.problem.constraint; + +public interface Constraint { + +} diff --git a/jsprit-core/src/main/java/jsprit/core/problem/constraint/ConstraintManager.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/ConstraintManager.java index 68677b2a..0ed08625 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/constraint/ConstraintManager.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/ConstraintManager.java @@ -1,5 +1,9 @@ package jsprit.core.problem.constraint; +import java.util.Collection; + +import org.apache.log4j.Logger; + import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.VehicleRoutingProblem.Constraint; import jsprit.core.problem.misc.JobInsertionContext; @@ -12,6 +16,8 @@ public class ConstraintManager implements HardActivityStateLevelConstraint, Hard CRITICAL, HIGH, LOW } + private static Logger log = Logger.getLogger(ConstraintManager.class); + private HardActivityLevelConstraintManager actLevelConstraintManager = new HardActivityLevelConstraintManager(); private HardRouteLevelConstraintManager routeLevelConstraintManager = new HardRouteLevelConstraintManager(); @@ -29,6 +35,30 @@ public class ConstraintManager implements HardActivityStateLevelConstraint, Hard this.stateManager = stateManager; } + public ConstraintManager(VehicleRoutingProblem vrp, RouteAndActivityStateGetter stateManager, Collection constraints) { + this.vrp = vrp; + this.stateManager = stateManager; + resolveConstraints(constraints); + } + + private void resolveConstraints(Collection constraints) { + for(jsprit.core.problem.constraint.Constraint c : constraints){ + boolean constraintTypeKnown = false; + if(c instanceof HardActivityStateLevelConstraint) { + actLevelConstraintManager.addConstraint((HardActivityStateLevelConstraint) c, Priority.HIGH); + constraintTypeKnown = true; + } + if(c instanceof HardRouteStateLevelConstraint) { + routeLevelConstraintManager.addConstraint((HardRouteStateLevelConstraint) c); + constraintTypeKnown = true; + } + if(!constraintTypeKnown){ + log.warn("constraint " + c + " unknown thus ignores the constraint. currently, a constraint must implement either HardActivityStateLevelConstraint or HardRouteStateLevelConstraint"); + } + } + + } + public void addTimeWindowConstraint(){ if(!timeWindowConstraintsSet){ addConstraint(new TimeWindowConstraint(stateManager, vrp.getTransportCosts()),Priority.HIGH); diff --git a/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardActivityStateLevelConstraint.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardActivityStateLevelConstraint.java index 5e77ba3a..94da886e 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardActivityStateLevelConstraint.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardActivityStateLevelConstraint.java @@ -3,7 +3,7 @@ package jsprit.core.problem.constraint; import jsprit.core.problem.misc.JobInsertionContext; import jsprit.core.problem.solution.route.activity.TourActivity; -public interface HardActivityStateLevelConstraint { +public interface HardActivityStateLevelConstraint extends HardConstraint{ static enum ConstraintsStatus { diff --git a/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardConstraint.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardConstraint.java new file mode 100644 index 00000000..233475a2 --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardConstraint.java @@ -0,0 +1,5 @@ +package jsprit.core.problem.constraint; + +public interface HardConstraint extends Constraint{ + +} diff --git a/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardRouteStateLevelConstraint.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardRouteStateLevelConstraint.java index b0fa1398..196f405b 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardRouteStateLevelConstraint.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/HardRouteStateLevelConstraint.java @@ -3,7 +3,7 @@ package jsprit.core.problem.constraint; import jsprit.core.problem.misc.JobInsertionContext; -public interface HardRouteStateLevelConstraint { +public interface HardRouteStateLevelConstraint extends HardConstraint{ public boolean fulfilled(JobInsertionContext insertionContext); diff --git a/jsprit-core/src/main/java/jsprit/core/problem/constraint/SoftConstraint.java b/jsprit-core/src/main/java/jsprit/core/problem/constraint/SoftConstraint.java new file mode 100644 index 00000000..2f24defe --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/problem/constraint/SoftConstraint.java @@ -0,0 +1,5 @@ +package jsprit.core.problem.constraint; + +public interface SoftConstraint extends Constraint{ + +}