1
0
Fork 0
mirror of https://github.com/graphhopper/jsprit.git synced 2020-01-24 07:45:05 +01:00

make fast regret optional

This commit is contained in:
oblonski 2015-10-20 19:55:35 +02:00
parent 8af268b1dc
commit 415ce961d2
4 changed files with 140 additions and 54 deletions

View file

@ -96,6 +96,7 @@ public class Jsprit {
INSERTION_NOISE_PROB("insertion.noise_prob"), INSERTION_NOISE_PROB("insertion.noise_prob"),
RUIN_WORST_NOISE_LEVEL("worst.noise_level"), RUIN_WORST_NOISE_LEVEL("worst.noise_level"),
RUIN_WORST_NOISE_PROB("worst.noise_prob"), RUIN_WORST_NOISE_PROB("worst.noise_prob"),
FAST_REGRET("regret.fast"),
CONSTRUCTION("construction"); CONSTRUCTION("construction");
String paraName; 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_LEVEL.toString(), String.valueOf(0.15));
defaults.put(Parameter.RUIN_WORST_NOISE_PROB.toString(), String.valueOf(0.2)); defaults.put(Parameter.RUIN_WORST_NOISE_PROB.toString(), String.valueOf(0.2));
defaults.put(Parameter.VEHICLE_SWITCH.toString(), String.valueOf(true)); 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()); defaults.put(Parameter.CONSTRUCTION.toString(), Construction.REGRET_INSERTION.toString());
return defaults; return defaults;
} }
@ -406,27 +408,57 @@ public class Jsprit {
AbstractInsertionStrategy regret; AbstractInsertionStrategy regret;
final DefaultScorer scorer; final DefaultScorer scorer;
boolean fastRegret = Boolean.parseBoolean(getProperty(Parameter.FAST_REGRET.toString()));
if (es != null) { if (es != null) {
RegretInsertionConcurrent regretInsertion = (RegretInsertionConcurrent) new InsertionBuilder(vrp, fm, stateManager, constraintManager) if(fastRegret){
.setInsertionStrategy(InsertionBuilder.Strategy.REGRET) RegretInsertionConcurrentFast regretInsertion = (RegretInsertionConcurrentFast) new InsertionBuilder(vrp, fm, stateManager, constraintManager)
.setConcurrentMode(es, noThreads) .setInsertionStrategy(InsertionBuilder.Strategy.REGRET)
.considerFixedCosts(toDouble(getProperty(Parameter.FIXED_COST_PARAM.toString()))) .setConcurrentMode(es, noThreads)
.setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString()))) .setFastRegret(true)
.setActivityInsertionCostCalculator(activityInsertion) .considerFixedCosts(toDouble(getProperty(Parameter.FIXED_COST_PARAM.toString())))
.build(); .setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString())))
scorer = getRegretScorer(vrp); .setActivityInsertionCostCalculator(activityInsertion)
regretInsertion.setScoringFunction(scorer); .build();
regret = regretInsertion; 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 { } else {
RegretInsertion regretInsertion = (RegretInsertion) new InsertionBuilder(vrp, fm, stateManager, constraintManager) if(fastRegret) {
.setInsertionStrategy(InsertionBuilder.Strategy.REGRET) RegretInsertionFast regretInsertion = (RegretInsertionFast) new InsertionBuilder(vrp, fm, stateManager, constraintManager)
.setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString()))) .setInsertionStrategy(InsertionBuilder.Strategy.REGRET)
.considerFixedCosts(toDouble(getProperty(Parameter.FIXED_COST_PARAM.toString()))) .setFastRegret(true)
.setActivityInsertionCostCalculator(activityInsertion) .setAllowVehicleSwitch(toBoolean(getProperty(Parameter.VEHICLE_SWITCH.toString())))
.build(); .considerFixedCosts(toDouble(getProperty(Parameter.FIXED_COST_PARAM.toString())))
scorer = getRegretScorer(vrp); .setActivityInsertionCostCalculator(activityInsertion)
regretInsertion.setScoringFunction(scorer); .build();
regret = regretInsertion; 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); regret.setRandom(random);

View file

