public void add(TimeWindow timeWindow){ for(TimeWindow tw : timeWindows){ if(timeWindow.getStart() > tw.getStart() && timeWindow.getStart() < tw.getEnd()){ throw new IllegalArgumentException("time-windows cannot overlap each other. overlap: " + tw + ", " + timeWindow); } if(timeWindow.getEnd() > tw.getStart() && timeWindow.getEnd() < tw.getEnd()){ throw new IllegalArgumentException("time-windows cannot overlap each other. overlap: " + tw + ", " + timeWindow); } if(timeWindow.getStart() <= tw.getStart() && timeWindow.getEnd() >= tw.getEnd()){ throw new IllegalArgumentException("time-windows cannot overlap each other. overlap: " + tw + ", " + timeWindow); } } timeWindows.add(timeWindow); }
public Builder<T> addTimeWindow(double earliest, double latest) { return addTimeWindow(TimeWindow.newInstance(earliest, latest)); }
/** * Returns new instance of TimeWindow. * * @param start * @param end * @return TimeWindow * @throw IllegalArgumentException either if start or end < 0.0 or end < start */ public static TimeWindow newInstance(double start, double end) { return new TimeWindow(start, end); }
@Override public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { Break aBreak = inRoute.getVehicle().getBreak(); if(aBreak != null){ boolean removed = inRoute.getTourActivities().removeJob(aBreak); if(removed){ logger.trace("ruin: {}", aBreak.getId()); stateManager.removed(aBreak,inRoute); stateManager.reCalculateStates(inRoute); } if(inRoute.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){ InsertionData iData = breakInsertionCalculator.getInsertionData(inRoute, aBreak, inRoute.getVehicle(), inRoute.getDepartureTime(), inRoute.getDriver(), Double.MAX_VALUE); if(!(iData instanceof InsertionData.NoInsertionFound)){ logger.trace("insert: [jobId={}]{}", aBreak.getId(), iData); for(Event e : iData.getEvents()){ eventListeners.inform(e); } stateManager.informJobInserted(aBreak,inRoute,0,0); } } } }
@Override public void informInsertionStarts(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) { for(VehicleRoute route : vehicleRoutes){ Break aBreak = route.getVehicle().getBreak(); if(aBreak != null && !route.getTourActivities().servesJob(aBreak)){ if(route.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){ InsertionData iData = breakInsertionCalculator.getInsertionData(route, aBreak, route.getVehicle(), route.getDepartureTime(), route.getDriver(), Double.MAX_VALUE); if(!(iData instanceof InsertionData.NoInsertionFound)){ logger.trace("insert: [jobId={}]{}", aBreak.getId(), iData); for(Event e : iData.getEvents()){ eventListeners.inform(e); } stateManager.informJobInserted(aBreak,route,0,0); } } } } } }
public Builder addDelivery(Shipment shipment, TimeWindow deliveryTimeWindow) { if (openShipments.contains(shipment)) { TourActivity act = openActivities.get(shipment); act.setTheoreticalEarliestOperationStartTime(deliveryTimeWindow.getStart()); act.setTheoreticalLatestOperationStartTime(deliveryTimeWindow.getEnd()); tourActivities.addActivity(act); openShipments.remove(shipment); } else { throw new IllegalArgumentException("cannot deliver shipment. shipment " + shipment + " needs to be picked up first."); } return this; }
public Builder addDeliveryTimeWindow(double earliest, double latest) { addDeliveryTimeWindow(TimeWindow.newInstance(earliest, latest)); return this; }
@Override public double getCosts(VehicleRoutingProblemSolution solution) { double costs = 0.; for (VehicleRoute route : solution.getRoutes()) { costs += route.getVehicle().getType().getVehicleCostParams().fix; boolean hasBreak = false; TourActivity prevAct = route.getStart(); for (TourActivity act : route.getActivities()) { if (act instanceof BreakActivity) hasBreak = true; costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), act.getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); costs += vrp.getActivityCosts().getActivityCost(act, act.getArrTime(), route.getDriver(), route.getVehicle()); prevAct = act; } costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), route.getEnd().getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); if (route.getVehicle().getBreak() != null) { if (!hasBreak) { //break defined and required but not assigned penalty if (route.getEnd().getArrTime() > route.getVehicle().getBreak().getTimeWindow().getEnd()) { costs += 4 * (maxCosts * 2 + route.getVehicle().getBreak().getServiceDuration() * route.getVehicle().getType().getVehicleCostParams().perServiceTimeUnit); } } } } for(Job j : solution.getUnassignedJobs()){ costs += maxCosts * 2 * (11 - j.getPriority()); } return costs; } };
/** * Returns new instance of TimeWindow. * * @param start * @param end * @return TimeWindow * @throw IllegalArgumentException either if start or end < 0.0 or end < start */ public static TimeWindow newInstance(double start, double end) { return new TimeWindow(start, end); }
public Builder addPickup(Shipment shipment, TimeWindow pickupTimeWindow) { if (openShipments.contains(shipment)) throw new IllegalArgumentException("shipment has already been added. cannot add it twice."); List<AbstractActivity> acts = jobActivityFactory.createActivities(shipment); TourActivity act = acts.get(0); act.setTheoreticalEarliestOperationStartTime(pickupTimeWindow.getStart()); act.setTheoreticalLatestOperationStartTime(pickupTimeWindow.getEnd()); tourActivities.addActivity(act); openShipments.add(shipment); openActivities.put(shipment, acts.get(1)); return this; }
public Builder addPickupTimeWindow(double earliest, double latest) { return addPickupTimeWindow(TimeWindow.newInstance(earliest, latest)); }
@Override public void informJobInserted(Job job2insert, VehicleRoute inRoute, double additionalCosts, double additionalTime) { Break aBreak = inRoute.getVehicle().getBreak(); if(aBreak != null){ boolean removed = inRoute.getTourActivities().removeJob(aBreak); if(removed){ logger.trace("ruin: {}", aBreak.getId()); stateManager.removed(aBreak,inRoute); stateManager.reCalculateStates(inRoute); } if(inRoute.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){ InsertionData iData = breakInsertionCalculator.getInsertionData(inRoute, aBreak, inRoute.getVehicle(), inRoute.getDepartureTime(), inRoute.getDriver(), Double.MAX_VALUE); if(!(iData instanceof InsertionData.NoInsertionFound)){ logger.trace("insert: [jobId={}]{}", aBreak.getId(), iData); for(Event e : iData.getEvents()){ eventListeners.inform(e); } stateManager.informJobInserted(aBreak,inRoute,0,0); } } } }
TimeWindow twObj = new TimeWindow(tw[0].getTotalMilliseconds(), tw[1].getTotalMilliseconds()); if (i == 0) { builder.setPickupTimeWindow(twObj);
public Builder addService(Service service, TimeWindow timeWindow) { if (service == null) throw new IllegalArgumentException("service must not be null"); List<AbstractActivity> acts = jobActivityFactory.createActivities(service); TourActivity act = acts.get(0); act.setTheoreticalEarliestOperationStartTime(timeWindow.getStart()); act.setTheoreticalLatestOperationStartTime(timeWindow.getEnd()); tourActivities.addActivity(act); return this; }
Builder(String id) { if (id == null) throw new IllegalArgumentException("id must not be null"); this.id = id; pickupTimeWindows = new TimeWindowsImpl(); pickupTimeWindows.add(TimeWindow.newInstance(0.0, Double.MAX_VALUE)); deliveryTimeWindows = new TimeWindowsImpl(); deliveryTimeWindows.add(TimeWindow.newInstance(0.0, Double.MAX_VALUE)); }
@Override public void informInsertionStarts(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) { for(VehicleRoute route : vehicleRoutes){ Break aBreak = route.getVehicle().getBreak(); if(aBreak != null && !route.getTourActivities().servesJob(aBreak)){ if(route.getEnd().getArrTime() > aBreak.getTimeWindow().getEnd()){ InsertionData iData = breakInsertionCalculator.getInsertionData(route, aBreak, route.getVehicle(), route.getDepartureTime(), route.getDriver(), Double.MAX_VALUE); if(!(iData instanceof InsertionData.NoInsertionFound)){ logger.trace("insert: [jobId={}]{}", aBreak.getId(), iData); for(Event e : iData.getEvents()){ eventListeners.inform(e); } stateManager.informJobInserted(aBreak,route,0,0); } } } } } }
private Service buildStop(ODLTableReadOnly table, int row, StopsTableDefn dfn, Service.Builder builder) { LatLong ll = dfn.latLong.getLatLong(table, row,false); Location location = Location.newInstance(locs.addLatLong(ll)); builder.setLocation(location); // validate and add quantities for (int q = 0; q < dfn.quantityIndices.length; q++) { builder.addSizeDimension(q, dfn.getQuantity(table, row, q)); } // validate and set service duration if (dfn.serviceDuration != -1) { builder.setServiceTime(dfn.getDuration(table, row).getTotalMilliseconds()); } // validate and set time window ODLTime[] tw = dfn.getTW(table, row); if (tw != null) { builder.setTimeWindow(new TimeWindow(tw[0].getTotalMilliseconds(), tw[1].getTotalMilliseconds())); } // add required skills for(String skill: getSkillsArray((String)table.getValueAt(row, dfn.requiredSkills))){ builder.addRequiredSkill(skill); } return builder.build(); }
private Builder addBreakInternally(Break currentBreak, TimeWindow timeWindow, Location breakLocation) { List<AbstractActivity> acts = jobActivityFactory.createActivities(currentBreak); BreakActivity act = (BreakActivity) acts.get(0); act.setTheoreticalEarliestOperationStartTime(timeWindow.getStart()); act.setTheoreticalLatestOperationStartTime(timeWindow.getEnd()); act.setLocation(breakLocation); tourActivities.addActivity(act); return this; }
Builder(String id){ this.id = id; timeWindows = new TimeWindowsImpl(); timeWindows.add(TimeWindow.newInstance(0.0, Double.MAX_VALUE)); }
@Override public double getCosts(VehicleRoutingProblemSolution solution) { double costs = 0.; for (VehicleRoute route : solution.getRoutes()) { costs += route.getVehicle().getType().getVehicleCostParams().fix; boolean hasBreak = false; TourActivity prevAct = route.getStart(); for (TourActivity act : route.getActivities()) { if (act instanceof BreakActivity) hasBreak = true; costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), act.getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); costs += vrp.getActivityCosts().getActivityCost(act, act.getArrTime(), route.getDriver(), route.getVehicle()); prevAct = act; } costs += vrp.getTransportCosts().getTransportCost(prevAct.getLocation(), route.getEnd().getLocation(), prevAct.getEndTime(), route.getDriver(), route.getVehicle()); if (route.getVehicle().getBreak() != null) { if (!hasBreak) { //break defined and required but not assigned penalty if (route.getEnd().getArrTime() > route.getVehicle().getBreak().getTimeWindow().getEnd()) { costs += 4 * (maxCosts * 2 + route.getVehicle().getBreak().getServiceDuration() * route.getVehicle().getType().getVehicleCostParams().perServiceTimeUnit); } } } } for(Job j : solution.getUnassignedJobs()){ costs += maxCosts * 2 * (11 - j.getPriority()); } return costs; } };