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"),
|
||||
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,7 +408,22 @@ public class Jsprit {
|
|||
AbstractInsertionStrategy regret;
|
||||
final DefaultScorer scorer;
|
||||
|
||||
boolean fastRegret = Boolean.parseBoolean(getProperty(Parameter.FAST_REGRET.toString()));
|
||||
if (es != null) {
|
||||
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)
|
||||
|
|
@ -417,7 +434,21 @@ public class Jsprit {
|
|||
scorer = getRegretScorer(vrp);
|
||||
regretInsertion.setScoringFunction(scorer);
|
||||
regret = regretInsertion;
|
||||
}
|
||||
} else {
|
||||
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())))
|
||||
|
|
@ -428,6 +459,7 @@ public class Jsprit {
|
|||
regretInsertion.setScoringFunction(scorer);
|
||||
regret = regretInsertion;
|
||||
}
|
||||
}
|
||||
regret.setRandom(random);
|
||||
|
||||
AbstractInsertionStrategy best;
|
||||
|
|
|
|||
|
|
@ -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,15 +177,28 @@ public class InsertionBuilder {
|
|||
}
|
||||
} else if (strategy.equals(Strategy.REGRET)) {
|
||||
if (executor == null) {
|
||||
RegretInsertion regret = new RegretInsertion(costCalculator, vrp);
|
||||
// regret.setSwitchAllowed(allowVehicleSwitch);
|
||||
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);
|
||||
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);
|
||||
return insertion;
|
||||
|
|
|
|||
|
|
@ -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<VehicleRoutingProblemSolution> solutions = vra.searchSolutions();
|
||||
assertEquals(828.94, Solutions.bestOf(solutions).getCost(), 0.01);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,24 +2,9 @@
|
|||
<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">
|
||||
<problemType>
|
||||
<fleetSize>FINITE</fleetSize>
|
||||
<fleetSize>INFINITE</fleetSize>
|
||||
</problemType>
|
||||
<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>
|
||||
<id>v1</id>
|
||||
<typeId>vehType</typeId>
|
||||
|
|
@ -48,16 +33,58 @@
|
|||
<time>0.0</time>
|
||||
</costs>
|
||||
</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>
|
||||
<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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue