diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/box/Jsprit.java b/jsprit-core/src/main/java/jsprit/core/algorithm/box/Jsprit.java index 037e7b38..45653c9c 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/box/Jsprit.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/box/Jsprit.java @@ -96,6 +96,7 @@ public class Jsprit { INSERTION_NOISE_PROB("insertion.noise_prob"), RUIN_WORST_NOISE_LEVEL("worst.noise_level"), RUIN_WORST_NOISE_PROB("worst.noise_prob"), + FAST_REGRET("regret.fast"), CONSTRUCTION("construction"); String paraName; @@ -182,6 +183,7 @@ public class Jsprit { defaults.put(Parameter.RUIN_WORST_NOISE_LEVEL.toString(), String.valueOf(0.15)); defaults.put(Parameter.RUIN_WORST_NOISE_PROB.toString(), String.valueOf(0.2)); defaults.put(Parameter.VEHICLE_SWITCH.toString(), String.valueOf(true)); + defaults.put(Parameter.FAST_REGRET, String.valueOf(false)); defaults.put(Parameter.CONSTRUCTION.toString(), Construction.REGRET_INSERTION.toString()); return defaults; } @@ -406,27 +408,57 @@ public class Jsprit { AbstractInsertionStrategy regret; final DefaultScorer scorer; + boolean fastRegret = Boolean.parseBoolean(getProperty(Parameter.FAST_REGRET.toString())); if (es != null) { - RegretInsertionConcurrent regretInsertion = (RegretInsertionConcurrent) new InsertionBuilder(vrp, fm, stateManager, constraintManager) - .setInsertionStrategy(InsertionBuilder.Strategy.REGRET) - .setConcurrentMode(es, noThreads) - .considerFixedCosts(toDouble(getProperty(Parameter.FIXED_COST_PARAM.toString()))) - .setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString()))) - .setActivityInsertionCostCalculator(activityInsertion) - .build(); - scorer = getRegretScorer(vrp); - regretInsertion.setScoringFunction(scorer); - regret = regretInsertion; + if(fastRegret){ + RegretInsertionConcurrentFast regretInsertion = (RegretInsertionConcurrentFast) new InsertionBuilder(vrp, fm, stateManager, constraintManager) + .setInsertionStrategy(InsertionBuilder.Strategy.REGRET) + .setConcurrentMode(es, noThreads) + .setFastRegret(true) + .considerFixedCosts(toDouble(getProperty(Parameter.FIXED_COST_PARAM.toString()))) + .setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString()))) + .setActivityInsertionCostCalculator(activityInsertion) + .build(); + scorer = getRegretScorer(vrp); + regretInsertion.setScoringFunction(scorer); + regret = regretInsertion; + } + else { + RegretInsertionConcurrent regretInsertion = (RegretInsertionConcurrent) new InsertionBuilder(vrp, fm, stateManager, constraintManager) + .setInsertionStrategy(InsertionBuilder.Strategy.REGRET) + .setConcurrentMode(es, noThreads) + .considerFixedCosts(toDouble(getProperty(Parameter.FIXED_COST_PARAM.toString()))) + .setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString()))) + .setActivityInsertionCostCalculator(activityInsertion) + .build(); + scorer = getRegretScorer(vrp); + regretInsertion.setScoringFunction(scorer); + regret = regretInsertion; + } } else { - RegretInsertion regretInsertion = (RegretInsertion) new InsertionBuilder(vrp, fm, stateManager, constraintManager) - .setInsertionStrategy(InsertionBuilder.Strategy.REGRET) - .setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString()))) - .considerFixedCosts(toDouble(getProperty(Parameter.FIXED_COST_PARAM.toString()))) - .setActivityInsertionCostCalculator(activityInsertion) - .build(); - scorer = getRegretScorer(vrp); - regretInsertion.setScoringFunction(scorer); - regret = regretInsertion; + if(fastRegret) { + RegretInsertionFast regretInsertion = (RegretInsertionFast) new InsertionBuilder(vrp, fm, stateManager, constraintManager) + .setInsertionStrategy(InsertionBuilder.Strategy.REGRET) + .setFastRegret(true) + .setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString()))) + .considerFixedCosts(toDouble(getProperty(Parameter.FIXED_COST_PARAM.toString()))) + .setActivityInsertionCostCalculator(activityInsertion) + .build(); + scorer = getRegretScorer(vrp); + regretInsertion.setScoringFunction(scorer); + regret = regretInsertion; + } + else{ + RegretInsertion regretInsertion = (RegretInsertion) new InsertionBuilder(vrp, fm, stateManager, constraintManager) + .setInsertionStrategy(InsertionBuilder.Strategy.REGRET) + .setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString()))) + .considerFixedCosts(toDouble(getProperty(Parameter.FIXED_COST_PARAM.toString()))) + .setActivityInsertionCostCalculator(activityInsertion) + .build(); + scorer = getRegretScorer(vrp); + regretInsertion.setScoringFunction(scorer); + regret = regretInsertion; + } } regret.setRandom(random); diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionBuilder.java b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionBuilder.java index 8b44f774..e3ada608 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionBuilder.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/recreate/InsertionBuilder.java @@ -30,6 +30,9 @@ import java.util.concurrent.ExecutorService; public class InsertionBuilder { + private boolean fastRegret; + + public enum Strategy { REGRET, BEST } @@ -70,6 +73,8 @@ public class InsertionBuilder { private Strategy strategy = Strategy.BEST; + private boolean isFastRegret = false; + public InsertionBuilder(VehicleRoutingProblem vrp, VehicleFleetManager vehicleFleetManager, StateManager stateManager, ConstraintManager constraintManager) { super(); this.vrp = vrp; @@ -98,6 +103,12 @@ public class InsertionBuilder { return this; } + public InsertionBuilder setFastRegret(boolean fastRegret) { + this.isFastRegret = fastRegret; + return this; + } + + public InsertionBuilder setLocalLevel() { local = true; return this; @@ -166,14 +177,27 @@ public class InsertionBuilder { } } else if (strategy.equals(Strategy.REGRET)) { if (executor == null) { - RegretInsertion regret = new RegretInsertion(costCalculator, vrp); -// regret.setSwitchAllowed(allowVehicleSwitch); - insertion = regret; + if(isFastRegret){ + RegretInsertionFast regret = new RegretInsertionFast(costCalculator, vrp, fleetManager); + regret.setSwitchAllowed(allowVehicleSwitch); + insertion = regret; + } + else { + RegretInsertion regret = new RegretInsertion(costCalculator, vrp); + insertion = regret; + } } else { - RegretInsertionConcurrent regret = new RegretInsertionConcurrent(costCalculator, vrp, executor); -// regret.setSwitchAllowed(allowVehicleSwitch); - insertion = regret; + if(isFastRegret){ + RegretInsertionConcurrentFast regret = new RegretInsertionConcurrentFast(costCalculator, vrp, executor, fleetManager); + regret.setSwitchAllowed(allowVehicleSwitch); + insertion = regret; + } + else{ + RegretInsertionConcurrent regret = new RegretInsertionConcurrent(costCalculator, vrp, executor); + insertion = regret; + } + } } else throw new IllegalStateException("you should never get here"); for (InsertionListener l : iListeners) insertion.addListener(l); diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/Solomon_IT.java b/jsprit-core/src/test/java/jsprit/core/algorithm/Solomon_IT.java index ff5a5b86..39b24daa 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/Solomon_IT.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/Solomon_IT.java @@ -25,9 +25,12 @@ public class Solomon_IT { new VrpXMLReader(vrpBuilder).read("src/test/resources/solomon_c101.xml"); VehicleRoutingProblem vrp = vrpBuilder.build(); - VehicleRoutingAlgorithm vra = Jsprit.createAlgorithm(vrp); + VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp) +// .setProperty(Jsprit.Parameter.THREADS,"3") +// .setProperty(Jsprit.Parameter.FAST_REGRET,"true") + .buildAlgorithm(); // VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfig.xml"); - vra.setMaxIterations(500); + vra.setMaxIterations(2000); Collection solutions = vra.searchSolutions(); assertEquals(828.94, Solutions.bestOf(solutions).getCost(), 0.01); } diff --git a/jsprit-core/src/test/resources/infiniteWriterV2Test.xml b/jsprit-core/src/test/resources/infiniteWriterV2Test.xml index 07c5406a..2d9058ab 100644 --- a/jsprit-core/src/test/resources/infiniteWriterV2Test.xml +++ b/jsprit-core/src/test/resources/infiniteWriterV2Test.xml @@ -2,24 +2,9 @@ - FINITE + INFINITE - - v2 - vehType2 - - loc - - - loc - - - 0.0 - 1.7976931348623157E308 - - true - v1 vehType @@ -48,16 +33,58 @@ - - vehType2 - - 200 - - - 0.0 - 1.0 - - - + + + + loc + + + 1 + + 2.0 + + + 0.0 + 1.7976931348623157E308 + + + + + + loc2 + + + 1 + + 4.0 + + + 0.0 + 1.7976931348623157E308 + + + + + + + 10.0 + + + noDriver + v1 + 0.0 + + 1 + 0.0 + 0.0 + + 0.0 + + + + + + +