@ -30,6 +30,9 @@ import java.util.concurrent.ExecutorService;
public class InsertionBuilder { public class InsertionBuilder {
private boolean fastRegret;
public enum Strategy { public enum Strategy {
REGRET, BEST REGRET, BEST
} }
@ -70,6 +73,8 @@ public class InsertionBuilder {
private Strategy strategy = Strategy.BEST; private Strategy strategy = Strategy.BEST;
private boolean isFastRegret = false;
public InsertionBuilder(VehicleRoutingProblem vrp, VehicleFleetManager vehicleFleetManager, StateManager stateManager, ConstraintManager constraintManager) { public InsertionBuilder(VehicleRoutingProblem vrp, VehicleFleetManager vehicleFleetManager, StateManager stateManager, ConstraintManager constraintManager) {
super(); super();
this.vrp = vrp; this.vrp = vrp;
@ -98,6 +103,12 @@ public class InsertionBuilder {
return this; return this;
} }
public InsertionBuilder setFastRegret(boolean fastRegret) {
this.isFastRegret = fastRegret;
return this;
}
public InsertionBuilder setLocalLevel() { public InsertionBuilder setLocalLevel() {
local = true; local = true;
return this; return this;
@ -166,14 +177,27 @@ public class InsertionBuilder {
} }
} else if (strategy.equals(Strategy.REGRET)) { } else if (strategy.equals(Strategy.REGRET)) {
if (executor == null) { if (executor == null) {
RegretInsertion regret = new RegretInsertion(costCalculator, vrp); if(isFastRegret){
// regret.setSwitchAllowed(allowVehicleSwitch); RegretInsertionFast regret = new RegretInsertionFast(costCalculator, vrp, fleetManager);
insertion = regret; regret.setSwitchAllowed(allowVehicleSwitch);
insertion = regret;
}
else {
RegretInsertion regret = new RegretInsertion(costCalculator, vrp);
insertion = regret;
}
} else { } else {
RegretInsertionConcurrent regret = new RegretInsertionConcurrent(costCalculator, vrp, executor); if(isFastRegret){
// regret.setSwitchAllowed(allowVehicleSwitch); RegretInsertionConcurrentFast regret = new RegretInsertionConcurrentFast(costCalculator, vrp, executor, fleetManager);
insertion = regret; regret.setSwitchAllowed(allowVehicleSwitch);
insertion = regret;
}
else{
RegretInsertionConcurrent regret = new RegretInsertionConcurrent(costCalculator, vrp, executor);
insertion = regret;
}
} }
} else throw new IllegalStateException("you should never get here"); } else throw new IllegalStateException("you should never get here");
for (InsertionListener l : iListeners) insertion.addListener(l); for (InsertionListener l : iListeners) insertion.addListener(l);

View file

@ -25,9 +25,12 @@ public class Solomon_IT {
new VrpXMLReader(vrpBuilder).read("src/test/resources/solomon_c101.xml"); new VrpXMLReader(vrpBuilder).read("src/test/resources/solomon_c101.xml");
VehicleRoutingProblem vrp = vrpBuilder.build(); 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"); // VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "src/test/resources/algorithmConfig.xml");
vra.setMaxIterations(500); vra.setMaxIterations(2000);
Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions(); Collection<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
assertEquals(828.94, Solutions.bestOf(solutions).getCost(), 0.01); assertEquals(828.94, Solutions.bestOf(solutions).getCost(), 0.01);
} }

View file

@ -2,24 +2,9 @@
<problem xmlns="http://www.w3schools.com" <problem xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
<problemType> <problemType>
<fleetSize>FINITE</fleetSize> <fleetSize>INFINITE</fleetSize>
</problemType> </problemType>
<vehicles> <vehicles>
<vehicle>
<id>v2</id>
<typeId>vehType2</typeId>
<startLocation>
<id>loc</id>
</startLocation>
<endLocation>
<id>loc</id>
</endLocation>
<timeSchedule>
<start>0.0</start>
<end>1.7976931348623157E308</end>
</timeSchedule>
<returnToDepot>true</returnToDepot>
</vehicle>
<vehicle> <vehicle>
<id>v1</id> <id>v1</id>
<typeId>vehType</typeId> <typeId>vehType</typeId>
@ -48,16 +33,58 @@
<time>0.0</time> <time>0.0</time>
</costs> </costs>
</type> </type>
<type>
<id>vehType2</id>
<capacity-dimensions>
<dimension index="0">200</dimension>
</capacity-dimensions>
<costs>
<fixed>0.0</fixed>
<distance>1.0</distance>
<time>0.0</time>
</costs>
</type>
</vehicleTypes> </vehicleTypes>
<services>
<service id="1" type="service">
<location>
<id>loc</id>
</location>
<capacity-dimensions>
<dimension index="0">1</dimension>
</capacity-dimensions>
<duration>2.0</duration>
<timeWindows>
<timeWindow>
<start>0.0</start>
<end>1.7976931348623157E308</end>
</timeWindow>
</timeWindows>
</service>
<service id="2" type="service">
<location>
<id>loc2</id>
</location>
<capacity-dimensions>
<dimension index="0">1</dimension>
</capacity-dimensions>
<duration>4.0</duration>
<timeWindows>
<timeWindow>
<start>0.0</start>
<end>1.7976931348623157E308</end>
</timeWindow>
</timeWindows>
</service>
</services>
<solutions>
<solution>
<cost>10.0</cost>
<routes>
<route>
<driverId>noDriver</driverId>
<vehicleId>v1</vehicleId>
<start>0.0</start>
<act type="service">
<serviceId>1</serviceId>
<arrTime>0.0</arrTime>
<endTime>0.0</endTime>
</act>
<end>0.0</end>
</route>
</routes>
<unassignedJobs>
<job id="2"/>
</unassignedJobs>
</solution>
</solutions>
</problem> </problem>