@Override public void tick(TimeLapse timeLapse) { synchronized (this) { // TODO this can be optimized by scheduling events upon registering currentTime = timeLapse.getStartTime(); final Collection<Parcel> parcels = parcelState.get(ParcelState.ANNOUNCED); final List<Parcel> newAvailables = newArrayList(); for (final Parcel p : parcels) { if (timeLapse.getStartTime() >= p.getPickupTimeWindow().begin()) { newAvailables.add(p); } } for (final Parcel p : newAvailables) { parcelState.put(ParcelState.AVAILABLE, p); eventDispatcher.dispatchEvent(new PDPModelEvent( PDPModelEventType.PARCEL_AVAILABLE, self, currentTime, p, null)); } } }
checkArgument(!parcelState.containsValue(element)); final Parcel p = (Parcel) element; final ParcelState state = currentTime < p.getPickupTimeWindow().begin() ? ParcelState.ANNOUNCED : ParcelState.AVAILABLE;
timeWindowPolicy.canPickup(parcel.getPickupTimeWindow(), time.getTime(), parcel.getPickupDuration()), "parcel pickup is not allowed according to the time window policy: " + "%s, current time: %s, time window %s.", timeWindowPolicy, time.getTime(), parcel.getPickupTimeWindow());
index2parcelBuilder.put(deliveryIndex, pio); final int[] tw = convertTW(p.getPickupTimeWindow(), state.getTime(), timeConverter); releaseDates[index] = tw[0];
void drawParcel(ParcelInfo p, int y) { final TimeWindow pi = p.parcel.getPickupTimeWindow(); final TimeWindow de = p.parcel.getDeliveryTimeWindow(); final int startX = (int) (p.eventTime / TIME_PER_PIXEL); final int startPickX = (int) (pi.begin() / TIME_PER_PIXEL); final int endPickX = (int) (pi.end() / TIME_PER_PIXEL); final int startDelX = (int) (de.begin() / TIME_PER_PIXEL); final int endDelX = (int) (de.end() / TIME_PER_PIXEL); final GC gc = new GC(contents.get()); gc.setForeground(lineColor); gc.drawLine(startX, y + BAR_START_OFFSET_Y, startX, y + BAR_END_OFFSET_Y); gc.drawLine(startX, y + BAR_MIDDLE_OFFSET_Y, startPickX, y + BAR_MIDDLE_OFFSET_Y); gc.setBackground(pickupColor); gc.fillRectangle(startPickX, y + 2, Math.max(endPickX - startPickX, 1), HALF_BAR_H); gc.drawRectangle(startPickX, y + 2, Math.max(endPickX - startPickX, 1), HALF_BAR_H); gc.drawLine(endPickX, y + BAR_MIDDLE_OFFSET_Y, startDelX, y + BAR_MIDDLE_OFFSET_Y); gc.setBackground(deliveryColor); gc.fillRectangle(startDelX, y + BAR_MIDDLE_OFFSET_Y, Math.max(endDelX - startDelX, 1), HALF_BAR_H); gc.drawRectangle(startDelX, y + BAR_MIDDLE_OFFSET_Y, Math.max(endDelX - startDelX, 1), HALF_BAR_H); gc.dispose(); }
void drawParcel(ParcelInfo p, int y) { final TimeWindow pi = p.parcel.getPickupTimeWindow(); final TimeWindow de = p.parcel.getDeliveryTimeWindow(); final int startX = (int) (p.eventTime / TIME_PER_PIXEL); final int startPickX = (int) (pi.begin() / TIME_PER_PIXEL); final int endPickX = (int) (pi.end() / TIME_PER_PIXEL); final int startDelX = (int) (de.begin() / TIME_PER_PIXEL); final int endDelX = (int) (de.end() / TIME_PER_PIXEL); final GC gc = new GC(contents.get()); gc.setForeground(lineColor); gc.drawLine(startX, y + BAR_START_OFFSET_Y, startX, y + BAR_END_OFFSET_Y); gc.drawLine(startX, y + BAR_MIDDLE_OFFSET_Y, startPickX, y + BAR_MIDDLE_OFFSET_Y); gc.setBackground(pickupColor); gc.fillRectangle(startPickX, y + 2, Math.max(endPickX - startPickX, 1), HALF_BAR_H); gc.drawRectangle(startPickX, y + 2, Math.max(endPickX - startPickX, 1), HALF_BAR_H); gc.drawLine(endPickX, y + BAR_MIDDLE_OFFSET_Y, startDelX, y + BAR_MIDDLE_OFFSET_Y); gc.setBackground(deliveryColor); gc.fillRectangle(startDelX, y + BAR_MIDDLE_OFFSET_Y, Math.max(endDelX - startDelX, 1), HALF_BAR_H); gc.drawRectangle(startDelX, y + BAR_MIDDLE_OFFSET_Y, Math.max(endDelX - startDelX, 1), HALF_BAR_H); gc.dispose(); }
} else { if (cur.getPickupTimeWindow().isBeforeStart(time)) { time = cur.getPickupTimeWindow().begin(); if (cur.getPickupTimeWindow().isAfterEnd(time)) { final long tardiness = time - cur.getPickupTimeWindow().end(); stats.pickupTardiness += tardiness;
ParcelVisit(Parcel p, VisitType t) { parcel = p; visitType = t; if (visitType == VisitType.DELIVER) { position = parcel.getDeliveryLocation(); timeWindow = Util.msToNs(parcel.getDeliveryTimeWindow()); serviceDuration = Util.msToNs(parcel.getDeliveryDuration()); } else { position = parcel.getPickupLocation(); timeWindow = Util.msToNs(parcel.getPickupTimeWindow()); serviceDuration = Util.msToNs(parcel.getPickupDuration()); } latestStartTime = timeWindow.end() - serviceDuration; }
@Override protected void tickImpl(TimeLapse time) { final RoadModel rm = getRoadModel(); final PDPModel pm = getPDPModel(); // we always go to the closest available parcel final Parcel closest = (Parcel) RoadModels .findClosestObject(rm.getPosition(this), rm, new Predicate<RoadUser>() { @Override public boolean apply(@Nullable RoadUser input) { return input instanceof Parcel && pm.getParcelState((Parcel) input) == ParcelState.AVAILABLE; } }); if (closest != null) { rm.moveTo(this, closest, time); if (rm.equalPosition(closest, this) && pm .getTimeWindowPolicy() .canPickup(closest.getPickupTimeWindow(), time.getTime(), closest.getPickupDuration())) { pm.pickup(this, closest, time); } } } }
@Override protected void tickImpl(TimeLapse time) { final RoadModel rm = getRoadModel(); final PDPModel pm = getPDPModel(); // we always go to the closest available parcel final Parcel closest = (Parcel) RoadModels .findClosestObject(rm.getPosition(this), rm, new Predicate<RoadUser>() { @Override public boolean apply(@Nullable RoadUser input) { return input instanceof Parcel && pm.getParcelState((Parcel) input) == ParcelState.AVAILABLE; } }); if (closest != null) { rm.moveTo(this, closest, time); if (rm.equalPosition(closest, this) && pm .getTimeWindowPolicy() .canPickup(closest.getPickupTimeWindow(), time.getTime(), closest.getPickupDuration())) { pm.pickup(this, closest, time); } } } }
assert v != null; final long latestBeginTime = p.getPickupTimeWindow().end() - p.getPickupDuration(); if (pme.time > latestBeginTime) {
assert v != null; final long latestBeginTime = p.getPickupTimeWindow().end() - p.getPickupDuration(); if (pme.time > latestBeginTime) {
vp.toCoordY(parcel.getDeliveryLocation().y)); if (parcel.getPickupTimeWindow().isBeforeStart(time)) { gc.setBackground(darkGreen); } else if (parcel.getPickupTimeWindow().isBeforeEnd(time)) { gc.setBackground(green); } else {
.getDeliveryLocation(); final long travelTime = computeTravelTimeTo(loc, time.getTimeUnit()); final long openingTime = isPickup ? p.getPickupTimeWindow().begin() : p .getDeliveryTimeWindow().begin(); final long latestTimeToLeave = openingTime - travelTime;
.getDeliveryLocation(); final long travelTime = computeTravelTimeTo(loc, time.getTimeUnit()); final long openingTime = isPickup ? p.getPickupTimeWindow().begin() : p .getDeliveryTimeWindow().begin(); final long latestTimeToLeave = openingTime - travelTime;
getPosition()) < DISTANCE_THRESHOLD_KM) { if (rm.equalPosition(closest, this) && pm.getTimeWindowPolicy().canPickup(closest.getPickupTimeWindow(), time.getTime(), closest.getPickupDuration())) { final double newSize = getPDPModel().getContentsSize(this)
getPosition()) < DISTANCE_THRESHOLD_KM) { if (rm.equalPosition(closest, this) && pm.getTimeWindowPolicy().canPickup(closest.getPickupTimeWindow(), time.getTime(), closest.getPickupDuration())) { final double newSize = getPDPModel().getContentsSize(this)
@Override protected void tickImpl(TimeLapse time) { final RoadModel rm = getRoadModel(); final PDPModel pm = getPDPModel(); // we always go to the closest available parcel final Parcel closest = (Parcel) RoadModels.findClosestObject( rm.getPosition(this), rm, new Predicate<RoadUser>() { @Override public boolean apply(RoadUser input) { return input instanceof Parcel && pm.getParcelState((Parcel) input) == ParcelState.AVAILABLE; } }); if (closest != null) { rm.moveTo(this, closest, time); if (rm.equalPosition(closest, this) && pm.getTimeWindowPolicy().canPickup(closest.getPickupTimeWindow(), time.getTime(), closest.getPickupDuration())) { pm.pickup(this, closest, time); } } } }