@Override public void visit(TourActivity activity) { if (firstAct) { firstAct = false; if (!vehicle.isReturnToDepot()) { assert activity.getLocation().getId().equals(end.getLocation().getId()) : "route end and last activity are not equal even route is open. this should not be."; } } }
public End(End end) { this.location = end.getLocation(); // this.locationId = end.getLocation().getId(); theoretical_earliestOperationStartTime = end.getTheoreticalEarliestOperationStartTime(); theoretical_latestOperationStartTime = end.getTheoreticalLatestOperationStartTime(); arrTime = end.getArrTime(); endTime = end.getEndTime(); setIndex(-2); }
private void setStartAndEnd(Vehicle vehicle, double vehicleDepTime) { if (!(vehicle instanceof VehicleImpl.NoVehicle)) { if (start == null && end == null) { start = new Start(vehicle.getStartLocation(), vehicle.getEarliestDeparture(), vehicle.getLatestArrival()); end = new End(vehicle.getEndLocation(), vehicle.getEarliestDeparture(), vehicle.getLatestArrival()); } start.setEndTime(Math.max(vehicleDepTime, vehicle.getEarliestDeparture())); start.setTheoreticalEarliestOperationStartTime(vehicle.getEarliestDeparture()); start.setTheoreticalLatestOperationStartTime(vehicle.getLatestArrival()); start.setLocation(vehicle.getStartLocation()); end.setLocation(vehicle.getEndLocation()); end.setTheoreticalEarliestOperationStartTime(vehicle.getEarliestDeparture()); end.setTheoreticalLatestOperationStartTime(vehicle.getLatestArrival()); } }
@Override public void finish() { sum_transport_time += route.getEnd().getArrTime() - prevActDeparture; sum_too_late += Math.max(0, route.getEnd().getArrTime() - route.getEnd().getTheoreticalLatestOperationStartTime()); stateManager.putRouteState(route, transport_time_id, sum_transport_time); stateManager.putRouteState(route, waiting_time_id, sum_waiting_time); stateManager.putRouteState(route, service_time_id, sum_service_time); stateManager.putRouteState(route, too_late_id, sum_too_late); } }
prevAct = act; double c = problem.getTransportCosts().getTransportCost(prevAct.getLocation(), route.getEnd().getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); c += problem.getActivityCosts().getActivityCost(route.getEnd(), route.getEnd().getArrTime(), route.getDriver(), route.getVehicle()); costs += c; out.format(leftAlgin, routeNu, getVehicleString(route), route.getEnd().getName(), "-", Math.round(route.getEnd().getArrTime()), "undef", Math.round(costs)); routeNu++;
@Override public double getCosts(VehicleRoutingProblemSolution solution) { double costs = 0.; for (VehicleRoute route : solution.getRoutes()) { costs += route.getVehicle().getType().getVehicleCostParams().fix; boolean hasBreak = false; TourActivity prevAct = route.getStart(); for (TourActivity act : route.getActivities()) { if (act instanceof BreakActivity) hasBreak = true; costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), act.getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); costs += vrp.getActivityCosts().getActivityCost(act, act.getArrTime(), route.getDriver(), route.getVehicle()); prevAct = act; } costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), route.getEnd().getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); if (route.getVehicle().getBreak() != null) { if (!hasBreak) { //break defined and required but not assigned penalty if (route.getEnd().getArrTime() > route.getVehicle().getBreak().getTimeWindow().getEnd()) { costs += 4 * (maxCosts * 2 + route.getVehicle().getBreak().getServiceDuration() * route.getVehicle().getType().getVehicleCostParams().perServiceTimeUnit); } } } } for(Job j : solution.getUnassignedJobs()){ costs += maxCosts * 2 * (11 - j.getPriority()); } return costs; } };
/** * @param route to get the total operation time from * @return operation time of this route, i.e. endTime - startTime of specified route */ public Double getOperationTime(VehicleRoute route) { if (route == null) throw new IllegalArgumentException("route is missing."); return route.getEnd().getArrTime() - route.getStart().getEndTime(); }
@Override public TourActivity duplicate() { return new End(this); }
@Override public void begin(VehicleRoute route) { this.route = route; latestArrTimeAtPrevAct = route.getEnd().getTheoreticalLatestOperationStartTime(); prevAct = route.getEnd(); }
/** * Copy constructor copying a route. * * @param route to copy */ private VehicleRoute(VehicleRoute route) { this.start = Start.copyOf(route.getStart()); this.end = End.copyOf(route.getEnd()); this.tourActivities = TourActivities.copyOf(route.getTourActivities()); this.vehicle = route.getVehicle(); this.driver = route.getDriver(); }
prevAct = act; double c = problem.getTransportCosts().getTransportCost(prevAct.getLocation(), route.getEnd().getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); c += problem.getActivityCosts().getActivityCost(route.getEnd(), route.getEnd().getArrTime(), route.getDriver(), route.getVehicle()); costs += c; out.format(leftAlgin, routeNu, getVehicleString(route), route.getEnd().getName(), "-", Math.round(route.getEnd().getArrTime()), "undef", Math.round(costs)); routeNu++;
@Override public double getCosts(VehicleRoutingProblemSolution solution) { double costs = 0.; for (VehicleRoute route : solution.getRoutes()) { costs += route.getVehicle().getType().getVehicleCostParams().fix; boolean hasBreak = false; TourActivity prevAct = route.getStart(); for (TourActivity act : route.getActivities()) { if (act instanceof BreakActivity) hasBreak = true; costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), act.getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); costs += vrp.getActivityCosts().getActivityCost(act, act.getArrTime(), route.getDriver(), route.getVehicle()); prevAct = act; } costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), route.getEnd().getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); if (route.getVehicle().getBreak() != null) { if (!hasBreak) { //break defined and required but not assigned penalty if (route.getEnd().getArrTime() > route.getVehicle().getBreak().getTimeWindow().getEnd()) { costs += 4 * (maxCosts * 2 + route.getVehicle().getBreak().getServiceDuration() * route.getVehicle().getType().getVehicleCostParams().perServiceTimeUnit); } } } } for(Job j : solution.getUnassignedJobs()){ costs += maxCosts * 2 * (11 - j.getPriority()); } return costs; } };
@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); } } } }
public static End copyOf(End end) { return new End(end); }
@Override public void finish() { sum_transport_time += route.getEnd().getArrTime() - prevActDeparture; sum_too_late += Math.max(0, route.getEnd().getArrTime() - route.getEnd().getTheoreticalLatestOperationStartTime()); stateManager.putRouteState(route, transport_time_id, sum_transport_time); stateManager.putRouteState(route, waiting_time_id, sum_waiting_time); stateManager.putRouteState(route, service_time_id, sum_service_time); stateManager.putRouteState(route, too_late_id, sum_too_late); } }
@Override public void begin(VehicleRoute route) { this.route = route; latest_arrTime_at_prevAct = route.getEnd().getTheoreticalLatestOperationStartTime(); prevAct = route.getEnd(); }
/** * Copy constructor copying a route. * * @param route to copy */ private VehicleRoute(VehicleRoute route) { this.start = Start.copyOf(route.getStart()); this.end = End.copyOf(route.getEnd()); this.tourActivities = TourActivities.copyOf(route.getTourActivities()); this.vehicle = route.getVehicle(); this.driver = route.getDriver(); }
@Override public void finish() { double transportTime = this.transportTime.getTransportTime(prevAct.getLocation(), route.getEnd().getLocation(), startAtPrevAct, route.getDriver(), route.getVehicle()); double arrivalTimeAtCurrAct = startAtPrevAct + transportTime; actArrTime = arrivalTimeAtCurrAct; actEndTime = arrivalTimeAtCurrAct; beginFirst = false; }
public End(End end) { this.location = end.getLocation(); // this.locationId = end.getLocation().getId(); theoretical_earliestOperationStartTime = end.getTheoreticalEarliestOperationStartTime(); theoretical_latestOperationStartTime = end.getTheoreticalLatestOperationStartTime(); arrTime = end.getArrTime(); endTime = end.getEndTime(); setIndex(-2); }
private void initialiseStartAndEnd(final Vehicle newVehicle, double newVehicleDepartureTime) { if (start == null) { start = new Start(newVehicle.getStartLocation(), newVehicle.getEarliestDeparture(), Double.MAX_VALUE); start.setEndTime(newVehicleDepartureTime); } else { start.setLocation(Location.newInstance(newVehicle.getStartLocation().getId())); start.setTheoreticalEarliestOperationStartTime(newVehicle.getEarliestDeparture()); start.setTheoreticalLatestOperationStartTime(Double.MAX_VALUE); start.setEndTime(newVehicleDepartureTime); } if (end == null) { end = new End(newVehicle.getEndLocation(), 0.0, newVehicle.getLatestArrival()); } else { end.setLocation(Location.newInstance(newVehicle.getEndLocation().getId())); end.setTheoreticalEarliestOperationStartTime(0.0); end.setTheoreticalLatestOperationStartTime(newVehicle.getLatestArrival()); } }