@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(); }
@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(); }
final Parcel p4 = Parcel.builder(new Point(1, 2), new Point(1, 5)) .pickupTimeWindow(TimeWindow.create(minute(5), minute(25))) .deliveryTimeWindow(TimeWindow.create(minute(22), minute(30))) .serviceDuration(minute(3)) .build();
.orderAnnounceTime(announceTime) .pickupTimeWindow(TimeWindow.create(announceTime, endTime)) .deliveryTimeWindow(TimeWindow.create(announceTime, endTime)) .neededCapacity(0).buildDTO()));
.deliveryTimeWindow(TimeWindow.create(50, 75)) .neededCapacity(0) .orderAnnounceTime(0L)
.deliveryTimeWindow(TimeWindow.create(10, 20)) .neededCapacity(0) .orderAnnounceTime(0)
.builder(new Point(1, 2.2), new Point(1, 4)) .pickupTimeWindow(TimeWindow.create(minute(5) + second(30), minute(15))) .deliveryTimeWindow(TimeWindow.create(minute(16), minute(30))) .pickupDuration(minute(3)) .deliveryDuration(minute(1))
.builder(new Point(1, 2), new Point(1, 4)) .pickupTimeWindow(TimeWindow.create(minute(5) + second(30), minute(15))) .deliveryTimeWindow(TimeWindow.create(minute(16), minute(30))) .pickupDuration(minute(3)) .deliveryDuration(minute(1))
.builder(new Point(1, 1.99), new Point(1, 4)) .pickupTimeWindow(TimeWindow.create(minute(5) + second(30), minute(15))) .deliveryTimeWindow(TimeWindow.create(minute(16), minute(30))) .pickupDuration(minute(3)) .deliveryDuration(minute(1))
.deliveryTimeWindow(TimeWindow.create(15, 15)) .neededCapacity(0) .orderAnnounceTime(0)
Parcel.builder(new Point(1, 0), new Point(0, 7)) .pickupTimeWindow(DEFAULT_TW) .deliveryTimeWindow(DEFAULT_TW) .neededCapacity(0) .orderAnnounceTime(0L)
/** * Tests that the statemachine dispatches the correct events in the correct * order when there is no service time. */ @Test @SuppressWarnings("ModifyingCollectionWithItself") public void noServiceTime() { final Parcel noServ = Parcel .builder(new Point(1, 2), new Point(1, 4)) .pickupTimeWindow(TimeWindow.create(minute(5), minute(15))) .deliveryTimeWindow(TimeWindow.create(minute(16), minute(30))) .pickupDuration(minute(0)) .deliveryDuration(minute(0)) .build(); PDPTWTestUtil.register(rm, pm, noServ); final List<DefaultEvent> expected = new ArrayList<>(asList(GOTO, ARRIVED, READY_TO_SERVICE, DONE)); expected.addAll(expected); final List<DefaultEvent> actual = new ArrayList<>(); d.stateMachine.getEventAPI().addListener(new Listener() { @Override public void handleEvent(Event e) { actual.add((DefaultEvent) ((StateTransitionEvent) e).trigger); } }, StateMachineEvent.STATE_TRANSITION); d.setRoute(asList(noServ, noServ)); tick(0, 100); assertThat(actual).containsExactlyElementsIn(expected).inOrder(); }
@Test public void simpleScenario() throws IOException { final Gendreau06Scenario scenario = create(2, minutes(15), AddParcelEvent.create( Parcel.builder(new Point(2, 1), new Point(4, 1)) .pickupTimeWindow(TimeWindow.create(0, 720000)) .deliveryTimeWindow(TimeWindow.create(5, 720000)) .neededCapacity(0) .orderAnnounceTime(0L) .pickupDuration(0L) .deliveryDuration(0L) .buildDTO())); final StatisticsDTO dto = runProblem(scenario, useGui); // the second truck will turn around just one tick distance before // reaching the package. the reason is that it is too late since the // first truck will pickup the parcel. final double distInOneTick = 30.0 / 3600.0; assertTrue(dto.simFinish); assertEquals(9 - 2.0 * distInOneTick, dto.totalDistance, EPSILON); assertEquals(1, dto.totalParcels); assertEquals(0, dto.overTime); assertEquals(0, dto.pickupTardiness); assertEquals(0, dto.deliveryTardiness); assertEquals(2, dto.totalVehicles); assertEquals(2, dto.movedVehicles); }
/** * Checks whether overtime is computed correctly. */ @Test public void overtimeScenario() { final Gendreau06Scenario scenario = create(1, minutes(6), AddParcelEvent.create( Parcel.builder(new Point(2, 1), new Point(4, 1)) .pickupTimeWindow(TimeWindow.create(0, minutes(12))) .deliveryTimeWindow(TimeWindow.create(5, minutes(12))) .neededCapacity(0) .orderAnnounceTime(0L) .pickupDuration(0L) .deliveryDuration(0L) .buildDTO())); final StatisticsDTO dto = runProblem(scenario, useGui); assertTrue(dto.simFinish); assertEquals(6, dto.totalDistance, EPSILON); assertEquals(1, dto.totalDeliveries); assertEquals(minutes(6) - 1000, dto.overTime); assertEquals(0, dto.pickupTardiness); assertEquals(0, dto.deliveryTardiness); }
static AddParcelEvent createParcel(int i, long delay, Point p1, Point p2) { final long announceTime = (i + 1) * 60 * 1000; return AddParcelEvent.create( Parcel.builder(p1, p2) .orderAnnounceTime(announceTime + delay) .pickupTimeWindow( TimeWindow.create(announceTime + delay, announceTime + 1 * 60 * 1000)) .deliveryTimeWindow( TimeWindow.create(announceTime + delay + 5 * 60 * 1000, announceTime + 6 * 60 * 1000)) .serviceDuration(5 * 60 * 1000) .buildDTO()); }
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()); }
static Parcel createParcel(Point origin, Point dest) { return Parcel.builder(origin, dest) .pickupTimeWindow(TW) .deliveryTimeWindow(TW) .serviceDuration(30) .build(); }
static AddParcelEvent parcelEvent(double x1, double y1, double x2, double y2, long tw1b, long tw1e, long tw2b, long tw2e) { return AddParcelEvent.create( Parcel.builder(new Point(x1, y1), new Point(x2, y2)) .pickupTimeWindow(TimeWindow.create(tw1b, tw1e)) .deliveryTimeWindow(TimeWindow.create(tw2b, tw2e)) .neededCapacity(0) .orderAnnounceTime(0L) .pickupDuration(0L) .deliveryDuration(0L) .buildDTO()); }
/** * Sets both the pickup and delivery time windows to the specified value. * The default value is {@link TimeWindow#always()}. * @param tw The time window to set. * @return This, as per the builder pattern. */ public Builder timeWindows(TimeWindow tw) { return pickupTimeWindow(tw).deliveryTimeWindow(tw); }
static Parcel create(Point p1, Point p2) { return Parcel.builder(p1, p2) .pickupTimeWindow(DEFAULT_TW) .deliveryTimeWindow(DEFAULT_TW) .neededCapacity(0) .orderAnnounceTime(0L) .pickupDuration(0L) .deliveryDuration(0L) .build(); } }