Vehicle break
In general, there are two break types: optional and required.
Optional break
This example demonstrates how to use optional vehicle break with time window and omitted location.
Problem
{
"plan": {
"jobs": [
{
"id": "job1",
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.52599,
"lng": 13.45413
},
"duration": 300.0,
"times": [
[
"2019-07-04T09:00:00Z",
"2019-07-04T12:00:00Z"
]
]
}
],
"demand": [
1
]
}
]
},
{
"id": "job2",
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.5225,
"lng": 13.4095
},
"duration": 240.0,
"times": [
[
"2019-07-04T12:00:00Z",
"2019-07-04T14:00:00Z"
]
]
}
],
"demand": [
1
]
}
]
},
{
"id": "job3",
"deliveries": [
{
"places": [
{
"location": {
"lat": 52.5165,
"lng": 13.3808
},
"duration": 300.0,
"times": [
[
"2019-07-04T16:00:00Z",
"2019-07-04T18:00:00Z"
]
]
}
],
"demand": [
1
]
}
]
}
]
},
"fleet": {
"vehicles": [
{
"typeId": "vehicle",
"vehicleIds": [
"vehicle_1"
],
"profile": {
"matrix": "normal_car"
},
"costs": {
"fixed": 22.0,
"distance": 0.0002,
"time": 0.004806
},
"shifts": [
{
"start": {
"earliest": "2019-07-04T09:00:00Z",
"location": {
"lat": 52.5316,
"lng": 13.3884
}
},
"end": {
"latest": "2019-07-04T18:00:00Z",
"location": {
"lat": 52.5316,
"lng": 13.3884
}
},
"breaks": [
{
"time": [
"2019-07-04T12:00:00Z",
"2019-07-04T14:00:00Z"
],
"places": [
{
"duration": 3600.0
}
]
}
]
}
],
"capacity": [
10
]
}
],
"profiles": [
{
"name": "normal_car"
}
]
}
}
Solution
{
"statistic": {
"cost": 101.964322,
"distance": 13251,
"duration": 16087,
"times": {
"driving": 2367,
"serving": 840,
"waiting": 9280,
"break": 3600
}
},
"tours": [
{
"vehicleId": "vehicle_1",
"typeId": "vehicle",
"shiftIndex": 0,
"stops": [
{
"location": {
"lat": 52.5316,
"lng": 13.3884
},
"time": {
"arrival": "2019-07-04T09:00:00Z",
"departure": "2019-07-04T11:44:12Z"
},
"distance": 0,
"load": [
3
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
]
},
{
"location": {
"lat": 52.52599,
"lng": 13.45413
},
"time": {
"arrival": "2019-07-04T12:00:00Z",
"departure": "2019-07-04T13:05:00Z"
},
"distance": 5112,
"load": [
2
],
"activities": [
{
"jobId": "job1",
"type": "delivery",
"location": {
"lat": 52.52599,
"lng": 13.45413
},
"time": {
"start": "2019-07-04T12:00:00Z",
"end": "2019-07-04T12:05:00Z"
}
},
{
"jobId": "break",
"type": "break",
"location": {
"lat": 52.52599,
"lng": 13.45413
},
"time": {
"start": "2019-07-04T12:05:00Z",
"end": "2019-07-04T13:05:00Z"
}
}
]
},
{
"location": {
"lat": 52.5225,
"lng": 13.4095
},
"time": {
"arrival": "2019-07-04T13:15:09Z",
"departure": "2019-07-04T13:19:09Z"
},
"distance": 8952,
"load": [
1
],
"activities": [
{
"jobId": "job2",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.5165,
"lng": 13.3808
},
"time": {
"arrival": "2019-07-04T13:25:20Z",
"departure": "2019-07-04T16:05:00Z"
},
"distance": 11106,
"load": [
0
],
"activities": [
{
"jobId": "job3",
"type": "delivery"
}
]
},
{
"location": {
"lat": 52.5316,
"lng": 13.3884
},
"time": {
"arrival": "2019-07-04T16:12:19Z",
"departure": "2019-07-04T16:12:19Z"
},
"distance": 13251,
"load": [
0
],
"activities": [
{
"jobId": "arrival",
"type": "arrival"
}
]
}
],
"statistic": {
"cost": 101.964322,
"distance": 13251,
"duration": 16087,
"times": {
"driving": 2367,
"serving": 840,
"waiting": 9280,
"break": 3600
}
}
}
],
"unassigned": []
}
Required break (experimental)
This example demonstrates how to use required vehicle break which has to be scheduled at specific time during travel between two stops.
Problem
{
"plan": {
"jobs": [
{
"id": "job1",
"deliveries": [
{
"places": [
{
"location": {
"lat": 51.06251,
"lng": 13.72133
},
"duration": 300
}
],
"demand": [
1
]
}
]
}
]
},
"fleet": {
"vehicles": [
{
"typeId": "vehicle",
"vehicleIds": [
"vehicle_1"
],
"profile": {
"matrix": "normal_car"
},
"costs": {
"fixed": 22,
"distance": 0.0002,
"time": 0.005
},
"shifts": [
{
"start": {
"earliest": "2019-07-04T09:00:00Z",
"latest": "2019-07-04T09:00:00Z",
"location": {
"lat": 52.5316,
"lng": 13.3884
}
},
"breaks": [
{
"time": {
"earliest": 7200,
"latest": 7200
},
"duration": 1800
}
]
}
],
"capacity": [
10
]
}
],
"profiles": [
{
"name": "normal_car"
}
]
}
}
Solution
{
"statistic": {
"cost": 148.0972,
"distance": 165136,
"duration": 18614,
"times": {
"driving": 16514,
"serving": 300,
"waiting": 0,
"break": 1800,
"commuting": 0,
"parking": 0
}
},
"tours": [
{
"vehicleId": "vehicle_1",
"typeId": "vehicle",
"shiftIndex": 0,
"stops": [
{
"location": {
"lat": 52.5316,
"lng": 13.3884
},
"time": {
"arrival": "2019-07-04T09:00:00Z",
"departure": "2019-07-04T09:00:00Z"
},
"distance": 0,
"load": [
1
],
"activities": [
{
"jobId": "departure",
"type": "departure"
}
]
},
{
"time": {
"arrival": "2019-07-04T11:00:00Z",
"departure": "2019-07-04T11:30:00Z"
},
"load": [
1
],
"activities": [
{
"jobId": "break",
"type": "break"
}
]
},
{
"location": {
"lat": 51.06251,
"lng": 13.72133
},
"time": {
"arrival": "2019-07-04T14:05:14Z",
"departure": "2019-07-04T14:10:14Z"
},
"distance": 165136,
"load": [
0
],
"activities": [
{
"jobId": "job1",
"type": "delivery"
}
]
}
],
"statistic": {
"cost": 148.0972,
"distance": 165136,
"duration": 18614,
"times": {
"driving": 16514,
"serving": 300,
"waiting": 0,
"break": 1800,
"commuting": 0,
"parking": 0
}
}
}
]
}
Please note, that departure rescheduling is disabled by setting shift.start.earliest
equal to shift.start.latest
.
At the moment, this is a hard requirement when such break type is used.