diff --git a/jsprit-core/src/main/java/algorithms/MarginalsCalculus.java b/jsprit-core/src/main/java/algorithms/ActivityInsertionCostCalculator.java similarity index 97% rename from jsprit-core/src/main/java/algorithms/MarginalsCalculus.java rename to jsprit-core/src/main/java/algorithms/ActivityInsertionCostCalculator.java index d17e9bfc..cfbb0f3f 100644 --- a/jsprit-core/src/main/java/algorithms/MarginalsCalculus.java +++ b/jsprit-core/src/main/java/algorithms/ActivityInsertionCostCalculator.java @@ -22,7 +22,7 @@ package algorithms; import basics.route.TourActivity; -interface MarginalsCalculus { +interface ActivityInsertionCostCalculator { class Marginals { @@ -51,5 +51,7 @@ interface MarginalsCalculus { } Marginals calculate(InsertionContext iContext, TourActivity prevAct, TourActivity nextAct, TourActivity newAct, double depTimeAtPrevAct); + + } diff --git a/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java b/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java new file mode 100644 index 00000000..9d415afa --- /dev/null +++ b/jsprit-core/src/main/java/algorithms/BestInsertionBuilder.java @@ -0,0 +1,34 @@ +package algorithms; + +import basics.VehicleRoutingProblem; +import algorithms.HardConstraints.HardActivityLevelConstraint; +import algorithms.HardConstraints.HardRouteLevelConstraint; + +public class BestInsertionBuilder implements InsertionStrategyBuilder{ + + private VehicleRoutingProblem vrp; + + private StateManager stateManager; + + public BestInsertionBuilder(VehicleRoutingProblem vrp, StateManager stateManager) { + super(); + this.vrp = vrp; + this.stateManager = stateManager; + } + + public void addConstraint(HardActivityLevelConstraint hardActvitiyLevelConstraint){}; + + public void addConstraint(HardRouteLevelConstraint hardRouteLevelConstraint){}; + + public void setRouteLevel(int forwardLooking, int memory){}; + + public void setLocalLevel(){}; + + public void setActivityInsertionCostCalculator(ActivityInsertionCostCalculator costCalc){}; + + @Override + public InsertionStrategy build() { + return null; + } + +} diff --git a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertion.java b/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertion.java index a792fb53..e14b2277 100644 --- a/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertion.java +++ b/jsprit-core/src/main/java/algorithms/CalculatesServiceInsertion.java @@ -16,7 +16,7 @@ import org.apache.log4j.Logger; import util.Neighborhood; import algorithms.HardConstraints.HardRouteLevelConstraint; -import algorithms.MarginalsCalculus.Marginals; +import algorithms.ActivityInsertionCostCalculator.Marginals; import basics.Job; import basics.Service; import basics.costs.VehicleRoutingTransportCosts; @@ -47,7 +47,7 @@ final class CalculatesServiceInsertion implements JobInsertionCalculator{ } }; - private MarginalsCalculus marginalCalculus; + private ActivityInsertionCostCalculator marginalCalculus; private VehicleRoutingTransportCosts transportCosts; @@ -58,7 +58,7 @@ final class CalculatesServiceInsertion implements JobInsertionCalculator{ logger.info("initialise neighborhood " + neighborhood); } - public CalculatesServiceInsertion(VehicleRoutingTransportCosts routingCosts, MarginalsCalculus marginalsCalculus, HardRouteLevelConstraint hardRouteLevelConstraint) { + public CalculatesServiceInsertion(VehicleRoutingTransportCosts routingCosts, ActivityInsertionCostCalculator marginalsCalculus, HardRouteLevelConstraint hardRouteLevelConstraint) { super(); this.marginalCalculus = marginalsCalculus; this.hardRouteLevelConstraint = hardRouteLevelConstraint; diff --git a/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java b/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java index 0a3898a2..95859ce8 100644 --- a/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java +++ b/jsprit-core/src/main/java/algorithms/CalculatorBuilder.java @@ -219,7 +219,7 @@ class CalculatorBuilder { private CalculatorPlusListeners createStandardLocal(VehicleRoutingProblem vrp, StateManager statesManager){ if(constraintManager == null) throw new IllegalStateException("constraint-manager is null"); - MarginalsCalculus defaultCalc = new MarginalsCalculusTriangleInequality(vrp.getTransportCosts(), vrp.getActivityCosts(), constraintManager); + ActivityInsertionCostCalculator defaultCalc = new MarginalsCalculusTriangleInequality(vrp.getTransportCosts(), vrp.getActivityCosts(), constraintManager); JobInsertionCalculator standardServiceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), defaultCalc, constraintManager); ((CalculatesServiceInsertion) standardServiceInsertion).setNeighborhood(vrp.getNeighborhood()); diff --git a/jsprit-core/src/main/java/algorithms/EuclideanServiceDistance.java b/jsprit-core/src/main/java/algorithms/EuclideanServiceDistance.java index 84562fbc..923aad49 100644 --- a/jsprit-core/src/main/java/algorithms/EuclideanServiceDistance.java +++ b/jsprit-core/src/main/java/algorithms/EuclideanServiceDistance.java @@ -23,7 +23,7 @@ class EuclideanServiceDistance implements JobDistance { } @Override - public double calculateDistance(Job i, Job j) { + public double getDistance(Job i, Job j) { double avgCost = 0.0; if (i instanceof Service && j instanceof Service) { if (i.equals(j)) { diff --git a/jsprit-core/src/main/java/algorithms/InsertionStrategy.java b/jsprit-core/src/main/java/algorithms/InsertionStrategy.java index 4ebc9ffa..50b1e160 100644 --- a/jsprit-core/src/main/java/algorithms/InsertionStrategy.java +++ b/jsprit-core/src/main/java/algorithms/InsertionStrategy.java @@ -27,7 +27,7 @@ import basics.route.VehicleRoute; * */ -interface InsertionStrategy { +public interface InsertionStrategy { class Insertion { diff --git a/jsprit-core/src/main/java/algorithms/InsertionStrategyBuilder.java b/jsprit-core/src/main/java/algorithms/InsertionStrategyBuilder.java new file mode 100644 index 00000000..04e34208 --- /dev/null +++ b/jsprit-core/src/main/java/algorithms/InsertionStrategyBuilder.java @@ -0,0 +1,7 @@ +package algorithms; + +public interface InsertionStrategyBuilder { + + public InsertionStrategy build(); + +} diff --git a/jsprit-core/src/main/java/algorithms/JobDistance.java b/jsprit-core/src/main/java/algorithms/JobDistance.java index 82464989..9f384ee0 100644 --- a/jsprit-core/src/main/java/algorithms/JobDistance.java +++ b/jsprit-core/src/main/java/algorithms/JobDistance.java @@ -16,8 +16,8 @@ import basics.Job; -interface JobDistance { +public interface JobDistance { - public double calculateDistance(Job i, Job j); + public double getDistance(Job i, Job j); } diff --git a/jsprit-core/src/main/java/algorithms/JobDistanceAvgCosts.java b/jsprit-core/src/main/java/algorithms/JobDistanceAvgCosts.java index 176cb946..538a750d 100644 --- a/jsprit-core/src/main/java/algorithms/JobDistanceAvgCosts.java +++ b/jsprit-core/src/main/java/algorithms/JobDistanceAvgCosts.java @@ -45,7 +45,7 @@ class JobDistanceAvgCosts implements JobDistance { *

If the distance between two jobs cannot be calculated with input-transport costs, it tries the euclidean distance between these jobs. */ @Override - public double calculateDistance(Job i, Job j) { + public double getDistance(Job i, Job j) { double avgCost = 0.0; if (i instanceof Service && j instanceof Service) { if (i.equals(j)) { @@ -72,7 +72,7 @@ class JobDistanceAvgCosts implements JobDistance { // now try the euclidean distance between these two services } EuclideanServiceDistance euclidean = new EuclideanServiceDistance(); - distance = euclidean.calculateDistance(s_i, s_j); + distance = euclidean.getDistance(s_i, s_j); return distance; } diff --git a/jsprit-core/src/main/java/algorithms/JobDistanceBeeline.java b/jsprit-core/src/main/java/algorithms/JobDistanceBeeline.java index aef489fe..5db58cca 100644 --- a/jsprit-core/src/main/java/algorithms/JobDistanceBeeline.java +++ b/jsprit-core/src/main/java/algorithms/JobDistanceBeeline.java @@ -29,7 +29,7 @@ class JobDistanceBeeline implements JobDistance { } @Override - public double calculateDistance(Job i, Job j) { + public double getDistance(Job i, Job j) { double avgCost = 0.0; if (i instanceof Service && j instanceof Service) { if (i.equals(j)) { diff --git a/jsprit-core/src/main/java/algorithms/MarginalsCalculusTriangleInequality.java b/jsprit-core/src/main/java/algorithms/MarginalsCalculusTriangleInequality.java index f4ab4005..6eb0c245 100644 --- a/jsprit-core/src/main/java/algorithms/MarginalsCalculusTriangleInequality.java +++ b/jsprit-core/src/main/java/algorithms/MarginalsCalculusTriangleInequality.java @@ -25,7 +25,7 @@ import basics.costs.VehicleRoutingActivityCosts; import basics.costs.VehicleRoutingTransportCosts; import basics.route.TourActivity; -class MarginalsCalculusTriangleInequality implements MarginalsCalculus{ +class MarginalsCalculusTriangleInequality implements ActivityInsertionCostCalculator{ private HardActivityLevelConstraint hardConstraint; diff --git a/jsprit-core/src/main/java/algorithms/RadialRuinStrategyFactory.java b/jsprit-core/src/main/java/algorithms/RadialRuinStrategyFactory.java new file mode 100644 index 00000000..c541c4c9 --- /dev/null +++ b/jsprit-core/src/main/java/algorithms/RadialRuinStrategyFactory.java @@ -0,0 +1,22 @@ +package algorithms; + +import basics.VehicleRoutingProblem; + +public class RadialRuinStrategyFactory implements RuinStrategyFactory{ + + private double fraction; + + private JobDistance jobDistance; + + public RadialRuinStrategyFactory(double fraction, JobDistance jobDistance) { + super(); + this.fraction = fraction; + this.jobDistance = jobDistance; + } + + @Override + public RuinStrategy createStrategy(VehicleRoutingProblem vrp) { + return new RuinRadial(vrp,fraction,jobDistance); + } + +} diff --git a/jsprit-core/src/main/java/algorithms/RandomRuinStrategyFactory.java b/jsprit-core/src/main/java/algorithms/RandomRuinStrategyFactory.java new file mode 100644 index 00000000..5a32c9f2 --- /dev/null +++ b/jsprit-core/src/main/java/algorithms/RandomRuinStrategyFactory.java @@ -0,0 +1,19 @@ +package algorithms; + +import basics.VehicleRoutingProblem; + +public class RandomRuinStrategyFactory implements RuinStrategyFactory{ + + private double fraction; + + public RandomRuinStrategyFactory(double fraction) { + super(); + this.fraction = fraction; + } + + @Override + public RuinStrategy createStrategy(VehicleRoutingProblem vrp) { + return new RuinRandom(vrp, fraction); + } + +} diff --git a/jsprit-core/src/main/java/algorithms/RuinAndRecreateModule.java b/jsprit-core/src/main/java/algorithms/RuinAndRecreateModule.java index b296dd0f..2868d525 100644 --- a/jsprit-core/src/main/java/algorithms/RuinAndRecreateModule.java +++ b/jsprit-core/src/main/java/algorithms/RuinAndRecreateModule.java @@ -30,7 +30,7 @@ import basics.algo.InsertionListener; import basics.algo.SearchStrategyModule; import basics.algo.SearchStrategyModuleListener; -class RuinAndRecreateModule implements SearchStrategyModule{ +public class RuinAndRecreateModule implements SearchStrategyModule{ private InsertionStrategy insertion; @@ -49,9 +49,13 @@ class RuinAndRecreateModule implements SearchStrategyModule{ public VehicleRoutingProblemSolution runAndGetSolution(VehicleRoutingProblemSolution vrpSolution) { Collection ruinedJobs = ruin.ruin(vrpSolution.getRoutes()); insertion.insertJobs(vrpSolution.getRoutes(), ruinedJobs); + scoreSolution(vrpSolution); + return vrpSolution; + } + + private void scoreSolution(VehicleRoutingProblemSolution vrpSolution) { double totalCost = RouteUtils.getTotalCost(vrpSolution.getRoutes()); vrpSolution.setCost(totalCost); - return vrpSolution; } @Override diff --git a/jsprit-core/src/main/java/algorithms/RuinRadial.java b/jsprit-core/src/main/java/algorithms/RuinRadial.java index 2e293468..fff46ed4 100644 --- a/jsprit-core/src/main/java/algorithms/RuinRadial.java +++ b/jsprit-core/src/main/java/algorithms/RuinRadial.java @@ -106,7 +106,7 @@ final class RuinRadial implements RuinStrategy { }); distanceNodeTree.put(i.getId(), treeSet); for (Job j : vrp.getJobs().values()) { - double distance = jobDistance.calculateDistance(i, j); + double distance = jobDistance.getDistance(i, j); ReferencedJob refNode = new ReferencedJob(j, distance); treeSet.add(refNode); nuOfDistancesStored++; diff --git a/jsprit-core/src/main/java/algorithms/RuinStrategy.java b/jsprit-core/src/main/java/algorithms/RuinStrategy.java index 603050d7..0670ba5a 100644 --- a/jsprit-core/src/main/java/algorithms/RuinStrategy.java +++ b/jsprit-core/src/main/java/algorithms/RuinStrategy.java @@ -26,7 +26,7 @@ import basics.route.VehicleRoute; * */ -interface RuinStrategy { +public interface RuinStrategy { /** * Listener that listens to the ruin-process. It informs whoever is interested about start, end and about a removal of a job. diff --git a/jsprit-core/src/main/java/algorithms/RuinStrategyFactory.java b/jsprit-core/src/main/java/algorithms/RuinStrategyFactory.java index 3d7bb19a..86c1b0d3 100644 --- a/jsprit-core/src/main/java/algorithms/RuinStrategyFactory.java +++ b/jsprit-core/src/main/java/algorithms/RuinStrategyFactory.java @@ -22,7 +22,7 @@ package algorithms; import basics.VehicleRoutingProblem; -interface RuinStrategyFactory { +public interface RuinStrategyFactory { public RuinStrategy createStrategy(VehicleRoutingProblem vrp); diff --git a/jsprit-core/src/main/java/algorithms/StateManager.java b/jsprit-core/src/main/java/algorithms/StateManager.java index efd8ad1b..5bb9fc4d 100644 --- a/jsprit-core/src/main/java/algorithms/StateManager.java +++ b/jsprit-core/src/main/java/algorithms/StateManager.java @@ -23,7 +23,7 @@ package algorithms; import basics.route.TourActivity; import basics.route.VehicleRoute; -interface StateManager { +public interface StateManager { interface State { double toDouble(); diff --git a/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java b/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java index 5fa6e7d3..f5e8b452 100644 --- a/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java +++ b/jsprit-core/src/test/java/algorithms/BuildCVRPAlgoFromScratchTest.java @@ -62,7 +62,7 @@ public class BuildCVRPAlgoFromScratchTest { return true; } }; - MarginalsCalculus marginalCalculus = new MarginalsCalculusTriangleInequality(vrp.getTransportCosts(), vrp.getActivityCosts(), hardActLevelConstraint); + ActivityInsertionCostCalculator marginalCalculus = new MarginalsCalculusTriangleInequality(vrp.getTransportCosts(), vrp.getActivityCosts(), hardActLevelConstraint); CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardLoadConstraint(stateManager)); VehicleFleetManager fleetManager = new InfiniteVehicles(vrp.getVehicles()); diff --git a/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java b/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java index 7279b242..3f5a1c1d 100644 --- a/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java +++ b/jsprit-core/src/test/java/algorithms/BuildPDVRPAlgoFromScratchTest.java @@ -78,7 +78,7 @@ public class BuildPDVRPAlgoFromScratchTest { actLevelConstraintAccumulator.addConstraint(new HardConstraints.HardPickupAndDeliveryActivityLevelConstraint(stateManager)); actLevelConstraintAccumulator.addConstraint(new HardConstraints.HardTimeWindowActivityLevelConstraint(stateManager, vrp.getTransportCosts())); - MarginalsCalculus marginalCalculus = new MarginalsCalculusTriangleInequality(vrp.getTransportCosts(), vrp.getActivityCosts(), actLevelConstraintAccumulator); + ActivityInsertionCostCalculator marginalCalculus = new MarginalsCalculusTriangleInequality(vrp.getTransportCosts(), vrp.getActivityCosts(), actLevelConstraintAccumulator); CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardPickupAndDeliveryLoadConstraint(stateManager)); // CalculatesServiceInsertion serviceInsertion = new CalculatesServiceInsertion(vrp.getTransportCosts(), marginalCalculus, new HardConstraints.HardLoadConstraint(stateManager)); @@ -104,8 +104,7 @@ public class BuildPDVRPAlgoFromScratchTest { strategyManager.addStrategy(randomStrategy, 0.5); vra = new VehicleRoutingAlgorithm(vrp, strategyManager); - - + vra.getAlgorithmListeners().addListener(new StateUpdates.ResetStateManager(stateManager)); final IterateRouteForwardInTime iterateForward = new IterateRouteForwardInTime(vrp.getTransportCosts()); diff --git a/jsprit-core/src/test/java/algorithms/TestJobDistanceAvgCosts.java b/jsprit-core/src/test/java/algorithms/TestJobDistanceAvgCosts.java index 2c359319..277c2b93 100644 --- a/jsprit-core/src/test/java/algorithms/TestJobDistanceAvgCosts.java +++ b/jsprit-core/src/test/java/algorithms/TestJobDistanceAvgCosts.java @@ -60,7 +60,7 @@ public class TestJobDistanceAvgCosts { } }; JobDistanceAvgCosts c = new JobDistanceAvgCosts(costs); - c.calculateDistance(Service.Builder.newInstance("1", 1).setLocationId("foo").build(), Service.Builder.newInstance("2", 2).setLocationId("foo").build()); + c.getDistance(Service.Builder.newInstance("1", 1).setLocationId("foo").build(), Service.Builder.newInstance("2", 2).setLocationId("foo").build()); } @Test(expected=NullPointerException.class) @@ -96,7 +96,7 @@ public class TestJobDistanceAvgCosts { } }; JobDistanceAvgCosts c = new JobDistanceAvgCosts(costs); - c.calculateDistance(Service.Builder.newInstance("1", 1).setLocationId("loc").build(), Service.Builder.newInstance("2", 2).setLocationId("loc").build()); + c.getDistance(Service.Builder.newInstance("1", 1).setLocationId("loc").build(), Service.Builder.newInstance("2", 2).setLocationId("loc").build()); } }