Problem with vehicles with LatestArrival set

Hi.

this is my code fo generating vehicles:

VehicleType type = VehicleTypeImpl.Builder.newInstance(“type”)
.addCapacityDimension(0, 150)
.setCostPerDistance(1)
.setCostPerTransportTime(2)
.build();

VehicleImpl vehicle = VehicleImpl.Builder.newInstance(“vehicle-666”)
.setStartLocation(depot[0])
.setLatestArrival(360.0d)
.setType(type)
.build();
VehicleImpl vehicle1 = VehicleImpl.Builder.newInstance(“vehicle1”)
.setStartLocation(depot[0])
.setLatestArrival(360.0d)
.setType(type)
.build();
VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance(“vehicle2”)
.setStartLocation(depot[0])
.setLatestArrival(300.0d)
.setType(type)
.build();
VehicleImpl vehicle3 = VehicleImpl.Builder.newInstance(“vehicle3”)
.setStartLocation(depot[0])
.setLatestArrival(430.0d)
.setType(type)
.build();

as you can see nothing special :slight_smile:
but it does not work :frowning:
BUT when I delete part that sets Latest Arrival it works smoothly.

In my code, I use minutes as a time factor, so here I try to set working time around 6 hours - 360.0d minutes - 60 * 6.

Plus I set all my services to have TimeWindow like this:

.setTimeWindow(TimeWindow.newInstance(0.0d, 360.0d))

Can anyone help me? What is correct way of setting LatestArrival ?

What exactly does not work? How do you interpret latest arrival? Note that latest arrival time of a vehicle is the time the vehicle needs to be back in the depot at latest. If the vehicle is still on the road or at a customer location, it does not work. Is this also your interpretation?

Yes - that’s exactly what I want to achieve.

When I ommit setLatestArrival() then everything is jus fine.
But when I set it on 360.0d, plus I use 5 vehicles (code above), on debugger, I see that I have two solutions, both with 71 unassigned stops :confused:

When I don;t set it - I get 7 routes, but every route uses the same vehicle - first one from the list that has no latest arrival set.

If you have a finite fleet, you need to set vrpBuilder.setFleetSize(FleetSize.FINITE). Does this solve your problem?

nope - same result.
want to se my full code? will it help you?

Just to clarify, you set fleetsize to finite and every route uses exactly the same vehicle? For example, you have vehicle A,B,C and you have 3 routes. All 3 routes use vehicle A?

here based on qty value from DB I decide if the stop is Piskup or Delivery

List<Service> serviceList = stopList.stream()
                 if (s.getQty() > 0) {
                       return Pickup.Builder.newInstance(s.getInvoiceId())
                                .addSizeDimension(0, s.getQty())
                                .setLocation(Location.Builder.newInstance()
                                        .setId(s.getInvoiceId())
                                        .setCoordinate(Coordinate.newInstance(s.getLatitude(), s.getLongitude()))
                                        .build())
                                .setTimeWindow(TimeWindow.newInstance(0.0d, 360.0d))
                                .build();
                    } else {
                        return Delivery.Builder.newInstance(s.getInvoiceId())
                                .addSizeDimension(0, Math.abs(s.getQty()))
                                .setLocation(Location.Builder.newInstance()
                                        .setId(s.getInvoiceId())
                                        .setCoordinate(Coordinate.newInstance(s.getLatitude(), s.getLongitude()))
                                        .build())
                                .setServiceTime(s.getTime())
                                .setTimeWindow(TimeWindow.newInstance(0.0d, 360.0d))
                                .build();
                    }
                })
                .collect(Collectors.toList());

here I build vehicles to use on route planning:

        VehicleType type = VehicleTypeImpl.Builder.newInstance("type")
                .addCapacityDimension(0, 150)
                .setCostPerDistance(1)
                .setCostPerTransportTime(2)
                .build();

        VehicleImpl vehicle = VehicleImpl.Builder.newInstance("vehicle-666")
                .setStartLocation(depot[0])
                .setType(type)
                .build();

        VehicleImpl vehicle1 = VehicleImpl.Builder.newInstance("vehicle1")
                .setStartLocation(depot[0])
                .setType(type)
                .build();

        VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("vehicle2")
                .setStartLocation(depot[0])
                .setType(type)
                .build();

        VehicleImpl vehicle3 = VehicleImpl.Builder.newInstance("vehicle3")
                .setStartLocation(depot[0])
                .setType(type)
                .build();

        VehicleImpl vehicle4 = VehicleImpl.Builder.newInstance("vehicle4")
                .setStartLocation(depot[0])
                .setType(type)
                .build();

based on DB data I make cost matrix here:

