@Override public void ruinEnds(Collection<VehicleRoute> routes, Collection<Job> unassignedJobs) { for(VehicleRoute route : routes){ Break aBreak = route.getVehicle().getBreak(); boolean removed = route.getTourActivities().removeJob(aBreak); if(removed) logger.trace("ruin: {}", aBreak.getId()); } List<Break> breaks = new ArrayList<Break>(); for (Job j : unassignedJobs) { if (j instanceof Break) { breaks.add((Break) j); } } for(Break b : breaks){ unassignedJobs.remove(b); } }
@Override public void ruinEnds(Collection<VehicleRoute> routes, Collection<Job> unassignedJobs) { for (VehicleRoute r : routes) { Break aBreak = r.getVehicle().getBreak(); if (aBreak != null) { r.getTourActivities().removeJob(aBreak); logger.trace("ruin: {}", aBreak.getId()); unassignedJobs.add(aBreak); } } }
private boolean addBreaksToActivityMap() { boolean hasBreaks = false; Set<String> uniqueBreakIds = new HashSet<>(); for (Vehicle v : uniqueVehicles) { if (v.getBreak() != null) { if (!uniqueBreakIds.add(v.getBreak().getId())) throw new IllegalArgumentException("The vehicle routing roblem already contains a vehicle break with id " + v.getBreak().getId() + ". Please choose unique ids for each vehicle break."); hasBreaks = true; List<AbstractActivity> breakActivities = jobActivityFactory.createActivities(v.getBreak()); if (breakActivities.isEmpty()) throw new IllegalArgumentException("At least one activity for break needs to be created by activityFactory."); for(AbstractActivity act : breakActivities){ act.setIndex(activityIndexCounter); incActivityIndexCounter(); } activityMap.put(v.getBreak(), breakActivities); } } return hasBreaks; }
@Override public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { Break aBreak = inRoute.getVehicle().getBreak(); if(aBreak != null){ boolean removed = inRoute.getTourActivities().removeJob(aBreak); if(removed){ logger.trace("ruin: {}", aBreak.getId()); stateManager.removed(aBreak,inRoute); stateManager.reCalculateStates(inRoute); } if(inRoute.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){ InsertionData iData = breakInsertionCalculator.getInsertionData(inRoute, aBreak, inRoute.getVehicle(), inRoute.getDepartureTime(), inRoute.getDriver(), Double.MAX_VALUE); if(!(iData instanceof InsertionData.NoInsertionFound)){ logger.trace("insert: [jobId={}]{}", aBreak.getId(), iData); for(Event e : iData.getEvents()){ eventListeners.inform(e); } stateManager.informJobInserted(aBreak,inRoute,0,0); } } } }
@Override public void inform(Event event) { if (event instanceof SwitchVehicle) { SwitchVehicle switchVehicle = (SwitchVehicle) event; if (vehiclesDifferent((SwitchVehicle) event)) { logger.trace("switch vehicle ({} to {})",((SwitchVehicle) event).getRoute().getVehicle().getId(),((SwitchVehicle) event).getVehicle().getId()); Break aBreak = ((SwitchVehicle) event).getRoute().getVehicle().getBreak(); if (aBreak != null) { boolean removed = ((SwitchVehicle) event).getRoute().getTourActivities().removeJob(aBreak); if (removed) logger.trace("remove {}",aBreak.getId()); } } switchVehicle.getRoute().setVehicleAndDepartureTime(switchVehicle.getVehicle(), ((SwitchVehicle) event).getDepartureTime()); } }
@Override public void informInsertionStarts(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) { for(VehicleRoute route : vehicleRoutes){ Break aBreak = route.getVehicle().getBreak(); if(aBreak != null && !route.getTourActivities().servesJob(aBreak)){ if(route.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){ InsertionData iData = breakInsertionCalculator.getInsertionData(route, aBreak, route.getVehicle(), route.getDepartureTime(), route.getDriver(), Double.MAX_VALUE); if(!(iData instanceof InsertionData.NoInsertionFound)){ logger.trace("insert: [jobId={}]{}", aBreak.getId(), iData); for(Event e : iData.getEvents()){ eventListeners.inform(e); } stateManager.informJobInserted(aBreak,route,0,0); } } } } } }
@Override public void ruinEnds(Collection<VehicleRoute> routes, Collection<Job> unassignedJobs) { for(VehicleRoute route : routes){ Break aBreak = route.getVehicle().getBreak(); boolean removed = route.getTourActivities().removeJob(aBreak); if(removed) logger.trace("ruin: {}", aBreak.getId()); } List<Break> breaks = new ArrayList<Break>(); for (Job j : unassignedJobs) { if (j instanceof Break) { breaks.add((Break) j); } } for(Break b : breaks){ unassignedJobs.remove(b); } }
@Override public void ruinEnds(Collection<VehicleRoute> routes, Collection<Job> unassignedJobs) { for (VehicleRoute r : routes) { Break aBreak = r.getVehicle().getBreak(); if (aBreak != null) { r.getTourActivities().removeJob(aBreak); logger.trace("ruin: {}", aBreak.getId()); unassignedJobs.add(aBreak); } } }
@Override public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { Break aBreak = inRoute.getVehicle().getBreak(); if(aBreak != null){ boolean removed = inRoute.getTourActivities().removeJob(aBreak); if(removed){ logger.trace("ruin: {}", aBreak.getId()); stateManager.removed(aBreak,inRoute); stateManager.reCalculateStates(inRoute); } if(inRoute.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){ InsertionData iData = breakInsertionCalculator.getInsertionData(inRoute, aBreak, inRoute.getVehicle(), inRoute.getDepartureTime(), inRoute.getDriver(), Double.MAX_VALUE); if(!(iData instanceof InsertionData.NoInsertionFound)){ logger.trace("insert: [jobId={}]{}", aBreak.getId(), iData); for(Event e : iData.getEvents()){ eventListeners.inform(e); } stateManager.informJobInserted(aBreak,inRoute,0,0); } } } }
@Override public void inform(Event event) { if (event instanceof SwitchVehicle) { SwitchVehicle switchVehicle = (SwitchVehicle) event; if (vehiclesDifferent((SwitchVehicle) event)) { logger.trace("switch vehicle ({} to {})",((SwitchVehicle) event).getRoute().getVehicle().getId(),((SwitchVehicle) event).getVehicle().getId()); Break aBreak = ((SwitchVehicle) event).getRoute().getVehicle().getBreak(); if (aBreak != null) { boolean removed = ((SwitchVehicle) event).getRoute().getTourActivities().removeJob(aBreak); if (removed) logger.trace("remove {}",aBreak.getId()); } } switchVehicle.getRoute().setVehicleAndDepartureTime(switchVehicle.getVehicle(), ((SwitchVehicle) event).getDepartureTime()); } }
@Override public void informInsertionStarts(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) { for(VehicleRoute route : vehicleRoutes){ Break aBreak = route.getVehicle().getBreak(); if(aBreak != null && !route.getTourActivities().servesJob(aBreak)){ if(route.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){ InsertionData iData = breakInsertionCalculator.getInsertionData(route, aBreak, route.getVehicle(), route.getDepartureTime(), route.getDriver(), Double.MAX_VALUE); if(!(iData instanceof InsertionData.NoInsertionFound)){ logger.trace("insert: [jobId={}]{}", aBreak.getId(), iData); for(Event e : iData.getEvents()){ eventListeners.inform(e); } stateManager.informJobInserted(aBreak,route,0,0); } } } } } }