diff --git a/jsprit-core/src/main/java/jsprit/core/util/RouteUtils.java b/jsprit-core/src/main/java/jsprit/core/util/RouteUtils.java new file mode 100644 index 00000000..a3294fb7 --- /dev/null +++ b/jsprit-core/src/main/java/jsprit/core/util/RouteUtils.java @@ -0,0 +1,94 @@ +package jsprit.core.util; + +import java.util.Collection; + +import jsprit.core.algorithm.state.UpdateActivityTimes; +import jsprit.core.problem.cost.TransportTime; +import jsprit.core.problem.driver.DriverImpl; +import jsprit.core.problem.job.Job; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.route.RouteActivityVisitor; +import jsprit.core.problem.solution.route.VehicleRoute; +import jsprit.core.problem.solution.route.activity.TourActivity; + +public class RouteUtils { + + /** + * Returns total service time, i.e. sum of service time of each job. + * + * @param routes + * @return + */ + public static double calculateServiceTime(Collection routes) { + double serviceTime = 0.; + for(VehicleRoute r : routes){ + for(Job j : r.getTourActivities().getJobs()){ + serviceTime += ((Service)j).getServiceDuration(); + } + } + return serviceTime; + } + + /** + * Returns total transport time. + * + * @param routes + * @param transportTimes + * @return + */ + public static double calculateTransportTime(Collection routes, TransportTime transportTimes) { + double tpTime = 0.; + for(VehicleRoute r : routes){ + TourActivity lastact = r.getStart(); + double lastActDepTime = r.getDepartureTime(); + for(TourActivity act : r.getActivities()){ + tpTime += transportTimes.getTransportTime(lastact.getLocationId(), act.getLocationId(), lastActDepTime, DriverImpl.noDriver(), r.getVehicle()); + lastact=act; + lastActDepTime=act.getEndTime(); + } + tpTime+=transportTimes.getTransportTime(lastact.getLocationId(), r.getEnd().getLocationId(), lastActDepTime, DriverImpl.noDriver(), r.getVehicle()); + } + return tpTime; + } + + /** + * Returns total waiting time. + * + * @param routes + * @return + */ + public static double calculateWaitingTime(Collection routes) { + double waitingTime = 0.; + for(VehicleRoute r : routes){ + for(TourActivity act : r.getActivities()){ + waitingTime += Math.max(0., act.getTheoreticalEarliestOperationStartTime() - act.getArrTime()); + } + } + return waitingTime; + } + + /** + * Returns total operation time. + * + * @param routes + * @return + */ + public static double calulateOperationTime(Collection routes) { + double opTime = 0.; + for(VehicleRoute r : routes){ + opTime += r.getEnd().getArrTime() - r.getDepartureTime(); + } + return opTime; + } + + /** + * Updates activity arrival/end-times of activities in specified route. + * + * @param route + * @param transportTimes + */ + public static void updateActivityTimes(VehicleRoute route, TransportTime transportTimes){ + new RouteActivityVisitor().addActivityVisitor(new UpdateActivityTimes(transportTimes)).visit(route); + } + +}