mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
extend Jsprit.Builder to easily add custom search strategies
This commit is contained in:
parent
b694c32d41
commit
7a8d9ee841
1 changed files with 40 additions and 17 deletions
|
|
@ -46,9 +46,7 @@ import com.graphhopper.jsprit.core.util.NoiseMaker;
|
||||||
import com.graphhopper.jsprit.core.util.RandomNumberGeneration;
|
import com.graphhopper.jsprit.core.util.RandomNumberGeneration;
|
||||||
import com.graphhopper.jsprit.core.util.Solutions;
|
import com.graphhopper.jsprit.core.util.Solutions;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.Properties;
|
|
||||||
import java.util.Random;
|
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
|
@ -170,6 +168,10 @@ public class Jsprit {
|
||||||
|
|
||||||
private ScoringFunction regretScorer = null;
|
private ScoringFunction regretScorer = null;
|
||||||
|
|
||||||
|
private Map<SearchStrategy, Double> customStrategies = new HashMap<>();
|
||||||
|
|
||||||
|
private VehicleFleetManager fleetManager = null;
|
||||||
|
|
||||||
public static Builder newInstance(VehicleRoutingProblem vrp) {
|
public static Builder newInstance(VehicleRoutingProblem vrp) {
|
||||||
return new Builder(vrp);
|
return new Builder(vrp);
|
||||||
}
|
}
|
||||||
|
|
@ -234,6 +236,16 @@ public class Jsprit {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Builder addSearchStrategy(SearchStrategy searchStrategy, double weight) {
|
||||||
|
customStrategies.put(searchStrategy, weight);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setVehicleFleetManager(VehicleFleetManager fleetManager) {
|
||||||
|
this.fleetManager = fleetManager;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public Builder setExecutorService(ExecutorService es, int noThreads) {
|
public Builder setExecutorService(ExecutorService es, int noThreads) {
|
||||||
this.es = es;
|
this.es = es;
|
||||||
this.noThreads = noThreads;
|
this.noThreads = noThreads;
|
||||||
|
|
@ -355,6 +367,10 @@ public class Jsprit {
|
||||||
|
|
||||||
private ScoringFunction regretScorer;
|
private ScoringFunction regretScorer;
|
||||||
|
|
||||||
|
private final Map<SearchStrategy, Double> customStrategies = new HashMap<>();
|
||||||
|
|
||||||
|
private VehicleFleetManager vehicleFleetManager;
|
||||||
|
|
||||||
private Jsprit(Builder builder) {
|
private Jsprit(Builder builder) {
|
||||||
this.stateManager = builder.stateManager;
|
this.stateManager = builder.stateManager;
|
||||||
this.constraintManager = builder.constraintManager;
|
this.constraintManager = builder.constraintManager;
|
||||||
|
|
@ -367,6 +383,8 @@ public class Jsprit {
|
||||||
this.activityInsertion = builder.activityInsertionCalculator;
|
this.activityInsertion = builder.activityInsertionCalculator;
|
||||||
this.acceptor = builder.solutionAcceptor;
|
this.acceptor = builder.solutionAcceptor;
|
||||||
regretScorer = builder.regretScorer;
|
regretScorer = builder.regretScorer;
|
||||||
|
customStrategies.putAll(builder.customStrategies);
|
||||||
|
vehicleFleetManager = builder.fleetManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ini(VehicleRoutingProblem vrp) {
|
private void ini(VehicleRoutingProblem vrp) {
|
||||||
|
|
@ -375,13 +393,14 @@ public class Jsprit {
|
||||||
|
|
||||||
private VehicleRoutingAlgorithm create(final VehicleRoutingProblem vrp) {
|
private VehicleRoutingAlgorithm create(final VehicleRoutingProblem vrp) {
|
||||||
ini(vrp);
|
ini(vrp);
|
||||||
VehicleFleetManager fm;
|
if (vehicleFleetManager == null) {
|
||||||
if (vrp.getFleetSize().equals(VehicleRoutingProblem.FleetSize.INFINITE)) {
|
if (vrp.getFleetSize().equals(VehicleRoutingProblem.FleetSize.INFINITE)) {
|
||||||
fm = new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager();
|
vehicleFleetManager = new InfiniteFleetManagerFactory(vrp.getVehicles()).createFleetManager();
|
||||||
} else {
|
} else {
|
||||||
FiniteFleetManagerFactory finiteFleetManagerFactory = new FiniteFleetManagerFactory(vrp.getVehicles());
|
FiniteFleetManagerFactory finiteFleetManagerFactory = new FiniteFleetManagerFactory(vrp.getVehicles());
|
||||||
finiteFleetManagerFactory.setRandom(random);
|
finiteFleetManagerFactory.setRandom(random);
|
||||||
fm = finiteFleetManagerFactory.createFleetManager();
|
vehicleFleetManager = finiteFleetManagerFactory.createFleetManager();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stateManager == null) {
|
if (stateManager == null) {
|
||||||
|
|
@ -506,7 +525,7 @@ public class Jsprit {
|
||||||
boolean fastRegret = Boolean.parseBoolean(getProperty(Parameter.FAST_REGRET.toString()));
|
boolean fastRegret = Boolean.parseBoolean(getProperty(Parameter.FAST_REGRET.toString()));
|
||||||
if (es != null) {
|
if (es != null) {
|
||||||
if(fastRegret){
|
if(fastRegret){
|
||||||
RegretInsertionConcurrentFast regretInsertion = (RegretInsertionConcurrentFast) new InsertionBuilder(vrp, fm, stateManager, constraintManager)
|
RegretInsertionConcurrentFast regretInsertion = (RegretInsertionConcurrentFast) new InsertionBuilder(vrp, vehicleFleetManager, stateManager, constraintManager)
|
||||||
.setInsertionStrategy(InsertionBuilder.Strategy.REGRET)
|
.setInsertionStrategy(InsertionBuilder.Strategy.REGRET)
|
||||||
.setConcurrentMode(es, noThreads)
|
.setConcurrentMode(es, noThreads)
|
||||||
.setFastRegret(true)
|
.setFastRegret(true)
|
||||||
|
|
@ -520,7 +539,7 @@ public class Jsprit {
|
||||||
regret = regretInsertion;
|
regret = regretInsertion;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
RegretInsertionConcurrent regretInsertion = (RegretInsertionConcurrent) new InsertionBuilder(vrp, fm, stateManager, constraintManager)
|
RegretInsertionConcurrent regretInsertion = (RegretInsertionConcurrent) new InsertionBuilder(vrp, vehicleFleetManager, stateManager, constraintManager)
|
||||||
.setInsertionStrategy(InsertionBuilder.Strategy.REGRET)
|
.setInsertionStrategy(InsertionBuilder.Strategy.REGRET)
|
||||||
.setConcurrentMode(es, noThreads)
|
.setConcurrentMode(es, noThreads)
|
||||||
.considerFixedCosts(toDouble(getProperty(Parameter.FIXED_COST_PARAM.toString())))
|
.considerFixedCosts(toDouble(getProperty(Parameter.FIXED_COST_PARAM.toString())))
|
||||||
|
|
@ -533,7 +552,7 @@ public class Jsprit {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if(fastRegret) {
|
if(fastRegret) {
|
||||||
RegretInsertionFast regretInsertion = (RegretInsertionFast) new InsertionBuilder(vrp, fm, stateManager, constraintManager)
|
RegretInsertionFast regretInsertion = (RegretInsertionFast) new InsertionBuilder(vrp, vehicleFleetManager, stateManager, constraintManager)
|
||||||
.setInsertionStrategy(InsertionBuilder.Strategy.REGRET)
|
.setInsertionStrategy(InsertionBuilder.Strategy.REGRET)
|
||||||
.setFastRegret(true)
|
.setFastRegret(true)
|
||||||
.setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString())))
|
.setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString())))
|
||||||
|
|
@ -546,7 +565,7 @@ public class Jsprit {
|
||||||
regret = regretInsertion;
|
regret = regretInsertion;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
RegretInsertion regretInsertion = (RegretInsertion) new InsertionBuilder(vrp, fm, stateManager, constraintManager)
|
RegretInsertion regretInsertion = (RegretInsertion) new InsertionBuilder(vrp, vehicleFleetManager, stateManager, constraintManager)
|
||||||
.setInsertionStrategy(InsertionBuilder.Strategy.REGRET)
|
.setInsertionStrategy(InsertionBuilder.Strategy.REGRET)
|
||||||
.setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString())))
|
.setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString())))
|
||||||
.considerFixedCosts(toDouble(getProperty(Parameter.FIXED_COST_PARAM.toString())))
|
.considerFixedCosts(toDouble(getProperty(Parameter.FIXED_COST_PARAM.toString())))
|
||||||
|
|
@ -561,7 +580,7 @@ public class Jsprit {
|
||||||
|
|
||||||
AbstractInsertionStrategy best;
|
AbstractInsertionStrategy best;
|
||||||
if (vrp.getJobs().size() < 250 || es == null) {
|
if (vrp.getJobs().size() < 250 || es == null) {
|
||||||
BestInsertion bestInsertion = (BestInsertion) new InsertionBuilder(vrp, fm, stateManager, constraintManager)
|
BestInsertion bestInsertion = (BestInsertion) new InsertionBuilder(vrp, vehicleFleetManager, stateManager, constraintManager)
|
||||||
.setInsertionStrategy(InsertionBuilder.Strategy.BEST)
|
.setInsertionStrategy(InsertionBuilder.Strategy.BEST)
|
||||||
.considerFixedCosts(Double.valueOf(properties.getProperty(Parameter.FIXED_COST_PARAM.toString())))
|
.considerFixedCosts(Double.valueOf(properties.getProperty(Parameter.FIXED_COST_PARAM.toString())))
|
||||||
.setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString())))
|
.setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString())))
|
||||||
|
|
@ -569,7 +588,7 @@ public class Jsprit {
|
||||||
.build();
|
.build();
|
||||||
best = bestInsertion;
|
best = bestInsertion;
|
||||||
} else {
|
} else {
|
||||||
BestInsertionConcurrent bestInsertion = (BestInsertionConcurrent) new InsertionBuilder(vrp, fm, stateManager, constraintManager)
|
BestInsertionConcurrent bestInsertion = (BestInsertionConcurrent) new InsertionBuilder(vrp, vehicleFleetManager, stateManager, constraintManager)
|
||||||
.setInsertionStrategy(InsertionBuilder.Strategy.BEST)
|
.setInsertionStrategy(InsertionBuilder.Strategy.BEST)
|
||||||
.considerFixedCosts(Double.valueOf(properties.getProperty(Parameter.FIXED_COST_PARAM.toString())))
|
.considerFixedCosts(Double.valueOf(properties.getProperty(Parameter.FIXED_COST_PARAM.toString())))
|
||||||
.setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString())))
|
.setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString())))
|
||||||
|
|
@ -626,7 +645,7 @@ public class Jsprit {
|
||||||
SearchStrategy stringBest = new SearchStrategy(Strategy.STRING_BEST.toString(), new SelectBest(), acceptor, objectiveFunction);
|
SearchStrategy stringBest = new SearchStrategy(Strategy.STRING_BEST.toString(), new SelectBest(), acceptor, objectiveFunction);
|
||||||
stringBest.addModule(new RuinAndRecreateModule(Strategy.STRING_BEST.toString(), best, stringRuin));
|
stringBest.addModule(new RuinAndRecreateModule(Strategy.STRING_BEST.toString(), best, stringRuin));
|
||||||
|
|
||||||
PrettyAlgorithmBuilder prettyBuilder = PrettyAlgorithmBuilder.newInstance(vrp, fm, stateManager, constraintManager);
|
PrettyAlgorithmBuilder prettyBuilder = PrettyAlgorithmBuilder.newInstance(vrp, vehicleFleetManager, stateManager, constraintManager);
|
||||||
prettyBuilder.setRandom(random);
|
prettyBuilder.setRandom(random);
|
||||||
if (addCoreConstraints) {
|
if (addCoreConstraints) {
|
||||||
prettyBuilder.addCoreStateAndConstraintStuff();
|
prettyBuilder.addCoreStateAndConstraintStuff();
|
||||||
|
|
@ -642,6 +661,10 @@ public class Jsprit {
|
||||||
.withStrategy(stringBest, toDouble(getProperty(Strategy.STRING_BEST.toString())))
|
.withStrategy(stringBest, toDouble(getProperty(Strategy.STRING_BEST.toString())))
|
||||||
.withStrategy(stringRegret, toDouble(getProperty(Strategy.STRING_REGRET.toString())));
|
.withStrategy(stringRegret, toDouble(getProperty(Strategy.STRING_REGRET.toString())));
|
||||||
|
|
||||||
|
for (SearchStrategy customStrategy : customStrategies.keySet()) {
|
||||||
|
prettyBuilder.withStrategy(customStrategy, customStrategies.get(customStrategy));
|
||||||
|
}
|
||||||
|
|
||||||
if (getProperty(Parameter.CONSTRUCTION.toString()).equals(Construction.BEST_INSERTION.toString())) {
|
if (getProperty(Parameter.CONSTRUCTION.toString()).equals(Construction.BEST_INSERTION.toString())) {
|
||||||
prettyBuilder.constructInitialSolutionWith(best, objectiveFunction);
|
prettyBuilder.constructInitialSolutionWith(best, objectiveFunction);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue