/******************************************************************************* * 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 com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivity; import com.opendoorlogistics.api.geometry.LatLong; import com.opendoorlogistics.api.geometry.ODLGeom; import com.opendoorlogistics.components.jsprit.VRPBuilder.BuiltStopRec; import com.opendoorlogistics.components.jsprit.VRPBuilder.TravelCostType; import com.opendoorlogistics.components.jsprit.RowWriter; import com.opendoorlogistics.components.jsprit.tabledefinitions.StopDetailsTableDfn; import com.opendoorlogistics.components.jsprit.tabledefinitions.VehiclesTableDfn.RowVehicleIndex; public class StopDetail extends StopOrder { public class TemporaryStopInfo { public double earliestArrival = Double.NEGATIVE_INFINITY; public double latestArrival = Double.POSITIVE_INFINITY; public String locationId; public RowVehicleIndex rowVehicleIndex; // public boolean isUnbalancedPickupDelivery; public BuiltStopRec builtStopRec; public int rowNumberInStopOrderTable; public TourActivity jspritTourActivity; } final public long[] arrivalQuantities; final public long[] arrivalCapacityViolation; public double arrivalTime; public Double endTimeWindow; public ODLGeom incomingPath; public String type; final public long[] leaveQuantities; final public long[] leaveCapacityViolation; public String jobId; public double leaveTime; public ODLGeom outgoingPath; public Double startTimeWindow; public String stopAddress; public double stopDuration; public LatLong stopLatLong; public String stopName; public long stopNumber = -1; final public long[] stopQuantities; final public TemporaryStopInfo temporary = new TemporaryStopInfo(); public double timeWindowViolation; final public double[] totalTravelCost = new double[TravelCostType.values().length]; final public double[] travelCost = new double[TravelCostType.values().length]; public String vehicleName; public double waitingTime; public long hasViolation; public String requiredSkills; public StopDetail(int nbQuantities) { stopQuantities = new long[nbQuantities]; arrivalQuantities = new long[nbQuantities]; arrivalCapacityViolation = new long[nbQuantities]; leaveQuantities = new long[nbQuantities]; leaveCapacityViolation= new long[nbQuantities]; } // public void writeRouteOrder(RouteOrderTableDfn r) public void writeDetails(StopDetailsTableDfn dfn, RowWriter writer) { writeRouteOrder(dfn, writer); writer.write(jobId, dfn.jobId); // travel costs for(TravelCostType type:TravelCostType.values()){ double value =travelCost[type.ordinal()]; double total = totalTravelCost[type.ordinal()]; if(type == TravelCostType.DISTANCE_KM){ value /=1000; total/=1000; } writer.write(value, dfn.travelCosts[type.ordinal()]); writer.write(total, dfn.totalTravelCosts[type.ordinal()]); } // writer.write(travelCost, dfn.travelCosts); // writer.write(totalTravelCost, dfn.totalTravelCosts); writer.write(hasViolation, dfn.hasViolation); // quantities writer.write(stopQuantities, dfn.stopQuantities); writer.write(arrivalQuantities, dfn.arrivalQuantities); writer.write(arrivalCapacityViolation, dfn.arrivalCapacityViolations); writer.write(leaveQuantities, dfn.leaveQuantities); writer.write(leaveCapacityViolation, dfn.leaveCapacityViolations); // time windows writer.write(startTimeWindow, dfn.timeWindowStart); writer.write(endTimeWindow, dfn.timeWindowEnd); writer.write(timeWindowViolation, dfn.timeWindowViolation); // misc writer.write(type, dfn.type); writer.write(vehicleName, dfn.vehicleName); writer.write(stopName, dfn.stopName); writer.write(stopNumber != -1 ? new Long(stopNumber) : null, dfn.stopNumber); writer.write(stopAddress, dfn.stopAddress); writer.write(arrivalTime, dfn.arrivalTime); writer.write(leaveTime, dfn.leaveTime); writer.write(waitingTime, dfn.waitingTime); writer.write(stopDuration, dfn.stopDuration); writer.write(requiredSkills, dfn.requiredSkills); if(stopLatLong!=null){ writer.write(stopLatLong.getLatitude(), dfn.stopLatLong.latitude); writer.write(stopLatLong.getLongitude(), dfn.stopLatLong.longitude); } writer.write(incomingPath, dfn.incomingPath); writer.write(outgoingPath, dfn.outgoingPath); } }