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:
parent
8af268b1dc
commit
415ce961d2
4 changed files with 140 additions and 54 deletions
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue