From cd65f66c86705cc526024ee5334b794145c6118d Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Fri, 16 Aug 2013 09:28:59 +0200 Subject: [PATCH] internal refactoring of insertionStrategy --- .../main/java/algorithms/BestInsertion.java | 6 +- .../algorithms/CreateInitialSolution.java | 6 +- .../src/main/java/algorithms/Gendreau.java | 4 +- .../java/algorithms/InsertionListeners.java | 57 +++++++++++++++++++ .../java/algorithms/InsertionStrategy.java | 3 + 5 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 jsprit-core/src/main/java/algorithms/InsertionListeners.java diff --git a/jsprit-core/src/main/java/algorithms/BestInsertion.java b/jsprit-core/src/main/java/algorithms/BestInsertion.java index aec62ea0..8d088b59 100644 --- a/jsprit-core/src/main/java/algorithms/BestInsertion.java +++ b/jsprit-core/src/main/java/algorithms/BestInsertion.java @@ -45,6 +45,8 @@ final class BestInsertion extends AbstractInsertionStrategy{ private Random random = RandomNumberGeneration.getRandom(); + private InsertionListeners insertionsListeners; + private RouteAlgorithm routeAlgorithm; public void setExperimentalPreferredRoute(Map experimentalPreferredRoute) { @@ -67,6 +69,7 @@ final class BestInsertion extends AbstractInsertionStrategy{ public BestInsertion(RouteAlgorithm routeAlgorithm) { super(); this.routeAlgorithm = routeAlgorithm; + this.insertionsListeners = new InsertionListeners(); logger.info("initialise " + this); } @@ -86,8 +89,7 @@ final class BestInsertion extends AbstractInsertionStrategy{ informInsertionStarts(vehicleRoutes,unassignedJobs.size()); int inserted = 0; List reasons = new ArrayList(); - for(Job unassignedJob : unassignedJobList){ - + for(Job unassignedJob : unassignedJobList){ VehicleRoute insertIn = null; Insertion bestInsertion = null; double bestInsertionCost = Double.MAX_VALUE; diff --git a/jsprit-core/src/main/java/algorithms/CreateInitialSolution.java b/jsprit-core/src/main/java/algorithms/CreateInitialSolution.java index dcaee915..08f19f1d 100644 --- a/jsprit-core/src/main/java/algorithms/CreateInitialSolution.java +++ b/jsprit-core/src/main/java/algorithms/CreateInitialSolution.java @@ -51,7 +51,7 @@ final class CreateInitialSolution implements InitialSolutionFactory { private static final Logger logger = Logger.getLogger(CreateInitialSolution.class); - private final AbstractInsertionStrategy insertion; + private final InsertionStrategy insertion; private boolean generateAsMuchAsRoutesAsVehiclesExist = false; @@ -59,9 +59,9 @@ final class CreateInitialSolution implements InitialSolutionFactory { this.generateAsMuchAsRoutesAsVehiclesExist = generateAsMuchAsRoutesAsVehiclesExist; } - public CreateInitialSolution(AbstractInsertionStrategy insertion) { + public CreateInitialSolution(InsertionStrategy insertionStrategy) { super(); - this.insertion = insertion; + this.insertion = insertionStrategy; } @Override diff --git a/jsprit-core/src/main/java/algorithms/Gendreau.java b/jsprit-core/src/main/java/algorithms/Gendreau.java index 03d96688..d94c4b1c 100644 --- a/jsprit-core/src/main/java/algorithms/Gendreau.java +++ b/jsprit-core/src/main/java/algorithms/Gendreau.java @@ -51,7 +51,7 @@ final class Gendreau implements SearchStrategyModule{ private final VehicleRoutingProblem vrp; - private final AbstractInsertionStrategy insertionStrategy; + private final InsertionStrategy insertionStrategy; private final RouteAlgorithm routeAlgorithm; @@ -67,7 +67,7 @@ final class Gendreau implements SearchStrategyModule{ this.shareOfJobsToRuin = shareOfJobsToRuin; } - public Gendreau(VehicleRoutingProblem vrp, RuinStrategy ruin, AbstractInsertionStrategy insertionStrategy) { + public Gendreau(VehicleRoutingProblem vrp, RuinStrategy ruin, InsertionStrategy insertionStrategy) { super(); this.routeAlgorithm = insertionStrategy.getRouteAlgorithm(); this.ruin = ruin; diff --git a/jsprit-core/src/main/java/algorithms/InsertionListeners.java b/jsprit-core/src/main/java/algorithms/InsertionListeners.java new file mode 100644 index 00000000..e0c9d2e3 --- /dev/null +++ b/jsprit-core/src/main/java/algorithms/InsertionListeners.java @@ -0,0 +1,57 @@ +package algorithms; + +import java.util.ArrayList; +import java.util.Collection; + +import basics.Job; +import basics.algo.InsertionEndsListener; +import basics.algo.InsertionListener; +import basics.algo.InsertionStartsListener; +import basics.algo.JobInsertedListener; +import basics.route.VehicleRoute; + +class InsertionListeners { + + private Collection listeners = new ArrayList(); + + public void informJobInserted(int nOfJobs2Recreate, Job insertedJob, VehicleRoute insertedIn){ + for(InsertionListener l : listeners){ + if(l instanceof JobInsertedListener){ + ((JobInsertedListener)l).informJobInserted(nOfJobs2Recreate, insertedJob, insertedIn); + } + } + } + + public void informBeforeJobInsertion(Job job, InsertionData data, VehicleRoute route){ + for(InsertionListener l : listeners){ + if(l instanceof BeforeJobInsertionListener){ + ((BeforeJobInsertionListener)l).informBeforeJobInsertion(job, data, route); + } + } + } + + public void informInsertionStarts(Collection vehicleRoutes, int nOfJobs2Recreate){ + for(InsertionListener l : listeners){ + if(l instanceof InsertionStartsListener){ + ((InsertionStartsListener)l).informInsertionStarts(vehicleRoutes,nOfJobs2Recreate); + } + } + } + + public void informInsertionEndsListeners(Collection vehicleRoutes) { + for(InsertionListener l : listeners){ + if(l instanceof InsertionEndsListener){ + ((InsertionEndsListener)l).informInsertionEnds(vehicleRoutes); + } + } + } + + public void addListener(InsertionListener insertionListener){ + listeners.add(insertionListener); + } + + public void removeListener(InsertionListener insertionListener){ + listeners.remove(insertionListener); + } + +} diff --git a/jsprit-core/src/main/java/algorithms/InsertionStrategy.java b/jsprit-core/src/main/java/algorithms/InsertionStrategy.java index 7c56995b..3d2e07d2 100644 --- a/jsprit-core/src/main/java/algorithms/InsertionStrategy.java +++ b/jsprit-core/src/main/java/algorithms/InsertionStrategy.java @@ -15,6 +15,7 @@ package algorithms; import java.util.Collection; import basics.Job; +import basics.algo.InsertionListener; import basics.route.VehicleRoute; @@ -62,5 +63,7 @@ interface InsertionStrategy { * @param result2beat */ public void run(Collection vehicleRoutes, Collection unassignedJobs, double result2beat); + + public void addListener(InsertionListener insertionListener); }