@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); }
@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; }
@Override public void finish() { double distance = distanceCalculator.getDistance(prevAct.getLocation(), route.getEnd().getLocation(),prevAct.getEndTime(), route.getVehicle()); sumDistance += distance; stateManager.putRouteState(route, distanceId, sumDistance); } }
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());
public void begin(VehicleRoute route) { this.route = route; vehicles = vehiclesToUpdate.get(route); for (Vehicle vehicle : vehicles) { latest_arrTimes_at_prevAct[vehicle.getVehicleTypeIdentifier().getIndex()] = vehicle.getLatestArrival(); Location location = vehicle.getEndLocation(); if(!vehicle.isReturnToDepot()){ location = route.getEnd().getLocation(); } location_of_prevAct[vehicle.getVehicleTypeIdentifier().getIndex()] = location; } }
System.out.println("dist@" + route.getEnd().getLocation().getId() + ": " + analyser.getDistanceAtActivity(route.getEnd(), route)); System.out.println("timeWindowViolation@" + route.getEnd().getLocation().getId() + ": " + analyser.getTimeWindowViolationAtActivity(route.getEnd(), route));
public double getCosts(JobInsertionContext insertionContext) { double delta_access = 0.0; double delta_egress = 0.0; VehicleRoute currentRoute = insertionContext.getRoute(); Vehicle newVehicle = insertionContext.getNewVehicle(); Driver newDriver = insertionContext.getNewDriver(); double newVehicleDepartureTime = insertionContext.getNewDepTime(); if (!currentRoute.isEmpty()) { double accessTransportCostNew = routingCosts.getTransportCost(newVehicle.getStartLocation(), currentRoute.getActivities().get(0).getLocation(), newVehicleDepartureTime, newDriver, newVehicle); double accessTransportCostOld = routingCosts.getTransportCost(currentRoute.getStart().getLocation(), currentRoute.getActivities().get(0).getLocation(), currentRoute.getDepartureTime(), currentRoute.getDriver(), currentRoute.getVehicle()); delta_access = accessTransportCostNew - accessTransportCostOld; if (newVehicle.isReturnToDepot()) { TourActivity lastActivityBeforeEndOfRoute = currentRoute.getActivities().get(currentRoute.getActivities().size() - 1); double lastActivityEndTimeWithOldVehicleAndDepartureTime = lastActivityBeforeEndOfRoute.getEndTime(); double lastActivityEndTimeEstimationWithNewVehicleAndNewDepartureTime = Math.max(0.0, lastActivityEndTimeWithOldVehicleAndDepartureTime + (newVehicleDepartureTime - currentRoute.getDepartureTime())); double egressTransportCostNew = routingCosts.getTransportCost(lastActivityBeforeEndOfRoute.getLocation(), newVehicle.getEndLocation(), lastActivityEndTimeEstimationWithNewVehicleAndNewDepartureTime, newDriver, newVehicle); double egressTransportCostOld = routingCosts.getTransportCost(lastActivityBeforeEndOfRoute.getLocation(), currentRoute.getEnd().getLocation(), lastActivityEndTimeWithOldVehicleAndDepartureTime, currentRoute.getDriver(), currentRoute.getVehicle()); delta_egress = egressTransportCostNew - egressTransportCostOld; } } return delta_access + delta_egress; }
@Override public void finish() { timeTracker.finish(); double transportCost = this.transportCost.getTransportCost(prevAct.getLocation(), vehicleRoute.getEnd().getLocation(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle()); double actCost = activityCost.getActivityCost(vehicleRoute.getEnd(), timeTracker.getActEndTime(), vehicleRoute.getDriver(), vehicleRoute.getVehicle()); totalOperationCost += transportCost; totalOperationCost += actCost; states.putTypedInternalRouteState(vehicleRoute, InternalStates.COSTS, totalOperationCost); startTimeAtPrevAct = 0.0; prevAct = null; vehicleRoute = null; totalOperationCost = 0.0; }
private XYSeriesCollection makeSolutionSeries(VehicleRoutingProblem vrp, Collection<VehicleRoute> routes) throws NoLocationFoundException { Map<String, Coordinate> coords = makeMap(vrp.getAllLocations()); XYSeriesCollection coll = new XYSeriesCollection(); int counter = 1; for (VehicleRoute route : routes) { if (route.isEmpty()) continue; XYSeries series = new XYSeries(counter, false, true); Coordinate startCoord = getCoordinate(coords.get(route.getStart().getLocation().getId())); series.add(startCoord.getX() * scalingFactor, startCoord.getY() * scalingFactor); for (TourActivity act : route.getTourActivities().getActivities()) { Coordinate coord = getCoordinate(coords.get(act.getLocation().getId())); series.add(coord.getX() * scalingFactor, coord.getY() * scalingFactor); } Coordinate endCoord = getCoordinate(coords.get(route.getEnd().getLocation().getId())); series.add(endCoord.getX() * scalingFactor, endCoord.getY() * scalingFactor); coll.addSeries(series); counter++; } return coll; }
@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."; } } }
@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 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); }
@Override public void finish() { double distance = distanceCalculator.getDistance(prevAct.getLocation(), route.getEnd().getLocation(),prevAct.getEndTime(), route.getVehicle()); sum_distance += distance; stateManager.putRouteState(route, distance_id, sum_distance); } }
public void begin(VehicleRoute route) { this.route = route; vehicles = vehiclesToUpdate.get(route); for (Vehicle vehicle : vehicles) { latest_arrTimes_at_prevAct[vehicle.getVehicleTypeIdentifier().getIndex()] = vehicle.getLatestArrival(); Location location = vehicle.getEndLocation(); if(!vehicle.isReturnToDepot()){ location = route.getEnd().getLocation(); } location_of_prevAct[vehicle.getVehicleTypeIdentifier().getIndex()] = location; } }
public double getCosts(JobInsertionContext insertionContext) { double delta_access = 0.0; double delta_egress = 0.0; VehicleRoute currentRoute = insertionContext.getRoute(); Vehicle newVehicle = insertionContext.getNewVehicle(); Driver newDriver = insertionContext.getNewDriver(); double newVehicleDepartureTime = insertionContext.getNewDepTime(); if (!currentRoute.isEmpty()) { double accessTransportCostNew = routingCosts.getTransportCost(newVehicle.getStartLocation(), currentRoute.getActivities().get(0).getLocation(), newVehicleDepartureTime, newDriver, newVehicle); double accessTransportCostOld = routingCosts.getTransportCost(currentRoute.getStart().getLocation(), currentRoute.getActivities().get(0).getLocation(), currentRoute.getDepartureTime(), currentRoute.getDriver(), currentRoute.getVehicle()); delta_access = accessTransportCostNew - accessTransportCostOld; if (newVehicle.isReturnToDepot()) { TourActivity lastActivityBeforeEndOfRoute = currentRoute.getActivities().get(currentRoute.getActivities().size() - 1); double lastActivityEndTimeWithOldVehicleAndDepartureTime = lastActivityBeforeEndOfRoute.getEndTime(); double lastActivityEndTimeEstimationWithNewVehicleAndNewDepartureTime = Math.max(0.0, lastActivityEndTimeWithOldVehicleAndDepartureTime + (newVehicleDepartureTime - currentRoute.getDepartureTime())); double egressTransportCostNew = routingCosts.getTransportCost(lastActivityBeforeEndOfRoute.getLocation(), newVehicle.getEndLocation(), lastActivityEndTimeEstimationWithNewVehicleAndNewDepartureTime, newDriver, newVehicle); double egressTransportCostOld = routingCosts.getTransportCost(lastActivityBeforeEndOfRoute.getLocation(), currentRoute.getEnd().getLocation(), lastActivityEndTimeWithOldVehicleAndDepartureTime, currentRoute.getDriver(), currentRoute.getVehicle()); delta_egress = egressTransportCostNew - egressTransportCostOld; } } return delta_access + delta_egress; }
@Override public void finish() { timeTracker.finish(); double transportCost = this.transportCost.getTransportCost(prevAct.getLocation(), vehicleRoute.getEnd().getLocation(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle()); double actCost = activityCost.getActivityCost(vehicleRoute.getEnd(), timeTracker.getActEndTime(), vehicleRoute.getDriver(), vehicleRoute.getVehicle()); totalOperationCost += transportCost; totalOperationCost += actCost; states.putTypedInternalRouteState(vehicleRoute, InternalStates.COSTS, totalOperationCost); startTimeAtPrevAct = 0.0; prevAct = null; vehicleRoute = null; totalOperationCost = 0.0; }
private XYSeriesCollection makeSolutionSeries(VehicleRoutingProblem vrp, Collection<VehicleRoute> routes) throws NoLocationFoundException { Map<String,Coordinate> coords = makeMap(vrp.getAllLocations()); XYSeriesCollection coll = new XYSeriesCollection(); int counter = 1; for (VehicleRoute route : routes) { if (route.isEmpty()) continue; XYSeries series = new XYSeries(counter, false, true); Coordinate startCoord = getCoordinate(coords.get(route.getStart().getLocation().getId())); series.add(startCoord.getX() * scalingFactor, startCoord.getY() * scalingFactor); for (TourActivity act : route.getTourActivities().getActivities()) { Coordinate coord = getCoordinate(coords.get(act.getLocation().getId())); series.add(coord.getX() * scalingFactor, coord.getY() * scalingFactor); } Coordinate endCoord = getCoordinate(coords.get(route.getEnd().getLocation().getId())); series.add(endCoord.getX() * scalingFactor, endCoord.getY() * scalingFactor); coll.addSeries(series); counter++; } return coll; }
@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; } };