vrp_vroomPlain - Experimental¶
vrp_vroomPlain
- Vehicle Routing Problem with VROOM, involving both jobs and
shipments, with plain integer values instead of TIMESTAMP or INTERVAL.
Warning
Possible server crash
These functions might create a server crash
Warning
Experimental functions
They are not officially of the current release.
They likely will not be officially be part of the next release:
The functions might not make use of ANY-INTEGER and ANY-NUMERICAL
Name might change.
Signature might change.
Functionality might change.
pgTap tests might be missing.
Might need c/c++ coding.
May lack documentation.
Documentation if any might need to be rewritten.
Documentation examples might need to be automatically generated.
Might need a lot of feedback from the comunity.
Might depend on a proposed function of vrpRouting
Might depend on a deprecated function of vrpRouting
Availability
Version 0.3.0
Function modified for VROOM 1.11.0
Version 0.2.0
New experimental function
Description¶
VROOM is an open-source optimization engine that aims at providing good solutions to various real-life vehicle routing problems (VRP) within a small computing time. This function can be used to get the solution to a problem involving both jobs and shipments.
Signature¶
Example: This example is based on the VROOM Data of the Sample Data network:
SELECT *
FROM vrp_vroomPlain(
'SELECT * FROM vroom.jobs',
'SELECT * FROM vroom.jobs_time_windows',
'SELECT * FROM vroom.shipments',
'SELECT * FROM vroom.shipments_time_windows',
'SELECT * FROM vroom.vehicles',
'SELECT * FROM vroom.breaks',
'SELECT * FROM vroom.breaks_time_windows',
'SELECT * FROM vroom.matrix'
);
seq | vehicle_seq | vehicle_id | vehicle_data | step_seq | step_type | task_id | location_id | task_data | arrival | travel_time | setup_time | service_time | waiting_time | departure | load
-----+-------------+------------+--------------+----------+-----------+---------+-------------+-----------+---------+-------------+------------+--------------+--------------+-----------+------
1 | 1 | 1 | {} | 1 | 1 | -1 | 1 | {} | 300 | 0 | 0 | 0 | 0 | 300 | {30}
2 | 1 | 1 | {} | 2 | 5 | 1 | 1 | {} | 300 | 0 | 0 | 0 | 0 | 300 | {30}
3 | 1 | 1 | {} | 3 | 2 | 2 | 2 | {} | 350 | 50 | 0 | 250 | 900 | 1500 | {30}
4 | 1 | 1 | {} | 4 | 3 | 5 | 2 | {} | 1500 | 0 | 0 | 2250 | 11850 | 15600 | {40}
5 | 1 | 1 | {} | 5 | 3 | 3 | 1 | {} | 15650 | 50 | 0 | 2250 | 0 | 17900 | {60}
6 | 1 | 1 | {} | 6 | 4 | 5 | 2 | {} | 17950 | 50 | 0 | 2250 | 225 | 20425 | {50}
7 | 1 | 1 | {} | 7 | 4 | 3 | 2 | {} | 20425 | 0 | 0 | 2250 | 200 | 22875 | {30}
8 | 1 | 1 | {} | 8 | 6 | -1 | 1 | {} | 22925 | 50 | 0 | 0 | 0 | 22925 | {30}
9 | 1 | 1 | {} | 0 | 0 | 0 | 0 | {} | 0 | 200 | 0 | 9250 | 13175 | 0 | {}
10 | 2 | 2 | {} | 1 | 1 | -1 | 1 | {} | 275 | 0 | 0 | 0 | 0 | 275 | {70}
11 | 2 | 2 | {} | 2 | 5 | 2 | 1 | {} | 275 | 0 | 0 | 10 | 0 | 285 | {70}
12 | 2 | 2 | {} | 3 | 2 | 5 | 4 | {} | 360 | 75 | 0 | 250 | 665 | 1275 | {70}
13 | 2 | 2 | {} | 4 | 2 | 3 | 3 | {} | 1325 | 50 | 0 | 250 | 1400 | 2975 | {70}
14 | 2 | 2 | {} | 5 | 2 | 4 | 3 | {} | 2975 | 0 | 0 | 250 | 550 | 3775 | {70}
15 | 2 | 2 | {} | 6 | 6 | -1 | 3 | {} | 3775 | 0 | 0 | 0 | 0 | 3775 | {70}
16 | 2 | 2 | {} | 0 | 0 | 0 | 0 | {} | 0 | 125 | 0 | 760 | 2615 | 0 | {}
17 | 3 | 3 | {} | 1 | 1 | -1 | 1 | {} | 0 | 0 | 0 | 0 | 0 | 0 | {20}
18 | 3 | 3 | {} | 2 | 5 | 3 | 1 | {} | 0 | 0 | 0 | 0 | 0 | 0 | {20}
19 | 3 | 3 | {} | 3 | 2 | 1 | 1 | {} | 0 | 0 | 0 | 250 | 3625 | 3875 | {20}
20 | 3 | 3 | {} | 4 | 3 | 4 | 1 | {} | 3875 | 0 | 0 | 2250 | 2500 | 8625 | {40}
21 | 3 | 3 | {} | 5 | 4 | 4 | 4 | {} | 8700 | 75 | 0 | 2250 | 225 | 11175 | {20}
22 | 3 | 3 | {} | 6 | 6 | -1 | 1 | {} | 11250 | 75 | 0 | 0 | 0 | 11250 | {20}
23 | 3 | 3 | {} | 0 | 0 | 0 | 0 | {} | 0 | 150 | 0 | 4750 | 6350 | 0 | {}
24 | 4 | 4 | {} | 1 | 1 | -1 | 3 | {} | 250 | 0 | 0 | 0 | 0 | 250 | {0}
25 | 4 | 4 | {} | 2 | 5 | 4 | 1 | {} | 250 | 0 | 0 | 0 | 0 | 250 | {0}
26 | 4 | 4 | {} | 3 | 3 | 2 | 5 | {} | 275 | 25 | 0 | 2250 | 100 | 2625 | {10}
27 | 4 | 4 | {} | 4 | 3 | 1 | 3 | {} | 2650 | 25 | 0 | 2250 | 0 | 4900 | {20}
28 | 4 | 4 | {} | 5 | 4 | 2 | 6 | {} | 4990 | 90 | 0 | 2250 | 0 | 7240 | {10}
29 | 4 | 4 | {} | 6 | 4 | 1 | 5 | {} | 7351 | 111 | 0 | 2250 | 17574 | 27175 | {0}
30 | 4 | 4 | {} | 7 | 6 | -1 | 3 | {} | 27200 | 25 | 0 | 0 | 0 | 27200 | {0}
31 | 4 | 4 | {} | 0 | 0 | 0 | 0 | {} | 0 | 276 | 0 | 9000 | 17674 | 0 | {}
32 | 0 | 0 | {} | 0 | 0 | 0 | 0 | {} | 0 | 751 | 0 | 23760 | 39814 | 0 | {}
(32 rows)
Parameters¶
Parameter |
Type |
Description |
---|---|---|
|
Query describing the single-location pickup and/or delivery |
|
|
Query describing valid slots for job service start. |
|
|
Query describing pickup and delivery tasks that should happen within same route. |
|
|
Query describing valid slots for pickup and delivery service start. |
|
|
Query describing the available vehicles. |
|
|
Query describing the driver breaks. |
|
|
Query describing valid slots for break start. |
|
|
Query containing the distance or travel times between the locations. |
Optional Parameters¶
Parameter |
Type |
Default |
Description |
---|---|---|---|
|
|
\(5\) |
Exploration level to use while solving.
|
|
|
\(-1\) |
Timeout value to stop the solving process.
|
Inner Queries¶
Jobs SQL¶
A SELECT
statement that returns the following columns:
id, location_id
[setup, service, delivery, pickup, skills, priority, data]
Maximum values apply from vroom
setup
and service
\(4294967295\)
skills
\(2147483647\)
priority
\(100\)
Column |
Type |
Default |
Description |
---|---|---|---|
|
ANY-INTEGER |
Positive unique identifier of the job. |
|
|
ANY-INTEGER |
Positive unique identifier of the location of the job. |
|
|
ANY-INTEGER |
\(0\) |
The Job setup duration. |
|
ANY-INTEGER |
\(0\) |
The Job service duration. Max value: |
|
|
|
Array of non-negative integers describing multidimensional quantities for pickup such as number of items, weight, volume etc.
|
|
|
|
Array of non-negative integers describing multidimensional quantities for delivery such as number of items, weight, volume etc.
|
|
|
|
Array of non-negative integers defining mandatory skills. |
|
|
\(0\) |
Value range: \([0, 100]\) |
|
|
|
Any metadata information of the job. |
Jobs Time Windows SQL¶
A SELECT
statement that returns the following columns:
id, tw_open, tw_close
Column |
Type |
Description |
---|---|---|
|
ANY-INTEGER |
Positive unique identifier of the: job, pickup/delivery shipment, or break. |
|
ANY-INTEGER |
Time window opening time. |
|
ANY-INTEGER |
Time window closing time. |
Shipments SQL¶
A SELECT
statement that returns the following columns:
id
p_location_id, [p_setup, p_service, p_data]
d_location_id, [d_setup, d_service, d_data]
[amount, skills, priority]
Maximum values apply from vroom
p_setup
, p_service
, d_setup
, d_service
\(4294967295\)
skills
\(2147483647\)
priority
\(100\)
Column |
Type |
Default |
Description |
---|---|---|---|
|
ANY-INTEGER |
Positive unique identifier of the shipment. |
|
|
ANY-INTEGER |
Positive unique identifier of the pickup location. |
|
|
ANY-INTEGER |
\(0\) |
The pickup setup duration |
|
ANY-INTEGER |
\(0\) |
The pickup service duration |
|
|
|
Any metadata information of the pickup. |
|
ANY-INTEGER |
Positive unique identifier of the pickup location. |
|
|
ANY-INTEGER |
\(0\) |
The pickup setup duration |
|
ANY-INTEGER |
\(0\) |
The pickup service duration |
|
|
|
Any metadata information of the delivery. |
|
|
|
Array of non-negative integers describing multidimensional quantities such as number of items, weight, volume etc.
|
|
|
|
Array of non-negative integers defining mandatory skills.
|
|
|
\(0\) |
Value range: \([0, 100]\) |
Shipments Time Windows SQL¶
A SELECT
statement that returns the following columns:
id, tw_open, tw_close
[kind]
Column |
Type |
Description |
---|---|---|
|
ANY-INTEGER |
Positive unique identifier of the: job, pickup/delivery shipment, or break. |
|
ANY-INTEGER |
Time window opening time. |
|
ANY-INTEGER |
Time window closing time. |
|
|
Value in [‘p’, ‘d’] indicating whether the time window is for:
|
Vehicles SQL¶
A SELECT
statement that returns the following columns:
id, start_id, end_id
[capacity, skills, tw_open, tw_close, speed_factor, max_tasks, data]
Maximum values apply from vroom
skills
\(2147483647\)
priority
\(100\)
Column |
Type |
Default |
Description |
---|---|---|---|
|
ANY-INTEGER |
Positive unique identifier of the vehicle. |
|
|
ANY-INTEGER |
Positive unique identifier of the start location. |
|
|
ANY-INTEGER |
Positive unique identifier of the end location. |
|
|
|
|
Array of non-negative integers describing multidimensional quantities such as number of items, weight, volume etc.
|
|
|
|
Array of non-negative integers defining mandatory skills. |
|
ANY-INTEGER |
\(0\) |
Time window opening time.
|
|
ANY-INTEGER |
\(4294967295\) |
Time window closing time.
|
|
ANY-NUMERICAL |
\(1.0\) |
Vehicle travel time multiplier.
|
|
|
\(2147483647\) |
Maximum number of tasks in a route for the vehicle.
|
|
|
|
Any metadata information of the vehicle. |
Note:
At least one of the
start_id
orend_id
shall be present.If
end_id
is omitted, the resulting route will stop at the last visited task, whose choice is determined by the optimization process.If
start_id
is omitted, the resulting route will start at the first visited task, whose choice is determined by the optimization process.To request a round trip, specify both
start_id
andend_id
as the same index.A vehicle is only allowed to serve a set of tasks if the resulting load at each route step is lower than the matching value in capacity for each metric. When using multiple components for amounts, it is recommended to put the most important/limiting metrics first.
It is assumed that all delivery-related amounts for jobs are loaded at vehicle start, while all pickup-related amounts for jobs are brought back at vehicle end.
Breaks SQL¶
A SELECT
statement that returns the following columns:
id, vehicle_id
[service, data]
Column |
Type |
Default |
Description |
---|---|---|---|
|
ANY-INTEGER |
Positive unique identifier of the break. Unique for the same vehicle. |
|
|
ANY-INTEGER |
Positive unique identifier of the vehicle. |
|
|
ANY-INTEGER |
\(0\) |
The break duration |
|
|
|
Any metadata information of the break. |
Breaks Time Windows SQL¶
A SELECT
statement that returns the following columns:
id, tw_open, tw_close
Column |
Type |
Description |
---|---|---|
|
ANY-INTEGER |
Positive unique identifier of the: job, pickup/delivery shipment, or break. |
|
ANY-INTEGER |
Time window opening time. |
|
ANY-INTEGER |
Time window closing time. |
Time Matrix SQL¶
A SELECT
statement that returns the following columns:
start_id, end_id, duration
[ cost]
Column |
Type |
Default |
Description |
---|---|---|---|
|
ANY-INTEGER |
Identifier of the start node. |
|
|
ANY-INTEGER |
Identifier of the end node. |
|
|
ANY-INTEGER |
Time to travel from |
|
|
ANY-INTEGER |
|
Cost of travel from |
Result Columns¶
Returns set of
(seq, vehicle_seq, vehicle_id, vehicle_data, step_seq, step_type, task_id,
task_data, arrival, travel_time, service_time, waiting_time, load)
Column |
Type |
Description |
---|---|---|
|
|
Sequential value starting from 1. |
|
|
Sequential value starting from 1 for current vehicles. The \(n^{th}\) vehicle in the solution. |
|
|
Current vehicle identifier.
|
|
|
Metadata information of the vehicle. |
|
|
Sequential value starting from 1 for the stops made by the current vehicle. The \(m^{th}\) stop of the current vehicle.
|
|
|
Kind of the step location the vehicle is at:
|
|
|
Identifier of the task performed at this step.
|
|
|
Identifier of the task location.
|
|
|
Metadata information of the task. |
|
ANY-INTEGER |
Estimated time of arrival at this step. |
|
ANY-INTEGER |
Travel time from previous
|
|
ANY-INTEGER |
Setup time at this step. |
|
ANY-INTEGER |
Service time at this step. |
|
ANY-INTEGER |
Waiting time at this step. |
|
ANY-INTEGER |
Estimated time of departure at this step.
|
|
|
Vehicle load after step completion (with capacity constraints) |
Note:
Unallocated tasks are mentioned at the end with
vehicle_id = -1
.The last step of every vehicle denotes the summary row, where the columns
travel_time
,service_time
andwaiting_time
denote the total time for the corresponding vehicle,The last row denotes the summary for the complete problem, where the columns
travel_time
,service_time
andwaiting_time
denote the total time for the complete problem,
Additional Example¶
Problem involving 2 jobs and 1 shipment, using a single vehicle, similar to the VROOM Documentation Example 2 with a shipment.
SELECT *
FROM vrp_vroomPlain(
$jobs$
SELECT * FROM (
VALUES (1414, 2), (1515, 3)
) AS C(id, location_id)
$jobs$,
NULL,
$shipments$
SELECT * FROM (
VALUES (100, 1, 4)
) AS C(id, p_location_id, d_location_id)
$shipments$,
NULL,
$vehicles$
SELECT * FROM (
VALUES (1, 1, 4)
) AS C(id, start_id, end_id)
$vehicles$,
NULL,
NULL,
$matrix$
SELECT * FROM (
VALUES (1, 2, 2104), (1, 3, 197), (1, 4, 1299),
(2, 1, 2103), (2, 3, 2255), (2, 4, 3152),
(3, 1, 197), (3, 2, 2256), (3, 4, 1102),
(4, 1, 1299), (4, 2, 3153), (4, 3, 1102)
) AS C(start_id, end_id, duration)
$matrix$
);
seq | vehicle_seq | vehicle_id | vehicle_data | step_seq | step_type | task_id | location_id | task_data | arrival | travel_time | setup_time | service_time | waiting_time | departure | load
-----+-------------+------------+--------------+----------+-----------+---------+-------------+-----------+---------+-------------+------------+--------------+--------------+-----------+------
1 | 1 | 1 | {} | 1 | 1 | -1 | 1 | {} | 0 | 0 | 0 | 0 | 0 | 0 | {}
2 | 1 | 1 | {} | 2 | 3 | 100 | 1 | {} | 0 | 0 | 0 | 0 | 0 | 0 | {}
3 | 1 | 1 | {} | 3 | 2 | 1414 | 2 | {} | 2104 | 2104 | 0 | 0 | 0 | 2104 | {}
4 | 1 | 1 | {} | 4 | 2 | 1515 | 3 | {} | 4359 | 2255 | 0 | 0 | 0 | 4359 | {}
5 | 1 | 1 | {} | 5 | 4 | 100 | 4 | {} | 5461 | 1102 | 0 | 0 | 0 | 5461 | {}
6 | 1 | 1 | {} | 6 | 6 | -1 | 4 | {} | 5461 | 0 | 0 | 0 | 0 | 5461 | {}
7 | 1 | 1 | {} | 0 | 0 | 0 | 0 | {} | 0 | 5461 | 0 | 0 | 0 | 0 | {}
8 | 0 | 0 | {} | 0 | 0 | 0 | 0 | {} | 0 | 5461 | 0 | 0 | 0 | 0 | {}
(8 rows)
See Also¶
The queries use the Sample Data network.
Indices and tables