Versiones no soportadas:2.6 2.5 2.4 2.3 2.2 2.1 2.0
pgr_TSP
¶
pgr_TSP
- Aproximación usando el algoritmo métrico.
Disponibilidad:
Versión 4.0.0
Simulated Annealing signature removed
Results change depending on input order
Only for undirected graphs
Versión 3.2.1
Algoritmo Metrico de la Librería Boost
El algoritmo de recocido simulado ya no es utilizado
Se ignoran los parámetros relacionados con el algoritmo de recocido simulado: max_processing_time, tries_per_temperature, max_changes_per_temperature, max_consecutive_non_changes, initial_temperature, final_temperature, cooling_factor, randomize
Versión 2.3.0
Cambio de firma
Firma antigua ya no soportada
Versión 2.0.0
Función oficial.
Descripción¶
Definición del Problema¶
En el problema del vendedor viajante (TSP) hace la siguiente pregunta:
Dada una lista de ciudades y las distancias entre cada par de ciudades, que corresponde con la ruta más corta posible que para visite cada ciudad exactamente una vez y regrese a la ciudad de origen?
Características¶
Este problema es un problema de optimización NP-duro.
Se utiliza el algoritmo métrico
Implementation generates solutions that are twice as long as the optimal tour in the worst case:
Graph characteristics for best performance:
El grafo es no dirigido
El grafo está completamente conectado
Grafo donde los costos de viaje en los segmentos cumplen con la desigualdad del triángulo.
Los costos del viaje son simétricos:
Los costos del viaje de
u
av
son tanto como viajar dev
au
Results change depending on input order of the Matrix SQL
Negative costs are ignored.
Se puede utilizar con funciones Cost Matrix - Categoría preferiblemente con directed => false.
Con
directed => false
Generará un grafo que:
es no dirigido
está completamente conectado (siempre que el grafo tenga un componente)
todos los costos de viaje en los segmentos vumplen con la desigualdad del triángulo.
Cuando
start_vid = 0 Ó end_vid = 0
The solutions generated are guaranteed to be twice as long as the optimal tour in the worst case
Cuando
start_vid != 0 Y end_vid != 0 Y start_vid != end_vid
It is not guaranteed that the solution will be, in the worst case, twice as long as the optimal tour, due to the fact that end_vid is forced to be in a fixed position.
Con
directed => true
It is not guaranteed that the solution will be, in the worst case, twice as long as the optimal tour
Generará un grafo que:
es dirigido
está completamente conectado (siempre que el grafo tenga un componente)
algunos (o todos) los costos de viaje en los segmentos podrían no obedecer a la desigualdad del triángulo.
Como se requiere un grafo no dirigido, el grafo dirigido se transforma de la siguiente manera:
los segmentos (u, v) y (v, u) se consideran el mismo segmentos (denotado (u, v)
Si “
agg_cost
difiere entre una o más instancias del segmento (u, v)El valor mínimo de
agg_cost
en todas las instancias de la arista (u, v) se considera como elagg_cost
de la arista (u, v)Algunos (o todos) los costos de viaje en los segmentos aún podrían no obedecer a la desigualdad del triángulo.
When the data does not come from an undirected graph or its not fully connected:
Missing values will be calculated with dijkstra algorithm.
When the graph has more than one component:
start_vid
orend_vid
are defined and are on the same component: the TSP tour will happen on that component.start_vid
orend_vid
are defined and are not on the same component: the TSP tour will propose a tour that has both components where connecting costs are estimated.start_vid
orend_vid
are not defined: the starting point could be on any component and will include data only from that component.
One cycle attempt to remove crossing edges is done to the TSP results.
Firmas¶
Resumen
[start_id, end_id]
)(seq, path_id, path_seq, start_vid, end_vid, node, edge, cost, agg_cost)
- Ejemplo:
Usando pgr_dijkstraCostMatrix para generar la información de la matriz
Línea 5 Los vértices
no están incluidos porque no están conectados.
1SELECT * FROM pgr_TSP(
2 $$SELECT * FROM pgr_dijkstraCostMatrix(
3 'SELECT id, source, target, cost, reverse_cost FROM edges',
4 (SELECT array_agg(id) FROM vertices WHERE id NOT IN (2, 4, 13, 14)),
5 directed => false) $$);
6 seq | node | cost | agg_cost
7-----+------+------+----------
8 1 | 1 | 0 | 0
9 2 | 3 | 1 | 1
10 3 | 7 | 1 | 2
11 4 | 6 | 1 | 3
12 5 | 5 | 1 | 4
13 6 | 10 | 2 | 6
14 7 | 11 | 1 | 7
15 8 | 12 | 1 | 8
16 9 | 16 | 2 | 10
17 10 | 15 | 1 | 11
18 11 | 17 | 2 | 13
19 12 | 9 | 3 | 16
20 13 | 8 | 1 | 17
21 14 | 1 | 3 | 20
22(14 rows)
23
Parámetros¶
Parámetro |
Tipo |
Descripción |
---|---|---|
|
SQL de matriz como se describe más adelante |
Parámetros opcionales de TSP¶
Columna |
Tipo |
x Defecto |
Descripción |
---|---|---|---|
|
ENTEROS |
|
El primer vértice visitado
|
|
ENTEROS |
|
Último vértice visitado antes de regresar a
|
Consultas Internas¶
SQL de matriz¶
Columna |
Tipo |
Descripción |
---|---|---|
|
|
Identificador del vértice de salida. |
|
|
Identificador del vértice final. |
|
|
Costo para pasar de start_vid a end_vid |
Columnas de resultados¶
Devuelve el CONJUNTO DE (seq, node, cost, agg_cost)
Columna |
Tipo |
Descripción |
---|---|---|
seq |
|
Secuencia de filas. |
node |
|
Identificador del nodo/coordenada/punto. |
costo |
|
Coste que se debe recorrer desde el
|
agg_cost |
|
Costo agregado del
|
Ejemplos Adicionales¶
Inicio en el vértice ¶
Linea 6
start_vid => 1
1SELECT * FROM pgr_TSP(
2 $$SELECT * FROM pgr_dijkstraCostMatrix(
3 'SELECT id, source, target, cost, reverse_cost FROM edges',
4 (SELECT array_agg(id) FROM vertices WHERE id NOT IN (2, 4, 13, 14)),
5 directed => false) $$,
6 start_id => 1);
7 seq | node | cost | agg_cost
8-----+------+------+----------
9 1 | 1 | 0 | 0
10 2 | 3 | 1 | 1
11 3 | 7 | 1 | 2
12 4 | 6 | 1 | 3
13 5 | 5 | 1 | 4
14 6 | 10 | 2 | 6
15 7 | 11 | 1 | 7
16 8 | 12 | 1 | 8
17 9 | 16 | 2 | 10
18 10 | 15 | 1 | 11
19 11 | 17 | 2 | 13
20 12 | 9 | 3 | 16
21 13 | 8 | 1 | 17
22 14 | 1 | 3 | 20
23(14 rows)
24
Using points of interest to generate an asymmetric matrix.¶
Para generar una matriz asimétrica:
Línea 4 La información
side
depointsOfInterset
se ignora al no incluirla en la consultaLine 6 Generating an asymmetric matrix with
directed => true
se considera como elagg_cost
La solución que puede ser mayor que el doble de larga que el tour óptimo porque:
La desigualdad del triángulo podría no estar satisfecha.
start_id != 0 Y end_id != 0
1SELECT * FROM pgr_TSP(
2 $$SELECT * FROM pgr_withPointsCostMatrix(
3 'SELECT id, source, target, cost, reverse_cost FROM edges ORDER BY id',
4 'SELECT pid, edge_id, fraction from pointsOfInterest',
5 array[-1, 10, 7, 11, -6],
6 directed => true) $$,
7 start_id => 7,
8 end_id => 11);
9 seq | node | cost | agg_cost
10-----+------+------+----------
11 1 | 7 | 0 | 0
12 2 | -6 | 0.3 | 0.3
13 3 | -1 | 1.3 | 1.6
14 4 | 10 | 1.6 | 3.2
15 5 | 11 | 1 | 4.2
16 6 | 7 | 1 | 5.2
17(6 rows)
18
Datos incompletos conectados¶
Usando aristas seleccionadas
1SELECT * FROM pgr_dijkstraCostMatrix(
2 $q1$SELECT id, source, target, cost, reverse_cost FROM edges WHERE id IN (2, 4, 5, 8, 9, 15)$q1$,
3 (SELECT ARRAY[6, 7, 10, 11, 16, 17]),
4 directed => true);
5 start_vid | end_vid | agg_cost
6-----------+---------+----------
7 6 | 7 | 1
8 6 | 11 | 2
9 6 | 16 | 3
10 6 | 17 | 4
11 7 | 6 | 1
12 7 | 11 | 1
13 7 | 16 | 2
14 7 | 17 | 3
15 10 | 6 | 1
16 10 | 7 | 2
17 10 | 11 | 1
18 10 | 16 | 2
19 10 | 17 | 3
20 11 | 6 | 2
21 11 | 7 | 1
22 11 | 16 | 1
23 11 | 17 | 2
24 16 | 6 | 3
25 16 | 7 | 2
26 16 | 11 | 1
27 16 | 17 | 1
28 17 | 6 | 4
29 17 | 7 | 3
30 17 | 11 | 2
31 17 | 16 | 1
32(25 rows)
33
Valor del cost para
1SELECT * FROM pgr_TSP(
2 $$SELECT * FROM pgr_dijkstraCostMatrix(
3 $q1$SELECT id, source, target, cost, reverse_cost FROM edges WHERE id IN (2, 4, 5, 8, 9, 15)$q1$,
4 (SELECT ARRAY[6, 7, 10, 11, 16, 17]),
5 directed => true)$$);
6 seq | node | cost | agg_cost
7-----+------+------+----------
8 1 | 6 | 0 | 0
9 2 | 7 | 1 | 1
10 3 | 11 | 1 | 2
11 4 | 16 | 1 | 3
12 5 | 17 | 1 | 4
13 6 | 10 | 3 | 7
14 7 | 6 | 1 | 8
15(7 rows)
16
Ver también¶
Índices y tablas