From fd625788906c4f18ee28328f6ee1da162d638678 Mon Sep 17 00:00:00 2001 From: oblonski Date: Tue, 6 Jan 2015 18:29:19 +0100 Subject: [PATCH] refactor ruin share --- .../algorithm/ruin/AbstractRuinStrategy.java | 10 ++++ .../core/algorithm/ruin/RuinRadial.java | 46 ++++++++++++++----- .../core/algorithm/ruin/RuinRandom.java | 26 ++++------- .../core/algorithm/ruin/RuinShareFactory.java | 7 +++ 4 files changed, 60 insertions(+), 29 deletions(-) create mode 100644 jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinShareFactory.java diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/AbstractRuinStrategy.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/AbstractRuinStrategy.java index b3635644..5bee0ad6 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/AbstractRuinStrategy.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/AbstractRuinStrategy.java @@ -41,6 +41,16 @@ public abstract class AbstractRuinStrategy implements RuinStrategy{ ruinListeners = new RuinListeners(); } + protected RuinShareFactory ruinShareFactory; + + public void setRuinShareFactory(RuinShareFactory ruinShareFactory){ + this.ruinShareFactory = ruinShareFactory; + } + + public RuinShareFactory getRuinShareFactory(){ + return ruinShareFactory; + } + @Override public Collection ruin(Collection vehicleRoutes){ ruinListeners.ruinStarts(vehicleRoutes); diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinRadial.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinRadial.java index 3c6daea0..2edd0eb2 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinRadial.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinRadial.java @@ -36,7 +36,7 @@ import java.util.*; * @author stefan * */ -final class RuinRadial extends AbstractRuinStrategy { +public final class RuinRadial extends AbstractRuinStrategy { static interface JobNeighborhoods { @@ -254,6 +254,7 @@ final class RuinRadial extends AbstractRuinStrategy { private JobNeighborhoods jobNeighborhoods; + private final int noJobsToMemorize; /** * Constructs RuinRadial. @@ -266,16 +267,43 @@ final class RuinRadial extends AbstractRuinStrategy { super(); this.vrp = vrp; this.fractionOfAllNodes2beRuined = fraction2beRemoved; - int nJobsToMemorize = (int) Math.ceil(vrp.getJobs().values().size()*fraction2beRemoved); - JobNeighborhoodsImplWithCapRestriction jobNeighborhoodsImpl = new JobNeighborhoodsImplWithCapRestriction(vrp, jobDistance, nJobsToMemorize); + noJobsToMemorize = (int) Math.ceil(vrp.getJobs().values().size()*fraction2beRemoved); + ruinShareFactory = new RuinShareFactory() { + + @Override + public int createNumberToBeRemoved() { + return noJobsToMemorize; + } + + }; + JobNeighborhoodsImplWithCapRestriction jobNeighborhoodsImpl = new JobNeighborhoodsImplWithCapRestriction(vrp, jobDistance, noJobsToMemorize); jobNeighborhoodsImpl.initialise(); jobNeighborhoods = jobNeighborhoodsImpl; - logger.info("intialise " + this); + logger.info("initialise " + this); + } + + public RuinRadial(VehicleRoutingProblem vrp, int noJobs2beRemoved, JobDistance jobDistance) { + super(); + this.vrp = vrp; +// this.fractionOfAllNodes2beRuined = fraction2beRemoved; + noJobsToMemorize = noJobs2beRemoved; + ruinShareFactory = new RuinShareFactory() { + + @Override + public int createNumberToBeRemoved() { + return noJobsToMemorize; + } + + }; + JobNeighborhoodsImplWithCapRestriction jobNeighborhoodsImpl = new JobNeighborhoodsImplWithCapRestriction(vrp, jobDistance, noJobsToMemorize); + jobNeighborhoodsImpl.initialise(); + jobNeighborhoods = jobNeighborhoodsImpl; + logger.info("initialise " + this); } @Override public String toString() { - return "[name=radialRuin][fraction="+fractionOfAllNodes2beRuined+"]"; + return "[name=radialRuin][noJobsToBeRemoved="+noJobsToMemorize+"]"; } /** @@ -287,7 +315,7 @@ final class RuinRadial extends AbstractRuinStrategy { if(vehicleRoutes.isEmpty()){ return Collections.emptyList(); } - int nOfJobs2BeRemoved = getNuOfJobs2BeRemoved(); + int nOfJobs2BeRemoved = Math.min(ruinShareFactory.createNumberToBeRemoved(), noJobsToMemorize); if (nOfJobs2BeRemoved == 0) { return Collections.emptyList(); } @@ -320,10 +348,4 @@ final class RuinRadial extends AbstractRuinStrategy { return new ArrayList(vrp.getJobs().values()).get(randomIndex); } - private int getNuOfJobs2BeRemoved() { - return (int) Math.ceil(vrp.getJobs().values().size() - * fractionOfAllNodes2beRuined); - } - - } diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinRandom.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinRandom.java index 2f810cf1..9974fa37 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinRandom.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinRandom.java @@ -36,7 +36,7 @@ import java.util.List; * */ -final class RuinRandom extends AbstractRuinStrategy { +public final class RuinRandom extends AbstractRuinStrategy { private Logger logger = LogManager.getLogger(RuinRandom.class); @@ -54,6 +54,12 @@ final class RuinRandom extends AbstractRuinStrategy { super(); this.vrp = vrp; this.fractionOfAllNodes2beRuined = fraction; + setRuinShareFactory(new RuinShareFactory() { + @Override + public int createNumberToBeRemoved() { + return selectNuOfJobs2BeRemoved(); + } + }); logger.info("initialise " + this); logger.info("done"); } @@ -66,7 +72,7 @@ final class RuinRandom extends AbstractRuinStrategy { @Override public Collection ruinRoutes(Collection vehicleRoutes) { List unassignedJobs = new ArrayList(); - int nOfJobs2BeRemoved = selectNuOfJobs2BeRemoved(); + int nOfJobs2BeRemoved = getRuinShareFactory().createNumberToBeRemoved(); ruin(vehicleRoutes, nOfJobs2BeRemoved, unassignedJobs); return unassignedJobs; } @@ -77,20 +83,6 @@ final class RuinRandom extends AbstractRuinStrategy { @Override public Collection ruinRoutes(Collection vehicleRoutes, Job targetJob, int nOfJobs2BeRemoved) { throw new IllegalStateException("not supported"); -// List unassignedJobs = new ArrayList(); -// if(targetJob != null){ -// boolean removed = false; -// for (VehicleRoute route : vehicleRoutes) { -// removed = removeJob(targetJob,route); -// if (removed) { -// nOfJobs2BeRemoved--; -// unassignedJobs.add(targetJob); -// break; -// } -// } -// } -// ruin(vehicleRoutes, nOfJobs2BeRemoved, unassignedJobs); -// return unassignedJobs; } public void setRuinFraction(double fractionOfAllNodes2beRuined) { @@ -111,7 +103,7 @@ final class RuinRandom extends AbstractRuinStrategy { @Override public String toString() { - return "[name=randomRuin][fraction="+fractionOfAllNodes2beRuined+"]"; + return "[name=randomRuin][noJobsToBeRemoved="+selectNuOfJobs2BeRemoved()+"]"; } private Job pickRandomJob(LinkedList availableJobs) { diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinShareFactory.java b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinShareFactory.java new file mode 100644 index 00000000..f70f0f63 --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/ruin/RuinShareFactory.java @@ -0,0 +1,7 @@ +package jsprit.core.algorithm.ruin; + +public interface RuinShareFactory { + + public int createNumberToBeRemoved(); + +}