4.8 KiB
It is assumed that you know the basics of the applied algorithm. In the recreation-step each removed job is re-inserted into the ruined solution again (one after another). To actually insert a job, the algorithm calculates its "best" insertion position. This implies also to check the feasibility of the insertion step which is in turn dependent on constraints (such as capacity constraints). jsprit knows hard and soft constraints. Whereas hard constraints must be met and cannot be broken, soft constraints are always fulfilled but uses penalties to express "good" and "bad" insertions.
jsprit comes with built-in or default constraints (such as capacity and time-window constraints) and allows you to add
custom constraints. However, you can also disable the default constraints. To add custom constraints use
core.algorithm.VehicleRoutingAlgorithmBuilder to build an algorithm instead of
core.algorithm.io.VehicleRoutingAlgorithms.
Note that
VehicleRoutingAlgorithmBuilder vraBuilder = new VehicleRoutingAlgorithmBuilder(routingProblem, "yourAlgorithmConfig");
vraBuilder.addCoreConstraints();
vraBuilder.addDefaultCostCalculators();
VehicleRoutingAlgorithm vra = vraBuilder.build();
is equivalent to
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(routingProblem, "yourAlgorithmConfig");;
To add custom constraints add the following lines:
VehicleRoutingAlgorithmBuilder vraBuilder = new VehicleRoutingAlgorithmBuilder(routingProblem, "yourAlgorithmConfig");
vraBuilder.addCoreConstraints();
vraBuilder.addDefaultCostCalculators();
//add custom constraint
StateManager stateManager = new StateManager(routingProblem.getTransportCosts());
ConstraintManager constraintManager = new ConstraintManager(routingProblem, stateManager);
constraintManager.addConstraint(customConstraint);
vraBuilder.setStateAndConstraintManager(stateManager, constraintManager);
VehicleRoutingAlgorithm vra = vraBuilder.build();
Hard constraints
There are hard constraints at two different levels: at route and activity level.
A route is basically a sequence of activities. Each route has a start- and an end-activity, and in between other activities of type core.problem.solution.route.activity.TourActivity.
###core.problem.constraint.HardRouteConstraint
A HardRouteConstraint indicates whether a specified job can be inserted into an existing route (along with a specified vehicle). To define it you need to implement the HardRouteConstraint-interface:
HardRouteConstraint constraint = new HardRouteConstraint(){
@Override
public boolean fulfilled(JobInsertionContext iContext) {
return true;
};
};
The JobInsertionContext tells you the context of the insertion step, i.e. the specified job (iContext.getJob()) to be inserted into
a specified route (iContext.getRoute()) as well as the vehicle
that should be employed on that route (iContext.getNewVehicle()).
####Example: Assume a vehicle with id="1" is not allowed to serve a job with id="job1" (since it is for example too big to access the customer location). Such a constraint can be easily defined as follows:
final Job jobWithAccessConstraint = routingProblem.getJobs().get("job1");
HardRouteConstraint accessConstraint = new HardRouteConstraint() {
@Override
public boolean fulfilled(JobInsertionContext iContext) {
if(iContext.getNewVehicle().getId().equals("1")){
if(iContext.getJob()==jobWithAccessConstraint || iContext.getRoute().getTourActivities().servesJob(jobWithAccessConstraint)){
return false;
}
}
return true;
}
};
constraintManager.addConstraint(accessConstraint);
Note that if vehicleSwitches are not allowed, you are done with the first term iContext.getJob()==jobWithAccessConstraint in the above if-clause. If they are, you need to add the second term iContext.getRoute().getTourActivities().servesJob(jobWithAccessConstraint as well to prohibit the vehicle (id=1) to take over a route that already contains job1.
core.problem.constraint.HardActivityConstraint
to be documented ... (as long as it is not yet documented it might be helpful to see how the service backhaul constraint is implemented which you can add to the constraintManager much like the above access constraint)
Soft constraints
to be documented ... (as long as it is not yet documented the following examples might be helpful http://stackoverflow.com/questions/24447451/related-jobs-in-jsprit)