From 62331ccfd9f470e1dd8b816823838a9d4bc4a13d Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Sat, 9 Aug 2014 22:48:51 +0200 Subject: [PATCH] add bad job list --- .../analysis/toolbox/SolutionPrinter.java | 5 ++ .../InsertionInitialSolutionFactory.java | 5 +- .../jsprit/core/algorithm/SearchStrategy.java | 3 +- .../core/algorithm/SearchStrategyManager.java | 19 ++++--- ...lusFixedSolutionCostCalculatorFactory.java | 16 ++++-- .../algorithm/acceptor/GreedyAcceptance.java | 10 +--- .../io/VehicleRoutingAlgorithms.java | 21 +------- .../module/RuinAndRecreateModule.java | 13 +++-- .../algorithm/recreate/BestInsertion.java | 54 ++++++------------- .../recreate/BestInsertionConcurrent.java | 3 +- .../algorithm/recreate/InsertionStrategy.java | 22 ++++---- .../VehicleRoutingProblemSolution.java | 44 +++++++++++---- .../VehicleRoutingProblemSolutionTest.java | 49 +++++++++++++++-- .../jsprit/examples/BicycleMessenger.java | 11 ++-- ...ltipleDepotExampleWithPenaltyVehicles.java | 9 ++-- 15 files changed, 167 insertions(+), 117 deletions(-) diff --git a/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/SolutionPrinter.java b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/SolutionPrinter.java index fa92732e..34183fa3 100644 --- a/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/SolutionPrinter.java +++ b/jsprit-analysis/src/main/java/jsprit/analysis/toolbox/SolutionPrinter.java @@ -93,6 +93,7 @@ public class SolutionPrinter { System.out.format("+---------------+------------------------------------------+%n"); System.out.format(leftAlignSolution, "costs",solution.getCost()); System.out.format(leftAlignSolution, "nVehicles",solution.getRoutes().size()); + System.out.format(leftAlignSolution, "badJobs", solution.getBadJobs().size()); System.out.format("+----------------------------------------------------------+%n"); if(print.equals(Print.VERBOSE)){ @@ -130,6 +131,10 @@ public class SolutionPrinter { } System.out.format("+*:=PenaltyVehicle+%n"); System.out.format("+--------------------------------------------------------------------------------------------------------------------------------+%n"); + System.out.format("+*:=badJobs+%n"); + for(Job j : solution.getBadJobs()){ + System.out.println(j.getId()); + } } private static String getVehicleString(VehicleRoute route) { diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/InsertionInitialSolutionFactory.java b/jsprit-core/src/main/java/jsprit/core/algorithm/InsertionInitialSolutionFactory.java index dd2f59e7..9435513e 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/InsertionInitialSolutionFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/InsertionInitialSolutionFactory.java @@ -29,6 +29,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.ArrayList; +import java.util.Collection; import java.util.List; @@ -51,8 +52,8 @@ public final class InsertionInitialSolutionFactory implements InitialSolutionFac logger.info("create initial solution."); List vehicleRoutes = new ArrayList(); vehicleRoutes.addAll(vrp.getInitialVehicleRoutes()); - insertion.insertJobs(vehicleRoutes, getUnassignedJobs(vrp)); - VehicleRoutingProblemSolution solution = new VehicleRoutingProblemSolution(vehicleRoutes, Double.MAX_VALUE); + Collection badJobs = insertion.insertJobs(vehicleRoutes, getUnassignedJobs(vrp)); + VehicleRoutingProblemSolution solution = new VehicleRoutingProblemSolution(vehicleRoutes, badJobs, Double.MAX_VALUE); double costs = solutionCostsCalculator.getCosts(solution); solution.setCost(costs); logger.info("creation done"); diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategy.java b/jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategy.java index dc0bdb6f..6a13beab 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategy.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategy.java @@ -117,7 +117,8 @@ public class SearchStrategy { * @param vrp the underlying vehicle routing problem * @param solutions which will be modified * @return discoveredSolution - */ + * @throws java.lang.IllegalStateException if selector cannot select any solution + */ @SuppressWarnings("UnusedParameters") public DiscoveredSolution run(VehicleRoutingProblem vrp, Collection solutions){ VehicleRoutingProblemSolution solution = solutionSelector.selectSolution(solutions); diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategyManager.java b/jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategyManager.java index 1bd8d0c1..fb38c740 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategyManager.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/SearchStrategyManager.java @@ -16,15 +16,15 @@ ******************************************************************************/ package jsprit.core.algorithm; +import jsprit.core.algorithm.listener.SearchStrategyListener; +import jsprit.core.algorithm.listener.SearchStrategyModuleListener; +import jsprit.core.util.RandomNumberGeneration; + import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; -import jsprit.core.algorithm.listener.SearchStrategyListener; -import jsprit.core.algorithm.listener.SearchStrategyModuleListener; -import jsprit.core.util.RandomNumberGeneration; - public class SearchStrategyManager { @@ -55,8 +55,9 @@ public class SearchStrategyManager { /** * adds a new search strategy. the probability must be within [0,1]. - * @param strategy - * @param probability + * @param strategy strategy to be added + * @param probability probability of corresponding strategy to be added + * @throws java.lang.IllegalStateException if strategy is null OR prob > 1. OR prob < 0. */ public void addStrategy(SearchStrategy strategy, double probability){ if(strategy == null){ @@ -76,6 +77,12 @@ public class SearchStrategyManager { } } + /** + * Returns search strategy that has been randomly selected. + * + * @return selected search strategy + * @throws java.lang.IllegalStateException if randomNumberGenerator is null OR no search strategy can be found + */ public SearchStrategy getRandomStrategy() { if(random == null) throw new IllegalStateException("randomizer is null. make sure you set random object correctly"); double randomFig = random.nextDouble(); diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/VariablePlusFixedSolutionCostCalculatorFactory.java b/jsprit-core/src/main/java/jsprit/core/algorithm/VariablePlusFixedSolutionCostCalculatorFactory.java index 7dca0685..2ab22785 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/VariablePlusFixedSolutionCostCalculatorFactory.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/VariablePlusFixedSolutionCostCalculatorFactory.java @@ -23,6 +23,7 @@ import jsprit.core.problem.solution.SolutionCostCalculator; import jsprit.core.problem.solution.VehicleRoutingProblemSolution; import jsprit.core.problem.solution.route.VehicleRoute; import jsprit.core.problem.solution.route.state.RouteAndActivityStateGetter; +import jsprit.core.problem.vehicle.Vehicle; /** * Default objective function which is the sum of all fixed vehicle and variable @@ -43,16 +44,23 @@ public class VariablePlusFixedSolutionCostCalculatorFactory { public SolutionCostCalculator createCalculator(){ return new SolutionCostCalculator() { - + @Override public double getCosts(VehicleRoutingProblemSolution solution) { double c = 0.0; - for(VehicleRoute r : solution.getRoutes()){ - c += stateManager.getRouteState(r, InternalStates.COSTS,Double.class); - c += r.getVehicle().getType().getVehicleCostParams().fix; + for(VehicleRoute r : solution.getRoutes()){ + c += stateManager.getRouteState(r, InternalStates.COSTS, Double.class); + c += getFixedCosts(r.getVehicle()); } + c += solution.getBadJobs().size() * c * .1; return c; } + + private double getFixedCosts(Vehicle vehicle) { + if(vehicle == null) return 0.0; + if(vehicle.getType() == null) return 0.0; + return vehicle.getType().getVehicleCostParams().fix; + } }; } diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/GreedyAcceptance.java b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/GreedyAcceptance.java index 1f896697..b892d145 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/GreedyAcceptance.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/acceptor/GreedyAcceptance.java @@ -16,10 +16,10 @@ ******************************************************************************/ package jsprit.core.algorithm.acceptor; -import java.util.Collection; - import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import java.util.Collection; + public class GreedyAcceptance implements SolutionAcceptor{ @@ -48,12 +48,6 @@ public class GreedyAcceptance implements SolutionAcceptor{ if (worstSolution == null) worstSolution = s; else if (s.getCost() > worstSolution.getCost()) worstSolution = s; } -// if(newSolution.getRoutes().size() < worstSolution.getRoutes().size()){ -// solutions.remove(worstSolution); -// solutions.add(newSolution); -// solutionAccepted = true; -// } -// else if(newSolution.getCost() < worstSolution.getCost()){ solutions.remove(worstSolution); solutions.add(newSolution); diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java b/jsprit-core/src/main/java/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java index 1854df27..4ce8fb42 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/io/VehicleRoutingAlgorithms.java @@ -620,25 +620,8 @@ public class VehicleRoutingAlgorithms { } private static SolutionCostCalculator getDefaultCostCalculator(final StateManager stateManager) { - SolutionCostCalculator calc = new SolutionCostCalculator() { - - @Override - public double getCosts(VehicleRoutingProblemSolution solution) { - double costs = 0.0; - for(VehicleRoute route : solution.getRoutes()){ - costs += stateManager.getRouteState(route, InternalStates.COSTS, Double.class) + getFixedCosts(route.getVehicle()); - } - return costs; - } - - private double getFixedCosts(Vehicle vehicle) { - if(vehicle == null) return 0.0; - if(vehicle.getType() == null) return 0.0; - return vehicle.getType().getVehicleCostParams().fix; - } - }; - return calc; - } + return new VariablePlusFixedSolutionCostCalculatorFactory(stateManager).createCalculator(); + } private static VehicleFleetManager createFleetManager(final VehicleRoutingProblem vrp) { if(vrp.getFleetSize().equals(FleetSize.INFINITE)){ diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/module/RuinAndRecreateModule.java b/jsprit-core/src/main/java/jsprit/core/algorithm/module/RuinAndRecreateModule.java index 29f79a1e..ff30eaba 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/module/RuinAndRecreateModule.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/module/RuinAndRecreateModule.java @@ -16,8 +16,6 @@ ******************************************************************************/ package jsprit.core.algorithm.module; -import java.util.Collection; - import jsprit.core.algorithm.SearchStrategyModule; import jsprit.core.algorithm.listener.SearchStrategyModuleListener; import jsprit.core.algorithm.recreate.InsertionStrategy; @@ -27,6 +25,10 @@ import jsprit.core.algorithm.ruin.listener.RuinListener; import jsprit.core.problem.job.Job; import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + public class RuinAndRecreateModule implements SearchStrategyModule{ @@ -46,7 +48,12 @@ public class RuinAndRecreateModule implements SearchStrategyModule{ @Override public VehicleRoutingProblemSolution runAndGetSolution(VehicleRoutingProblemSolution vrpSolution) { Collection ruinedJobs = ruin.ruin(vrpSolution.getRoutes()); - insertion.insertJobs(vrpSolution.getRoutes(), ruinedJobs); + Set ruinedJobSet = new HashSet(); + ruinedJobSet.addAll(ruinedJobs); + ruinedJobSet.addAll(vrpSolution.getBadJobs()); + Collection badJobs = insertion.insertJobs(vrpSolution.getRoutes(), ruinedJobSet); + vrpSolution.getBadJobs().clear(); + vrpSolution.getBadJobs().addAll(badJobs); return vrpSolution; } diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertion.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertion.java index 15f9fd26..29cff38a 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertion.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertion.java @@ -34,11 +34,11 @@ import java.util.*; /** - * + * Best insertion that insert the job where additional costs are minimal. + * * @author stefan schroeder * */ - final class BestInsertion implements InsertionStrategy{ class Insertion { @@ -79,8 +79,6 @@ final class BestInsertion implements InsertionStrategy{ private JobInsertionCostsCalculator bestInsertionCostCalculator; - private boolean minVehiclesFirst = false; - public void setRandom(Random random) { this.random = random; } @@ -99,9 +97,10 @@ final class BestInsertion implements InsertionStrategy{ } @Override - public void insertJobs(Collection vehicleRoutes, Collection unassignedJobs) { + public Collection insertJobs(Collection vehicleRoutes, Collection unassignedJobs) { insertionsListeners.informInsertionStarts(vehicleRoutes,unassignedJobs); - List unassignedJobList = new ArrayList(unassignedJobs); + List badJobs = new ArrayList(unassignedJobs.size()); + List unassignedJobList = new ArrayList(unassignedJobs); Collections.shuffle(unassignedJobList, random); for(Job unassignedJob : unassignedJobList){ Insertion bestInsertion = null; @@ -116,41 +115,20 @@ final class BestInsertion implements InsertionStrategy{ bestInsertionCost = iData.getInsertionCost(); } } - if(!minVehiclesFirst){ - VehicleRoute newRoute = VehicleRoute.emptyRoute(); - InsertionData newIData = bestInsertionCostCalculator.getInsertionData(newRoute, unassignedJob, NO_NEW_VEHICLE_YET, NO_NEW_DEPARTURE_TIME_YET, NO_NEW_DRIVER_YET, bestInsertionCost); - if(newIData.getInsertionCost() < bestInsertionCost){ - bestInsertion = new Insertion(newRoute,newIData); - vehicleRoutes.add(newRoute); - } - } - if(bestInsertion == null){ - VehicleRoute newRoute = VehicleRoute.emptyRoute(); - InsertionData bestI = bestInsertionCostCalculator.getInsertionData(newRoute, unassignedJob, NO_NEW_VEHICLE_YET, NO_NEW_DEPARTURE_TIME_YET, NO_NEW_DRIVER_YET, Double.MAX_VALUE); - if(bestI instanceof InsertionData.NoInsertionFound){ - throw new NoSolutionFoundException(getErrorMsg(unassignedJob)); - } - else{ - bestInsertion = new Insertion(newRoute,bestI); - vehicleRoutes.add(newRoute); - } - } -// logger.info("insert " + unassignedJob + " pickup@" + bestInsertion.getInsertionData().getPickupInsertionIndex() + " delivery@" + bestInsertion.getInsertionData().getDeliveryInsertionIndex()); - inserter.insertJob(unassignedJob, bestInsertion.getInsertionData(), bestInsertion.getRoute()); - } + VehicleRoute newRoute = VehicleRoute.emptyRoute(); + InsertionData newIData = bestInsertionCostCalculator.getInsertionData(newRoute, unassignedJob, NO_NEW_VEHICLE_YET, NO_NEW_DEPARTURE_TIME_YET, NO_NEW_DRIVER_YET, bestInsertionCost); + if(newIData.getInsertionCost() < bestInsertionCost){ + bestInsertion = new Insertion(newRoute,newIData); + vehicleRoutes.add(newRoute); + } + if(bestInsertion == null) badJobs.add(unassignedJob); + else inserter.insertJob(unassignedJob, bestInsertion.getInsertionData(), bestInsertion.getRoute()); + } insertionsListeners.informInsertionEndsListeners(vehicleRoutes); + return badJobs; } - private String getErrorMsg(Job unassignedJob) { - return "given the vehicles, could not insert job\n" + - "\t" + unassignedJob + - "\n\tthis might have the following reasons:\n" + - "\t- no vehicle has the capacity to transport the job [check whether there is at least one vehicle that is capable to transport the job]\n" + - "\t- the time-window cannot be met, even in a commuter tour the time-window is missed [check whether it is possible to reach the time-window on the shortest path or make hard time-windows soft]\n" + - "\t- if you deal with finite vehicles, and the available vehicles are already fully employed, no vehicle can be found anymore to transport the job [add penalty-vehicles]"; - } - - @Override + @Override public void removeListener(InsertionListener insertionListener) { insertionsListeners.removeListener(insertionListener); } diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertionConcurrent.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertionConcurrent.java index ac981be3..3bd9de47 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertionConcurrent.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/BestInsertionConcurrent.java @@ -114,7 +114,7 @@ final class BestInsertionConcurrent implements InsertionStrategy{ } @Override - public void insertJobs(Collection vehicleRoutes, Collection unassignedJobs) { + public Collection insertJobs(Collection vehicleRoutes, Collection unassignedJobs) { insertionsListeners.informInsertionStarts(vehicleRoutes,unassignedJobs); List unassignedJobList = new ArrayList(unassignedJobs); Collections.shuffle(unassignedJobList, random); @@ -184,6 +184,7 @@ final class BestInsertionConcurrent implements InsertionStrategy{ inserter.insertJob(unassignedJob, bestInsertion.getInsertionData(), bestInsertion.getRoute()); } insertionsListeners.informInsertionEndsListeners(vehicleRoutes); + return null; } private String getErrorMsg(Job unassignedJob) { diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionStrategy.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionStrategy.java index b7f77521..8d0bc264 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionStrategy.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionStrategy.java @@ -16,18 +16,17 @@ ******************************************************************************/ package jsprit.core.algorithm.recreate; -import java.util.Collection; - import jsprit.core.algorithm.recreate.listener.InsertionListener; import jsprit.core.problem.job.Job; import jsprit.core.problem.solution.route.VehicleRoute; - +import java.util.Collection; /** - * + * Basic interface for insertion strategies + * * @author stefan schroeder * */ @@ -35,14 +34,13 @@ import jsprit.core.problem.solution.route.VehicleRoute; public interface InsertionStrategy { /** - * Assigns the unassigned jobs to service-providers - * - * @param vehicleRoutes - * @param unassignedJobs - */ - public void insertJobs(Collection vehicleRoutes, Collection unassignedJobs); - - public void addListener(InsertionListener insertionListener); + * Inserts unassigned jobs into vehicle routes. + * @param vehicleRoutes existing vehicle routes + * @param unassignedJobs jobs to be inserted + */ + public Collection insertJobs(Collection vehicleRoutes, Collection unassignedJobs); + + public void addListener(InsertionListener insertionListener); public void removeListener(InsertionListener insertionListener); diff --git a/jsprit-core/src/main/java/jsprit/core/problem/solution/VehicleRoutingProblemSolution.java b/jsprit-core/src/main/java/jsprit/core/problem/solution/VehicleRoutingProblemSolution.java index 63302c94..bbfc061f 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/solution/VehicleRoutingProblemSolution.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/solution/VehicleRoutingProblemSolution.java @@ -16,11 +16,12 @@ ******************************************************************************/ package jsprit.core.problem.solution; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; + import java.util.ArrayList; import java.util.Collection; -import jsprit.core.problem.solution.route.VehicleRoute; - /** * Contains the solution of a vehicle routing problem and its corresponding costs. @@ -29,14 +30,12 @@ import jsprit.core.problem.solution.route.VehicleRoute; * */ public class VehicleRoutingProblemSolution { - - public static double NO_COST_YET = -9999.0; - + /** * Makes a deep copy of the solution to be copied. * - * @param solution2copy - * @return + * @param solution2copy solution to be copied + * @return solution */ public static VehicleRoutingProblemSolution copyOf(VehicleRoutingProblemSolution solution2copy){ return new VehicleRoutingProblemSolution(solution2copy); @@ -44,6 +43,8 @@ public class VehicleRoutingProblemSolution { private final Collection routes; + private Collection badJobs = new ArrayList(); + private double cost; private VehicleRoutingProblemSolution(VehicleRoutingProblemSolution solution){ @@ -53,13 +54,14 @@ public class VehicleRoutingProblemSolution { routes.add(route); } this.cost = solution.getCost(); + badJobs.addAll(solution.getBadJobs()); } /** * Constructs a solution with a number of {@link VehicleRoute}s and their corresponding aggregate cost value. * - * @param routes - * @param cost + * @param routes routes being part of the solution + * @param cost total costs of solution */ public VehicleRoutingProblemSolution(Collection routes, double cost) { super(); @@ -67,6 +69,19 @@ public class VehicleRoutingProblemSolution { this.cost = cost; } + /** + * Constructs a solution with a number of {@link VehicleRoute}s, bad jobs and their corresponding aggregate cost value. + * + * @param routes routes being part of the solution + * @param cost total costs of solution + */ + public VehicleRoutingProblemSolution(Collection routes, Collection badJobs, double cost) { + super(); + this.routes = routes; + this.badJobs = badJobs; + this.cost = cost; + } + /** * Returns a collection of vehicle-routes. * @@ -88,10 +103,19 @@ public class VehicleRoutingProblemSolution { /** * Sets the costs of this solution. * - * @param cost + * @param cost the cost to assigned to this solution */ public void setCost(double cost){ this.cost = cost; } + /** + * Returns bad jobs, i.e. jobs that are not assigned to any vehicle route. + * + * @return bad jobs + */ + public Collection getBadJobs(){ + return badJobs; + } + } diff --git a/jsprit-core/src/test/java/jsprit/core/problem/solution/VehicleRoutingProblemSolutionTest.java b/jsprit-core/src/test/java/jsprit/core/problem/solution/VehicleRoutingProblemSolutionTest.java index 4d55c600..efff461d 100644 --- a/jsprit-core/src/test/java/jsprit/core/problem/solution/VehicleRoutingProblemSolutionTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/solution/VehicleRoutingProblemSolutionTest.java @@ -18,14 +18,17 @@ ******************************************************************************/ package jsprit.core.problem.solution; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.solution.route.VehicleRoute; +import org.junit.Test; + +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.List; -import jsprit.core.problem.solution.route.VehicleRoute; - -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; -import org.junit.Test; public class VehicleRoutingProblemSolutionTest { @@ -51,4 +54,42 @@ public class VehicleRoutingProblemSolutionTest { assertEquals(20.0,sol.getCost(),0.01); } + @Test + public void sizeOfBadJobsShouldBeCorrect(){ + Job badJob = mock(Job.class); + List badJobs = new ArrayList(); + badJobs.add(badJob); + VehicleRoutingProblemSolution sol = new VehicleRoutingProblemSolution(Collections.emptyList(), badJobs, 10.0); + assertEquals(1,sol.getBadJobs().size()); + } + + @Test + public void sizeOfBadJobsShouldBeCorrect_2(){ + Job badJob = mock(Job.class); + List badJobs = new ArrayList(); + badJobs.add(badJob); + VehicleRoutingProblemSolution sol = new VehicleRoutingProblemSolution(Collections.emptyList(), 10.0); + sol.getBadJobs().addAll(badJobs); + assertEquals(1, sol.getBadJobs().size()); + } + + @Test + public void badJobsShouldBeCorrect(){ + Job badJob = mock(Job.class); + List badJobs = new ArrayList(); + badJobs.add(badJob); + VehicleRoutingProblemSolution sol = new VehicleRoutingProblemSolution(Collections.emptyList(), badJobs, 10.0); + assertEquals(badJob,sol.getBadJobs().iterator().next()); + } + + @Test + public void badJobsShouldBeCorrect_2() { + Job badJob = mock(Job.class); + List badJobs = new ArrayList(); + badJobs.add(badJob); + VehicleRoutingProblemSolution sol = new VehicleRoutingProblemSolution(Collections.emptyList(), 10.0); + sol.getBadJobs().addAll(badJobs); + assertEquals(badJob, sol.getBadJobs().iterator().next()); + } + } diff --git a/jsprit-examples/src/main/java/jsprit/examples/BicycleMessenger.java b/jsprit-examples/src/main/java/jsprit/examples/BicycleMessenger.java index 175967d8..513c603f 100644 --- a/jsprit-examples/src/main/java/jsprit/examples/BicycleMessenger.java +++ b/jsprit-examples/src/main/java/jsprit/examples/BicycleMessenger.java @@ -245,7 +245,7 @@ public class BicycleMessenger { VehicleRoutingTransportCosts routingCosts = new CrowFlyCosts(problemBuilder.getLocations()); //which is the default VehicleRoutingTransportCosts in builder above problemBuilder.setRoutingCost(routingCosts); //finally build the problem - problemBuilder.addPenaltyVehicles(20.0,50000); +// problemBuilder.addPenaltyVehicles(20.0,50000); VehicleRoutingProblem bicycleMessengerProblem = problemBuilder.build(); /* @@ -272,10 +272,10 @@ public class BicycleMessenger { vraBuilder.addDefaultCostCalculators(); vraBuilder.setStateAndConstraintManager(stateManager, constraintManager); VehicleRoutingAlgorithm algorithm = vraBuilder.build(); - algorithm.setNuOfIterations(2000); + algorithm.setMaxIterations(2000); VariationCoefficientTermination prematureAlgorithmTermination = new VariationCoefficientTermination(200, 0.001); - algorithm.setPrematureAlgorithmTermination(prematureAlgorithmTermination); - algorithm.addListener(prematureAlgorithmTermination); +// algorithm.setPrematureAlgorithmTermination(prematureAlgorithmTermination); +// algorithm.addListener(prematureAlgorithmTermination); // algorithm.addListener(new AlgorithmSearchProgressChartListener("output/progress.png")); //search @@ -294,7 +294,8 @@ public class BicycleMessenger { //and the problem as well as the solution Plotter plotter1 = new Plotter(bicycleMessengerProblem, Solutions.bestOf(solutions)); - plotter1.plotShipments(false); + plotter1.setLabel(Plotter.Label.ID); + plotter1.plotShipments(false); // plotter1.setBoundingBox(5000, 45500, 25000, 66500); plotter1.plot("output/bicycleMessengerSolution.png", "bicycleMessenger"); diff --git a/jsprit-examples/src/main/java/jsprit/examples/MultipleDepotExampleWithPenaltyVehicles.java b/jsprit-examples/src/main/java/jsprit/examples/MultipleDepotExampleWithPenaltyVehicles.java index 4ddc16e1..e255418b 100644 --- a/jsprit-examples/src/main/java/jsprit/examples/MultipleDepotExampleWithPenaltyVehicles.java +++ b/jsprit-examples/src/main/java/jsprit/examples/MultipleDepotExampleWithPenaltyVehicles.java @@ -59,7 +59,7 @@ public class MultipleDepotExampleWithPenaltyVehicles { * * each with 14 vehicles each with a capacity of 500 and a maximum duration of 310 */ - int nuOfVehicles = 14; + int nuOfVehicles = 13; int capacity = 500; double maxDuration = 310; Coordinate firstDepotCoord = Coordinate.newInstance(-33, 33); @@ -68,7 +68,8 @@ public class MultipleDepotExampleWithPenaltyVehicles { int depotCounter = 1; for(Coordinate depotCoord : Arrays.asList(firstDepotCoord,second)){ for(int i=0;i solutions = vra.searchSolutions();