From 10defbe1eca44c6fd9e5aec2a529a653dd068609 Mon Sep 17 00:00:00 2001 From: oblonski Date: Tue, 13 Oct 2015 20:44:00 +0200 Subject: [PATCH] speed up regret insertion with breaks --- .../VehicleRoutingAlgorithmListeners.java | 31 ----------------- .../algorithm/recreate/RegretInsertion.java | 33 +++++++++++++++++-- .../recreate/RegretInsertionConcurrent.java | 31 ++++++++++++++++- 3 files changed, 61 insertions(+), 34 deletions(-) diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/listener/VehicleRoutingAlgorithmListeners.java b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/VehicleRoutingAlgorithmListeners.java index 9e425257..c9d0d355 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/listener/VehicleRoutingAlgorithmListeners.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/listener/VehicleRoutingAlgorithmListeners.java @@ -45,37 +45,6 @@ public class VehicleRoutingAlgorithmListeners { return l; } -// @Override -// public int hashCode() { -// final int prime = 31; -// int result = 1; -// result = prime * result + ((l == null) ? 0 : l.hashCode()); -// result = prime * result -// + ((priority == null) ? 0 : priority.hashCode()); -// return result; -// } -// @Override -// public boolean equals(Object obj) { -// if (this == obj) -// return true; -// if (obj == null) -// return false; -// if (getClass() != obj.getClass()) -// return false; -// PrioritizedVRAListener other = (PrioritizedVRAListener) obj; -// if (l == null) { -// if (other.l != null) -// return false; -// } else if (!l.equals(other.l)) -// return false; -// if (priority == null) { -// if (other.priority != null) -// return false; -// } else if (!priority.equals(other.priority)) -// return false; -// return true; -// } - } public enum Priority { diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertion.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertion.java index 486b8547..c7736e86 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertion.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertion.java @@ -19,6 +19,7 @@ package jsprit.core.algorithm.recreate; import jsprit.core.problem.Location; import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.job.Break; import jsprit.core.problem.job.Job; import jsprit.core.problem.job.Service; import jsprit.core.problem.job.Shipment; @@ -28,6 +29,7 @@ import org.apache.logging.log4j.Logger; import java.util.ArrayList; import java.util.Collection; +import java.util.Iterator; import java.util.List; /** @@ -223,8 +225,28 @@ public class RegretInsertion extends AbstractInsertionStrategy { @Override public Collection insertUnassignedJobs(Collection routes, Collection unassignedJobs) { List badJobs = new ArrayList(unassignedJobs.size()); - List jobs = new ArrayList(unassignedJobs); + Iterator jobIterator = unassignedJobs.iterator(); + while (jobIterator.hasNext()){ + Job job = jobIterator.next(); + if(job instanceof Break){ + VehicleRoute route = findRoute(routes,job); + if(route == null){ + badJobs.add(job); + } + else { + InsertionData iData = insertionCostsCalculator.getInsertionData(route, job, NO_NEW_VEHICLE_YET, NO_NEW_DEPARTURE_TIME_YET, NO_NEW_DRIVER_YET, Double.MAX_VALUE); + if (iData instanceof InsertionData.NoInsertionFound) { + badJobs.add(job); + } else { + insertJob(job, iData, route); + } + } + jobIterator.remove(); + } + } + + List jobs = new ArrayList(unassignedJobs); while (!jobs.isEmpty()) { List unassignedJobList = new ArrayList(jobs); List badJobList = new ArrayList(); @@ -244,7 +266,14 @@ public class RegretInsertion extends AbstractInsertionStrategy { return badJobs; } - private ScoredJob nextJob(Collection routes, List unassignedJobList, List badJobs) { + private VehicleRoute findRoute(Collection routes, Job job) { + for(VehicleRoute r : routes){ + if(r.getVehicle().getBreak() == job) return r; + } + return null; + } + + private ScoredJob nextJob(Collection routes, Collection unassignedJobList, List badJobs) { ScoredJob bestScoredJob = null; for (Job unassignedJob : unassignedJobList) { ScoredJob scoredJob = getScoredJob(routes, unassignedJob, insertionCostsCalculator, scoringFunction); diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertionConcurrent.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertionConcurrent.java index fe7f8feb..a08f7f46 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertionConcurrent.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/RegretInsertionConcurrent.java @@ -21,6 +21,7 @@ import jsprit.core.algorithm.recreate.RegretInsertion.DefaultScorer; import jsprit.core.algorithm.recreate.RegretInsertion.ScoredJob; import jsprit.core.algorithm.recreate.RegretInsertion.ScoringFunction; import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.job.Break; import jsprit.core.problem.job.Job; import jsprit.core.problem.solution.route.VehicleRoute; import org.apache.logging.log4j.LogManager; @@ -28,6 +29,7 @@ import org.apache.logging.log4j.Logger; import java.util.ArrayList; import java.util.Collection; +import java.util.Iterator; import java.util.List; import java.util.concurrent.*; @@ -88,8 +90,28 @@ public class RegretInsertionConcurrent extends AbstractInsertionStrategy { @Override public Collection insertUnassignedJobs(Collection routes, Collection unassignedJobs) { List badJobs = new ArrayList(unassignedJobs.size()); - List jobs = new ArrayList(unassignedJobs); + Iterator jobIterator = unassignedJobs.iterator(); + while (jobIterator.hasNext()){ + Job job = jobIterator.next(); + if(job instanceof Break){ + VehicleRoute route = findRoute(routes,job); + if(route == null){ + badJobs.add(job); + } + else { + InsertionData iData = insertionCostsCalculator.getInsertionData(route, job, NO_NEW_VEHICLE_YET, NO_NEW_DEPARTURE_TIME_YET, NO_NEW_DRIVER_YET, Double.MAX_VALUE); + if (iData instanceof InsertionData.NoInsertionFound) { + badJobs.add(job); + } else { + insertJob(job, iData, route); + } + } + jobIterator.remove(); + } + } + + List jobs = new ArrayList(unassignedJobs); while (!jobs.isEmpty()) { List unassignedJobList = new ArrayList(jobs); List badJobList = new ArrayList(); @@ -150,5 +172,12 @@ public class RegretInsertionConcurrent extends AbstractInsertionStrategy { return bestScoredJob; } + private VehicleRoute findRoute(Collection routes, Job job) { + for(VehicleRoute r : routes){ + if(r.getVehicle().getBreak() == job) return r; + } + return null; + } + }