@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(200) .pickupTimeWindow(TimeWindow.create(200, 2000)) .buildDTO()), AddParcelEvent.create(Parcel.builder(new Point(1, 4), new Point(3, 4)) .orderAnnounceTime(1000) .pickupTimeWindow(TimeWindow.create(1000, 80000)) .serviceDuration(180000L)
AddParcelEvent.create( Parcel.builder(new Point(0, 0), new Point(3, 3)) .orderAnnounceTime(300) .pickupTimeWindow(TimeWindow.create(1000, 2000)) .buildDTO()), AddParcelEvent.create( Parcel.builder(new Point(0, 0), new Point(3, 3)) .orderAnnounceTime(1000) .pickupTimeWindow(TimeWindow.create(60000, 80000)) .serviceDuration(180000L)
.deliveryTimeWindow(TimeWindow.create(5000, 10000)) .neededCapacity(0) .orderAnnounceTime(2400) .pickupDuration(200) .deliveryDuration(800)
.deliveryTimeWindow(TimeWindow.create(10, 20)) .neededCapacity(0) .orderAnnounceTime(0) .serviceDuration(5) .buildDTO();
new Point(rng.nextDouble() * 10, rng.nextDouble() * 10), new Point(rng.nextDouble() * 10, rng.nextDouble() * 10)) .orderAnnounceTime(announceTime) .pickupTimeWindow(TimeWindow.create(announceTime, endTime)) .deliveryTimeWindow(TimeWindow.create(announceTime, endTime))
.deliveryTimeWindow(TimeWindow.create(50, 75)) .neededCapacity(0) .orderAnnounceTime(0L) .pickupDuration(5L) .deliveryDuration(5L)
.deliveryTimeWindow(TimeWindow.create(15, 15)) .neededCapacity(0) .orderAnnounceTime(0) .serviceDuration(5) .buildDTO();
.deliveryTimeWindow(DEFAULT_TW) .neededCapacity(0) .orderAnnounceTime(0L) .pickupDuration(2L) .deliveryDuration(0L)
@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(); }
/** * 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 Iterable<Parcel.Builder> parcelBuilders() { final Iterator<Point> locations = Iterators.cycle(asList( new Point(3, 3), new Point(8, 1), new Point(2, 0), new Point(0, 0), new Point(1, 1), new Point(7, 6))); final Iterator<Long> serviceDurations = Iterators.cycle(asList( 0L, 0L, 1L, 2L, 5L, 10L, 10L)); final Iterator<Long> arrivalTimes = Iterators.cycle(asList(0L, 50L, 85L)); final List<Parcel.Builder> builders = newArrayList(); for (int i = 0; i < 50; i++) { builders.add( Parcel.builder(locations.next(), locations.next()) .orderAnnounceTime(arrivalTimes.next()) .pickupDuration(serviceDurations.next()) .deliveryDuration(serviceDurations.next())); } return builders; }
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 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 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(); } }