a corresponding RuinListener:
algorithm.addListener(new RuinListener() {
@Override
public void ruinStarts(Collection<VehicleRoute> routes) {
}
@Override
public void ruinEnds(Collection<VehicleRoute> routes, Collection<Job> unassignedJobs) {
Map<TourActivity, VehicleRoute> toDeleteActRouteMap = new HashMap<>();
for(VehicleRoute route : routes){
for (int i = 0; i < route.getActivities().size() - 1; i++) {
TourActivity act1 = route.getActivities().get(i);
TourActivity act2 = route.getActivities().get(i + 1);
if(isInstanceOfDelivery(act1) && isInstanceOfDelivery(act2)) {
toDeleteActRouteMap.put(act1, route);
}
}
}
for (Map.Entry<TourActivity, VehicleRoute> entry : toDeleteActRouteMap.entrySet()) {
TourActivity act = entry.getKey();
VehicleRoute route = entry.getValue();
if (act instanceof TourActivity.JobActivity) {
Job job = ((TourActivity.JobActivity) act).getJob();
boolean removed = route.getTourActivities().removeJob(job);
if(removed) {
unassignedJobs.add(job);
}
}
}
}
@Override
public void removed(Job job, VehicleRoute vehicleRoute) {
}
});