From 59b25d3d8e61ce635dcb4070fb8d571c631b4fe8 Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Tue, 13 Aug 2013 12:00:31 +0200 Subject: [PATCH] improve ruinApi --- .../java/algorithms/AbstractRuinStrategy.java | 22 --------- .../main/java/algorithms/RuinListeners.java | 33 +++++++++++++ .../src/main/java/algorithms/RuinRadial.java | 46 +++++-------------- .../src/main/java/algorithms/RuinRandom.java | 34 +++++--------- .../main/java/algorithms/RuinStrategy.java | 8 ++++ .../algorithms/VehicleRoutingAlgorithms.java | 6 +-- .../java/algorithms/GendreauPostOptTest.java | 4 +- .../java/algorithms/TestAlgorithmReader.java | 6 +++ 8 files changed, 76 insertions(+), 83 deletions(-) delete mode 100644 jsprit-core/src/main/java/algorithms/AbstractRuinStrategy.java create mode 100644 jsprit-core/src/main/java/algorithms/RuinListeners.java diff --git a/jsprit-core/src/main/java/algorithms/AbstractRuinStrategy.java b/jsprit-core/src/main/java/algorithms/AbstractRuinStrategy.java deleted file mode 100644 index f5264601..00000000 --- a/jsprit-core/src/main/java/algorithms/AbstractRuinStrategy.java +++ /dev/null @@ -1,22 +0,0 @@ -package algorithms; - -import java.util.Collection; - -import basics.Job; -import basics.route.VehicleRoute; - -abstract class AbstractRuinStrategy implements RuinStrategy{ - - public void ruinStarts(Collection routes){ - - } - - public void ruinEnds(Collection routes){ - - } - - public void jobRemoved(Job job, VehicleRoute fromRoute){ - - } - -} diff --git a/jsprit-core/src/main/java/algorithms/RuinListeners.java b/jsprit-core/src/main/java/algorithms/RuinListeners.java new file mode 100644 index 00000000..f48df19d --- /dev/null +++ b/jsprit-core/src/main/java/algorithms/RuinListeners.java @@ -0,0 +1,33 @@ +package algorithms; + +import java.util.ArrayList; +import java.util.Collection; + +import algorithms.RuinStrategy.RuinListener; +import basics.Job; +import basics.route.VehicleRoute; + +class RuinListeners { + + private Collection ruinListeners = new ArrayList(); + + void ruinStarts(Collection routes){ + for(RuinListener l : ruinListeners) l.ruinStarts(routes); + } + + void ruinEnds(Collection routes, Collection unassignedJobs){ + for(RuinListener l : ruinListeners) l.ruinEnds(routes, unassignedJobs); + } + + void removed(Job job, VehicleRoute fromRoute){ + for(RuinListener l : ruinListeners) l.removed(job, fromRoute); + } + + void addListener(RuinListener ruinListener){ + ruinListeners.add(ruinListener); + } + + void removeListener(RuinListener ruinListener){ + ruinListeners.remove(ruinListener); + } +} diff --git a/jsprit-core/src/main/java/algorithms/RuinRadial.java b/jsprit-core/src/main/java/algorithms/RuinRadial.java index 22296066..3e10b10e 100644 --- a/jsprit-core/src/main/java/algorithms/RuinRadial.java +++ b/jsprit-core/src/main/java/algorithms/RuinRadial.java @@ -34,22 +34,6 @@ import basics.route.VehicleRoute; final class RuinRadial implements RuinStrategy { - - private final static String NAME = "radialRuin"; - - /** - * returns a new creation of instance of ruinRadial - * @param vrp - * @param fraction TODO - * @param jobDistance - * @param jobRemover TODO - * @param routeUpdater TODO - * @return - */ - static RuinRadial newInstance(VehicleRoutingProblem vrp, double fraction, JobDistance jobDistance, JobRemover jobRemover, VehicleRouteUpdater routeUpdater){ - return new RuinRadial(vrp, fraction, jobDistance); - } - static class ReferencedJob { private Job job; @@ -82,6 +66,8 @@ final class RuinRadial implements RuinStrategy { private JobDistance jobDistance; + private RuinListeners ruinListeners; + public void setRandom(Random random) { this.random = random; } @@ -91,6 +77,7 @@ final class RuinRadial implements RuinStrategy { this.vrp = vrp; this.jobDistance = jobDistance; this.fractionOfAllNodes2beRuined = fraction; + ruinListeners = new RuinListeners(); calculateDistancesFromJob2Job(); logger.info("intialise " + this); } @@ -150,7 +137,7 @@ final class RuinRadial implements RuinStrategy { } public Collection ruin(Collection vehicleRoutes, Job targetJob, int nOfJobs2BeRemoved){ - ruinStarts(vehicleRoutes); + ruinListeners.ruinStarts(vehicleRoutes); List unassignedJobs = new ArrayList(); TreeSet tree = distanceNodeTree.get(targetJob.getId()); Iterator descendingIterator = tree.descendingIterator(); @@ -164,30 +151,15 @@ final class RuinRadial implements RuinStrategy { for (VehicleRoute route : vehicleRoutes) { removed = route.getTourActivities().removeJob(job);; if (removed) { - jobRemoved(job,route); + ruinListeners.removed(job,route); break; } } } - ruinEnds(vehicleRoutes); + ruinListeners.ruinEnds(vehicleRoutes, unassignedJobs); return unassignedJobs; } - private void ruinEnds(Collection vehicleRoutes) { - // TODO Auto-generated method stub - - } - - private void jobRemoved(Job job, VehicleRoute route) { - // TODO Auto-generated method stub - - } - - private void ruinStarts(Collection vehicleRoutes) { - // TODO Auto-generated method stub - - } - private Job pickRandomJob() { int totNuOfJobs = vrp.getJobs().values().size(); int randomIndex = random.nextInt(totNuOfJobs); @@ -200,6 +172,12 @@ final class RuinRadial implements RuinStrategy { * fractionOfAllNodes2beRuined); } + @Override + public void addListener(RuinListener ruinListener) { + // TODO Auto-generated method stub + + } + // @Override // public VehicleRoutingProblemSolution runAndGetSolution(VehicleRoutingProblemSolution vrpSolution) { // ruin(vrpSolution.getRoutes()); diff --git a/jsprit-core/src/main/java/algorithms/RuinRandom.java b/jsprit-core/src/main/java/algorithms/RuinRandom.java index 31c78483..57081db9 100644 --- a/jsprit-core/src/main/java/algorithms/RuinRandom.java +++ b/jsprit-core/src/main/java/algorithms/RuinRandom.java @@ -35,10 +35,6 @@ import basics.route.VehicleRoute; */ final class RuinRandom implements RuinStrategy { - - public static RuinRandom newInstance(VehicleRoutingProblem vrp, double fraction, JobRemover jobRemover, VehicleRouteUpdater routeUpdater){ - return new RuinRandom(vrp, fraction); - } private Logger logger = Logger.getLogger(RuinRandom.class); @@ -47,6 +43,8 @@ final class RuinRandom implements RuinStrategy { private double fractionOfAllNodes2beRuined; private Random random = RandomNumberGeneration.getRandom(); + + private RuinListeners ruinListeners; public void setRandom(Random random) { this.random = random; @@ -62,6 +60,7 @@ final class RuinRandom implements RuinStrategy { super(); this.vrp = vrp; this.fractionOfAllNodes2beRuined = fraction; + ruinListeners = new RuinListeners(); logger.info("initialise " + this); logger.info("done"); } @@ -84,7 +83,7 @@ final class RuinRandom implements RuinStrategy { */ @Override public Collection ruin(Collection vehicleRoutes, Job targetJob, int nOfJobs2BeRemoved) { - ruinStarts(vehicleRoutes); + ruinListeners.ruinStarts(vehicleRoutes); List unassignedJobs = new ArrayList(); if(targetJob != null){ boolean removed = false; @@ -93,13 +92,13 @@ final class RuinRandom implements RuinStrategy { if (removed) { nOfJobs2BeRemoved--; unassignedJobs.add(targetJob); - jobRemoved(targetJob,route); + ruinListeners.removed(targetJob,route); break; } } } ruin(vehicleRoutes, nOfJobs2BeRemoved, unassignedJobs); - ruinEnds(vehicleRoutes); + ruinListeners.ruinEnds(vehicleRoutes, unassignedJobs); return unassignedJobs; } @@ -117,28 +116,14 @@ final class RuinRandom implements RuinStrategy { for (VehicleRoute route : vehicleRoutes) { boolean removed = route.getTourActivities().removeJob(job); if (removed) { - jobRemoved(job,route); + ruinListeners.removed(job,route); break; } } } } - private void ruinEnds(Collection vehicleRoutes) { - // TODO Auto-generated method stub - } - - private void ruinStarts(Collection vehicleRoutes) { - // TODO Auto-generated method stub - - } - - private void jobRemoved(Job job, VehicleRoute route) { - // TODO Auto-generated method stub - - } - @Override public String toString() { return "[name=randomRuin][fraction="+fractionOfAllNodes2beRuined+"]"; @@ -153,4 +138,9 @@ final class RuinRandom implements RuinStrategy { return (int) Math.ceil(vrp.getJobs().values().size() * fractionOfAllNodes2beRuined); } + @Override + public void addListener(RuinListener ruinListener) { + ruinListeners.addListener(ruinListener); + } + } diff --git a/jsprit-core/src/main/java/algorithms/RuinStrategy.java b/jsprit-core/src/main/java/algorithms/RuinStrategy.java index 67cf868a..8f425c6a 100644 --- a/jsprit-core/src/main/java/algorithms/RuinStrategy.java +++ b/jsprit-core/src/main/java/algorithms/RuinStrategy.java @@ -31,6 +31,12 @@ interface RuinStrategy { public static interface RuinListener { + public void ruinStarts(Collection routes); + + public void ruinEnds(Collection routes, Collection unassignedJobs); + + public void removed(Job job, VehicleRoute fromRoute); + } /** @@ -43,5 +49,7 @@ interface RuinStrategy { public Collection ruin(Collection vehicleRoutes); public Collection ruin(Collection vehicleRoutes, Job targetJob, int nOfJobs2BeRemoved); + + public void addListener(RuinListener ruinListener); } diff --git a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java b/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java index 25daad32..d8b49a8d 100644 --- a/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java +++ b/jsprit-core/src/main/java/algorithms/VehicleRoutingAlgorithms.java @@ -757,7 +757,7 @@ public class VehicleRoutingAlgorithms { RuinStrategyKey stratKey = new RuinStrategyKey(ruinKey); RuinStrategy ruin = definedClasses.get(stratKey); if(ruin == null){ - ruin = RuinRadial.newInstance(vrp, 0.3, new JobDistanceAvgCosts(vrp.getTransportCosts()), new JobRemoverImpl(), new TourStateUpdater(activityStates, vrp.getTransportCosts(), vrp.getActivityCosts())); + ruin = new RuinRadial(vrp, 0.3, new JobDistanceAvgCosts(vrp.getTransportCosts())); definedClasses.put(stratKey, ruin); } @@ -795,7 +795,7 @@ public class VehicleRoutingAlgorithms { RuinStrategyKey stratKey = new RuinStrategyKey(modKey); RuinStrategy ruin = definedClasses.get(stratKey); if(ruin == null){ - ruin = RuinRadial.newInstance(vrp, shareToRuin, jobDistance, new JobRemoverImpl(), new TourStateUpdater(activityStates, vrp.getTransportCosts(), vrp.getActivityCosts())); + ruin = new RuinRadial(vrp, shareToRuin, jobDistance); definedClasses.put(stratKey, ruin); } return ruin; @@ -807,7 +807,7 @@ public class VehicleRoutingAlgorithms { RuinStrategyKey stratKey = new RuinStrategyKey(modKey); RuinStrategy ruin = definedClasses.get(stratKey); if(ruin == null){ - ruin = RuinRandom.newInstance(vrp, shareToRuin, new JobRemoverImpl(), new TourStateUpdater(activityStates, vrp.getTransportCosts(), vrp.getActivityCosts())); + ruin = new RuinRandom(vrp, shareToRuin); definedClasses.put(stratKey, ruin); } return ruin; diff --git a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java b/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java index 7b23c02c..2ab58a40 100644 --- a/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java +++ b/jsprit-core/src/test/java/algorithms/GendreauPostOptTest.java @@ -202,7 +202,7 @@ public class GendreauPostOptTest { assertEquals(110.0, sol.getCost(), 0.5); - RuinRadial radialRuin = RuinRadial.newInstance(vrp, 0.2, new JobDistanceAvgCosts(vrp.getTransportCosts()), new JobRemoverImpl(), updater); + RuinRadial radialRuin = new RuinRadial(vrp, 0.2, new JobDistanceAvgCosts(vrp.getTransportCosts())); AbstractInsertionStrategy insertionStrategy = new BestInsertion(routeAlgorithm); Gendreau postOpt = new Gendreau(vrp, radialRuin, insertionStrategy); postOpt.setFleetManager(fleetManager); @@ -243,7 +243,7 @@ public class GendreauPostOptTest { assertEquals(110.0, sol.getCost(), 0.5); - RuinRadial radialRuin = RuinRadial.newInstance(vrp, 0.2, new JobDistanceAvgCosts(vrp.getTransportCosts()), new JobRemoverImpl(), updater); + RuinRadial radialRuin = new RuinRadial(vrp, 0.2, new JobDistanceAvgCosts(vrp.getTransportCosts())); AbstractInsertionStrategy insertionStrategy = new BestInsertion(routeAlgorithm); Gendreau postOpt = new Gendreau(vrp, radialRuin, insertionStrategy); postOpt.setShareOfJobsToRuin(1.0); diff --git a/jsprit-core/src/test/java/algorithms/TestAlgorithmReader.java b/jsprit-core/src/test/java/algorithms/TestAlgorithmReader.java index db93a116..3e6416a9 100644 --- a/jsprit-core/src/test/java/algorithms/TestAlgorithmReader.java +++ b/jsprit-core/src/test/java/algorithms/TestAlgorithmReader.java @@ -169,6 +169,12 @@ public class TestAlgorithmReader { // TODO Auto-generated method stub return null; } + + @Override + public void addListener(RuinListener ruinListener) { + // TODO Auto-generated method stub + + } };