@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(); }
.pickupTimeWindow(TimeWindow.create(15, 15)) .deliveryTimeWindow(TimeWindow.create(15, 15)) .neededCapacity(0)
.pickupTimeWindow(TimeWindow.create(10, 30)) .deliveryTimeWindow(TimeWindow.create(50, 75)) .neededCapacity(0)
.pickupTimeWindow(TimeWindow.create(0, 10)) .deliveryTimeWindow(TimeWindow.create(10, 20)) .neededCapacity(0)
final Parcel p4 = Parcel .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))
final Parcel p4 = Parcel .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))
final Parcel p4 = Parcel .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))
dp1 = new Parcel( Parcel.builder(new Point(1, 0), new Point(0, 7)) .pickupTimeWindow(DEFAULT_TW) .deliveryTimeWindow(DEFAULT_TW) .neededCapacity(0)
/** * 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); }
/** * Sets up simple problem with two agents and two parcels. */ @Before public void setUp() { final List<TimedEvent> events = asList( AddParcelEvent.create( Parcel.builder(new Point(0, 0), new Point(3, 3)) .orderAnnounceTime(200) .pickupTimeWindow(TimeWindow.create(1000, 2000)) .buildDTO()), AddParcelEvent.create( Parcel.builder(new Point(0, 0), new Point(3, 3)) .orderAnnounceTime(999) .pickupTimeWindow(TimeWindow.create(60000, 80000)) .serviceDuration(180000L) .buildDTO()), TimeOutEvent.create(3000)); sim = RealtimeTestHelper.init(Handler.INSTANCE, events) .addModel(RtSolverModel.builder() .withThreadPoolSize(3) .withThreadGrouping(false)) .build(); }
/** * Test for changing values in builder. */ @Test public void overridingTest() { final Parcel.Builder b = Parcel.builder(new Point(0, 0), new Point(2, 2)); final IParcel dto1 = b.timeWindows(TimeWindow.create(7, 10)).buildDTO(); assertEquals(TimeWindow.create(7, 10), dto1.getPickupTimeWindow()); assertEquals(TimeWindow.create(7, 10), dto1.getDeliveryTimeWindow()); final IParcel dto2 = b.pickupTimeWindow(TimeWindow.create(8, 11)).buildDTO(); assertEquals(TimeWindow.create(8, 11), dto2.getPickupTimeWindow()); assertEquals(TimeWindow.create(7, 10), dto2.getDeliveryTimeWindow()); final IParcel dto3 = b.serviceDuration(560L).buildDTO(); assertEquals(TimeWindow.create(8, 11), dto3.getPickupTimeWindow()); assertEquals(TimeWindow.create(7, 10), dto3.getDeliveryTimeWindow()); assertEquals(560, dto3.getPickupDuration()); assertEquals(560, dto3.getDeliveryDuration()); final IParcel dto4 = b.pickupDuration(230L).buildDTO(); assertEquals(230, dto4.getPickupDuration()); assertEquals(560, dto4.getDeliveryDuration()); }
/** * 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(); } }