• Supported versions:

Flow - Familia de funciones

  • pgr_maxFlow - Solo el flujo máximo se calcula usando el algoritmo empuja y reetiquetado.

  • pgr_boykovKolmogorov - Algoritmo Boykov y Kolmogorov con detalles del flujo en aristas.

  • pgr_edmondsKarp - Algoritmo Edmonds y Karp con detalles de flujo del flujo en aristas.

  • pgr_pushRelabel - Algoritmo empuja y reetiquetado con detalles del flujo en aristas.

  • Aplicaciones

Experimental

Advertencia

Posible bloqueo del servidor

  • Estas funciones pueden crear una caída del servidor

Advertencia

Funciones experimentales

  • No son oficialmente de la versión actual.

  • Es probable que oficialmente no formen parte de la siguiente versión:

    • Las funciones no podrían hacer uso de ANY-INTEGER ni ANY-NUMERICAL

    • El nombre puede cambiar.

    • La firma puede cambiar.

    • La funcionalidad puede cambiar.

    • Las pruebas de pgTap pueden faltar.

    • Posiblemente necesite codificación c/c++.

    • Puede carecer documentación.

    • Hay documentación que, en dado caso, podría ser necesario reescribir.

    • Puede ser necesario que los ejemplos de documentación se generen automáticamente.

    • Puede ser necesaria retroalimentación por parte de la comunidad.

    • Puede depender de una función propuesta de pgRouting

    • Podría depender de una función obsoleta de pgRouting

Información General de las Funciones de Flujo

Las principales características son:

  • El grafo es dirigido.

  • El proceso se realiza sólo en aristas con capacidades positivas.

  • Cuando el flujo máximo es 0 entonces no hay flujo, se devolverá: EMPTY SET.

    • No hay ningún flujo cuando el orígen es el mismo que el destino.

  • Cualquier valor duplicado en el/los orígen(es) o en el/los destino(s) será ignorado.

  • Calcula la capacidad de flujo/residuo para cada arista. En la salida

    • Se omiten las aristas con flujo cero.

  • Crea una súper origen, con aristas para todos las fuentes(es), y un súper destino con aristas para todos los destino(s).

  • Se garantiza que el flujo máximo a través del grafo es el valor devuelto por pgr_maxFlow cuando es ejecutado con los mismos parámetros y se puede calcular:

    • Mediante la suma de los flujos salientes de las fuentes

    • Mediante la suma de los flujos llegantes a los destinos

pgr_maxFlow es el flujo máximo y este máximo tiene garantía de ser el mismo en las funciones pgr_pushRelabel, pgr_edmondsKarp, pgr_boykovKolmogorov, pero el flujo actual para cada arista puede variar.

Consultas Internas

SQL aristas

Aristas de capacidad

Columna

Tipo

x Defecto

Descripción

id

ENTEROS

Identificador de la arista.

source

ENTEROS

Identificador del primer vértice de la arista.

target

ENTEROS

Identificador del segundo vértice de la arista.

capacity

ENTEROS

Peso de la arista (source, target)

reverse_capacity

ENTEROS

-1

Peso de la arista (target, source)

  • Cuando negativo: la arista (target, source) no existe, por lo tanto no es parte del grafo.

Donde:

ENTEROS:

SMALLINT, INTEGER, BIGINT

FLOTANTES:

SMALLINT, INTEGER, BIGINT, REAL, FLOAT

Aristas Capacidad-Costo

Columna

Tipo

x Defecto

Descripción

id

ENTEROS

Identificador de la arista.

source

ENTEROS

Identificador del primer vértice de la arista.

target

ENTEROS

Identificador del segundo vértice de la arista.

capacity

ENTEROS

Capacidad de la arista (source, target)

  • Cuando negativo: la arista (target, source) no existe, por lo tanto no es parte del grafo.

reverse_capacity

ENTEROS

-1

Capacidad de la arista (target, source)

  • Cuando negativo: la arista (target, source) no existe, por lo tanto no es parte del grafo.

cost

FLOTANTES

Peso de la arista (source, target) si existe

reverse_cost

FLOTANTES

\(-1\)

Peso de la arista (target, source) si existe

Donde:

ENTEROS:

SMALLINT, INTEGER, BIGINT

FLOTANTES:

SMALLINT, INTEGER, BIGINT, REAL, FLOAT

Aristas de costo

Columna

Tipo

x Defecto

Descripción

id

ENTEROS

Identificador de la arista.

source

ENTEROS

Identificador del primer vértice de la arista.

target

ENTEROS

