From 93ead2edce34e20009a09ab28d9f1ebfa95e6b39 Mon Sep 17 00:00:00 2001 From: Stefan Schroeder <4sschroeder@gmail.com> Date: Thu, 22 Aug 2013 11:54:01 +0200 Subject: [PATCH] introduce HardConstraints --- .../CalculatesServiceInsertion.java | 25 +++++--- ...alculatesServiceInsertionOnRouteLevel.java | 2 +- ...erviceInsertionWithTriangleInequality.java | 4 +- .../java/algorithms/CalculatorBuilder.java | 10 ++- .../main/java/algorithms/HardConstraint.java | 2 +- .../main/java/algorithms/HardConstraints.java | 28 +++++++++ .../main/java/algorithms/InsertionFacts.java | 63 +++++++++++++++++++ .../java/algorithms/InsertionScenario.java | 27 ++++++++ .../java/algorithms/GendreauPostOptTest.java | 2 +- .../TestCalculatesServiceInsertion.java | 2 +- ...alculatesServiceInsertionOnRouteLevel.java | 2 +- jsprit-examples/input/algorithmConfig.xml | 2 +- .../main/java/examples/SolomonExample.java | 4 +- 13 files changed, 151 insertions(+), 22 deletions(-) create mode 100644 jsprit-core/src/main/java/algorithms/HardConstraints.java create mode 100644 jsprit-core/src/main/java/algorithms/InsertionFacts.java create mode 100644 jsprit-core/src/main/java/algorithms/InsertionScenario.java diff --git a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertion.java b/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertion.java index 616f60be..3a86d780 100644 --- a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertion.java +++ b/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertion.java @@ -46,6 +46,14 @@ final class CalculatesServiceInsertion implements JobInsertionCalculator{ private End end; + private HardConstraint hardConstraint = new HardConstraint() { + + @Override + public boolean fulfilled(InsertionScenario iScenario) { + return true; + } + }; + private Neighborhood neighborhood = new Neighborhood() { @Override @@ -54,14 +62,16 @@ final class CalculatesServiceInsertion implements JobInsertionCalculator{ } }; - + void setHardConstraint(HardConstraint hardConstraint){ + this.hardConstraint = hardConstraint; + } public void setNeighborhood(Neighborhood neighborhood) { this.neighborhood = neighborhood; logger.info("initialise neighborhood " + neighborhood); } - public void setActivityStates(StatesContainer activityStates2){ + public void setStates(StatesContainer activityStates2){ this.states = activityStates2; } @@ -87,14 +97,15 @@ final class CalculatesServiceInsertion implements JobInsertionCalculator{ if(jobToInsert == null) throw new IllegalStateException("jobToInsert is missing."); if(newVehicle == null || newVehicle instanceof NoVehicle) throw new IllegalStateException("newVehicle is missing."); + InsertionFacts iFacts = new InsertionFacts(currentRoute, jobToInsert, newVehicle, newDriver, newVehicleDepartureTime); + if(!hardConstraint.fulfilled(new InsertionScenario(iFacts, null))){ + return InsertionData.noInsertionFound(); + } + TourActivities tour = currentRoute.getTourActivities(); double bestCost = bestKnownCosts; Service service = (Service)jobToInsert; - - int currentLoad = (int) states.getRouteState(currentRoute, StateTypes.LOAD).toDouble(); - if(currentLoad + service.getCapacityDemand() > newVehicle.getCapacity()){ - return InsertionData.noInsertionFound(); - } + int insertionIndex = InsertionData.NO_INDEX; TourActivity deliveryAct2Insert = ServiceActivity.newInstance(service); diff --git a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionOnRouteLevel.java b/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionOnRouteLevel.java index 85164555..ffa74025 100644 --- a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionOnRouteLevel.java +++ b/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionOnRouteLevel.java @@ -90,7 +90,7 @@ final class CalculatesServiceInsertionOnRouteLevel implements JobInsertionCalcul logger.info("initialise " + this); } - public void setActivityStates(StatesContainer activityStates2){ + public void setStates(StatesContainer activityStates2){ this.states = activityStates2; } diff --git a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionWithTriangleInequality.java b/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionWithTriangleInequality.java index 8281d5ff..4f18a234 100644 --- a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionWithTriangleInequality.java +++ b/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertionWithTriangleInequality.java @@ -73,7 +73,9 @@ final class CalculatesServiceInsertionWithTriangleInequality implements JobInser private HardConstraint hardConstraint = new HardConstraint() { @Override - public boolean fulfilled() { return true; } + public boolean fulfilled(InsertionScenario iScenario) { + return true; + } }; public void setHardConstraint(HardConstraint hardConstraint){ diff --git a/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java b/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java index 346f2c8a..7a6d7382 100644 --- a/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java +++ b/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java @@ -223,12 +223,10 @@ class CalculatorBuilder { private CalculatorPlusListeners createStandardLocal(VehicleRoutingProblem vrp, StatesContainer activityStates2){ JobInsertionCalculator standardServiceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), vrp.getActivityCosts()); -// JobInsertionCalculator standardServiceInsertion = new CalculatesServiceInsertionWithTriangleInequality(vrp.getTransportCosts(), vrp.getActivityCosts()); -// ((CalculatesServiceInsertionWithTriangleInequality) standardServiceInsertion).setActivityStates(activityStates2); -// ((CalculatesServiceInsertionWithTriangleInequality) standardServiceInsertion).setNeighborhood(vrp.getNeighborhood()); -// - ((CalculatesServiceInsertion) standardServiceInsertion).setActivityStates(activityStates2); + + ((CalculatesServiceInsertion) standardServiceInsertion).setStates(activityStates2); ((CalculatesServiceInsertion) standardServiceInsertion).setNeighborhood(vrp.getNeighborhood()); + ((CalculatesServiceInsertion) standardServiceInsertion).setHardConstraint(new HardConstraints.HardLoadConstraint(activityStates2)); CalculatorPlusListeners calcPlusListeners = new CalculatorPlusListeners(standardServiceInsertion); return calcPlusListeners; @@ -248,7 +246,7 @@ class CalculatorBuilder { ((CalculatesServiceInsertionOnRouteLevel)jobInsertionCalculator).setNuOfActsForwardLooking(after); ((CalculatesServiceInsertionOnRouteLevel)jobInsertionCalculator).setMemorySize(solutionMemory); ((CalculatesServiceInsertionOnRouteLevel)jobInsertionCalculator).setNeighborhood(vrp.getNeighborhood()); - ((CalculatesServiceInsertionOnRouteLevel) jobInsertionCalculator).setActivityStates(activityStates2); + ((CalculatesServiceInsertionOnRouteLevel) jobInsertionCalculator).setStates(activityStates2); CalculatorPlusListeners calcPlusListener = new CalculatorPlusListeners(jobInsertionCalculator); return calcPlusListener; } diff --git a/jsprit-core/src/main/java/algorithms/HardConstraint.java b/jsprit-core/src/main/java/algorithms/HardConstraint.java index 1b754ec4..8fbbad8c 100644 --- a/jsprit-core/src/main/java/algorithms/HardConstraint.java +++ b/jsprit-core/src/main/java/algorithms/HardConstraint.java @@ -2,6 +2,6 @@ package algorithms; interface HardConstraint { - public boolean fulfilled(); + public boolean fulfilled(InsertionScenario iScenario); } diff --git a/jsprit-core/src/main/java/algorithms/HardConstraints.java b/jsprit-core/src/main/java/algorithms/HardConstraints.java new file mode 100644 index 00000000..bebcf217 --- /dev/null +++ b/jsprit-core/src/main/java/algorithms/HardConstraints.java @@ -0,0 +1,28 @@ +package algorithms; + +import basics.Service; + +class HardConstraints { + + static class HardLoadConstraint implements HardConstraint{ + + private StatesContainer states; + + public HardLoadConstraint(StatesContainer states) { + super(); + this.states = states; + } + + @Override + public boolean fulfilled(InsertionScenario iScenario) { + int currentLoad = (int) states.getRouteState(iScenario.getiFacts().getRoute(), StateTypes.LOAD).toDouble(); + Service service = (Service) iScenario.getiFacts().getJob(); + if(currentLoad + service.getCapacityDemand() > iScenario.getiFacts().getNewVehicle().getCapacity()){ + return false; + } + return true; + } + + } + +} diff --git a/jsprit-core/src/main/java/algorithms/InsertionFacts.java b/jsprit-core/src/main/java/algorithms/InsertionFacts.java new file mode 100644 index 00000000..20284ed3 --- /dev/null +++ b/jsprit-core/src/main/java/algorithms/InsertionFacts.java @@ -0,0 +1,63 @@ +package algorithms; + +import basics.Job; +import basics.route.Driver; +import basics.route.Vehicle; +import basics.route.VehicleRoute; + +class InsertionFacts { + + private VehicleRoute route; + private Job job; + private Vehicle newVehicle; + private Driver newDriver; + private double newDepTime; + + /** + * @return the route + */ + public VehicleRoute getRoute() { + return route; + } + + /** + * @return the job + */ + public Job getJob() { + return job; + } + + /** + * @return the newVehicle + */ + public Vehicle getNewVehicle() { + return newVehicle; + } + + /** + * @return the newDriver + */ + public Driver getNewDriver() { + return newDriver; + } + + /** + * @return the newDepTime + */ + public double getNewDepTime() { + return newDepTime; + } + + public InsertionFacts(VehicleRoute route, Job job, Vehicle newVehicle, + Driver newDriver, double newDepTime) { + super(); + this.route = route; + this.job = job; + this.newVehicle = newVehicle; + this.newDriver = newDriver; + this.newDepTime = newDepTime; + } + + + +} diff --git a/jsprit-core/src/main/java/algorithms/InsertionScenario.java b/jsprit-core/src/main/java/algorithms/InsertionScenario.java new file mode 100644 index 00000000..f618368b --- /dev/null +++ b/jsprit-core/src/main/java/algorithms/InsertionScenario.java @@ -0,0 +1,27 @@ +package algorithms; + +class InsertionScenario { + + InsertionFacts iFacts; + InsertionData iData; + public InsertionScenario(InsertionFacts iFacts, InsertionData iData) { + super(); + this.iFacts = iFacts; + this.iData = iData; + } + /** + * @return the iFacts + */ + public InsertionFacts getiFacts() { + return iFacts; + } + /** + * @return the iData + */ + public InsertionData getiData() { + return iData; + } + + + +} diff --git a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java b/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java index 0f367fd8..1d386a28 100644 --- a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java +++ b/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java @@ -152,7 +152,7 @@ public class GendreauPostOptTest { activityCosts = new ExampleActivityCostFunction(); CalculatesServiceInsertion standardServiceInsertion = new CalculatesServiceInsertion(cost, activityCosts); - standardServiceInsertion.setActivityStates(states); + standardServiceInsertion.setStates(states); CalculatesServiceInsertionConsideringFixCost withFixCost = new CalculatesServiceInsertionConsideringFixCost(standardServiceInsertion, states); withFixCost.setWeightOfFixCost(1.2); diff --git a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java index 7b13d457..18c77574 100644 --- a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java +++ b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertion.java @@ -157,7 +157,7 @@ public class TestCalculatesServiceInsertion { ExampleActivityCostFunction activityCosts = new ExampleActivityCostFunction(); serviceInsertion = new CalculatesServiceInsertion(costs, activityCosts); - serviceInsertion.setActivityStates(states); + serviceInsertion.setStates(states); 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 56668a05..e7101157 100644 --- a/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java +++ b/jsprit-core/src/test/java/algorithms/TestCalculatesServiceInsertionOnRouteLevel.java @@ -148,7 +148,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel { ExampleActivityCostFunction activityCosts = new ExampleActivityCostFunction(); serviceInsertion = new CalculatesServiceInsertionOnRouteLevel(costs,activityCosts); serviceInsertion.setNuOfActsForwardLooking(4); - serviceInsertion.setActivityStates(states); + serviceInsertion.setStates(states); updateStates = new UpdateStates(states, costs, activityCosts); diff --git a/jsprit-examples/input/algorithmConfig.xml b/jsprit-examples/input/algorithmConfig.xml index 24d25d2f..3e136475 100755 --- a/jsprit-examples/input/algorithmConfig.xml +++ b/jsprit-examples/input/algorithmConfig.xml @@ -26,7 +26,7 @@ - route + diff --git a/jsprit-examples/src/main/java/examples/SolomonExample.java b/jsprit-examples/src/main/java/examples/SolomonExample.java index 6897a833..c72ebd1b 100644 --- a/jsprit-examples/src/main/java/examples/SolomonExample.java +++ b/jsprit-examples/src/main/java/examples/SolomonExample.java @@ -76,8 +76,8 @@ public class SolomonExample { * * The algorithm can be defined and configured in an xml-file. */ -// VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp); - VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfig_solomon.xml"); + VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp); +// VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfig_solomon.xml"); vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png")); /* * Solve the problem.