From 094dd9305af0d20ca4ea8fd4f501d7c47b909699 Mon Sep 17 00:00:00 2001 From: braktar Date: Tue, 5 Apr 2016 12:19:41 +0200 Subject: [PATCH 1/2] Add clusterRuin to xml algorithm config --- .../ruin/ClusterRuinStrategyFactory.java | 20 +++++++++++ .../algorithm/VehicleRoutingAlgorithms.java | 34 +++++++++++++++---- .../src/main/resources/algorithm_schema.xsd | 8 +++++ 3 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/ruin/ClusterRuinStrategyFactory.java diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/ruin/ClusterRuinStrategyFactory.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/ruin/ClusterRuinStrategyFactory.java new file mode 100644 index 00000000..2fb3d385 --- /dev/null +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/ruin/ClusterRuinStrategyFactory.java @@ -0,0 +1,20 @@ +package com.graphhopper.jsprit.core.algorithm.ruin; + +import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem; + +public class ClusterRuinStrategyFactory implements RuinStrategyFactory { + + private int initialNumberJobsToRemove; + private JobNeighborhoods jobNeighborhoods; + + public ClusterRuinStrategyFactory(int initialNumberJobsToRemove, JobNeighborhoods jobNeighborhoods) { + super(); + this.initialNumberJobsToRemove = initialNumberJobsToRemove; + this.jobNeighborhoods = jobNeighborhoods; + } + + @Override + public RuinStrategy createStrategy(VehicleRoutingProblem vrp) { + return new RuinClusters(vrp, initialNumberJobsToRemove, jobNeighborhoods); + } +} \ No newline at end of file diff --git a/jsprit-io/src/main/java/com/graphhopper/jsprit/io/algorithm/VehicleRoutingAlgorithms.java b/jsprit-io/src/main/java/com/graphhopper/jsprit/io/algorithm/VehicleRoutingAlgorithms.java index 07b62bae..4caf885f 100644 --- a/jsprit-io/src/main/java/com/graphhopper/jsprit/io/algorithm/VehicleRoutingAlgorithms.java +++ b/jsprit-io/src/main/java/com/graphhopper/jsprit/io/algorithm/VehicleRoutingAlgorithms.java @@ -26,6 +26,9 @@ import com.graphhopper.jsprit.core.algorithm.listener.VehicleRoutingAlgorithmLis import com.graphhopper.jsprit.core.algorithm.module.RuinAndRecreateModule; import com.graphhopper.jsprit.core.algorithm.recreate.InsertionStrategy; import com.graphhopper.jsprit.core.algorithm.recreate.listener.InsertionListener; +import com.graphhopper.jsprit.core.algorithm.ruin.ClusterRuinStrategyFactory; +import com.graphhopper.jsprit.core.algorithm.ruin.JobNeighborhoods; +import com.graphhopper.jsprit.core.algorithm.ruin.JobNeighborhoodsFactory; import com.graphhopper.jsprit.core.algorithm.ruin.RadialRuinStrategyFactory; import com.graphhopper.jsprit.core.algorithm.ruin.RandomRuinStrategyFactory; import com.graphhopper.jsprit.core.algorithm.ruin.RuinStrategy; @@ -839,18 +842,25 @@ public class VehicleRoutingAlgorithms { if (ruin_name == null) throw new IllegalStateException("module.ruin[@name] is missing."); String ruin_id = moduleConfig.getString("ruin[@id]"); if (ruin_id == null) ruin_id = "noId"; - String shareToRuinString = moduleConfig.getString("ruin.share"); - if (shareToRuinString == null) throw new IllegalStateException("module.ruin.share is missing."); - double shareToRuin = Double.valueOf(shareToRuinString); final RuinStrategy ruin; ModKey ruinKey = makeKey(ruin_name, ruin_id); if (ruin_name.equals("randomRuin")) { + String shareToRuinString = moduleConfig.getString("ruin.share"); + if (shareToRuinString == null) throw new IllegalStateException("module.ruin.share is missing."); + double shareToRuin = Double.valueOf(shareToRuinString); ruin = getRandomRuin(vrp, routeStates, definedClasses, ruinKey, shareToRuin); } else if (ruin_name.equals("radialRuin")) { + String shareToRuinString = moduleConfig.getString("ruin.share"); + if (shareToRuinString == null) throw new IllegalStateException("module.ruin.share is missing."); + double shareToRuin = Double.valueOf(shareToRuinString); JobDistance jobDistance = new AvgServiceAndShipmentDistance(vrp.getTransportCosts()); ruin = getRadialRuin(vrp, routeStates, definedClasses, ruinKey, shareToRuin, jobDistance); - } else - throw new IllegalStateException("ruin[@name] " + ruin_name + " is not known. Use either randomRuin or radialRuin."); + } else if (ruin_name.equals("clusterRuin")) { + String initialNumberJobsToRemoveString = moduleConfig.getString("ruin.initRemoveJobs"); + if (initialNumberJobsToRemoveString == null) throw new IllegalStateException("module.ruin.initRemoveJobs is missing."); + int initialNumberJobsToRemove = Integer.valueOf(initialNumberJobsToRemoveString); + ruin = getClusterRuin(vrp, routeStates, definedClasses, ruinKey, initialNumberJobsToRemove); + } else throw new IllegalStateException("ruin[@name] " + ruin_name + " is not known. Use either randomRuin or radialRuin."); String insertionName = moduleConfig.getString("insertion[@name]"); if (insertionName == null) @@ -877,7 +887,8 @@ public class VehicleRoutingAlgorithms { "\n\tcurrently there are following modules available: " + "\n\tbestInsertion" + "\n\trandomRuin" + - "\n\tradialRuin"); + "\n\tradialRuin" + + "\n\tclusterRuin"); } private static RuinStrategy getRadialRuin(final VehicleRoutingProblem vrp, final StateManager routeStates, TypedMap definedClasses, ModKey modKey, double shareToRuin, JobDistance jobDistance) { @@ -890,6 +901,17 @@ public class VehicleRoutingAlgorithms { return ruin; } + private static RuinStrategy getClusterRuin(final VehicleRoutingProblem vrp, final StateManager routeStates, TypedMap definedClasses, ModKey modKey, int initialNumberJobsToRemove) { + JobNeighborhoods jobNeighborhoods = new JobNeighborhoodsFactory().createNeighborhoods(vrp, new AvgServiceAndShipmentDistance(vrp.getTransportCosts())); + RuinStrategyKey stratKey = new RuinStrategyKey(modKey); + RuinStrategy ruin = definedClasses.get(stratKey); + if (ruin == null) { + ruin = new ClusterRuinStrategyFactory(initialNumberJobsToRemove, jobNeighborhoods).createStrategy(vrp); + definedClasses.put(stratKey, ruin); + } + return ruin; + } + private static RuinStrategy getRandomRuin(final VehicleRoutingProblem vrp, final StateManager routeStates, TypedMap definedClasses, ModKey modKey, double shareToRuin) { RuinStrategyKey stratKey = new RuinStrategyKey(modKey); RuinStrategy ruin = definedClasses.get(stratKey); diff --git a/jsprit-io/src/main/resources/algorithm_schema.xsd b/jsprit-io/src/main/resources/algorithm_schema.xsd index 555c0b99..d8bd7ec2 100644 --- a/jsprit-io/src/main/resources/algorithm_schema.xsd +++ b/jsprit-io/src/main/resources/algorithm_schema.xsd @@ -205,6 +205,13 @@ + + + + + + + @@ -218,6 +225,7 @@ + From 3c7b98dd0c100604ed5fa5a3b686d21948222314 Mon Sep 17 00:00:00 2001 From: braktar Date: Tue, 2 Aug 2016 17:00:52 +0200 Subject: [PATCH 2/2] CoreConstraint at xml creation --- .../io/algorithm/VehicleRoutingAlgorithms.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/jsprit-io/src/main/java/com/graphhopper/jsprit/io/algorithm/VehicleRoutingAlgorithms.java b/jsprit-io/src/main/java/com/graphhopper/jsprit/io/algorithm/VehicleRoutingAlgorithms.java index 07b62bae..ac2575a9 100644 --- a/jsprit-io/src/main/java/com/graphhopper/jsprit/io/algorithm/VehicleRoutingAlgorithms.java +++ b/jsprit-io/src/main/java/com/graphhopper/jsprit/io/algorithm/VehicleRoutingAlgorithms.java @@ -482,7 +482,7 @@ public class VehicleRoutingAlgorithms { constraintManager.addSkillsConstraint(); constraintManager.addConstraint(new SwitchNotFeasible(stateManager)); - return readAndCreateAlgorithm(vrp, config, nuOfThreads, null, stateManager, constraintManager, true); + return readAndCreateAlgorithm(vrp, config, nuOfThreads, null, stateManager, constraintManager, true, true); } public static VehicleRoutingAlgorithm readAndCreateAlgorithm(final VehicleRoutingProblem vrp, AlgorithmConfig config, @@ -490,8 +490,20 @@ public class VehicleRoutingAlgorithms { return readAndCreateAlgorithm(vrp, config.getXMLConfiguration(), nuOfThreads, solutionCostCalculator, stateManager, constraintManager, addDefaultCostCalculators); } + + public static VehicleRoutingAlgorithm readAndCreateAlgorithm(final VehicleRoutingProblem vrp, AlgorithmConfig config, + int nuOfThreads, SolutionCostCalculator solutionCostCalculator, final StateManager stateManager, ConstraintManager constraintManager, boolean addDefaultCostCalculators, boolean addCoreConstraints) { + return readAndCreateAlgorithm(vrp, config.getXMLConfiguration(), nuOfThreads, solutionCostCalculator, stateManager, constraintManager, addDefaultCostCalculators, addCoreConstraints); + } + private static VehicleRoutingAlgorithm readAndCreateAlgorithm(final VehicleRoutingProblem vrp, XMLConfiguration config, int nuOfThreads, final SolutionCostCalculator solutionCostCalculator, final StateManager stateManager, ConstraintManager constraintManager, boolean addDefaultCostCalculators) { + + return readAndCreateAlgorithm(vrp, config, nuOfThreads, solutionCostCalculator, stateManager, constraintManager, addDefaultCostCalculators, true); + } + + private static VehicleRoutingAlgorithm readAndCreateAlgorithm(final VehicleRoutingProblem vrp, XMLConfiguration config, + int nuOfThreads, final SolutionCostCalculator solutionCostCalculator, final StateManager stateManager, ConstraintManager constraintManager, boolean addDefaultCostCalculators, boolean addCoreConstraints) { // map to store constructed modules TypedMap definedClasses = new TypedMap(); @@ -574,6 +586,8 @@ public class VehicleRoutingAlgorithms { else costCalculator = solutionCostCalculator; PrettyAlgorithmBuilder prettyAlgorithmBuilder = PrettyAlgorithmBuilder.newInstance(vrp, vehicleFleetManager, stateManager, constraintManager); + if(addCoreConstraints) + prettyAlgorithmBuilder.addCoreStateAndConstraintStuff(); //construct initial solution creator final InsertionStrategy initialInsertionStrategy = createInitialSolution(config, vrp, vehicleFleetManager, stateManager, algorithmListeners, definedClasses, executorService, nuOfThreads, costCalculator, constraintManager, addDefaultCostCalculators); if (initialInsertionStrategy != null)