pgr_stoerWagner
— Devuelve el peso del corte mínimo del grafo utilizando el algoritmo stoerWagner. La función determina un corte mínimo y el peso de corte mínimo de un grafo conectado y no dirigido implementado por Boost.Graph.
Advertencia
Posible bloqueo del servidor
Advertencia
Funciones experimentales
Disponibilidad
Versión 2.3.0
- Nueva función Experimental
Soporte
En teoría de grafos, el algoritmo Stoer-Wagner es un algoritmo recursivo para resolver el problema de corte mínimo en gráficos ponderados no dirigidos con pesos no negativos. La idea esencial de este algoritmo es encoger el grafo mediante la fusión de los vértices más intensivos, hasta que el grafo sólo contiene dos conjuntos de vértices combinados. En cada fase, el algoritmo encuentra el corte s-t mínimo para dos vértices s y t elegidos a su voluntad. A continuación, el algoritmo encoge la arista entre s y t para buscar cortes no s-t. El corte mínimo encontrado en todas las fases será el corte ponderado mínimo del grafo.
Un corte es una partición de los vértices de un grafo en dos subconjuntos separados. Un corte mínimo es un corte para el que el tamaño o peso del corte no es mayor que el tamaño de cualquier otro corte. Para un grafo no ponderado, el corte mínimo sería simplemente el corte con menos aristas. Para un grafo ponderado, la suma del peso de todas las aristas en el corte determina si se trata de un corte mínimo.
Las características principales son:
pgr_stoerWagner(edges_sql)
RETURNS SET OF (seq, edge, cost, mincut)
OR EMPTY SET
Ejemplo: |
|
---|
pgr_stoerWagner(TEXT edges_sql);
RETURNS SET OF (seq, edge, cost, mincut)
OR EMPTY SET
SELECT * FROM pgr_stoerWagner(
'SELECT id, source, target, cost, reverse_cost
FROM edge_table
WHERE id < 17'
);
seq | edge | cost | mincut
-----+------+------+--------
1 | 1 | 1 | 1
(1 row)
Parámetro | Tipo | Valores predeterminados | Descripción |
---|---|---|---|
edges_sql | TEXT |
Consulta SQL como se describió anteriormente. |
edges_sql: | Una consulta SQL, que debe regresar un conjunto de filas con las siguientes columnas: |
---|
Columna | Tipo | Valores predeterminados | Descripción |
---|---|---|---|
id | ANY-INTEGER |
Identificador de la arista. | |
origen | ANY-INTEGER |
Identificador del primer punto final en el vértice de la arista. | |
objetivo | ANY-INTEGER |
Identificador del segundo punto final en el vértice de la arista. | |
cost | ANY-NUMERICAL |
Peso de la arista (source, target)
|
|
reverse_cost | ANY-NUMERICAL |
-1 | Peso de la arista (target, source),
|
Donde:
ANY-INTEGER: | SMALLINT, INTEGER, BIGINT |
---|---|
ANY-NUMERICAL: | SMALLINT, INTEGER, BIGINT, REAL, FLOAT |
Devuelve conjunto de (seq, edge, cost, mincut)
Columna | Tipo | Descripción |
---|---|---|
seq | INT |
Valor secuencial a partir de 1. |
edge | BIGINT |
Aristas que dividen el conjunto de vértices en dos. |
cost | FLOAT |
Costo para atravesar la arista. |
mincut | FLOAT |
Peso de corte mínimo de un grafo no dirigido. |
SELECT * FROM pgr_stoerWagner(
'SELECT id, source, target, cost, reverse_cost
FROM edge_table
WHERE id = 18'
);
seq | edge | cost | mincut
-----+------+------+--------
1 | 18 | 1 | 1
(1 row)
Utilice la función pgr_connectedComponents( ) en la consulta:
SELECT * FROM pgr_stoerWagner(
$$
SELECT id, source, target, cost, reverse_cost FROM edge_table
where source = any (ARRAY(SELECT node FROM pgr_connectedComponents(
'SELECT id, source, target, cost, reverse_cost FROM edge_table ')
WHERE component = 14)
)
OR
target = any (ARRAY(SELECT node FROM pgr_connectedComponents(
'SELECT id, source, target, cost, reverse_cost FROM edge_table ')
WHERE component = 14)
)
$$
);
seq | edge | cost | mincut
-----+------+------+--------
1 | 17 | 1 | 1
(1 row)
Índices y tablas