matrix.stream().forEach(m -> {
    costMatrixBuilder.addTransportTimeAndDistance(m.getIdFrom(), m.getIdTo(), m.getDistance(), m.getTime());
});

and finally creating problem here:

        VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance()
                .setFleetSize(VehicleRoutingProblem.FleetSize.FINITE)
                .setRoutingCost(costMatrix)
                .addAllVehicles(vehicleList)
                .addAllJobs(serviceList)
                .build();

        VehicleRoutingAlgorithm vra = new GreedySchrimpfFactory().createAlgorithm(vrp);

        VehicleRoutingProblemSolution bestSolution = Solutions.bestOf(vra.searchSolutions());

the solution in this case is 7 routes, correctly planned as far as I was able to check them on map, but they all use the same vehicle - first one from list.

If I add to first vehicle line like this:

.setLatestArrival(430.0d)

resulting routes are using next vehicle.
If I set this parameter to each vehicle there is no results - from debugger I know that there are two solutions with cost = 0.0 and 71 unassigned stops.

This should not be is - probably - a bug. Would you mind to replace the algorithm by

vra = Jsprit.createAlgorithm(vrp)

?

will check - one moment

nope man - still same result.

as you can see below - two solutions, with only unassigned vehicles on each

What time unit do you use for your transport time values?

I just double checked - almost every value is lower than 120 minutes.
values are to second decimal place
there are 0.0 values - for two stops at same location (two stores next to each other)

obviously, you use your own matrix. are u sure distance and time is in correct sequence? The name .addTransportTimeAndDistance suggests (m.getIdFrom(),m.getIdTo(),m.getTime(),m.getDistance()) ?

yep - triple checked that.
The name is misleading - will change that on code clearing, but this is not an issue.

I raised number of iterations - we’ll see if it helps

Could you omit time windows, print out the solution with SolutionPrinter.print(…Print.VERBOSE) and post it here?

will do! gimme just time, I increased number of iteration to 10kk… :slight_smile:

you want me to ommi time windows on pickups and deliveries, or on vehicles ommit latest arrival?

sorry … I meant latestArr of vehicles

here it is - and frankly, now it works :confused:
nothing changed, except of changing fleet type to FINITE.

meanwhile I checked if it might work with not time windows on pickups and deliveires, but with latest arrivals - no result :confused:

so there must be some kind of bug with that

