From 82a1a1117d5d578bf0ceb7b9728653cc4e60bfe8 Mon Sep 17 00:00:00 2001 From: Kandel Irina Date: Thu, 8 Feb 2018 14:15:20 +0200 Subject: [PATCH] remove unrelated breaks from unassigned jobs --- .../module/RuinAndRecreateModule.java | 24 +++++++++-- .../module/RuinAndRecreateModuleTest.java | 42 +++++++++++++++++++ 2 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/module/RuinAndRecreateModuleTest.java diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/module/RuinAndRecreateModule.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/module/RuinAndRecreateModule.java index 9c6e85cc..6eb48c27 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/module/RuinAndRecreateModule.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/module/RuinAndRecreateModule.java @@ -23,8 +23,10 @@ import com.graphhopper.jsprit.core.algorithm.recreate.InsertionStrategy; import com.graphhopper.jsprit.core.algorithm.recreate.listener.InsertionListener; import com.graphhopper.jsprit.core.algorithm.ruin.RuinStrategy; import com.graphhopper.jsprit.core.algorithm.ruin.listener.RuinListener; +import com.graphhopper.jsprit.core.problem.job.Break; import com.graphhopper.jsprit.core.problem.job.Job; import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute; import java.util.Collection; import java.util.HashSet; @@ -49,14 +51,30 @@ public class RuinAndRecreateModule implements SearchStrategyModule { @Override public VehicleRoutingProblemSolution runAndGetSolution(VehicleRoutingProblemSolution vrpSolution) { Collection ruinedJobs = ruin.ruin(vrpSolution.getRoutes()); - Set ruinedJobSet = new HashSet(); + Set ruinedJobSet = new HashSet<>(); ruinedJobSet.addAll(ruinedJobs); ruinedJobSet.addAll(vrpSolution.getUnassignedJobs()); Collection unassignedJobs = insertion.insertJobs(vrpSolution.getRoutes(), ruinedJobSet); vrpSolution.getUnassignedJobs().clear(); - vrpSolution.getUnassignedJobs().addAll(unassignedJobs); - return vrpSolution; + vrpSolution.getUnassignedJobs().addAll(getUnassignedJobs(vrpSolution, unassignedJobs)); + return vrpSolution; + } + + static Set getUnassignedJobs(VehicleRoutingProblemSolution vrpSolution, Collection unassignedJobs) { + final Set unassigned = new HashSet<>(); + for (Job job : unassignedJobs) { + if (!(job instanceof Break)) + unassigned.add(job); + } + + for (VehicleRoute route : vrpSolution.getRoutes()) { + Break aBreak = route.getVehicle().getBreak(); + if(aBreak != null && !route.getTourActivities().servesJob(aBreak)) { + unassigned.add(aBreak); + } + } + return unassigned; } @Override diff --git a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/module/RuinAndRecreateModuleTest.java b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/module/RuinAndRecreateModuleTest.java new file mode 100644 index 00000000..0adec8a6 --- /dev/null +++ b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/module/RuinAndRecreateModuleTest.java @@ -0,0 +1,42 @@ +package com.graphhopper.jsprit.core.algorithm.module; + +import com.graphhopper.jsprit.core.problem.job.Break; +import com.graphhopper.jsprit.core.problem.job.Job; +import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute; +import com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivities; +import com.graphhopper.jsprit.core.problem.vehicle.Vehicle; +import org.junit.Test; + +import java.util.*; + +import static com.graphhopper.jsprit.core.algorithm.module.RuinAndRecreateModule.getUnassignedJobs; +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class RuinAndRecreateModuleTest { + @Test + public void testUnassignedJobs() { + VehicleRoute vehicleRoute = mock(VehicleRoute.class); + Vehicle vehicle = mock(Vehicle.class); + Break aBreak = Break.Builder.newInstance(UUID.randomUUID().toString()).build(); + when(vehicle.getBreak()).thenReturn(aBreak); + when(vehicleRoute.getVehicle()).thenReturn(vehicle); + TourActivities tourActivities = mock(TourActivities.class); + when(vehicleRoute.getTourActivities()).thenReturn(tourActivities); + + Collection routes = new ArrayList<>(); + routes.add(vehicleRoute); + + Break unRelatedBreak = Break.Builder.newInstance(UUID.randomUUID().toString()).build(); + Set unassigned = new HashSet<>(); + unassigned.add(unRelatedBreak); + + when(tourActivities.servesJob(aBreak)).thenReturn(true); + assertEquals(0, getUnassignedJobs(new VehicleRoutingProblemSolution(routes, 212), unassigned).size()); + + when(tourActivities.servesJob(aBreak)).thenReturn(false); + assertEquals(1, getUnassignedJobs(new VehicleRoutingProblemSolution(routes, 212), unassigned).size()); + } +}