Python library for working with vehicle routing problem instances.
Project description
VRPLIB
vrplib is a Python package for working with Vehicle Routing Problem (VRP) instances. The main features are:
- reading VRPLIB and Solomon instances and solutions, and
- downloading instances and best known solutions from CVRPLIB.
Installation
vrplib works with Python 3.8+ and only depends on numpy.
pip install vrplib
Example usage
Reading instances and solutions
import vrplib
# Read VRPLIB formatted instances (default)
instance = vrplib.read_instance("/path/to/X-n101-k25.vrp")
solution = vrplib.read_solution("/path/to/X-n101-k25.sol")
# Read Solomon formatted instances
instance = vrplib.read_instance("/path/to/C101.txt", instance_format="solomon")
solution = vrplib.read_solution("/path/to/C101.sol") # only 1 solution format
instance and solution are dictionaries that contain all parsed data.
>>> instance.keys()
dict_keys(['name', ..., 'edge_weight'])
>>> solution.keys()
dict_keys(['routes', 'cost'])
Downloading instances from CVRPLIB
import vrplib
# Download an instance and a solution file
vrplib.download_instance("X-n101-k25", "/path/to/instances/")
vrplib.download_solution("X-n101-k25", "/path/to/solutions/")
# List all instance names that can be downloaded
vrplib.list_names() # All instance names
vrplib.list_names(low=100, high=200) # Instances with between [100, 200] customers
vrplib.list_names(vrp_type="cvrp") # Only CVRP instances
vrplib.list_names(vrp_type="vrptw") # Only VRPTW instances
Documentation
VRPLIB instance format
The VRPLIB format is the standard format for the Capacitated Vehicle Routing Problem (CVRP). An example VRPLIB instance looks as follows:
NAME: Example
EDGE_WEIGHT_TYPE: EUC_2D
NODE_COORD_SECTION
1 0 0
2 5 5
SERVICE_TIME_SECTION
1 0
2 3
DEPOT_SECTION
1
EOF
A VRPLIB instance contains problem specifications and problem data.
- Specifications are key-value pairs separated by a colon. In the example above,
NAMEandEDGE_WEIGHT_TYPEare the two data specifications. - Data are explicit array-like values such as customer coordinates or service times.
Each data section should start with a header name that ends with
_SECTION, e.g.,NODE_COORD_SECTIONandSERVICE_TIME_SECTION. It is then followed by rows of values and each row must start with an index representing the depot or customer. There are two exceptions: values inEDGE_WEIGHT_SECTIONandDEPOT_SECTIONshould not start with an index.
Besides the rules outlined above, vrplib is not strict about the naming of specifications or sections.
This means that you can use vrplib to read VRPLIB instances with custom specifications like MY_SPECIFICATION: SOME_VALUE and custom section names like MY_SECTION.
Reading the above example instance returns the following dictionary:
{'name': 'Example',
'edge_weight_type': 'EUC_2D',
'node_coord': array([[0, 0], [5, 5]]),
'service_time': array([1, 3]),
'depot': array([0]),
'edge_weight': array([[0. , 7.07106781], [7.07106781, 0. ]])}
The depot section specifies which location index corresponds to the depot data.
The convention is to let index 1 represent the depot.
vrplib subtracts one from the depot value to make it easier to index.
Computing edge weights
Note that the example instance did not include any explicit information about the edge weights, yet the output includes edge weights data.
This is because vrplib automatically computes the edge weights based on the instance specifications, if applicable.
In the example, the edge weight type specification and node coordinates data are used to compute the Euclidean distance.
You can set the compute_distances argument in read_instance to disable this feature.
Following the VRPLIB conventions, the edge weights are computed based on the EDGE_WEIGHT_TYPE specification, and in some cases the EDGE_WEIGHT_FORMAT specification. vrplib currently supports two categories of edge weight types:
*_2D: Euclidean distances based on the node coordinates data.EUC_2D: Double precision distances without rounding.FLOOR_2D: Round down all distances to down to an integer.EXACT_2D: Multiply the distances by 1000, round to the nearest integer.
EXPLICIT: the distance data is explicitly provided, in partial or full form. TheEDGE_WEIGHT_FORMATspecification must be present. We support the following two edge weight formats:LOWER_ROW: Lower row triangular matrix without diagonal entries.FULL_MATRIX: Explicit full matrix representation.
More information about VRPLIB
The VRPLIB format is an extension of the TSPLIB95 format. Additional information about the VRPLIB format can be found here.
Solomon instance format
The Solomon format was used to introduce the Solomon instances for the Vehicle Routing Problem with Time Window (VRPTW) and also the extended instance set by Homberger and Gehring. A Solomon instance looks like this:
Example
VEHICLE
NUMBER CAPACITY
50 200
CUSTOMER
CUST NO. XCOORD. YCOORD. DEMAND READY TIME DUE DATE SERVICE TIME
0 70 70 0 0 1351 0
1 33 78 20 750 809 90
Reading this Solomon instance returns the following dictionary:
{'name': 'Example',
'vehicles': 50,
'capacity': 200,
'node_coord': array([[70, 70], [33, 78]]),
'demand': array([ 0, 20]),
'time_window': array([[ 0, 1351], [ 750, 809]]),
'service_time': array([ 0, 90]),
'edge_weight': array([[ 0. , 37.85498646], [37.85498646, 0. ]])}
The edge weights are computed by default using the Euclidean distances.
Solution format
Here's an example of a solution format:
Route #1: 1 2 3
Route #2: 4 5
Cost: 100
A solution is represented by a set of routes, where each route specifies the sequence of customers to visit.
Each route should start with "Route", followed by the route number, and followed by a colon.
The customers to be served on the route are then listed.
The solution file can also include other keywords like Cost, which will be separated on the first colon or whitespace.
The convention is that customer indices start counting from 1, but vrplib simply parses the file without strict requirements about those indices.
Reading the above example solution returns the following dictionary:
{'routes': [[1, 2, 3], [4, 5]], 'cost': 100}
Other remarks
- The
XML100benchmark set is not listed inlist_namesand cannot be downloaded through this package. You can download these instances directly from CVRPLIB. - In the literature, some instances use rounding conventions different from what is specified in the instance. For example, X instance set proposed by Uchoa et al. (2017) assumes that the distances are rounded to the nearest integer. When you use the
vrplibpackage to read this instance, it will return non-rounded Euclidean distances because the instance specifies theEUC_2Dedge weight type which implies no rounding. To adhere to the convention used in the literature, you can manually round the distances matrix. - For large instances (>5000 customers) it's recommended to set the
compute_edge_weightsargument toFalseinread_instance.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file vrplib-1.1.0.tar.gz.
File metadata
- Download URL: vrplib-1.1.0.tar.gz
- Upload date:
- Size: 21.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.3.2 CPython/3.10.9 Darwin/21.3.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d23b63687ba0bf88fdc510cffc26be4af78f0f3e740a332a3474cbe8c5febe5c
|
|
| MD5 |
b8802df8e91f52edc6955147854d1e67
|
|
| BLAKE2b-256 |
9eda3f9309b9cb0cb8be8e03654e6304fdd09cb5520bb1c7258eca686c7da25c
|
File details
Details for the file vrplib-1.1.0-py3-none-any.whl.
File metadata
- Download URL: vrplib-1.1.0-py3-none-any.whl
- Upload date:
- Size: 21.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.3.2 CPython/3.10.9 Darwin/21.3.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d26321f73419651a405b5aa34979a1fa7773bfd122b42004973aa54fc2e60871
|
|
| MD5 |
b7e74cbe0b8e43910f3e6a4cdc926433
|
|
| BLAKE2b-256 |
6318c84eed793dac508d3054b928e8e08b1da7864de6643ae8930722e07be9da
|