Get started
You will learn the basics of interacting with the router.
In this tutorial, you will learn how to use the router engine with a simple example.

Example

The aim of this example is to create routes to visit seven landmarks in Kyoto using two vehicles.
base-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
}
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
}
14
15
// Use the router engine and CLI runner to solve a Vehicle Routing Problem.
16
func main() {
17
f := func(i input, opt solve.Options) (solve.Solver, error) {
18
router, err := route.NewRouter(i.Stops, i.Vehicles)
19
if err != nil {
20
return nil, err
21
}
22
23
return router.Solver(opt)
24
}
25
26
cli.Run(f)
27
}
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": 1242
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!
You can see that one vehicle has six stops assigned and the other just a single stop, which is the farthest from the others.
See the router engine overview page for additional options that can be added to extend this basic example.
base-output
Export as PDF
Copy link