Identificador del segundo vértice de la arista.

cost

FLOTANTES

Peso de la arista (source, target)

reverse_cost

FLOTANTES

-1

Peso de la arista (target, source)

  • Cuando negativo: la arista (target, source) no existe, por lo tanto no es parte del grafo.

Donde:

ENTEROS:

SMALLINT, INTEGER, BIGINT

FLOTANTES:

SMALLINT, INTEGER, BIGINT, REAL, FLOAT

SQL Combinaciones

Parámetro

Tipo

Descripción

source

ENTEROS

Identificador del vértice de salida.

target

ENTEROS

Identificador del vértice de llegada.

Donde:

ENTEROS:

SMALLINT, INTEGER, BIGINT

Columnas de Resultados

Usado en

Columna

Tipo

Descripción

seq

INT

Valor secuencial a partir de 1.

arista

BIGINT

Identificador de la arista en la consulta original(edges_sql).

start_vid

BIGINT

Identificador del primer vértice de la arista.

end_vid

BIGINT

Identificador del segundo vértice de la arista.

flujo

BIGINT

Flujo a través del arista en la dirección (start_vid, end_vid).

residual_capacity

BIGINT

Capacidad residual del arista en la dirección (start_vid, end_vid).

Para pgr_maxFlowMinCost - Experimental

Columna

Tipo

Descripción

seq

INT

Valor secuencial a partir de 1.

arista

BIGINT

Identificador de la arista en la consulta original(edges_sql).

origen

BIGINT

Identificador del primer vértice de la arista.

objetivo

BIGINT

Identificador del segundo vértice de la arista.

flujo

BIGINT

Flujo a través de la arista en la dirección (origen, destino).

residual_capacity

BIGINT

Capacidad residual de la arista en la dirección (origen, destino).

costo

FLOAT

El costo de enviar este flujo a través de la arista en la dirección (origen, destino).

agg_cost

FLOAT

El costo agregado.

Documentación Avanzada

Una red de flujo es un gráfico dirigido donde cada arista tiene una capacidad y un flujo. El flujo a través de una arista no debe exceder la capacidad de la misma. Además, el flujo entrante y saliente de un nodo debe ser igual, excepto para el origen que solo tiene flujo saliente, y el destino (receptor) que solo tiene flujo entrante.

Los algoritmos de Flujo Máximo se calculan a través del grafo del flujo máximo y el flujo de cada arista.

Se garantiza que el flujo máximo a través del grafo sea el mismo con todas las implementaciones, pero el flujo real a través de cada arista puede variar.

Dada la siguiente consulta:

pgr_maxFlow \((edges\_sql, source\_vertex, sink\_vertex)\)

donde: \(edges\_sql = \{(id_i, source_i, target_i, capacity_i, reverse\_capacity_i)\}\)

Definición de grafo

El grafo ponderado dirigido, \(G(V,E)\), se define como:

  • Conjunto de vértices \(V\)

    • \(source\_vertex \cup sink\_vertex \bigcup source_i \bigcuptarget_i\)

  • El conjunto de aristas \(E\)

    • \(E = \begin{cases} \text{ } \{(source_i, target_i, capacity_i) \text{ when } capacity > 0 \} & \quad \text{ if } reverse\_capacity = \varnothing \\ \text{ } & \quad \text{ } \\ \{(source_i, target_i, capacity_i) \text{ when } capacity > 0 \} & \text{ } \\ \cup \{(target_i, source_i, reverse\_capacity_i) \text{ when } reverse\_capacity_i > 0)\} & \quad \text{ if } reverse\_capacity \neq \varnothing \\ \end{cases}\)

Problema de Flujo Máximo

Dado:

  • \(G(V,E)\)

  • \(source\_vertex \in V\) el vértice de origen

  • \(sink\_vertex \in V\) el vértice pozo

Entonces:

  • \(pgr\_maxFlow(edges\_sql, source, sink) = \boldsymbol{\Phi}\)

  • \(\boldsymbol{\Phi} = {(id_i, edge\_id_i, source_i, target_i, flow_i, residual\_capacity_i)}\)

Donde:

\(\boldsymbol{\Phi}\) es un subconjunto de las aristas originales con su flujo y capacidad residual. El flujo máximo a través del grafo se puede obtener agregando en el origen o sumidero y sumiendo el flujo hacia él. En particular:

  • \(id_i = i\)

  • \(edge\_id = id_i\) en edges_sql

  • \(residual\_capacity_i = capacity_i - flow_i\)

Ver también

Índices y tablas