@Override public ParcelDTO doDeserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) { final Iterator<JsonElement> it = json.getAsJsonArray().iterator(); final Point p1 = context.deserialize(it.next(), Point.class); final Point p2 = context.deserialize(it.next(), Point.class); return Parcel.builder(p1, p2) .pickupTimeWindow( (TimeWindow) context.deserialize(it.next(), TimeWindow.class)) .deliveryTimeWindow( (TimeWindow) context.deserialize(it.next(), TimeWindow.class)) .neededCapacity(it.next().getAsDouble()) .orderAnnounceTime(it.next().getAsLong()) .pickupDuration(it.next().getAsLong()) .deliveryDuration(it.next().getAsLong()).buildDTO(); }
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; }
return false; final Point loc = isPickup ? p.getDto().getPickupLocation() : p .getDeliveryLocation(); final long travelTime = computeTravelTimeTo(loc, time.getTimeUnit()); final long openingTime = isPickup ? p.getPickupTimeWindow().begin() : p .getDeliveryTimeWindow().begin(); final long latestTimeToLeave = openingTime - travelTime; return latestTimeToLeave >= time.getEndTime();
@Nullable Parcel getDelivery(TimeLapse time, int distance) { Parcel target = null; double closest = distance; final PDPModel pm = getPDPModel(); for (final Parcel p : pm.getContents(this)) { final double dist = Point.distance(getRoadModel().getPosition(this), p.getDeliveryLocation()); if (dist < closest && pm.getTimeWindowPolicy().canDeliver(p.getDeliveryTimeWindow(), time.getTime(), p.getPickupDuration())) { closest = dist; target = p; } } return target; }
if (delivery.getDeliveryLocation().equals(getPosition()) && pm.getVehicleState(this) == VehicleState.IDLE) { pm.deliver(this, delivery, time); } else { rm.moveTo(this, delivery.getDeliveryLocation(), time); getPosition()) < DISTANCE_THRESHOLD_KM) { if (rm.equalPosition(closest, this) && pm.getTimeWindowPolicy().canPickup(closest.getPickupTimeWindow(), time.getTime(), closest.getPickupDuration())) { final double newSize = getPDPModel().getContentsSize(this) + closest.getNeededCapacity();
assert v != null; final long latestBeginTime = p.getPickupTimeWindow().end() - p.getPickupDuration(); if (pme.time > latestBeginTime) { final long tardiness = pme.time - latestBeginTime; assert v != null; final long latestBeginTime = p.getDeliveryTimeWindow().end() - p.getDeliveryDuration(); if (pme.time > latestBeginTime) { final long tardiness = pme.time - latestBeginTime;
Point getParcelPos(RoadUser obj) { if (!containsObject(obj) && obj instanceof Parcel) { final ParcelState state = pdpModel.get().getParcelState( (Parcel) obj); checkArgument( state == ParcelState.IN_CARGO, "Can only move to parcels which are either on the map or in cargo, " + "state is %s, obj is %s.", state, obj); return ((Parcel) obj).getDeliveryLocation(); } return getPosition(obj); }
gc.setForeground(black); for (final Parcel parcel : contents) { final Point po = parcel.getDeliveryLocation(); final int xd = vp.toCoordX(po.x); final int yd = vp.toCoordY(po.y); if (parcel.getDeliveryTimeWindow().isBeforeStart(time)) { gc.setBackground(darkGreen); } else if (parcel.getDeliveryTimeWindow().isBeforeEnd(time)) { gc.setBackground(green); } else { final int y = vp.toCoordY(p.y); gc.setForeground(lightGray); gc.drawLine(x, y, vp.toCoordX(parcel.getDeliveryLocation().x), vp.toCoordY(parcel.getDeliveryLocation().y)); if (parcel.getPickupTimeWindow().isBeforeStart(time)) { gc.setBackground(darkGreen); } else if (parcel.getPickupTimeWindow().isBeforeEnd(time)) { gc.setBackground(green); } else {
@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); } } } }
parcel.getDeliveryLocation().equals(roadModel.getPosition(vehicle)), "parcel must be delivered at its destination, vehicle should move " + "there first"); timeWindowPolicy.canDeliver(parcel.getDeliveryTimeWindow(), time.getTime(), parcel.getDeliveryDuration()), "parcel delivery is not allowed at this time (%s) according to the " + "time window policy: %s", time.getTime(), timeWindowPolicy); checkArgument(parcel.canBeDelivered(vehicle, time.getTime()), "the parcel does not allow a delivery now"); if (time.getTimeLeft() < parcel.getDeliveryDuration()) { vehicleState.put(vehicle, VehicleState.DELIVERING); parcelState.put(ParcelState.DELIVERING, parcel); pendingVehicleActions.put(vehicle, new DeliverAction(this, vehicle, parcel, parcel.getDeliveryDuration() - time.getTimeLeft())); time.consumeAll(); } else { time.consume(parcel.getDeliveryDuration()); doDeliver(vehicle, parcel, time.getTime());
rm.register(truck); model.register(truck); final Parcel pack1 = Parcel.builder(new Point(1, 1), new Point(2, 2)) .pickupDuration(10) .deliveryDuration(10) assertTrue(model.getParcels(ParcelState.AVAILABLE).isEmpty()); rm.moveTo(truck, pack1.getDeliveryLocation(), TimeLapseFactory.create(0, 3600000 * 3)); assertEquals(pack1.getDeliveryLocation(), rm.getPosition(truck)); assertEquals(8, tl.getTimeLeft()); final Parcel pack2 = Parcel.builder(new Point(2, 2), new Point(2, 2)) .pickupDuration(10) .deliveryDuration(10)
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(); }
+ "pickup"); final double newSize = containerContentsSize.get(vehicle) + parcel.getNeededCapacity(); parcel.getNeededCapacity(), containerContentsSize.get(vehicle), containerCapacities.get(vehicle)); 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()); checkArgument(parcel.canBePickedUp(vehicle, time.getTime()), "the parcel does not allow pickup now"); if (time.getTimeLeft() < parcel.getPickupDuration()) { vehicleState.put(vehicle, VehicleState.PICKING_UP); parcelState.put(ParcelState.PICKING_UP, parcel); parcel, parcel.getPickupDuration() - time.getTimeLeft())); time.consumeAll(); } else { time.consume(parcel.getPickupDuration()); doPickup(vehicle, parcel, time.getTime());
public ParcelDecorator(Parcel p, String parcelName) { super(p.getDto()); name = parcelName; }
static Parcel createParcel(Point origin, Point dest) { return new Parcel( Parcel.builder(origin, dest) .pickupTimeWindow(TimeWindow.create(380001, 380002)) .deliveryTimeWindow(TimeWindow.create(0, 1000)) .neededCapacity(0) .orderAnnounceTime(0L) .pickupDuration(3000L) .deliveryDuration(3000L) .buildDTO()); }
/** * Check whether mixing diversion allowed/disallowed methods produce the * expected results. */ @Test public void test() { // first move by using the location rm.moveTo(dv1, dp1.getPickupLocation(), time(10)); assertEquals(rm.getPosition(dv1), dp1.getPickupLocation()); pm.pickup(dv1, dp1, time(1)); assertTrue(pm.containerContains(dv1, dp1)); // now move by using the reference to the parcel rm.moveTo(dv1, dp1, time(300)); assertEquals(rm.getPosition(dv1), dp1.getDeliveryLocation()); } }
@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)); } } }
void addParcel(final ParcelInfo p) { newParcels.add(p); width = Math.max(width, (int) (p.parcel.getDeliveryTimeWindow().end() / TIME_PER_PIXEL)); }