static SolutionObject convertRouteToSolutionObject(GlobalStateObject state,
VehicleStateObject vso, Map<Parcel, ParcelIndexObj> mapping,
int[][] travelTime, int[] releaseDates, int[] dueDates,
int[] serviceTimes, int[] vehicleTravelTimes, int remainingServiceTime) {
final int[] route = new int[vso.getRoute().get().size() + 2];
final Set<Parcel> seen = newHashSet();
for (int i = 0; i < vso.getRoute().get().size(); i++) {
final Parcel dto = vso.getRoute().get().get(i);
if (vso.getContents().contains(dto) || seen.contains(dto)) {
route[i + 1] = mapping.get(dto).deliveryIndex;
} else {
checkArgument(state.getAvailableParcels().contains(dto),
"This parcel should be available but is not: %s.", dto);
route[i + 1] = mapping.get(dto).pickupIndex;
}
checkArgument(route[i + 1] > 0);
seen.add(dto);
}
route[route.length - 1] = travelTime.length - 1;
final int[] arrivalTimes = computeArrivalTimes(route, travelTime,
remainingServiceTime, vehicleTravelTimes, serviceTimes, releaseDates);
final int tardiness = computeRouteTardiness(route, arrivalTimes,
serviceTimes, dueDates, remainingServiceTime);
final int tt = computeTotalTravelTime(route, travelTime,
vehicleTravelTimes);
return new SolutionObject(route, arrivalTimes, tt + tardiness);
}