/******************************************************************************* * Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com) * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt ******************************************************************************/ package com.opendoorlogistics.components.jsprit.solution; import java.util.ArrayList; import java.util.List; import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute; import com.graphhopper.jsprit.core.problem.vehicle.Vehicle; import com.opendoorlogistics.components.jsprit.RowWriter; import com.opendoorlogistics.components.jsprit.VRPBuilder.TravelCostType; import com.opendoorlogistics.components.jsprit.tabledefinitions.RouteDetailsTableDfn; import com.opendoorlogistics.components.jsprit.tabledefinitions.VehiclesTableDfn.RowVehicleIndex; public class RouteDetail { final public long [] capacity; final public long [] capacityViolation; final public long [] deliveredQuantities; public double costPerHour; public double costPerKm; public long deliveriesCount; public double endTime; public Double endTimeWindow; final public long [] pickedUpQuantities; public long pickupsCount; public long hasViolation; final public long [] startQuantities; public double startTime; public Double startTimeWindow; final public List<StopDetail> stops = new ArrayList<>(); public long stopsCount; public double time; public double timeWindowViolation=0; public double [] travelCosts = new double[TravelCostType.values().length]; public String vehicleId; public String vehicleName; public double waitingTime=0; public TemporaryRouteInto temp = new TemporaryRouteInto(); public String skills; public double speedMultiplier; public RouteDetail(int nbQuantities) { capacity= new long[nbQuantities]; capacityViolation = new long[nbQuantities]; startQuantities = new long[nbQuantities]; pickedUpQuantities = new long[nbQuantities]; deliveredQuantities = new long[nbQuantities]; } public static class TemporaryRouteInto{ public RowVehicleIndex rvi; public Vehicle jspritVehicle; public VehicleRoute jspritRoute; } public void writeDetails(RouteDetailsTableDfn dfn, RowWriter w) { w.write(capacity, dfn.capacity); w.write(capacityViolation, dfn.capacityViolation); w.write(deliveredQuantities, dfn.deliveredQuantities); w.write(deliveriesCount, dfn.deliveriesCount); w.write(endTime, dfn.endTime); w.write(endTimeWindow, dfn.endTimeWindow); w.write(pickupsCount, dfn.pickupsCount); w.write(pickedUpQuantities, dfn.pickedUpQuantities); w.write(startQuantities, dfn.startQuantities); w.write(startTime, dfn.startTime); w.write(startTimeWindow, dfn.startTimeWindow); w.write(stopsCount, dfn.stopCount); w.write(time, dfn.time); w.write(timeWindowViolation, dfn.timeWindowViolation); for(TravelCostType type:TravelCostType.values()){ double value =travelCosts[type.ordinal()]; if(type == TravelCostType.DISTANCE_KM){ value /=1000; } w.write(value, dfn.travelCosts[type.ordinal()]); } w.write(vehicleId, dfn.vehicleId); w.write(vehicleName, dfn.vehicleName); w.write(waitingTime, dfn.waitingTime); w.write(hasViolation, dfn.hasViolation); w.write(skills, dfn.skills); w.write(speedMultiplier, dfn.speedMultiplier); } }