@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(); }
@Override public ImmutableList<AddParcelEvent> generate(long seed, TravelTimes travelModel, long endTime) { rng.setSeed(seed); final ImmutableList.Builder<AddParcelEvent> eventList = ImmutableList .builder(); final List<Double> times = announceTimeGenerator.generate(rng.nextLong()); final ImmutableList.Builder<Point> locsB = ImmutableList.builder(); for (int i = 0; i < times.size() * 2; i++) { locsB.add(graph.getRandomNode(rng)); } final Iterator<Point> locs = locsB.build().iterator(); for (final double time : times) { final long arrivalTime = DoubleMath.roundToLong(time, RoundingMode.FLOOR); final Point origin = locs.next(); final Point destination = locs.next(); checkEndTime(time, endTime); final Parcel.Builder parcelBuilder = Parcel .builder(origin, destination) .orderAnnounceTime(arrivalTime) .pickupDuration(pickupDurationGenerator.get(rng.nextLong())) .deliveryDuration(deliveryDurationGenerator.get(rng.nextLong())) .neededCapacity(neededCapacityGenerator.get(rng.nextLong())); timeWindowGenerator.generate(rng.nextLong(), parcelBuilder, travelModel, endTime); eventList.add(AddParcelEvent.create(parcelBuilder.buildDTO())); } return eventList.build(); }
.orderAnnounceTime(0) .serviceDuration(5) .buildDTO();
.pickupDuration(2L) .deliveryDuration(0L) .buildDTO());
@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); }
@Override public ImmutableList<AddParcelEvent> generate(long seed, TravelTimes travelModel, long endTime) { rng.setSeed(seed); final ImmutableList.Builder<AddParcelEvent> eventList = ImmutableList .builder(); final List<Double> times = announceTimeGenerator.generate(rng.nextLong()); final Iterator<Point> locs = locationGenerator.generate(rng.nextLong(), times.size() * 2).iterator(); for (final double time : times) { final long arrivalTime = DoubleMath.roundToLong(time, RoundingMode.FLOOR); final Point origin = locs.next(); final Point destination = locs.next(); checkEndTime(time, endTime); final Parcel.Builder parcelBuilder = Parcel .builder(origin, destination) .orderAnnounceTime(arrivalTime) .pickupDuration(pickupDurationGenerator.get(rng.nextLong())) .deliveryDuration(deliveryDurationGenerator.get(rng.nextLong())) .neededCapacity(neededCapacityGenerator.get(rng.nextLong())); timeWindowGenerator.generate(rng.nextLong(), parcelBuilder, travelModel, endTime); eventList.add(AddParcelEvent.create(parcelBuilder.buildDTO())); } return eventList.build(); }
/** * 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); }
/** * Tests whether the default values are correctly applied. */ @Test public void defaultsTest() { final IParcel defaults = Parcel.builder(new Point(0, 0), new Point(2, 2)).buildDTO(); assertEquals(new Point(0, 0), defaults.getPickupLocation()); assertEquals(new Point(2, 2), defaults.getDeliveryLocation()); assertEquals(0, defaults.getOrderAnnounceTime()); assertEquals(0, defaults.getNeededCapacity(), 0.00001); assertEquals(TimeWindow.always(), defaults.getPickupTimeWindow()); assertEquals(TimeWindow.always(), defaults.getDeliveryTimeWindow()); assertEquals(0, defaults.getPickupDuration()); assertEquals(0, defaults.getDeliveryDuration()); }
@Override public void tick(TimeLapse time) { if (time.getStartTime() > endTime) { simulator.stop(); } else if (rng.nextDouble() < NEW_CUSTOMER_PROB) { simulator.register(new Customer( Parcel .builder(roadModel.getRandomPosition(rng), roadModel.getRandomPosition(rng)) .serviceDuration(SERVICE_DURATION) .neededCapacity(1 + rng.nextInt(MAX_CAPACITY)) .buildDTO())); } }
@Override public void tick(TimeLapse time) { if (time.getStartTime() > endTime) { simulator.stop(); } else if (rng.nextDouble() < NEW_CUSTOMER_PROB) { simulator.register(new Customer( Parcel .builder(roadModel.getRandomPosition(rng), roadModel.getRandomPosition(rng)) .serviceDuration(SERVICE_DURATION) .neededCapacity(1 + rng.nextInt(MAX_CAPACITY)) .buildDTO())); } }
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()); }
Box(Point o, Point d, long duration, BoxHandle bh) { super( Parcel.builder(o, d) .serviceDuration(duration) .neededCapacity(1d) .buildDTO()); boxHandle = bh; }
static Parcel parcel(final String name) { return new Parcel(Parcel.builder(new Point(0, 0), new Point(0, 0)) .buildDTO()) { @Override public String toString() { return name; } }; }
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()); }
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()); }
Box(Point o, Point d, long duration, BoxHandle bh) { super( Parcel.builder(o, d) .serviceDuration(duration) .neededCapacity(1d) .buildDTO()); boxHandle = bh; }
/** * @return A new parcel object. */ public Parcel build() { return new Parcel(buildDTO(), toString); }