Last-mile delivery¶
An appliance delivery company based in Tilburg delivers washing machines, dryers, and other household appliances across North Brabant. When delivering a new appliance, the driver often picks up the customer's old one as well.
This example shows how to model a real-world delivery scenario that combines several FastVRP features:
- Load with deliveries and pickups: new appliances are delivered and old ones are picked up in the same visit.
- Time windows: customers select a morning, afternoon, or all-day delivery window.
- Vehicle restrictions: some deliveries require a two-person crew for carrying appliances upstairs.
- Cost optimisation: a two-person crew cost twice as much per hour, so the solver minimises their use.
Scenario¶
The company operates from a single depot in Tilburg and serves 20 customers across eight cities.
Load is measured in number of appliances. Most deliveries are a single appliance, and about half of the customers also have an old appliance to pick up. Three deliveries require a two-person crew to carry appliances upstairs in buildings without lifts. Each vehicle has a capacity of 10 appliances, so the solver must plan routes that never exceed this limit at any point along the way.
Time windows depend on the customer's preference:
| Window | Hours |
|---|---|
| All day | 08:00 - 17:00 |
| Morning | 08:00 - 12:00 |
| Afternoon | 13:00 - 17:00 |
Service duration of a standard delivery is 15 minutes. If the customer also has an old appliance to return, the service takes 30 minutes.
Vehicle types reflect crew size:
| Type | Crew | Fixed cost | Per hour | Per km | Capacity |
|---|---|---|---|---|---|
one-person-crew |
1 person | 175 | 25 | 0.25 | 10 |
two-person-crew |
2 persons | 175 | 50 | 0.25 | 10 |
The three crew-restricted tasks can only be served by two-person-crew using the allowed_vehicle_types restriction.
All other tasks can be served by either vehicle type, so the solver prefers the cheaper one-person crew vehicles when possible.
Both vehicle types work a 9-hour shift from 08:00 to 17:00.
An unlimited number of vehicles is available.
The complete routing request looks as follows:
{
"locations": [
{"id": "loc-depot-Tilburg", "latitude": 51.6023, "longitude": 5.0045},
{"id": "loc-Breda-1", "latitude": 51.5875, "longitude": 4.7895},
{"id": "loc-Breda-2", "latitude": 51.5987, "longitude": 4.7578},
{"id": "loc-Breda-3", "latitude": 51.6037, "longitude": 4.8000},
{"id": "loc-Breda-4", "latitude": 51.6126, "longitude": 4.7864},
{"id": "loc-Oosterhout-1", "latitude": 51.6338, "longitude": 4.8652},
{"id": "loc-Oosterhout-2", "latitude": 51.5852, "longitude": 4.9223},
{"id": "loc-Etten-Leur", "latitude": 51.5851, "longitude": 4.6560},
{"id": "loc-Zevenbergen", "latitude": 51.6411, "longitude": 4.5994},
{"id": "loc-Roosendaal", "latitude": 51.5452, "longitude": 4.4850},
{"id": "loc-Tilburg-1", "latitude": 51.5825, "longitude": 5.0929},
{"id": "loc-Tilburg-2", "latitude": 51.5455, "longitude": 5.0765},
{"id": "loc-Tilburg-3", "latitude": 51.5517, "longitude": 5.0543},
{"id": "loc-Tilburg-4", "latitude": 51.5745, "longitude": 5.0585},
{"id": "loc-Eindhoven-1", "latitude": 51.4716, "longitude": 5.4468},
{"id": "loc-Eindhoven-2", "latitude": 51.4464, "longitude": 5.4084},
{"id": "loc-Eindhoven-3", "latitude": 51.4321, "longitude": 5.3869},
{"id": "loc-Eindhoven-4", "latitude": 51.4751, "longitude": 5.4654},
{"id": "loc-Eindhoven-5", "latitude": 51.4449, "longitude": 5.5121},
{"id": "loc-Eindhoven-6", "latitude": 51.4746, "longitude": 5.4987},
{"id": "loc-Oisterwijk", "latitude": 51.5737, "longitude": 5.1901}
],
"tasks": [
{
"id": "task-Breda-1",
"location": "loc-Breda-1",
"delivery": [1],
"service_duration": "PT900S",
"time_windows": [
{"start": "2025-01-01T13:00:00", "end": "2025-01-01T17:00:00"}
]
},
{
"id": "task-Breda-2",
"location": "loc-Breda-2",
"delivery": [1],
"pickup": [1],
"service_duration": "PT1800S",
"time_windows": [
{"start": "2025-01-01T08:00:00", "end": "2025-01-01T17:00:00"}
],
"allowed_vehicle_types": ["two-person-crew"]
},
{
"id": "task-Breda-3",
"location": "loc-Breda-3",
"delivery": [1],
"pickup": [1],
"service_duration": "PT1800S",
"time_windows": [
{"start": "2025-01-01T08:00:00", "end": "2025-01-01T12:00:00"}
]
},
{
"id": "task-Breda-4",
"location": "loc-Breda-4",
"delivery": [1],
"service_duration": "PT900S",
"time_windows": [
{"start": "2025-01-01T13:00:00", "end": "2025-01-01T17:00:00"}
]
},
{
"id": "task-Oosterhout-1",
"location": "loc-Oosterhout-1",
"delivery": [1],
"pickup": [1],
"service_duration": "PT1800S",
"time_windows": [
{"start": "2025-01-01T08:00:00", "end": "2025-01-01T12:00:00"}
]
},
{
"id": "task-Oosterhout-2",
"location": "loc-Oosterhout-2",
"delivery": [1],
"service_duration": "PT900S",
"time_windows": [
{"start": "2025-01-01T08:00:00", "end": "2025-01-01T17:00:00"}
]
},
{
"id": "task-Etten-Leur",
"location": "loc-Etten-Leur",
"delivery": [1],
"pickup": [1],
"service_duration": "PT1800S",
"time_windows": [
{"start": "2025-01-01T08:00:00", "end": "2025-01-01T12:00:00"}
]
},
{
"id": "task-Zevenbergen",
"location": "loc-Zevenbergen",
"delivery": [1],
"service_duration": "PT900S",
"time_windows": [
{"start": "2025-01-01T08:00:00", "end": "2025-01-01T17:00:00"}
]
},
{
"id": "task-Roosendaal",
"location": "loc-Roosendaal",
"delivery": [1],
"pickup": [1],
"service_duration": "PT1800S",
"time_windows": [
{"start": "2025-01-01T08:00:00", "end": "2025-01-01T17:00:00"}
]
},
{
"id": "task-Tilburg-1",
"location": "loc-Tilburg-1",
"delivery": [1],
"service_duration": "PT900S",
"time_windows": [
{"start": "2025-01-01T13:00:00", "end": "2025-01-01T17:00:00"}
]
},
{
"id": "task-Tilburg-2",
"location": "loc-Tilburg-2",
"delivery": [1],
"pickup": [1],
"service_duration": "PT1800S",
"time_windows": [
{"start": "2025-01-01T13:00:00", "end": "2025-01-01T17:00:00"}
]
},
{
"id": "task-Tilburg-3",
"location": "loc-Tilburg-3",
"delivery": [1],
"service_duration": "PT900S",
"time_windows": [
{"start": "2025-01-01T13:00:00", "end": "2025-01-01T17:00:00"}
]
},
{
"id": "task-Tilburg-4",
"location": "loc-Tilburg-4",
"delivery": [1],
"pickup": [1],
"service_duration": "PT1800S",
"time_windows": [
{"start": "2025-01-01T08:00:00", "end": "2025-01-01T17:00:00"}
]
},
{
"id": "task-Eindhoven-1",
"location": "loc-Eindhoven-1",
"delivery": [1],
"pickup": [1],
"service_duration": "PT1800S",
"time_windows": [
{"start": "2025-01-01T08:00:00", "end": "2025-01-01T17:00:00"}
],
"allowed_vehicle_types": ["two-person-crew"]
},
{
"id": "task-Eindhoven-2",
"location": "loc-Eindhoven-2",
"delivery": [1],
"pickup": [1],
"service_duration": "PT1800S",
"time_windows": [
{"start": "2025-01-01T08:00:00", "end": "2025-01-01T17:00:00"}
],
"allowed_vehicle_types": ["two-person-crew"]
},
{
"id": "task-Eindhoven-3",
"location": "loc-Eindhoven-3",
"delivery": [1],
"service_duration": "PT900S",
"time_windows": [
{"start": "2025-01-01T08:00:00", "end": "2025-01-01T17:00:00"}
]
},
{
"id": "task-Eindhoven-4",
"location": "loc-Eindhoven-4",
"delivery": [1],
"pickup": [1],
"service_duration": "PT1800S",
"time_windows": [
{"start": "2025-01-01T08:00:00", "end": "2025-01-01T12:00:00"}
]
},
{
"id": "task-Eindhoven-5",
"location": "loc-Eindhoven-5",
"delivery": [1],
"service_duration": "PT900S",
"time_windows": [
{"start": "2025-01-01T08:00:00", "end": "2025-01-01T17:00:00"}
]
},
{
"id": "task-Eindhoven-6",
"location": "loc-Eindhoven-6",
"delivery": [1],
"pickup": [1],
"service_duration": "PT1800S",
"time_windows": [
{"start": "2025-01-01T08:00:00", "end": "2025-01-01T17:00:00"}
]
},
{
"id": "task-Oisterwijk",
"location": "loc-Oisterwijk",
"delivery": [1],
"service_duration": "PT900S",
"time_windows": [
{"start": "2025-01-01T13:00:00", "end": "2025-01-01T17:00:00"}
]
}
],
"depots": [
{
"id": "depot-Tilburg",
"location": "loc-depot-Tilburg",
"time_window": {
"start": "2025-01-01T07:30:00",
"end": "2025-01-01T17:30:00"
}
}
],
"vehicle_types": [
{
"id": "one-person-crew",
"start_depot": "depot-Tilburg",
"end_depot": "depot-Tilburg",
"num_available": 10,
"capacity": [10],
"shift": {
"earliest_start": "2025-01-01T08:00:00",
"latest_end": "2025-01-01T17:00:00",
"duration": "PT32400S"
},
"costs": {
"fixed": "175.00",
"per_hour": "25.00",
"per_km": "0.25"
}
},
{
"id": "two-person-crew",
"start_depot": "depot-Tilburg",
"end_depot": "depot-Tilburg",
"num_available": 10,
"capacity": [10],
"shift": {
"earliest_start": "2025-01-01T08:00:00",
"latest_end": "2025-01-01T17:00:00",
"duration": "PT32400S"
},
"costs": {
"fixed": "175.00",
"per_hour": "50.00",
"per_km": "0.25"
}
}
],
"options": {
"stop": {
"type": "max_runtime",
"seconds": 5
}
}
}
Solution¶
{
"summary": {
"total_cost": "923.57",
"distance_cost": "72.66",
"duration_cost": "500.91",
"fixed_vehicle_cost": "350.00",
"distance": 290662,
"duration": "PT48160S",
"travel_duration": "PT20260S",
"service_duration": "PT27900S",
"wait_duration": "P0D",
"num_planned": 20,
"num_unplanned": 0,
"num_routes": 2,
"load_duration": "P0D",
"overtime": "P0D"
},
"routes": [
{
"summary": {
"total_cost": "376.41",
"distance_cost": "33.42",
"duration_cost": "167.99",
"fixed_vehicle_cost": "175.00",
"distance": 133688,
"duration": "PT24190S",
"travel_duration": "PT9790S",
"service_duration": "PT14400S",
"wait_duration": "P0D",
"start_time": "2025-01-01T08:58:51",
"end_time": "2025-01-01T15:42:01",
"num_tasks": 10,
"num_activities": 12,
"slack_duration": "PT4335S",
"load_duration": "P0D",
"overtime": "P0D"
},
"vehicle_type_id": "one-person-crew",
"profile": "car",
"activities": [
{
"id": "depot-Tilburg",
"location": {
"id": "loc-depot-Tilburg",
"latitude": 51.6023,
"longitude": 5.0045
},
"type": "depot",
"start_time": "2025-01-01T08:58:51",
"end_time": "2025-01-01T08:58:51",
"duration": "P0D",
"wait_duration": "P0D",
"travel_duration": "P0D",
"distance": 0
},
{
"id": "task-Oosterhout-1",
"location": {
"id": "loc-Oosterhout-1",
"latitude": 51.6338,
"longitude": 4.8652
},
"type": "task",
"start_time": "2025-01-01T09:17:10",
"end_time": "2025-01-01T09:47:10",
"duration": "PT1800S",
"wait_duration": "P0D",
"travel_duration": "PT1099S",
"distance": 13893
},
{
"id": "task-Breda-3",
"location": {
"id": "loc-Breda-3",
"latitude": 51.6037,
"longitude": 4.8
},
"type": "task",
"start_time": "2025-01-01T10:00:13",
"end_time": "2025-01-01T10:30:13",
"duration": "PT1800S",
"wait_duration": "P0D",
"travel_duration": "PT783S",
"distance": 10343
},
{
"id": "task-Etten-Leur",
"location": {
"id": "loc-Etten-Leur",
"latitude": 51.5851,
"longitude": 4.656
},
"type": "task",
"start_time": "2025-01-01T10:47:45",
"end_time": "2025-01-01T11:17:45",
"duration": "PT1800S",
"wait_duration": "P0D",
"travel_duration": "PT1052S",
"distance": 11545
},
{
"id": "task-Roosendaal",
"location": {
"id": "loc-Roosendaal",
"latitude": 51.5452,
"longitude": 4.485
},
"type": "task",
"start_time": "2025-01-01T11:33:45",
"end_time": "2025-01-01T12:03:45",
"duration": "PT1800S",
"wait_duration": "P0D",
"travel_duration": "PT960S",
"distance": 16089
},
{
"id": "task-Zevenbergen",
"location": {
"id": "loc-Zevenbergen",
"latitude": 51.6411,
"longitude": 4.5994
},
"type": "task",
"start_time": "2025-01-01T12:22:11",
"end_time": "2025-01-01T12:37:11",
"duration": "PT900S",
"wait_duration": "P0D",
"travel_duration": "PT1106S",
"distance": 18694
},
{
"id": "task-Breda-4",
"location": {
"id": "loc-Breda-4",
"latitude": 51.6126,
"longitude": 4.7864
},
"type": "task",
"start_time": "2025-01-01T13:00:00",
"end_time": "2025-01-01T13:15:00",
"duration": "PT900S",
"wait_duration": "P0D",
"travel_duration": "PT1369S",
"distance": 19836
},
{
"id": "task-Breda-1",
"location": {
"id": "loc-Breda-1",
"latitude": 51.5875,
"longitude": 4.7895
},
"type": "task",
"start_time": "2025-01-01T13:23:44",
"end_time": "2025-01-01T13:38:44",
"duration": "PT900S",
"wait_duration": "P0D",
"travel_duration": "PT524S",
"distance": 4143
},
{
"id": "task-Tilburg-2",
"location": {
"id": "loc-Tilburg-2",
"latitude": 51.5455,
"longitude": 5.0765
},
"type": "task",
"start_time": "2025-01-01T14:05:26",
"end_time": "2025-01-01T14:35:26",
"duration": "PT1800S",
"wait_duration": "P0D",
"travel_duration": "PT1602S",
"distance": 26844
},
{
"id": "task-Tilburg-3",
"location": {
"id": "loc-Tilburg-3",
"latitude": 51.5517,
"longitude": 5.0543
},
"type": "task",
"start_time": "2025-01-01T14:40:16",
"end_time": "2025-01-01T14:55:16",
"duration": "PT900S",
"wait_duration": "P0D",
"travel_duration": "PT290S",
"distance": 2941
},
{
"id": "task-Tilburg-4",
"location": {
"id": "loc-Tilburg-4",
"latitude": 51.5745,
"longitude": 5.0585
},
"type": "task",
"start_time": "2025-01-01T15:01:54",
"end_time": "2025-01-01T15:31:54",
"duration": "PT1800S",
"wait_duration": "P0D",
"travel_duration": "PT398S",
"distance": 3179
},
{
"id": "depot-Tilburg",
"location": {
"id": "loc-depot-Tilburg",
"latitude": 51.6023,
"longitude": 5.0045
},
"type": "depot",
"start_time": "2025-01-01T15:42:01",
"end_time": "2025-01-01T15:42:01",
"duration": "P0D",
"wait_duration": "P0D",
"travel_duration": "PT607S",
"distance": 6181
}
],
"polyline": "gt}yHyhp]fGfMT`@VXd@^Rg@P^PV`@\\W~@YzAOz@Kl@Kr@Kv@KdAIlAGhAChACjA?r@g@@qTRcGFWGU?M?_B@w@@I?WAWPMn_@CvL?`EBxDBzCHvBHhAJpAVtBBRLz@cB~@_Aj@i@`@MJWXUZWd@Wh@KXKZSl@KVOx@IVCFE?GDCBCDEFAHADAF?H?H@F@H@FBFDD@@BFBFL`BLvCF~@@^B`B@lA?xAEf@Ej@EZIl@EVY|Ak@lCi@hC_C~LaB|I[~Aa@~AyC`Km@nCqBjJGXo@zDYfEKrC?`A?d@CrDg@bLQpCKpCObBKz@e@vB]bBMv@Ip@Eh@Ev@AVATA|@@|@HfBVpBaAl@QLIJIRGTCNEZG~Ea@zUOpJ?tB?fA@bACd@mBrF}B|EQ\\u@jAwBjDy@xA_@h@_@\\w@`@m@d@UZ{AxDKR}@[aA]wCgAa@OWKeA_@iAa@gAYWIgC}@oBs@_Cy@g@[WQa@SCd@KxAC^CXGZARQbCCh@QvCMxCI`BUFyBl@sCp@gDz@oBl@YFUDW?OKEE?MCKEIGCEAGBGDCJCL@NBJ?NEv@KbBE^Ep@El@MbACd@Cd@?DC|@IlAAZGjAEf@?f@Et@MhDKz@AJGBINAR@JBJFF?L@z@KpEKvDUfHIdAOjGErD?PGFCDAFCJ?H@LDLBF@RBtAN|I@n@D~B@dABxD?L@F?V?FAFAFIHGNAP?F@JBNDFBBDBDHBL@N?N@f@@`@Af@Cd@At@Kr@Ml@Sp@Qj@wAdEcDrJMPyAhECHOb@Qf@{@nCM\\m@pBE\\a@lAsA~DqJjYOVcArCELK\\Qf@k@dBQh@CR_@fAq@|ASd@uApCmA`CyCpF}@zAsBhDiDjGcE~Hc@r@]Z[`@y@|@_AfAKJSRMNNPNZ\\LZ`@f@f@V\\V`@Tf@Pd@Pr@Jb@Fb@ZvCBXRdBBVDTFr@r@rFH`@FVJ`@Z~@~AhE\\~@Xx@HXJ`@Jr@D`@Bh@@\\@j@AZGv@SnCU|D]hFKnAq@dLIlA_@nFCZQnBG~@CfAB~BHzBJjBB\\Aj@Ed@Ef@g@tCg@zBY`A_@nAOl@I`@MXSn@CHITI?GFCDADAF?F?H@HBFDDDBD@DADERFBDPJh@Vf@LX?`AJ|@JF@r@LVDVBbBNlBTPBD@JBH@T@J?V@XA`BGl@CRARENGVKPMl@a@NKJGRO`BeAbEoC`@UZSNIPGn@G^AB?RB@FBF@BAX?HEn@Cl@?\\]dEEf@Gj@O`BCZCXa@hEOdBE`@Gj@C\\WGMAM?K?K@[@oDNQ@?_@IwCAWVAB?nFU\\AL?H@TH`@iEBYB[NaBFk@Dg@\\eEFWFk@Ds@@GDYDADEBEBINAB?nAChBj@nBn@xBr@d@PPD~GdCRVx@b@B@HB\\NXLB[Do@Hu@J}@Ls@Jk@\\oAVgAJ]Bc@PFFBTRVV|KzKh@j@|AdAfDnD|@|@jAhA|AzAbA`Axu@rt@nGpGtCdDfDfEpBrCvCpEtCzEvAdCrLzVnGhNfChFzDzHfB~CzCzEt@hAfCnD|CbEtI~K`BrBpExF~@nBv@jApEdHP\\p@tAd@nAj@fBBJLXFJJJDFJHLHPLMfCInC[rGALC`@A\\Cb@QdEUbFGh@G^GVMXKNOLOFWDm@Em@My@GeAAw@B}@DgARaBh@]N_@P]Ri@^UNSPe@^QRSRUX]`@Y`@SXS\\e@v@Wh@Wl@[t@_@dA]jAYhAUfAIb@Kj@Id@Gf@Ih@Gh@K|@IhAIhAMrC_@hHOnCOnCOlCMpCKnCKlCS|DMlCMhCe@vIk@bKQpDK|BANEp@C\\Et@u@tOg@tKI~BEjCAlC@|ABfBDrBHfCFpATzC@RBb@UDE@c@Ly@VgBRiBD@[@{@B_B@{@Bq@?MBg@?GHeBDeALa@RUDEDS@[?UDyBBwAB}A@W@{@@U?EBaA?OEKOMDq@Fu@H{BDu@@a@HaBN}DBe@CIOIm@Kw@MQEDy@Da@B]BMmBo@Gj@x@Xr@TE`@Ex@PDv@Ll@JNHBHCd@O|DI`BA`@Et@IzBGt@Ep@NLDJ?NC`A?DATAz@AVC|ACvAExB?TAZEREDSTM`@EdAIdB?FCf@?LCp@Az@C~AAz@AZA`@bA@j@?`@Ch@IrBo@DAFATGBh@pAlRFbADz@?D@F@V@V@LPvDNnCFnCDxA@~AA|BEpDOzBWjDUpCAJ?@El@C\\Gn@AL?DUdDQrDEvAGlBChAAhA?vG@|BCbBA\\I`F?L?FAp@AR?PAp@?HCt@CdCCnAAfACrDAjD?nABlA@h@Bf@@h@Bf@Db@Bb@HfARnC`@|Fh@jIBp@Fz@NzBf@vG@FDn@Df@NpBh@dHLrAHzAHzAH~AFbC@^B`AF|B@r@FlBF`EJpC@`@@J@XJjBBXpBYPC~@WVITG`@I`@CV?V@ZD\\D`@Pb@VLR@BLJNPNPJLDFbLrQnAhBnA~AhDnEhAxAjErFh@j@j@d@\\PPFNFNFPD^H`@Bp@AHARCDd@BJz@pDRl@Vl@l@pCPx@BJDJ@FBH@FBFv@xBRh@Nh@H^H^H`@n@vDDVBRDTRbAX`Af@tAf@zAH\\VbARbAHXDTVlA@NHXNb@ABARBTBNBFBF?FANE^Gb@WnASlAUbAERCRIj@Eb@Ed@Er@Cr@At@?r@@l@@j@Bd@LpALnANfA~CbXZdCB\\^pDBpC?~ANxEBrAEv@KfA}@dIMhAShBg@xDMhAaAbJIh@Ot@[z@kCxFSf@Uh@Mb@Of@ETGTGb@G\\CNARAV?RBZ?`@?^Dn@Dh@BVDXrAjJvFda@nA~IbArOJ~BDh@RbC~Bj]h@rIBz@Cl@w@~IG~@GzAG~BCz@?bA?t@@|@G?O@I@EBEBEDCDEFCLIz@APEf@_@fEMrAOjBCNOdBEd@Ih@Kj@[xAGb@CLCNAJCJAJAJCXCXKnAMpAWvCWtCE^C\\AVAV?VAVAv@?P?PB|AFzDHhF@xA@^?dC?b@?P?hA?RC?C@A@CBADADAD?B?F@D@D@DBB@@D@@?@??N@p@@v@?f@@L?P?N@PD~@XnFZ~GVtF@VL|BFdAFhBJnCHvB`Bo@z@]p@fCf@jB`AnD@F@F@F?FBb@F~B@V@PJpA?B?@@D@F@DDNFTNQrAaBLMPOXQJItB{AhBqAh@]hBqAbAs@BAB?F?F@HOLKDK@E@GD@B?@?DAFCJMx@i@`@QFEFCDCr@g@VQBAf@[vH_EdEgCl@_@tD}BtF_DTKbAi@nDiBNIrBcAbAe@x@a@XCVK@ABANIDXBR@FHb@Dn@Dn@@VNjDD`BDjADnAZfH@PBd@^GzAYTEvB_@HALEx@Yj@Yf@[xAuAd@m@b@k@Xe@f@aAh@t@p@j@`@Vl@Xb@LlANt@Hn@Ln@Pz@\\`Al@~CvBxAl@rIlGbBrAnAfArAnA|BfCfAtAbAvAxAzBlAxBfBlDrAdDx@tB`ArCn@vBr@lCn@lCx@bEd@rCd@|C|CtU~CbW`CnSdB~Ob@jFVlDRlDX|GNvGFtF@fGChECfCEtBIxCIfCIlBQbDQpCQhCUjC_@zDe@`Ec@fDg@dDa@|Ba@~Bc@xBc@zBk@bCm@dCm@~Bo@xBo@rBa@lAa@nAa@fA_@dAcAhCyBfFoCjG{BrF{@nCc@|Ae@lBg@vB[lBa@dC]bCUzBM`BK`BK~AI|BEjBE`B?bC@`CF|DR`EJfBLhBVhCd@dE`BbN~Frf@|Dp\\~H~p@lPhuAfCbTlHxm@|Df\\vBxQdLj`AxA|LrCzURzCJhC?h@Cb@Mt@c@pAe@jAo@vA[`AKr@Ct@?vA?^?HEBCDCFAFAH?F?HBLBDDFDB@F@^Dp@HXFRJX`@d@h@RtDf@\\DVJNXR|@l@jEn@hF~AnMDXLjANpBC~@Ux@c@~Ag@xFe@rEMhB]bG?LCXYlFCp@MrF?R?@AP?NEr@]rJOvEOdEEtAMxBCd@Cf@I~As@`NKdBAHAd@MbAIx@I^KXFPHT@LEfACf@AROxCO|C]nGEdA?F@F@B@DEJCDAFQEcANWDSFi@HC@E@G@G@G?C?oJoAiDW[FIe@FwADsBBw@lAyN?MCMMe@KFQF]?gEo@W@WDe@\\SLSBg@GGAWEWOQYQ]MQ]Um@MePmCW@[B[?YAAk@?[?mA_@BKFITIJq@d@c@l@i@fA{@|CaApDgA|Dq@lCk@rBi@tBkApE}B|IM^g@|@Uz@M|@Gz@Eb@EJIDM?IBCLGh@C\\f@LVHEf@MrBMvAOrAUtAKf@Of@Sn@O^OZi@|@e@l@UX[VUPYPq@\\q@ZcClA_Bx@IDa@PMHk@Xo@ZKDeJnEeA\\kB`AQHc@V]gBQe@Q[QQSKSG_@CkBJ{@?s@IYI[Ke@Yo@c@s@w@gAsAs@o@uDiGsBgDoEoHyCsEqEaHsK_PaIgL}AsBoB}BaBkBwDwDw@u@kD}CgCoB}@s@mBsAiBmAaBaAoAu@m@]aCkAuBaAgDwAsCiAyI}CqG}BcN}EeEyAio@eU{JkDmC_AsG_CwDsA[MSGcDkAy@YmAc@uWkJiBu@s@_@gCuAmCmBaCqB{B{BQQgBwBoBmCuBaDsAkC{@aB_CsFuEsLaAeCc@gAiN_^_JkU{`@{cAmRmf@{D}J_AcCu@kBkG_PwFsN{C{HqAaDeAeCgBuDiA}BgAoBa@w@mB_DeNeT}IkNmDqFwBeDyDcGgIiMw@mBYs@Ug@Y{@YkA[wAUyAo@}EIi@Mi@Me@M]M[OWYa@UYYU_@S[[EAOEEEGGAIEGAM?OBuAFy@R}FDoB?_DF_BJsBb@_JNcENeHByD@{FCsDEqBA{BImDAKAo@ZEDA\\S`@EfHcAnBGlBH|@LxAZfCx@D@TF?J@JDFDDH@HGDK?QCQII@MDuA?]Au@Am@Au@?EA_@EaCAa@ASCoBCaA?IAe@^AF@N@`@@n@BfBDPCTINSHMJ]DOBYBY?m@@cA@_A@]@m@@_A?cA@w@@u@?y@@u@@]?Q@u@?o@?I@y@@a@?Q@a@?M@gA?}@@o@Ae@A[?MIcAGc@Ge@AMG_@c@{BAIKe@f@]pA_AlAu@t@i@\\UZSRQ\\o@FO^_A\\w@BEVi@Li@BaA@]BOHIFE^ADAD?F?@`@@HBJHZV`@RJXZJLFPBJBVRBJDFHHJX\\ZXBBfDrC`EjDzCdCjAdAlCdChA`A`@`@VVWWa@a@iAaAmCeCkAeA{CeCiJ_ICC[YY]IKGIKESCCWCKGQKMY[IMISGQI[AKAKAY@]?K@UFc@B[XiANm@Jg@LaAFg@H{@BUD@DADEBCBK?EAMAGCGECBS@GJgALsAJgAHu@J{@ZyCDWLcADe@Jy@Fy@RiAp@qCFU@I?MCMIMa@]GGUUWUIIc@Mu@S[MAAKCAACCAAAEKHOJC@CBC@STGBKBI?gBG}AEU?aDEcAEU?WAE?k@A]M]MyAc@OEYGBy@@U@gAAsDGaRAi@?M?K?IA_EAcA?cEAcA?cAAaAAcEA_AAqBE}HCeJD_A@s@HEFIFMBO@QAMAKCMGKGIICAs@Go@BiUAoG?kH?a@EmFMyEMcFaAyVoAs^mAy]OiEYuJm@uPMeECiBAcC?mMAyAKgDMkDEmAAKMgBQiBUoBIq@Mw@e@uCu@qDM_@{CyPuJih@iEsUq@cEYmBS}AUuBKaBS_DOcBQyAM}@]qBwBgMk@wCQy@[sAW_AqCsIq@}BYmA]}AQcA[gBIaAE[Ii@AMGi@FIDM@O@QAOCMEIGKGGKAI@Ma@c@kBSm@_A_FcAuF_AmFeAmGoDmToGm^}CqPyKkk@cDuPuEcVoI{c@aB{Ig@iDy@aHUaDSyCSsDOaEqAen@Y{MWmN?m@As@?e@?EHEHKBGBO@O?SAET_@T_@BOfA_Bv@aAd@c@\\Wr@]z@OzLaC@?|HuAhEm@hCYlNkAbCWlEu@ZGv@IhAWlBg@`@M|@SlA]zAe@b@MfBg@`A_@~@a@l@Yv@g@zBeAxAw@xA}@rBuAl@[r@e@pBgBDERULOzAwAb@a@`BgBlAwAX]|JuJNOvDoDf@e@p@k@`Au@t@g@x@g@|A{@`Ac@fAa@~@[bAYbAUn@M|@ObAKpAIdAEtA?p@?j@B`@@lCL|ALdAL|ATdBTh@HdGv@v@V`B^xARxBRb@BN?b@Db@Bb@@`@@b@?X?ZA\\ATCRETETEpA]TEVGTIzJwCpCy@b@AvAUXEvAQ`@E\\CfAKfB_@v@Qv@a@|GwBrEsAz@CZGp@QVM`AUHCn@O`@GrBe@f@Oj@a@|Ag@zAc@nAc@j@U^Mv@Yh@UZQp@StAe@hA]rBm@z@YJCXIJE\\KLEt@UzAc@bBe@tH}Bj@S`@ExCw@NEREb@O?U?U?e@?g@JaCJ_BRiBZsBhAgFJy@FU@GFWB?DABA@CBE@C@E@C?G?E?GAEAEFU@IZgAPy@Ls@Ju@Fm@J{@F_AFeA\\gKUCIAaAOy@I_@EyC]q@KeAMSCWCk@Gc@IBw@B{@DkABi@F}BWEyC_@MICGEIDeAD_ARqGx@Jx@LfCVzAPpBVv@Hz@J@JHJTD\\Bt@JH@VBN@LBN@VD?I@QHkC@YR{F@_@JoCBOBMBGFMHKr@]h@WPIBC|@e@JEDFFBF@FC??JL`B~B`@j@TLXHxBVD@N@@FBFDBD@F?FEDINDB?zGx@`D\\V@bA@j@?`@Ch@IrBo@DAFATG\\ITGFAjDcAHAHCzAc@tAa@vBo@BA@?FAPE^KDAbCs@PERENCTEPCRCPARCN?PAd@@@?B?V?LANBF?jBRnALbBRv@JTDLDLDHDHBNLNLRRLP@@BB@@JRLVBF@@vBvHDJJb@DKBIBIBGBG@?JOHMJOJKTURQ`@Sb@O\\Id@Ed@A\\@b@BbB`@D@D@JDNDLBB@DBhCfAdAh@LFz@h@|CnBDYVyANwAh@}FF}@B{@@aA?M?KAqAA{@?CAeBKmFEsC@s@pA^PFnA`@B@BBBBBDBJ@N@PBd@B`ABbA?v@@v@?l@Al@Az@Cl@Cl@O`C[nECf@A^?HAL?VAN@hAAiA@O?W@W@_@Bg@ZoENaCBm@Bm@@{@@m@?m@Aw@?w@CcACaACe@AQAOCKCECCCCCAoAa@QGqA_@Ar@DrCJlF@dB?B@z@@pA?J?LA`ACz@G|@i@|FOvAWxAEXnBvAb@f@p@h@h@b@FDDDRNPPBUFk@@Kv@oIFq@LcBFeBFsBFmDLqHDwABk@D}ADw@Bu@F{@TkE@S?CBo@Dw@Bg@Ds@Do@F}@H{@Fg@Fe@V{ANu@Ps@Nk@Ng@`@mAVq@Pa@\\s@`@s@`@q@l@y@DEPQNONSZWVS~BaBrCmBvDeCFERM`@SvCsBZSb@[t@i@l@a@p@_@h@[Ik@Ga@CIGWM_@aBaEu@iB]aA[eAm@mBMk@g@yBi@{C_@qCc@wDk@cGYiDIuASyDQoDKyDGqCImEAmAAgACsA?kAr@A^?XCPEPEPKVQRUNYv@}An@oAl@aA`@g@d@c@l@_@b@Ux@WbBSjEB~CJnDN~DZxE`@~G~@bDh@dDl@tJpB|Dx@vDp@`Db@bD`@hCVlCRrBPtBL|DXlBLfBPhANjAPtCh@rGzApALjAHpAC~AOzA[v@Wd@Sf@Wb@Wj@]t@k@VUj@i@TYd@k@n@y@n@eAn@kA^}@f@oAb@oATy@VcAZwA^mBb@kCvBeMpB{Lh@mDNaALkAHs@HwAF_B@{AAsAC{@IoAIeAMeASuASaA_@wAW}@c@gAi@kA_A_BgDsFs@iA{@{Ac@{@{@yBa@sA[wA[eBk@iEc@mDi@mC}BcU}AePgBiSy@cKu@uJc@gGu@aKi@sIe@mH]wF_A{P}@oPa@kJWiGKaDKmEEaCEwCCiFCuFB_FFoFJeGPyGNmERgENyCh@sHl@}HjBiS|@yJbAiKzBeUdCkVnBoQzAqNlAuMz@sKn@oJb@aHVoEPuDRgEZiIZeJ^}PT_TDqKX}T`@gQl@eU^}KFkBLcEl@mQr@}QNgDx@_St@cPvAeYVyDZqEXwC`@wD`@_Dn@}Dv@aEv@oD`A{DhAwD~A{E~A{DhDwHRa@zIuRbPa^nCaHrAyDfAqDbB_HhAwFdA}Gd@uD\\uD\\eFDm@VgGHkCF}C@cE?aHIuHOeKc@oWk@yZIkFoB_{@}Aqn@SeLA}BEoBCqJ?yLHeNHuFJoFN_GNaFn@}OZsBD_@Hc@Le@L]R[NQRMXIRAPBNDPHPNNTLVJXDTBXB`@Ab@]rECV_FsAyBk@m@O}C{@]IqA_@MEw@a@u@c@o@g@o@m@q@s@_@i@]g@MUU]S_@Wo@Yq@Mu@]sAG]G_@E_@E]Cg@Ag@?g@?e@@_@@_@LuDDyAFuBBqA?u@@kAAmAMqC@yKAe@EeK?gA?WCkA?a@Ay@AWCwFAU?a@?k@[?SBQFeB_@A]iBc@?wA@qB@eB@W@m@?yB?m@@gC?a@?M@wA?K@iA?]@o@@s@?u@@_C@s@@yA@aA@oB@cA@gBBiB@kA@iB@{@qDQ@aAxAAvA?QsDGyAPALF@@PBz@FX@H@|@VJFHBIvEAjD?jF@`F?lD?^BbH?tB?z@?bA@xB@lHAv@@lH?Z?\\?\\?h@@dCFbE?n@FnB@fABpB?rG?j@@pPAlAEfAEr@Iv@Ox@On@Wv@Qb@W`@QROJ[VYLSFSBUBU@S?OCi@Qe@YWWQUU_@OYO]Uk@c@oAc@uAq@oBSm@GMOa@Qa@S[Yk@k@q@UYGIK`@GTCFMZq@rBMXeAhBaBjCOXaA~AaA~BGNs@vBe@i@gDaBKXEJq@hByAqBgArC}@~B_A~BGNENEFQR{@lA{@tAGJa@p@o@|@CFi@z@INYp@MPUv@Kf@APa@dCMVcAuCIQKKMKQKs@[]OME]KoAOWCIAOCOAMCQAO@mBO_AKe@G_AKMAiBSy@KiAMYEi@EIA[Mk@KSC{@OE?QESCQCqEa@WE[C{JkAe@GuBUsGw@MAUCQCSAs@IOCQDGC[GiCm@QE_EcAWG[Iu@OOO]OGEGKAICGEGECGAE@EDEFO?}ASYGw@OeB]}@Q}Bc@_@Ie@KQIIC@c@DiAAe@Dw@FwAPqCF_@@Q@SA]LuBYEiBc@HoA@WDk@kAUYGUEIAINCl@?BInAy@Oy@ME~@WpEC^Ez@cB]UEWEEr@k@~Js@zMEr@Et@Et@YzEMzAU|BE`@AX?XK?G@GFUPORQ\\INI\\qAdBeBzAy@h@wIbGiBnAm@b@_@Tm@l@WZS\\g@~@oAjCMTq@pAUT]l@EHMRGLOTCB}@~Aa@v@Wh@Ud@I^oCxES\\YXUVSZeBxCCH[p@Yp@a@x@Q\\ILq@hAU^o@n@c@n@i@r@a@r@eBvCOVMVU\\MRaAbB?@Yh@Wj@_@hAa@x@{AlCU^aDtFkDrFa@j@sAxBS\\KRQ\\mBhDo@xAcJzOyAnBgB|CS^MPQ\\u@pAs@pAYf@Sn@iExHeIdNsCvEOL_@j@{@zAi@dAKRU\\MXGGICK?IDGFEHCHAJARBR@HDHBFFDDBF@FAFATVT^HDLXDHLThErINVpAnCtBlEVd@zFlLt@vAb@x@Q\\aQhZUh@g@|AYfAa@]QWQ_@Sf@e@_@WYUa@gGgM"
},
{
"summary": {
"total_cost": "547.16",
"distance_cost": "39.24",
"duration_cost": "332.92",
"fixed_vehicle_cost": "175.00",
"distance": 156974,
"duration": "PT23970S",
"travel_duration": "PT10470S",
"service_duration": "PT13500S",
"wait_duration": "P0D",
"start_time": "2025-01-01T08:00:00",
"end_time": "2025-01-01T14:39:30",
"num_tasks": 10,
"num_activities": 12,
"slack_duration": "PT4907S",
"load_duration": "P0D",
"overtime": "P0D"
},
"vehicle_type_id": "two-person-crew",
"profile": "car",
"activities": [
{
"id": "depot-Tilburg",
"location": {
"id": "loc-depot-Tilburg",
"latitude": 51.6023,
"longitude": 5.0045
},
"type": "depot",
"start_time": "2025-01-01T08:00:00",
"end_time": "2025-01-01T08:00:00",
"duration": "P0D",
"wait_duration": "P0D",
"travel_duration": "P0D",
"distance": 0
},
{
"id": "task-Oosterhout-2",
"location": {
"id": "loc-Oosterhout-2",
"latitude": 51.5852,
"longitude": 4.9223
},
"type": "task",
"start_time": "2025-01-01T08:12:11",
"end_time": "2025-01-01T08:27:11",
"duration": "PT900S",
"wait_duration": "P0D",
"travel_duration": "PT731S",
"distance": 10966
},
{
"id": "task-Breda-2",
"location": {
"id": "loc-Breda-2",
"latitude": 51.5987,
"longitude": 4.7578
},
"type": "task",
"start_time": "2025-01-01T08:44:10",
"end_time": "2025-01-01T09:14:10",
"duration": "PT1800S",
"wait_duration": "P0D",
"travel_duration": "PT1019S",
"distance": 13650
},
{
"id": "task-Eindhoven-1",
"location": {
"id": "loc-Eindhoven-1",
"latitude": 51.4716,
"longitude": 5.4468
},
"type": "task",
"start_time": "2025-01-01T10:04:48",
"end_time": "2025-01-01T10:34:48",
"duration": "PT1800S",
"wait_duration": "P0D",
"travel_duration": "PT3038S",
"distance": 60371
},
{
"id": "task-Eindhoven-4",
"location": {
"id": "loc-Eindhoven-4",
"latitude": 51.4751,
"longitude": 5.4654
},
"type": "task",
"start_time": "2025-01-01T10:38:13",
"end_time": "2025-01-01T11:08:13",
"duration": "PT1800S",
"wait_duration": "P0D",
"travel_duration": "PT205S",
"distance": 1885
},
{
"id": "task-Eindhoven-6",
"location": {
"id": "loc-Eindhoven-6",
"latitude": 51.4746,
"longitude": 5.4987
},
"type": "task",
"start_time": "2025-01-01T11:12:37",
"end_time": "2025-01-01T11:42:37",
"duration": "PT1800S",
"wait_duration": "P0D",
"travel_duration": "PT264S",
"distance": 2498
},
{
"id": "task-Eindhoven-5",
"location": {
"id": "loc-Eindhoven-5",
"latitude": 51.4449,
"longitude": 5.5121
},
"type": "task",
"start_time": "2025-01-01T11:52:09",
"end_time": "2025-01-01T12:07:09",
"duration": "PT900S",
"wait_duration": "P0D",
"travel_duration": "PT572S",
"distance": 6474
},
{
"id": "task-Eindhoven-3",
"location": {
"id": "loc-Eindhoven-3",
"latitude": 51.4321,
"longitude": 5.3869
},
"type": "task",
"start_time": "2025-01-01T12:23:29",
"end_time": "2025-01-01T12:38:29",
"duration": "PT900S",
"wait_duration": "P0D",
"travel_duration": "PT980S",
"distance": 11116
},
{
"id": "task-Eindhoven-2",
"location": {
"id": "loc-Eindhoven-2",
"latitude": 51.4464,
"longitude": 5.4084
},
"type": "task",
"start_time": "2025-01-01T12:45:13",
"end_time": "2025-01-01T13:15:13",
"duration": "PT1800S",
"wait_duration": "P0D",
"travel_duration": "PT404S",
"distance": 3565
},
{
"id": "task-Oisterwijk",
"location": {
"id": "loc-Oisterwijk",
"latitude": 51.5737,
"longitude": 5.1901
},
"type": "task",
"start_time": "2025-01-01T13:42:00",
"end_time": "2025-01-01T13:57:00",
"duration": "PT900S",
"wait_duration": "P0D",
"travel_duration": "PT1607S",
"distance": 26890
},
{
"id": "task-Tilburg-1",
"location": {
"id": "loc-Tilburg-1",
"latitude": 51.5825,
"longitude": 5.0929
},
"type": "task",
"start_time": "2025-01-01T14:12:13",
"end_time": "2025-01-01T14:27:13",
"duration": "PT900S",
"wait_duration": "P0D",
"travel_duration": "PT913S",
"distance": 10615
},
{
"id": "depot-Tilburg",
"location": {
"id": "loc-depot-Tilburg",
"latitude": 51.6023,
"longitude": 5.0045
},
"type": "depot",
"start_time": "2025-01-01T14:39:30",
"end_time": "2025-01-01T14:39:30",
"duration": "P0D",
"wait_duration": "P0D",
"travel_duration": "PT737S",
"distance": 8944
}
],
"polyline": "gt}yHyhp]fGfMT`@VXd@^Rg@P^PV`@\\W~@YzAOz@Kl@Kr@Kv@KdAIlAGhAChACjA?r@g@@qTRcGFWGU?M?_B@w@@I?WAWPMn_@CvL?`EBxDBzCHvBHhAJpAVtBBRLz@F\\VhAh@|Bv@hCfAhCj@hAj@`AvCjExCvDhCnCdDvCnEhE|C|CpAhAj@`@j@`@`BbAx@^x@^dA^fAZrAZp@J|@Lz@Fl@Bn@@`B?`AEdAGxGm@x@Gv@C`AEd@Al@AlAAb@?jE?vDJdGd@pEj@rUhDlFt@RDXD\\D|`@zFl@J~HjAXFzEp@NDrGz@hDh@`Dt@t@TjBl@pCfAJDZJ[zCYnCWfCQpCCx@Gl@Gh@C\\CRIp@KbAWbCWbC[`DcDpZI^CJEZCXAJ?`@oAtLKZCXEX@\\[vC{@vHIx@m@rFEXIXE`@ABIj@C@CBCBADAF?D?F@D@D@DBBB@B@B?B?BA@CBC@EDBd@HPCJ@P?P?VCJ?F?NNNLR\\DDNZ[j@{@xAcBpC[l@iAnBUd@Qb@Sh@Of@IXKf@Kb@G`@G^Gd@MjA_@pDmA`LgBnP]dDE\\o@tFI~@CXYbCQdBS`CQjBGt@Ix@YfCSnBK~@YtCK~@Gh@ShBQ~AS|As@fFIh@Ih@e@pEK~@Y?MDKJWH]RQFWHMFQFqB|@E@[LYHKByA^}DbAIB}@T_@Jo@P{Bj@eEdAy@REAG?IBG@E@MDSFWHc@N]Pa@VQHOJGDC@WPMHwCpCMJ@DHb@Fb@Dh@@f@B\\IBHCC]Ag@Ei@Gc@Ki@LKvCqCLIVQBAFENKPI`@W\\Qb@OVIRGLEDAFAHCF?D@x@SdEeAzBk@n@Q^K|@UHC|DcAxA_@JCXIZMDApB}@PGLGVIPG\\SVIJ@H?VHKbAEXm@|FM|AI|@IhAMdBAh@O~Ai@~E}Ipz@c@lCk@nFCLGt@EVIv@u@lHGx@Cx@_ApIcAnJcArJ_C|TuDr]Kf@CPALCn@]hDUrBk@rFg@vEOt@Gf@Ap@eH|p@OnAI^CTETAt@aEx_@UxBqA~LYlCkBlQa@tDI\\Ip@@ZKbAYpCkAvKc@nE]|CAPMf@CPEVQhA_@hCAHKz@M|@YpB{@`GEb@E^Eb@Ad@?h@@dA@p@@T@jAAfAEzAK|BG~@_@fHItAa@lH_@vGI~@KpACb@Ex@C`AI|Ag@hJMtAAPCb@[dGKxBEl@SjDAPA\\AVoA`U]jG?JEl@Ep@KzASnCKzAM|A[xDc@rFCXQvCI`BGdAMfCInC[rGALC`@A\\Cb@QdEUbFGh@G^GVMXKNOLOFWDm@Em@My@GeAAw@B}@DgARaBh@]N_@P]Ri@^UNSPe@^QRSRUX]`@Y`@SXS\\e@v@Wh@Wl@[t@_@dA]jAYhAUfAIb@Kj@Id@Gf@Ih@Gh@K|@IhAIhAMrC_@hHOnCOnCOlCMpCKnCKlCS|DMlCMhCe@vIk@bKQpDK|BANEp@C\\Et@u@tOg@tKI~BEjCAlC@|ABfBDrBHfCFpATzC@RBb@D`@Bh@pAlRFbADz@?D@F@V@V@LPvDNnCFnCDxA@~AA|BEpDOzBWjDUpCAJ?@El@C\\Gn@AL?DUdDQrDEvAGlBChAAhA?vG@|BCbBA\\I`F?L?FAp@AR?PAp@?HCt@CdCCnAAfACrDAjD?nABlA@h@Bf@@h@Bf@Db@Bb@HfARnC`@|Fh@jIBp@Fz@NzBf@vG@FDn@X?VGVITQlBo@Dp@NEJE^KZKXIXIZKHz@??[J[HYH[J]JI{@KDODEq@mBn@WAIBMBWFEc@OsBgB}Uc@}FQuBMsBGmAEmAAiA?iAD}E@u@BeA@uBJuG?K?I@s@?S@Q@o@?I@}@@sABcBAgE@kDDwB@aABuABoADoABu@Bs@Bs@Bu@B_@Ba@FcAHcA@SBK?IFm@BYFk@@OTgCV}CLgCDcC@aB?oCGuCGwBQyDOsC?E?ECWAWAMMwBMiBaA{NAMCi@Ea@Cg@WuDGqAIkBE}AC}AAaB?_CDaEPmEr@sNf@{I@OBa@@_@Du@NqC`Bu[FsAL_DD{@Be@NuEDoBB_ABo@RcET_ELoCn@iMFw@Fs@N_BPqARoATmAVkA\\sARu@Ja@L]`@cATi@Vg@^s@b@u@l@w@TYX[XY\\[TQTQh@]^U^S\\MzAc@jCUlACpAJdAP`Bl@ZNPHDo@Ba@l@sLNwC@UDy@Bi@p@uOBc@VFPDXH~@VpAj@~@l@pDhClBhAlB~@bAf@pBl@nCpAbAd@lE~AxBp@lEdAjBXpDp@dFd@nCLvBLvL?jEB~CJnDN~DZxE`@~G~@bDh@dDl@tJpB|Dx@vDp@`Db@bD`@hCVlCRrBPtBL|DXlBLfBPhANjAPtCh@rGzApALjAHpAC~AOzA[v@Wd@Sf@Wb@Wj@]t@k@VUj@i@TYd@k@n@y@n@eAn@kA^}@f@oAb@oATy@VcAZwA^mBb@kCvBeMpB{Lh@mDNaALkAHs@HwAF_B@{AAsAC{@IoAIeAMeASuASaA_@wAW}@c@gAi@kA_A_BgDsFs@iA{@{Ac@{@{@yBa@sA[wA[eBk@iEc@mDi@mC}BcU}AePgBiSy@cKu@uJc@gGu@aKi@sIe@mH]wF_A{P}@oPa@kJWiGKaDKmEEaCEwCCiFCuFB_FFoFJeGPyGNmERgENyCh@sHl@}HjBiS|@yJbAiKzBeUdCkVnBoQzAqNlAuMz@sKn@oJb@aHVoEPuDRgEZiIZeJ^}PT_TDqKX}T`@gQl@eU^}KFkBLcEl@mQr@}QNgDx@_St@cPvAeYVyDZqEXwC`@wD`@_Dn@}Dv@aEv@oD`A{DhAwD~A{E~A{DhDwHRa@zIuRbPa^nCaHrAyDfAqDbB_HhAwFdA}Gd@uD\\uD\\eFDm@VgGHkCF}C@cE?aHIuHOeKc@oWk@yZIkFoB_{@}Aqn@SeLA}BEoBCqJ?yLHeNHuFJoFN_GNaFn@}Ox@wQd@}I`@sJ^wJlB{b@P_ExEgdAdEm_ApAkYb@{JLkEFaE@iC?iCAcCGgDEuAGqBQgDQ}BSmC[gCc@iDg@cDu@cEk@gC}@oEQu@w@kCq@qBm@}AeAaCi@gAyAsCwBkDoB{CiDaFgFuHiBkCcBcCiHgKwDiFgEiGeCqDg@s@_EyFSg@GMIOw@sAkAaCo@{As@kBUo@Qm@a@sA]mAk@{BQ}@Mi@k@aDc@cDSaBQwBMqAMmBKmCIuCAoD?uBDgCFaDRiDVkD\\aDVoBXcBf@mC^iBn@sC|@oD`CcJzBiIzHyYv@sC~@oDnGyUzCaL~ByIxF}SjFaSlI}ZdDcMhDmMf@_CjDeQj@}AdAwDhCuIFUF[@C@K@KBw@J{AJcARaB\\yB`@sC|@wGdEoTv@eEPw@Jg@dSweAxJ{j@zJmk@tVkwA`DaRd@iCf@sCdB_JtVkkAhUcgAjAwFDUbAqEvFkXtUwlAnUolAnAuF|@oDhAwDpAiDpB_FtBeEhD_GxBwDpFeJfEeH~AqCxAwCn@sAv@iBp@eBVq@Z{@~@wCX_Ar@gC`A_El@}Cn@cDf@kDf@yDVaCP_BT}CT_DDkAJ}BJeDFaDFsMn@olBHcVJeWNqZBmPDiIFmGJkFJkDLuDNmCVaG`@eGTaDVqCXcD~@oIz@{GT_BjCeSdBuM|@yGzFgc@jBiNPyA`DeV|B}PdB{MDY\\aC@K^oCXaCD[xA_LZoBb@eCVoAf@uB\\kAj@mBv@oBf@mAb@}@l@eApAqBp@{@|@{@d@e@xAiA`As@fB}@nAg@tAc@lAStCQbACj@CrCG|AGtAO~AOfBYbCe@|A_@p@SzAi@dCy@xBq@xBc@fBQzCUdEc@hC_@lAUpCe@vHeBhGgB~FwBxAONCLCJCLAJ?JAR?P@J@JBTDPFJDJFPJLJPLLJLL\\XNJNHHDLDRDT?NAHAPENIh@[l@e@tA}@d@]DGRUIUWaAu@iCe@oBqAiEAEYaA_@}@_@aAMa@Ma@sB_Ho@oB[{@Wq@q@yAw@}AIMISqByD[w@Wk@]cAY{@wA{FMi@K[I_@WcAcAaEmA_FCGSw@Qo@IU_@gAyA{DUi@Qg@Qm@Sk@Ke@Mk@Me@G_@I_@My@Ky@Is@Gq@e@{HMaCIu@MiAGc@Ga@Ki@Ic@CII]K_@_@kAOc@GQGMg@eAg@_AkA}BkAyBu@{A{C{FKSm@kAWg@_BgDGMYc@S_@y@{AeBmDUg@Sk@]_AQg@KWKYmAyEEKKc@Qu@Kc@_@sAWcA{@wC]kACIKc@Mc@K_@I[g@iBsCeK_@uAg@gBEOK_@NGPKh@WjAu@DCTSTSBCb@[p@g@RQFVFTBJ~@fDnAoAf@dBX~@`@rAHTFAlAkArBqB@MEYK]k@qBEMa@wAu@iCCKGWGUTQbBwANMJQFQBEBY@k@E_@GUm@oCIe@Ka@c@qBE[Aa@BYDYRa@l@e@VQ?WI_@IUKOMU_@[YSm@g@Ye@K]iAyDcEwNCKGUK]m@mBM[O]m@_BQw@EQMa@[aAOc@GOi@uAa@wAg@eB}@cDe@_BEe@Ga@Cc@Eg@Cs@Es@[mH?c@?S?[NEJELIJA~@Or@Mp@Mz@OHrCHlB]FK@s@L_ANo@JIAEGWoFK@OEK@O@?a@?MC]JcRFk@@S?S@U?QCwAHoK@iBHeKHqIHuJDm@@Q?_@?S@_@?GAMCk@@u@F}FB}C@eA@wBHiC@S?_@?S@]HoEA{AJcG@UBc@Be@HwD?A@a@@e@PyG@m@JeEHgC?E?IBS@GBEBC@G@I?I?ICKEI?S@E?KBk@?ODcA@e@Bk@B}@FyA@W@SHkC?I@U@g@@OHcD@WHkC?A@WP@@@NDRBB?l@F|@JB?@]?C?BA\\C?kBSC?SCOEAAQAAV?@IjCAVIbDANAf@AT?HIjCARAVGxAKz@Ej@KhAC^Gv@?BAHARAFCDCFCJ?H?JBFBFAT?FAFKzAQxFAj@ObGAVARCRC`@GrD?BAb@b@FJ@x@CpFGlB?bACdCVr@H`@Dx@HlD^lD^nANvHt@dBLrAJzCRxG`@dMr@pCN`ET|AJfETdERbFX~AHxBNv@HlALPBRD`Bb@`@JfCp@z@RpAZtA\\HIHCF?D?PEFCFCPKLODEJOTk@@C@e@FeD@eB?{AAiAAm@CkBAgC?w@?Q@cC@mBB}D@i@@Q@WBi@Bg@Dg@@_@D_@H{@JiAHm@P_ALs@XsA\\qANi@Ng@Tq@\\_Ap@yAl@cAl@{@b@e@TUxAuAFGJKTSROx@u@zDaDTSt@e@HEPIPEPCH?PATBVBJ@J?H?HCLELILKFIHMDMFQBKBQBMDOJWLUN]T]h@s@LQNMHKvBeB~@w@pAeA|@i@pBiAp@[\\Kr@S~Aa@f@M`AUFCRERGREPk@ODYFQD[HEGCCIEGIs@TkBb@EIWYAOOMgA]_Ac@s@]L}@Be@@SCWBq@o@Ue@QSMMMIIIIEICEEKGKCICIAKo@eEg@eCGYG}@KqAG}@a@iGzBa@HLh@OPENCR}BHk@RWJEBWWGe@Sm@LODw@PUsDRMl@{CDSbDtBLPRNDDVPr@f@RP\\n@Nr@FRJh@fA~E@HdBjHx@`D\\tAJl@Fl@Ft@@t@BzABzA@`@Dd@Jz@D^?b@?L@L?L?JAHCPENGTMf@YFQD[HWFcEjA_@L]L[Ni@V[NULm@^aAl@kA~@_At@mAbAYVkA~@]VURIDKFQDMBK?a@?K?I@G@IDIFYTIHGHMPKRWf@[n@GJKNKLSPe@^_Av@QJsAhAyAhAOJURWTWVqArA}@`Ak@x@k@`A}@nBk@`BSp@Sr@Qn@a@rBOt@O|@K|@K|@I|@G|@Ef@Cj@Af@Cr@OlFE~AC`AATA^G|AIxA@l@MfFEhCCfC?v@AV?z@?DAbAAr@?|@AVAlCEdF?xA?zA@hB?xA?tAAfB?p@?f@?p@BdB@lAB~AB`E@nB@dAAx@C^Ch@Cn@C`@A\\AZ?\\?X?\\@h@Bf@DdAFlAN|B@H@LBZBZDb@?L@J`@fGRpDHjADlABnABrBAnFC`EAVFj@Fd@HVLZLRRXZZZ`@HTR`ABXDVFZFX@JJd@X~@TbAl@bDj@tCLv@DVT~A@F@JD`@H`@DP@H|@pDVhAXrAnCrLpArFzDrP`@dB^|AJb@Lb@HRHRDLHLNVFXBHBDLLPNTNVNTHTHTBV@d@@t@Af@@B?D@\\?BFFFR`@BDJZJd@ZdCNz@^|BnAjGHf@D`@Jn@BN@FDRDXDXBHJh@Lj@VpALf@BN@DTz@FTBFf@nAL`@Tt@v@`CFTL\\J\\fHzTl@jBHTDRV|@HRHXFPJPTr@Xp@d@rAfApDf@xAt@zB^vAFRFTHTHV|@rC^jAPr@^tAb@zAV`AJ\\`@tAd@~ATt@@D@D\\pAFXH`@|@~FZjCD`@Fd@RnAZzAXfATt@BHh@lADFLVNVFLnB|CzDdGRZt@fAFb@@D@T@H[z@]dAy@lBu@fBUh@EJO\\CHkAnCW\\KJOFc@Js@TC@G@C@IFEFCDCFETCRB\\N~BFz@@RDVD^DZNhB@BHjANnBLpB@v@Bv@@X@XBXD\\Lx@F^H^DRFRLb@ZhAh@hBd@|AJ^J^~@xCz@tCvCxJPlA@l@?F@JAR?FGFCHCJAJ?J@JDLHHFD@R?D?J@v@?b@Cb@ANk@pEe@fDq@hF_ApHiAvIm@rEGVOl@Q\\CDKNGEIAIBIHGLCP@PBNBHFFHDH?HENHBF^l@V\\TVNRRTRPdAv@JHHDTLj@^f@d@d@f@b@n@NVNVZl@Tf@L\\LXJRf@hAPVJJJCEXAFHJ@fCGDa@l@a@l@IXAFDdE@f@B~@IGQAA??[AaAEsE@I@CFQj@cALa@NaANaA@GDYIOSW[w@MWKSMYg@gAYk@OYOWq@{@q@s@{@q@IGKGUMUMm@g@USSQa@e@KMMS_@m@CGIQBO?OCOEIEIGEIAIBIHGLCP@PBNINEHa@p@SViApBi@~@UXON_@R[Dg@B_@JMF[TGHKNGJOXK^W|@?\\E^Mp@Ul@QV]ZWRk@^a@F_@Da@Ag@Em@Ki@MYEk@A{ADOBy@Jg@HE@s@Tg@TKF{A`AsAl@_Bb@y@NkBLc@?a@Aa@Ie@SYUMOOUKQ[s@c@uAa@wAk@uC]cCYsCKoAEyAAyGBaADw@D{@NkBJcA@KJ}@Bw@BoADaBLcFB_C@Y?WI?K?IAOGMMgAcCsCmGCGEMoCgGONIEIS_AuBCGCGkAmCMUKUAEjBqCnAkBf@u@j@{@bBkCb@s@j@}@zAaCm@uAe@gAsAwCeA}B}@qB?A{@oBYm@c@_AO_@ESGc@KAOHwAjBsAbBwAhBOR{AlBoA~AyAbBMJQLUTKR{@v@i@Zg@Zc@Vc@b@y@hAs@hAaBzC_AhBWl@Wr@m@jB_@z@{@xAm@bAUr@Sv@M`AG^CXEjA?`@@b@@n@?j@AR?LAHCLCJEHEHGFEFGFIHMFaAJ[@e@BQ@S?Y@WAKAIAGAECGCOIKGOOIKGGEGEIAEEGCIY_A[cAW}@{@qCeCcIqAoESs@IUWaAu@iCe@oBqAiEAEYaA]RqEhE}BtBg@b@m@^{B`BoGxBeCr@}Bn@kH|AwAZmAR}Dd@cET_DBgBCwACyAGs@Cm@@g@Hs@LiAZu@b@oAj@aB|@sAl@{@Ti@Nq@NcDn@cEZyCLcBDeCDaBBq@Fk@Hc@Hi@Pk@RGDk@XiAr@c@b@eAfAo@~@m@dAq@tAa@jA[~@a@~AOp@Ox@e@zDSzA]fCoA~I{B~PEZ[`C_@lCAL]`CEX_AjHeEj[kDzWyLj~@eCfRoCnS{@dHm@~Ek@vFY`EWjEYfHKfEEhDIfPKhWqA~nDKjTEhGK|CQ`EWlDW~CMzAYjC]tCi@`Em@hDm@rC_A~DeAtDgAfDq@lBo@bBgB|Du@zAu@vAQXaGdKcFtIyBxDyDnGuBbEuB`FoAhDkAtDcAtDoAnFeUvlAcJpe@sJbf@_FxUyAdHEViApFoUdgAkVvjAwCtOa@`CcDbRwVdwA{Jjk@uJ|j@eSteAMn@gDfQsDnRaAhDUt@eAdDoAhCGPENCL?DAJ_@EQAwBQUAQ@Q@UDM@E?[JC@GBCACCCAC?C@EBEDCFAF?F?D?DELCHSr@EHg@rAGTOj@S`ACLKZ_@pBKj@QdAUpAEj@Q`AcAlGMn@Mb@O^Wh@IDMRIJCDCBGCE?GBEFCFK?O?mAS_@OYOyA{@UOKGUKu@c@]Mc@Oe@Me@Gg@CSAOBW?cCAaFFoCDw@?MCu@BK@I@G?GACECCCEEAG?E@CBEFCJOBG@o@BSDo@?oEKu@EUCs@EgHi@[E[Cw@Eo@?y@LmC|@oEtA[Hm@J}@PgATm@@o@?_AGi@KoH_D_Ae@{AkAq@i@q@_@u@[w@SKC}Ac@u@Uq@]y@g@k@i@k@k@o@i@yDsD}@sAEIiA{A]a@Y[i@g@}AqAuBaBa@[uD{CkCuBwAkAIIY[KKMIUKQKYUmAaAcAq@YMc@Mc@GcEKaCEeBCY?O?O?K@Q@WBUAOBi@Ns@JK@SBCGEEECCMGQAIKo@Km@GKSoAKu@_@sCk@oE?EWuBKcA[Pm@{Fa@uDa@uDCKGGI?o@XmBz@FTTvATxARxARxAFr@\\dEeE|A{Bz@GBCGCGCCE?E@CBCFAFAD@D?FBDBBBBD?B?F`@T~Aj@|EZpDDl@?@?H@VA@C@ABA@ABAD_@BYDKBC@K?G?E?K@[B]@yBJm@FY@[DULWJQH_@Lo@ZEBOHACCAC?C?A?A@A@CBABADCJkAn@EBMFC@AACAAAC?A?C?CBADCD?D?F?FBDBD@@B@B?BA@A@DFP@Hb@jBl@hCT~@n@~Bl@bCDJDBDBBAR`BJrABVJtBFvC@r@?p@@tADpJ@h@?zA@p@?F?dA@p@Hp@t@xFBLf@hD@TALEPCDABCBOZQ\\{@zAm@~@{@p@SRKPO\\Uj@Oh@Gd@C^Ad@@b@BZDl@t@~FVbBZhBVjAV`A`@rAV`AR~@@Bd@hCNxADh@@f@@^@^A`@A^KrBAhA@`AFfAVzCJr@?@Jp@XfBXpBFb@Dd@HjBAt@@r@DvAL`BFfBXtHBbAAh@?x@ExBAp@@v@?l@A\\AXEXOdAa@pA?LK^AFCFCBEBE@EDCFCFAH?H?HBH?D?FK\\CH]zAO~@Gh@Cd@?h@?FAHCDCBCBCDCFAHAH@H@F@FBFBDBBDBD@B@D?DABCBADEBGBI@Gd@AxBFrAD\\@nAHVBd@Jv@VhAd@l@Xj@DjLnGjAl@pAp@vJlFt@`@fCtApMfH`AhARRZ\\RXPXP\\N^JZL`@Lh@Hj@Hl@Hl@D^Fj@DVJd@J^HXHVz@`CPf@DJeDxCc@`@yBlBgDpC}AjAkClBsDfC{@j@{FjDcDbBoCrAeAd@eFxBaFjBaDfAm@PiFvAmBf@oA\\y@T}@XgAd@g@Xe@Zo@b@aA`Aw@`Ai@t@_@l@c@|@c@dAk@zAk@tBe@vB_@bB}@fFOv@E^Kh@g@pCYrAgAbEq@xB_AfCyEtLkBbFq@xAi@~@u@dAiAhA_Ar@WP_Bn@e@NYJk@H_@FCh@DlBIpAkAnEEREVEn@?n@Bx@Hl@Np@Th@n@x@FJXXVZfAv@d@d@tDxDjEjEf@b@aAxC_@lAY~@Qf@i@dBKV[fAOb@Y~@CDOl@G`@Kv@Cf@CP?LI`BG|AADIdCGfA?F?VBh@XbCTlBBPLdA@HLlANrAF|@@x@NBdBXXD^FLuCbDd@DB@FARErACd@SCSCs@MqAS_@GYEeBYOC@l@?\\C^MrDAPC\\?HEv@GxA?HInBGtAEz@Cd@IbBGtAEdAKv@WnBGd@WnBOnAIf@EXGj@MbACJM~@CRI^MRGHWXEH[\\EFk@n@GHQRED_@h@EXCJKz@U~AAHSbBKx@EXKr@OjAWnAGd@CHKv@sDuAwG}B]M[KWKsBy@GCOE_@MOGqC_Ay@Uc@Oc@Mw@Oa@E]CQA[?o@FQBSFqAf@e@ZUXEFuAzAKJORg@h@w@z@GHIJqAvASVQPWXc@d@IJc@Ts@j@]ZuAtAIFONUTFRJ\\Px@NlAD|@AnBG|@Il@{@rEGh@G`@OxBIdEAv@AdBGtC?d@CdAG~CAhA@fAAj@DhAPtBHz@J|@Lv@Hd@PdAZfBF`@~ArHh@zBx@tDpBdIhE`Pn@nCv@dENz@Jv@J|@Fz@HbC?tBG~BIxCQ|Cc@zGW|Cy@rHcClQeArHy@`GOhAqD`WgDtTiDpTqAtHcDjPY~Ac@nCQrAKhAItAGrASxGOdDI`AKbAK`AM~@k@nCYnAYlAqDxMeBhGIVJb@pCpCr@t@BBFFFHARBR@HDHBFFDDBF@FAFATVT^HDLXDHLThErINVpAnCtBlEVd@zFlLt@vAb@x@Q\\aQhZUh@g@|AYfAa@]QWQ_@Sf@e@_@WYUa@gGgM"
}
],
"unplanned": [],
"job_id": "77639186-16d0-48ea-a918-ed788c1b6b79",
"technical": {
"runtime": 5,
"iterations": 100000
}
}
The solution consists of two routes with a total cost of 923.57 and all 20 tasks planned:
- First route (one-person crew, 10 tasks, cost 376.41) starts in Oosterhout and Breda for the morning deliveries, then heads west to Etten-Leur, Roosendaal, and Zevenbergen. Afterwards, the route goes back east through Breda to finish with afternoon deliveries in Tilburg.
- Second route (two-person crew, 10 tasks, cost 547.16) handles the three restricted tasks plus the remaining customers. It starts with Oosterhout and Breda, then drives to Eindhoven for six deliveries before finishing with afternoon activities in Oisterwijk and Tilburg.
Conclusion¶
This example combines several FastVRP features to model a realistic appliance delivery operation. The key modelling decisions and the tutorials that explain them in further detail:
-
Vehicle restrictions for tasks. The
allowed_vehicle_typesfield on the three restricted tasks ensures only two-person crew vehicles serve them. Without this restriction, the solver would assign all tasks to the cheaper one-person crew vehicles. See the Vehicle restrictions tutorial. -
Cost-driven fleet assignment. Because two-person crew vehicles cost twice as much per hour, the solver assigns them only to the tasks that require them and fills the remaining routes with cheaper one-person crew vehicles. The result is a mixed fleet that balances capability with cost. See the Cost optimisation tutorial.
-
Time windows shape the route order. Morning customers are visited first, afternoon customers later, and all-day customers fill the gaps. This avoids unnecessary waiting time and ensures no customer is visited outside their preferred window. See the Time windows tutorial.