@Override public void informJobUnassigned(Job unassigned, Collection<String> failedConstraintNames) { if (!this.failedConstraintNamesFrequencyMapping.containsKey(unassigned.getId())) { this.failedConstraintNamesFrequencyMapping.put(unassigned.getId(), new Frequency()); } for (String r : failedConstraintNames) { if (failedConstraintNamesToBeIgnored.contains(r)) continue; this.failedConstraintNamesFrequencyMapping.get(unassigned.getId()).addValue(r); } }
private static Service getService(String serviceId, Builder vrpBuilder) { for (Job j : vrpBuilder.getAddedJobs()) { if (j.getId().equals(serviceId)) { return (Service) j; } } return null; }
private void removeService(Job job, VehicleRoute fromRoute) { String nodeId = job.getId(); removeNodeAndBelongingEdges(nodeId, fromRoute); }
private boolean jobIsInitial(Job job) { return !vrp.getJobs().containsKey(job.getId()); //for initial jobs (being not contained in problem }
static Map<String, Double> getNearestMessengers(VehicleRoutingTransportCosts routingCosts, Collection<Job> envelopes, Collection<Vehicle> messengers) { Map<String, Double> nearestMessengers = new HashMap<String, Double>(); for (Job envelope : envelopes) { double minDirect = Double.MAX_VALUE; for (Vehicle m : messengers) { double direct = getTimeOfDirectRoute(envelope, m, routingCosts); if (direct < minDirect) { minDirect = direct; } } nearestMessengers.put(envelope.getId(), minDirect); } return nearestMessengers; }
@Override public Iterator<Job> getNearestNeighborsIterator(int nNeighbors, Job neighborTo) { TreeSet<ReferencedJob> tree = distanceNodeTree.get(neighborTo.getId()); if (tree == null) return new Iterator<Job>() { @Override public boolean hasNext() { return false; } @Override public Job next() { return null; } @Override public void remove() { } }; Iterator<ReferencedJob> descendingIterator = tree.iterator(); return new NearestNeighborhoodIterator(descendingIterator, nNeighbors); }
@Override public Iterator<Job> getNearestNeighborsIterator(int nNeighbors, Job neighborTo) { TreeSet<ReferencedJob> tree = distanceNodeTree.get(neighborTo.getId()); if (tree == null) return new Iterator<Job>() { @Override public boolean hasNext() { return false; } @Override public Job next() { return null; } @Override public void remove() { } }; Iterator<ReferencedJob> descendingIterator = tree.iterator(); return new NearestNeighborhoodIterator(descendingIterator, nNeighbors); }
private void addLabel(Job job, XYDataItem dataItem) { if (this.label.equals(Label.SIZE)) { labelsByDataItem.put(dataItem, getSizeString(job)); } else if (this.label.equals(Label.ID)) { labelsByDataItem.put(dataItem, String.valueOf(job.getId())); } }
private void log(VehicleRoutingProblemSolution solution) { logger.trace("solution costs: {}", solution.getCost()); for (VehicleRoute r : solution.getRoutes()) { StringBuilder b = new StringBuilder(); b.append(r.getVehicle().getId()).append(" : ").append("[ "); for (TourActivity act : r.getActivities()) { if (act instanceof TourActivity.JobActivity) { b.append(((TourActivity.JobActivity) act).getJob().getId()).append(" "); } } b.append("]"); logger.trace(b.toString()); } StringBuilder b = new StringBuilder(); b.append("unassigned : [ "); for (Job j : solution.getUnassignedJobs()) { b.append(j.getId()).append(" "); } b.append("]"); logger.trace(b.toString()); }
private void insertService(Job job, InsertionData data, VehicleRoute route) { insertNode(job.getId(), data.getDeliveryInsertionIndex(), data, route); }
private static void validateSolution(VehicleRoutingProblemSolution bestOf, VehicleRoutingProblem bicycleMessengerProblem, Map<String, Double> nearestMessengers) { for (VehicleRoute route : bestOf.getRoutes()) { for (TourActivity act : route.getActivities()) { if (act.getArrTime() > 3 * nearestMessengers.get(((JobActivity) act).getJob().getId())) { SolutionPrinter.print(bicycleMessengerProblem, bestOf, SolutionPrinter.Print.VERBOSE); throw new IllegalStateException("three times less than ... constraint broken. this must not be. act.getArrTime(): " + act.getArrTime() + " allowed: " + 3 * nearestMessengers.get(((JobActivity) act).getJob().getId())); } } } }
protected boolean removeJob(Job job, VehicleRoute route) { if (jobIsInitial(job)) return false; boolean removed = route.getTourActivities().removeJob(job); if (removed) { logger.trace("ruin: {}", job.getId()); ruinListeners.removed(job, route); return true; } return false; } }
@Override public boolean fulfilled(JobInsertionContext insertionContext) { double timeOfDirectRoute = getTimeOfDirectRoute(insertionContext.getJob(), insertionContext.getNewVehicle(), routingCosts); double timeOfNearestMessenger = bestMessengers.get(insertionContext.getJob().getId()); return !(timeOfDirectRoute > 3 * timeOfNearestMessenger); }
private String getNodeId(TourActivity act) { String nodeId = null; if (act instanceof TourActivity.JobActivity) { Job job = ((TourActivity.JobActivity) act).getJob(); if (job instanceof Service) { nodeId = job.getId(); } else if (job instanceof Shipment) { if (act.getName().equals("pickupShipment")) nodeId = getFromNodeId((Shipment) job); else nodeId = getToNodeId((Shipment) job); } } return nodeId; }
private ScoredJob nextJob(Collection<VehicleRoute> routes, Collection<Job> unassignedJobList, List<ScoredJob> badJobs) { ScoredJob bestScoredJob = null; for (Job unassignedJob : unassignedJobList) { ScoredJob scoredJob = getScoredJob(routes, unassignedJob, insertionCostsCalculator, scoringFunction); if (scoredJob instanceof ScoredJob.BadJob) { badJobs.add(scoredJob); continue; } if (bestScoredJob == null) bestScoredJob = scoredJob; else { if (scoredJob.getScore() > bestScoredJob.getScore()) { bestScoredJob = scoredJob; } else if (scoredJob.getScore() == bestScoredJob.getScore()) { if (scoredJob.getJob().getId().compareTo(bestScoredJob.getJob().getId()) <= 0) { bestScoredJob = scoredJob; } } } } return bestScoredJob; }
static double score(Job unassignedJob, InsertionData best, InsertionData secondBest, ScoringFunction scoringFunction){ if (best == null) { throw new IllegalStateException("cannot insert job " + unassignedJob.getId()); } double score; if (secondBest == null) { //either there is only one vehicle or there are more vehicles, but they cannot load unassignedJob //if only one vehicle, I want the job to be inserted with min iCosts //if there are more vehicles, I want this job to be prioritized since there are no alternatives score = (11 - unassignedJob.getPriority()) * (Integer.MAX_VALUE - best.getInsertionCost()) + scoringFunction.score(best, unassignedJob); } else { score = (11 - unassignedJob.getPriority()) * (secondBest.getInsertionCost() - best.getInsertionCost()) + scoringFunction.score(best, unassignedJob); } return score; } }
@Override public void visit(TourActivity currAct) { double timeOfNearestMessenger = bestMessengers.get(((JobActivity) currAct).getJob().getId()); double potential_latest_arrTime_at_currAct = latest_arrTime_at_prevAct - routingCosts.getBackwardTransportTime(currAct.getLocation(), prevAct.getLocation(), latest_arrTime_at_prevAct, route.getDriver(), route.getVehicle()) - currAct.getOperationTime(); double latest_arrTime_at_currAct = Math.min(3 * timeOfNearestMessenger, potential_latest_arrTime_at_currAct); stateManager.putActivityState(currAct, latest_act_arrival_time_stateId, latest_arrTime_at_currAct); assert currAct.getArrTime() <= latest_arrTime_at_currAct : "this must not be since it breaks condition; actArrTime: " + currAct.getArrTime() + " latestArrTime: " + latest_arrTime_at_currAct + " vehicle: " + route.getVehicle().getId(); latest_arrTime_at_prevAct = latest_arrTime_at_currAct; prevAct = currAct; }
/** * Adds an initial vehicle route. * * @param route initial route * @return the builder */ public Builder addInitialVehicleRoute(VehicleRoute route) { if(!addedVehicleIds.contains(route.getVehicle().getId())){ addVehicle((AbstractVehicle) route.getVehicle()); addedVehicleIds.add(route.getVehicle().getId()); } for (TourActivity act : route.getActivities()) { AbstractActivity abstractAct = (AbstractActivity) act; abstractAct.setIndex(activityIndexCounter); incActivityIndexCounter(); if (act instanceof TourActivity.JobActivity) { Job job = ((TourActivity.JobActivity) act).getJob(); jobsInInitialRoutes.put(job.getId(), job); addLocationToTentativeLocations(job); registerJobAndActivity(abstractAct, job); } } initialRoutes.add(route); return this; }
protected void insertJob(Job unassignedJob, InsertionData iData, VehicleRoute inRoute) { logger.trace("insert: [jobId={}]{}", unassignedJob.getId(), iData); insertionsListeners.informBeforeJobInsertion(unassignedJob, iData, inRoute); if (!(inRoute.getVehicle().getId().equals(iData.getSelectedVehicle().getId()))) { insertionsListeners.informVehicleSwitched(inRoute, inRoute.getVehicle(), iData.getSelectedVehicle()); } for (Event e : iData.getEvents()) { eventListeners.inform(e); } insertionsListeners.informJobInserted(unassignedJob, inRoute, iData.getInsertionCost(), iData.getAdditionalTime()); }
private void handleVehicleSwitch(InsertionData data, VehicleRoute route) { boolean vehicleSwitch = false; if (!(route.getVehicle() instanceof VehicleImpl.NoVehicle)) { if (!route.getVehicle().getId().equals(data.getSelectedVehicle().getId())) { vehicleSwitch = true; } } if (vehicleSwitch && !route.getActivities().isEmpty()) { String oldStart = makeStartId(route.getVehicle()); String firstAct = ((TourActivity.JobActivity) route.getActivities().get(0)).getJob().getId(); String oldEnd = makeEndId(route.getVehicle()); String lastAct = ((TourActivity.JobActivity) route.getActivities().get(route.getActivities().size() - 1)).getJob().getId(); removeEdge(oldStart + "_" + firstAct); if (route.getVehicle().isReturnToDepot()) { removeEdge(lastAct + "_" + oldEnd); } String newStart = makeStartId(data.getSelectedVehicle()); String newEnd = makeEndId(data.getSelectedVehicle()); addEdge(newStart + "_" + firstAct, newStart, firstAct); if (data.getSelectedVehicle().isReturnToDepot()) { addEdge(lastAct + "_" + newEnd, lastAct, newEnd); } } }