Service times
You will learn how to use the Services option with a practical example.
In vehicle routing problems (VRPs) it is often useful to account for the amount of time required to service a stop. This allows for a VRP model that aligns more closely with reality because loading and unloading times are represented in the model. This information can be added to the model using the Services option.
The Services option is often combined with the Shifts and the Windows options.

Example

The router example is used as a base, where routes are created to visit seven landmarks in Kyoto using two vehicles. This time, we define service times for a few stops.
services-input
Save the following information in an input.json file (see input and output for more information on working with input files).
JSON
1
{
2
"stops": [
3
{
4
"id": "Fushimi Inari Taisha",
5
"position": { "lon": 135.772695, "lat": 34.967146 }
6
},
7
{
8
"id": "Kiyomizu-dera",
9
"position": { "lon": 135.78506, "lat": 34.994857 }
10
},
11
{
12
"id": "Nijō Castle",
13
"position": { "lon": 135.748134, "lat": 35.014239 }
14
},
15
{
16
"id": "Kyoto Imperial Palace",
17
"position": { "lon": 135.762057, "lat": 35.025431 }
18
},
19
{
20
"id": "Gionmachi",
21
"position": { "lon": 135.775682, "lat": 35.002457 }
22
},
23
{
24
"id": "Kinkaku-ji",
25
"position": { "lon": 135.728898, "lat": 35.039705 }
26
},
27
{
28
"id": "Arashiyama Bamboo Forest",
29
"position": { "lon": 135.672009, "lat": 35.017209 }
30
}
31
],
32
"vehicles": ["v1", "v2"],
33
"service_times": [
34
{
35
"id": "Fushimi Inari Taisha",
36
"duration": 900
37
},
38
{
39
"id": "Kiyomizu-dera",
40
"duration": 900
41
},
42
{
43
"id": "Kyoto Imperial Palace",
44
"duration": 900
45
},
46
{
47
"id": "Kinkaku-ji",
48
"duration": 900
49
}
50
]
51
}
Copied!

Code

The following program uses the CLI Runner to obtain a solution and requires access to the Nextmv code repository on GitHub. To request access, please contact [email protected].
To proceed with running the example, create a main.go file and use the code snippet below.
Go
1
package main
2
3
import (
4
"github.com/nextmv-io/code/engines/route"
5
"github.com/nextmv-io/code/hop/run/cli"
6
"github.com/nextmv-io/code/hop/solve"
7
)
8
9
// Struct to read from JSON in.
10
type input struct {
11
Stops []route.Stop `json:"stops,omitempty"`
12
Vehicles []string `json:"vehicles,omitempty"`
13
Services []route.Service `json:"service_times,omitempty"`
14
}
15
16
// Use the CLI runner to solve a Vehicle Routing Problem.
17
func main() {
18
f := func(i input, opt solve.Options) (solve.Solver, error) {
19
router, err := route.NewRouter(
20
i.Stops,
21
i.Vehicles,
22
route.Services(i.Services),
23
)
24
if err != nil {
25
return nil, err
26
}
27
28
return router.Solver(opt)
29
}
30
31
cli.Run(f)
32
}
Copied!
To execute the example, specify the path to the input.json file using command-line flags and use jq to extract the solution state (see runners for more information on building and running programs).
Bash
1
go run main.go -hop.runner.input.path input.json | jq .state
Copied!

Solution

The solution should look similar to this one:
JSON
1
{
2
"unassigned": [],
3
"vehicles": [
4
{
5
"id": "v1",
6
"route": [
7
{
8
"id": "Fushimi Inari Taisha",
9
"position": {
10
"lon": 135.772695,
11
"lat": 34.967146
12
}
13
},
14
{
15
"id": "Kiyomizu-dera",
16
"position": {
17
"lon": 135.78506,
18
"lat": 34.994857
19
}
20
},
21
{
22
"id": "Gionmachi",
23
"position": {
24
"lon": 135.775682,
25
"lat": 35.002457
26
}
27
},
28
{
29
"id": "Kyoto Imperial Palace",
30
"position": {
31
"lon": 135.762057,
32
"lat": 35.025431
33
}
34
},
35
{
36
"id": "Nijō Castle",
37
"position": {
38
"lon": 135.748134,
39
"lat": 35.014239
40
}
41
},
42
{
43
"id": "Kinkaku-ji",
44
"position": {
45
"lon": 135.728898,
46
"lat": 35.039705
47
}
48
}
49
],
50
"route_duration": 4842
51
},
52
{
53
"id": "v2",
54
"route": [
55
{
56
"id": "Arashiyama Bamboo Forest",
57
"position": {
58
"lon": 135.672009,
59
"lat": 35.017209
60
}
61
}
62
],
63
"route_duration": 0
64
}
65
]
66
}
Copied!
The route durations in the output file now does not only account for the travel time alone but also the given service times.
services-output
Export as PDF
Copy link