±-------------------------------------------------------------------------------------------------------------------------------+
18:12:32,618 INFO [stdout] (default task-15) | detailed solution |
18:12:32,618 INFO [stdout] (default task-15) ±--------±---------------------±----------------------±----------------±----------------±----------------±----------------+
18:12:32,618 INFO [stdout] (default task-15) | route | vehicle | activity | job | arrTime | endTime | costs |
18:12:32,618 INFO [stdout] (default task-15) ±--------±---------------------±----------------------±----------------±----------------±----------------±----------------+
18:12:32,618 INFO [stdout] (default task-15) | 1 | vehicle2 | start | - | undef | 0 | 0 |
18:12:32,618 INFO [stdout] (default task-15) | 1 | vehicle2 | pickup | 16701666 | 44 | 44 | 155 |
18:12:32,618 INFO [stdout] (default task-15) | 1 | vehicle2 | pickup | 16701669 | 66 | 66 | 219 |
18:12:32,618 INFO [stdout] (default task-15) | 1 | vehicle2 | pickup | 16701670 | 86 | 86 | 269 |
18:12:32,618 INFO [stdout] (default task-15) | 1 | vehicle2 | pickup | 16701671 | 102 | 102 | 308 |
18:12:32,618 INFO [stdout] (default task-15) | 1 | vehicle2 | pickup | 16701672 | 113 | 113 | 335 |
18:12:32,618 INFO [stdout] (default task-15) | 1 | vehicle2 | pickup | 16701674 | 179 | 179 | 576 |
18:12:32,618 INFO [stdout] (default task-15) | 1 | vehicle2 | delivery | 16701675 | 243 | 245 | 810 |
18:12:32,618 INFO [stdout] (default task-15) | 1 | vehicle2 | end | - | 5727 | undef | 17255 |
18:12:32,618 INFO [stdout] (default task-15) ±--------±---------------------±----------------------±----------------±----------------±----------------±----------------+
18:12:32,618 INFO [stdout] (default task-15) | 2 | vehicle3 | start | - | undef | 0 | 0 |
18:12:32,618 INFO [stdout] (default task-15) | 2 | vehicle3 | pickup | 16701897 | 68 | 68 | 238 |
18:12:32,618 INFO [stdout] (default task-15) | 2 | vehicle3 | pickup | 16701903 | 129 | 129 | 440 |
18:12:32,618 INFO [stdout] (default task-15) | 2 | vehicle3 | pickup | 16701906 | 148 | 148 | 492 |
18:12:32,618 INFO [stdout] (default task-15) | 2 | vehicle3 | pickup | 16701907 | 197 | 197 | 643 |
18:12:32,618 INFO [stdout] (default task-15) | 2 | vehicle3 | pickup | 16701910 | 249 | 249 | 812 |
18:12:32,618 INFO [stdout] (default task-15) | 2 | vehicle3 | end | - | 5731 | undef | 17257 |
18:12:32,618 INFO [stdout] (default task-15) ±--------±---------------------±----------------------±----------------±----------------±----------------±----------------+
18:12:32,618 INFO [stdout] (default task-15) | 3 | vehicle4 | start | - | undef | 0 | 0 |
18:12:32,618 INFO [stdout] (default task-15) | 3 | vehicle4 | pickup | 16701575 | 47 | 47 | 156 |
18:12:32,618 INFO [stdout] (default task-15) | 3 | vehicle4 | pickup | 16701577 | 65 | 65 | 213 |
18:12:32,618 INFO [stdout] (default task-15) | 3 | vehicle4 | pickup | 16701579 | 79 | 79 | 250 |
18:12:32,618 INFO [stdout] (default task-15) | 3 | vehicle4 | pickup | 16701696 | 104 | 104 | 332 |
18:12:32,618 INFO [stdout] (default task-15) | 3 | vehicle4 | pickup | 16703123 | 131 | 131 | 409 |
18:12:32,618 INFO [stdout] (default task-15) | 3 | vehicle4 | pickup | 16703124 | 147 | 147 | 450 |
18:12:32,618 INFO [stdout] (default task-15) | 3 | vehicle4 | pickup | 16703125 | 201 | 201 | 631 |
18:12:32,618 INFO [stdout] (default task-15) | 3 | vehicle4 | delivery | 16703132 | 236 | 240 | 749 |
18:12:32,619 INFO [stdout] (default task-15) | 3 | vehicle4 | pickup | 16703133 | 248 | 248 | 767 |
18:12:32,619 INFO [stdout] (default task-15) | 3 | vehicle4 | pickup | 16703207 | 296 | 296 | 908 |
18:12:32,619 INFO [stdout] (default task-15) | 3 | vehicle4 | pickup | 16703211 | 331 | 331 | 1016 |
18:12:32,619 INFO [stdout] (default task-15) | 3 | vehicle4 | end | - | 5813 | undef | 17461 |
18:12:32,619 INFO [stdout] (default task-15) ±--------±---------------------±----------------------±----------------±----------------±----------------±----------------+
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | start | - | undef | 0 | 0 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16701991 | 30 | 30 | 92 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16701995 | 42 | 42 | 123 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16702003 | 62 | 62 | 180 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16702233 | 91 | 91 | 273 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16702236 | 121 | 121 | 367 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16702241 | 126 | 126 | 378 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16702244 | 129 | 129 | 385 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16702247 | 158 | 158 | 471 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16702254 | 167 | 167 | 494 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16702264 | 173 | 173 | 510 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16702268 | 183 | 183 | 542 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16702510 | 218 | 218 | 657 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16702512 | 240 | 240 | 725 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16702515 | 252 | 252 | 758 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | delivery | 16703190 | 284 | 292 | 860 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16703192 | 295 | 295 | 865 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | pickup | 16703196 | 316 | 316 | 918 |
18:12:32,619 INFO [stdout] (default task-15) | 4 | vehicle1 | end | - | 5798 | undef | 17363 |
18:12:32,619 INFO [stdout] (default task-15) ±--------±---------------------±----------------------±----------------±----------------±----------------±----------------+
18:12:32,619 INFO [stdout] (default task-15) | 5 | vehicle9 | start | - | undef | 0 | 0 |
18:12:32,619 INFO [stdout] (default task-15) | 5 | vehicle9 | pickup | 16702117 | 26 | 26 | 83 |
18:12:32,619 INFO [stdout] (default task-15) | 5 | vehicle9 | pickup | 16702128 | 41 | 41 | 119 |
18:12:32,619 INFO [stdout] (default task-15) | 5 | vehicle9 | pickup | 16702131 | 54 | 54 | 149 |
18:12:32,620 INFO [stdout] (default task-15) | 5 | vehicle9 | pickup | 16702133 | 71 | 71 | 199 |
18:12:32,620 INFO [stdout] (default task-15) | 5 | vehicle9 | pickup | 16702135 | 86 | 86 | 240 |
18:12:32,620 INFO [stdout] (default task-15) | 5 | vehicle9 | pickup | 16702430 | 103 | 103 | 294 |
18:12:32,620 INFO [stdout] (default task-15) | 5 | vehicle9 | delivery | 16702432 | 131 | 133 | 386 |
18:12:32,620 INFO [stdout] (default task-15) | 5 | vehicle9 | pickup | 16702434 | 145 | 145 | 416 |
18:12:32,620 INFO [stdout] (default task-15) | 5 | vehicle9 | pickup | 16702436 | 160 | 160 | 463 |
18:12:32,620 INFO [stdout] (default task-15) | 5 | vehicle9 | delivery | 16702437 | 167 | 171 | 482 |
18:12:32,620 INFO [stdout] (default task-15) | 5 | vehicle9 | pickup | 16702438 | 187 | 187 | 528 |
18:12:32,620 INFO [stdout] (default task-15) | 5 | vehicle9 | pickup | 16703216 | 310 | 310 | 964 |
18:12:32,620 INFO [stdout] (default task-15) | 5 | vehicle9 | end | - | 5792 | undef | 17409 |
18:12:32,620 INFO [stdout] (default task-15) ±--------±---------------------±----------------------±----------------±----------------±----------------±----------------+
18:12:32,620 INFO [stdout] (default task-15) | 6 | vehicle-666 | start | - | undef | 0 | 0 |
18:12:32,620 INFO [stdout] (default task-15) | 6 | vehicle-666 | pickup | 16701530 | 79 | 79 | 281 |
18:12:32,620 INFO [stdout] (default task-15) | 6 | vehicle-666 | pickup | 16701531 | 120 | 120 | 419 |
18:12:32,620 INFO [stdout] (default task-15) | 6 | vehicle-666 | pickup | 16701532 | 146 | 146 | 506 |
18:12:32,620 INFO [stdout] (default task-15) | 6 | vehicle-666 | pickup | 16701535 | 172 | 172 | 592 |
18:12:32,620 INFO [stdout] (default task-15) | 6 | vehicle-666 | pickup | 16701536 | 199 | 199 | 690 |
18:12:32,620 INFO [stdout] (default task-15) | 6 | vehicle-666 | pickup | 16701537 | 285 | 285 | 972 |
18:12:32,620 INFO [stdout] (default task-15) | 6 | vehicle-666 | pickup | 16701538 | 303 | 303 | 1021 |
18:12:32,620 INFO [stdout] (default task-15) | 6 | vehicle-666 | end | - | 5785 | undef | 17466 |
18:12:32,620 INFO [stdout] (default task-15) ±--------±---------------------±----------------------±----------------±----------------±----------------±----------------+
18:12:32,620 INFO [stdout] (default task-15) | 7 | vehicle8 | start | - | undef | 0 | 0 |
18:12:32,620 INFO [stdout] (default task-15) | 7 | vehicle8 | pickup | 16701568 | 54 | 54 | 181 |
18:12:32,620 INFO [stdout] (default task-15) | 7 | vehicle8 | pickup | 16701570 | 90 | 90 | 301 |
18:12:32,620 INFO [stdout] (default task-15) | 7 | vehicle8 | pickup | 16701571 | 104 | 104 | 339 |
18:12:32,620 INFO [stdout] (default task-15) | 7 | vehicle8 | pickup | 16701680 | 148 | 148 | 479 |
18:12:32,620 INFO [stdout] (default task-15) | 7 | vehicle8 | pickup | 16701682 | 160 | 160 | 512 |
18:12:32,620 INFO [stdout] (default task-15) | 7 | vehicle8 | delivery | 16701683 | 164 | 168 | 524 |
18:12:32,620 INFO [stdout] (default task-15) | 7 | vehicle8 | pickup | 16701684 | 183 | 183 | 570 |
18:12:32,620 INFO [stdout] (default task-15) | 7 | vehicle8 | pickup | 16701685 | 202 | 202 | 628 |
18:12:32,620 INFO [stdout] (default task-15) | 7 | vehicle8 | pickup | 16701690 | 230 | 230 | 727 |
18:12:32,620 INFO [stdout] (default task-15) | 7 | vehicle8 | pickup | 16701691 | 256 | 256 | 810 |
18:12:32,620 INFO [stdout] (default task-15) | 7 | vehicle8 | pickup | 16701693 | 268 | 268 | 846 |
18:12:32,620 INFO [stdout] (default task-15) | 7 | vehicle8 | pickup | 16701695 | 293 | 293 | 921 |
18:12:32,620 INFO [stdout] (default task-15) | 7 | vehicle8 | end | - | 5775 | undef | 17366 |
18:12:32,621 INFO [stdout] (default task-15) ±-------------------------------------------------------------------------------------------------------------------------------+

This is what I ask you to do in the first place ;). Why do you think that “there must be some kind of bug”?