Collaboration diagram for Redes de Flujo.:Typedefs | |
| template<class Net > | |
| using | Aleph::Parc = tuple< typename Net::Arc *, bool > |
| template<class Net > | |
| using | Aleph::SemiPath = tuple< bool, typename Net::Flow_Type, DynList< Parc< Net > >> |
Functions | |
| template<class Net > | |
| Net::Flow_Type | Aleph::remaining_flow (typename Net::Node *src, typename Net::Arc *a) noexcept |
| template<class Net > | |
| Net::Flow_Type | Aleph::increase_flow (Net &net, const Path< Net > &path) |
| template<class Net > | |
| void | Aleph::increase_flow (Net &net, const DynList< Parc< Net >> &semi_path, const typename Net::Flow_Type slack) |
| template<class Net > | |
| void | Aleph::decrease_flow (Net &net, const DynList< Parc< Net >> &semi_path, typename Net::Flow_Type slack) |
| template<class Net , template< typename T > class Q> | |
| Path< Net > | Aleph::find_aumenting_path (const Net &net, const typename Net::Flow_Type &min_slack) |
| template<class Net > | |
| Path< Net > | Aleph::find_aumenting_path_dfs (const Net &net, const typename Net::Flow_Type &min_slack) |
| template<class Net > | |
| Path< Net > | Aleph::find_aumenting_path_bfs (const Net &net, const typename Net::Flow_Type &min_slack) |
| template<class Net , template< typename T > class Q> | |
| SemiPath< Net > | Aleph::find_aumenting_semi_path (const Net &net, const typename Net::Flow_Type &slack) |
| template<class Net > | |
| SemiPath< Net > | Aleph::find_aumenting_semi_path_dfs (const Net &net, const typename Net::Flow_Type &slack) |
| template<class Net > | |
| SemiPath< Net > | Aleph::find_aumenting_semi_path_bfs (const Net &net, const typename Net::Flow_Type &slack) |
| template<class Net , template< typename T > class Q> | |
| SemiPath< Net > | Aleph::find_decrementing_path (const Net &net, const typename Net::Flow_Type &slack) |
| template<class Net > | |
| SemiPath< Net > | Aleph::find_decrementing_path_dfs (const Net &net, const typename Net::Flow_Type &slack) |
| template<class Net > | |
| SemiPath< Net > | Aleph::find_decrementing_path_bfs (const Net &net, const typename Net::Flow_Type &slack) |
| template<class Net , template< class > class Find_Path> | |
| Net::Flow_Type | Aleph::aumenting_path_maximum_flow (Net &net) |
| template<class Net > | |
| Net::Flow_Type | Aleph::ford_fulkerson_maximum_flow (Net &net) |
| template<class Net > | |
| Net::Flow_Type | Aleph::edmonds_karp_maximum_flow (Net &net) |
| template<class Net , class Q_Type > | |
| Net::Flow_Type | Aleph::generic_preflow_vertex_push_maximum_flow (Net &net) |
| template<class Net > | |
| Net::Flow_Type | Aleph::fifo_preflow_maximum_flow (Net &net) |
| template<class Net > | |
| Net::Flow_Type | Aleph::heap_preflow_maximum_flow (Net &net) |
| template<class Net > | |
| Net::Flow_Type | Aleph::random_preflow_maximum_flow (Net &net) |
| template<class Net , template< class > class Maxflow> | |
| Net::Flow_Type | Aleph::min_cut (Net &net, DynSetTree< typename Net::Node *> &vs, DynSetTree< typename Net::Node *> &vt, DynList< typename Net::Arc *> &cuts, DynList< typename Net::Arc *> &cutt) |
| template<class Net , template< class > class Max_Flow_Algo = Ford_Fulkerson_Maximum_Flow> | |
| tuple< size_t, double > | Aleph::max_flow_min_cost_by_cycle_canceling (Net &net, double it_factor=0.4, size_t step=10) |
Redes de flujo
Una red de flujo es un digrafo dirigido que abstrae una red de tuberías por donde circula un fluido. Los arcos representan tuberías; los nodos las junturas. Cada arco asocia dos valores numéricos: asociados a cada arco:
A una red de flujo también se le conoce como red capacitada. En una red capacitada se identifican nodos especiales denominados "fuentes" y "sumideros", respectivamente. Un nodo fuente es uno que no tiene arcos de entrada; consecuentemente, sólo emana flujo. Análogamente, un nodo sumidero es uno que no tiene arcos de salida; en el mismo sentido, sólo recibe flujo.
Puesto que las abstracciones provienen de la teoría física, para cada nodo que no sea fuente o sumidero siempre se debe cumplir que la cantidad total de flujo de entrada debe ser la misma que la de salida.
Las redes capacitadas son un excelente vehículo de resolución de problemas sobre grafos. Aparte del problema del flujo máximo, representable en muchas situaciones de la vida real, una red capacitada sirve para resolver otros problemas de optimización combinatoria: caminos mínimos, emparejamientos, cortes, etc.
| using Aleph::Parc = typedef tuple<typename Net::Arc*, bool> |
Define un arco que pertenece a un semicamino
| using Aleph::SemiPath = typedef tuple<bool, typename Net::Flow_Type, DynList<Parc<Net> >> |
Define un semicamino compuesto por: -. bool: dise si el camino fue o no encontrado -. Flow_Type: el valor del slack del camino -. Lista de pares arco e indicación de si es normal o reducido. true ==> normal
| Net::Flow_Type Aleph::aumenting_path_maximum_flow | ( | Net & | net | ) |
Maximiza el flujo de la red según búsquedas de caminos de aumento.
aumenting_path_maximum_flow() recibe una red capacitada y maximiza su valor de flujo mediante búsquedas sucesivas de caminos de aumento.
El método recibe tres parámetros tipo:
La red puede tener múltiples fuentes y sumideros.
| [in,out] | net | la red capacitada cuyo flujo se desea maximizar. |
| [in] | sa | el estado del filtro de arcos |
| void Aleph::decrease_flow | ( | Net & | net, |
| const DynList< Parc< Net >> & | semi_path, | ||
| typename Net::Flow_Type | slack | ||
| ) |
Decrementa el flujo de una red según un camino de aumento.
decrease_flow(net, semi_path) toma el camino de aumento contenido en path y decrementa el valor de flujo de net en el eslabón mÃnimo (slack) del camino.
| [in] | net | la red capacitada por donde se desea incrementar el flujo por el camino de aumento. |
| [in] | semi_path | semicamino por donde se aumentará el flujo |
| [in] | slack | valor de aumento dl camino. Debe ser menor o igual al slack mÃnimo del camino. |
Here is the call graph for this function:| Net::Flow_Type Aleph::edmonds_karp_maximum_flow | ( | Net & | net | ) |
Maximiza el flujo de la red según el algoritmo de Edmonds-Karp.
edmonds_karp_maximum_flow() recibe una red capacitada y maximiza su valor de flujo mediante el algoritmo de Edmonds-Karp.
La red puede tener múltiples fuentes y sumideros.
| [in,out] | net | la red capacitada cuyo flujo se desea maximizar. |
| [in] | sa | el filtro de arcos |
| Net::Flow_Type Aleph::fifo_preflow_maximum_flow | ( | Net & | net | ) |
Flujo máximo de empuje de preflujo con cola FIFO de nodos.
fifo_preflow_vertex_push_maximum_flow(net) calcula el flujo máximo de la red net según el algoritmo genérico de Goldberg y Tarjan en donde los nodos activos, aquellos cuyo flujo de entrada es mayor que el de salida son almacenados y procesados según una cola FIFO. Este algoritmo procesa empuja el preflujo por los arcos según una heurÃstica en profundidad.
Durante la ejecución del algoritmo se emplean los contadores y cookies de todos los nodos de la red. El bit Maximum_Flow es usado para los arcos.
| [in,out] | net | una red capacitada a maximizar su flujo. net puede tener varios fuentes y sumideros. |
| [in] | leave_residual | indica si la red residual requerida para los cálculos parciales debe dejarse instanciada o no. Por omisión, la red residual, asà como el supra grafo en caso de que la red tenga varios fuentes o sumideros, son liberados al final del cálculo. Si el parámetro es true, entonces la red residual queda instanciada y eventualmente utilizable por otros algoritmos. |
| bad_alloc | si no hay suficiente memoria. |
Here is the call graph for this function:
Here is the caller graph for this function:| Path<Net> Aleph::find_aumenting_path | ( | const Net & | net, |
| const typename Net::Flow_Type & | min_slack | ||
| ) |
Encuentra un camino de aumento mediante una búsqueda en profundidad o en amplitud según sea el valor del parámetro plantilla Q. Q puede ser una pila, en cuyo caso la búsqueda será en profundidad, o una cola, en cuyo caso la búsqueda será en amplitud
| [in] | net | red capacitada de flujo |
| [in] | min_slack | valor mÃnimo de decremento del camino |
| [in] | sa | valor del filtro de arcos |
| Path<Net> Aleph::find_aumenting_path_bfs | ( | const Net & | net, |
| const typename Net::Flow_Type & | min_slack | ||
| ) |
Encuentra un camino de aumento mediante una búsqueda en amplitud.
| [in] | net | red capacitada de flujo |
| [in] | min_slack | valor mÃnimo de aumento del camino |
| [in] | sa | valor del filtro de arcos |
| Path<Net> Aleph::find_aumenting_path_dfs | ( | const Net & | net, |
| const typename Net::Flow_Type & | min_slack | ||
| ) |
Encuentra un camino de aumento mediante una búsqueda en profundidad.
| [in] | net | red capacitada de flujo |
| [in] | min_slack | valor mÃnimo de aumento del camino |
| [in] | sa | valor del filtro de arcos |
| SemiPath<Net> Aleph::find_aumenting_semi_path | ( | const Net & | net, |
| const typename Net::Flow_Type & | slack | ||
| ) |
Encuentra un camino de aumento en forma de semicamino mediante una búsqueda en profundidad o en amplitud según sea el valor del parámetro plantilla Q. Q puede ser una pila, en cuyo caso la búsqueda será en profundidad, o una cola, en cuyo caso la búsqueda será en amplitud
| [in] | net | red capacitada de flujo |
| [out] | semi_path | lista de pares (Arc,bool) que describe el semicamino |
| [in] | min_slack | valor mÃnimo de decremento del camino |
| [in] | sa | valor del filtro de arcos |
| SemiPath<Net> Aleph::find_aumenting_semi_path_bfs | ( | const Net & | net, |
| const typename Net::Flow_Type & | slack | ||
| ) |
Encuentra un camino de aumento en forma de semicamino mediante una búsqueda en amplitud.
| [in] | net | red capacitada de flujo |
| [out] | semi_path | lista de pares (Arc,bool) que describe el semicamino |
| [in] | min_slack | valor mÃnimo de decremento del camino |
| [in] | sa | valor del filtro de arcos |
| SemiPath<Net> Aleph::find_aumenting_semi_path_dfs | ( | const Net & | net, |
| const typename Net::Flow_Type & | slack | ||
| ) |
Encuentra un camino de aumento en forma de semicamino mediante una búsqueda en profundidad.
| [in] | net | red capacitada de flujo |
| [out] | semi_path | lista de pares (Arc,bool) que describe el semicamino |
| [in] | min_slack | valor mÃnimo de decremento del camino |
| [in] | sa | valor del filtro de arcos |
| SemiPath<Net> Aleph::find_decrementing_path | ( | const Net & | net, |
| const typename Net::Flow_Type & | slack | ||
| ) |
Encuentra un camino de decremento mediante una búsqueda en profundidad o en amplitud según sea el valor del parámetro plantilla Q. Q puede ser una pila, en cuyo caso la búsqueda será en profundidad, o una cola, en cuyo caso la búsqueda será en amplitud
| [in] | net | red capacitada de flujo |
| [in] | min_slack | valor mÃnimo de decremento del camino |
| [out] | semi_path | lista de pares arco,forward que caracteriza el semi-camino |
| [in] | sa | valor del filtro de arcos |
| SemiPath<Net> Aleph::find_decrementing_path_bfs | ( | const Net & | net, |
| const typename Net::Flow_Type & | slack | ||
| ) |
Encuentra un camino de aumento mediante una búsqueda en amplitud.
| [in] | net | red capacitada de flujo |
| [in] | min_slack | valor mÃnimo de aumento del camino |
| [in] | sa | valor del filtro de arcos |
Here is the call graph for this function:| SemiPath<Net> Aleph::find_decrementing_path_dfs | ( | const Net & | net, |
| const typename Net::Flow_Type & | slack | ||
| ) |
Encuentra un camino de aumento mediante una búsqueda en amplitud.
| [in] | net | red capacitada de flujo |
| [in] | min_slack | valor mÃnimo de aumento del camino |
| [in] | sa | valor del filtro de arcos |
| Net::Flow_Type Aleph::ford_fulkerson_maximum_flow | ( | Net & | net | ) |
Maximiza el flujo de la red según el algoritmo de Ford-Fulkerson.
ford_fulkerson_maximum_flow() recibe una red capacitada y maximiza su valor de flujo mediante el algoritmo de Ford-Fulkerson.
La red puede tener múltiples fuentes y sumideros.
Durante el cálculo se construye una red residual parcial, cuyo consumo en espacio es proporcional a la cantidad de arcos.
| [in,out] | net | la red capacitada cuyo flujo se desea maximizar. |
| [in] | sa | el filtro de arcos |
| bad_alloc | si no hay suficiente memoria para la red residual y para los caminos de aumento internos. En este caso, el estado de la red se corresponde con el último incremento de flujo realizado antes de que ocurra excepción. |
| domain_error | si la red residual ya ha sido calculada. |
Here is the caller graph for this function:| Net::Flow_Type Aleph::generic_preflow_vertex_push_maximum_flow | ( | Net & | net | ) |
Flujo máximo según algoritmo genérico de empuje de preflujo orientado hacia nodos.
generic_preflow_vertex_push_maximum_flow(net) calcula el flujo máximo de la red net según el algoritmo genérico de Goldberg y Tarjan. La función emplea dos parámetros tipo:
Durante la ejecución del algoritmo se emplean los contadores y cookies de todos los nodos de la red. El bit Maximum_Flow es usado para los arcos.
| [in,out] | net | una red capacitada a maximizar su flujo. net puede tener varios fuentes y sumideros. |
| [in] | leave_residual | indica si la red residual requerida para los cálculos parciales debe dejarse instanciada o no. Por omisión, la red residual, asà como el supra grafo en caso de que la red tenga varios fuentes o sumideros, son liberados al final del cálculo. Si el parámetro es true, entonces la red residual queda instanciada y eventualmente utilizable por otros algoritmos. |
| bad_alloc | si no hay suficiente memoria. |
| domain_error | si la red residual ya está calculada. |
Here is the call graph for this function:
Here is the caller graph for this function:| Net::Flow_Type Aleph::heap_preflow_maximum_flow | ( | Net & | net | ) |
Flujo máximo de empuje de preflujo con cola de prioridad según la altura de los nodos.
heap_preflow_vertex_push_maximum_flow(net) calcula el flujo máximo de la red net en donde los nodos activos, aquellos cuyo flujo de entrada es mayor que el de salida son almacenados en una cola de prioridad. El preflujo se empuja desde el fuente hasta el sumidero según una heurÃstica en amplitud.
heap_preflow_vertex_push_maximum_flow() es uno de los mejores algoritmos generales de cálculo de flujo máximo. Su desempeño para el peor caso es de
.
Durante la ejecución del algoritmo se emplean los contadores y cookies de todos los nodos de la red. El bit Maximum_Flow es usado para los arcos.
| [in,out] | net | una red capacitada a maximizar su flujo. net puede tener varios fuentes y sumideros. |
| [in] | leave_residual | indica si la red residual requerida para los cálculos parciales debe dejarse instanciada o no. Por omisión, la red residual, asà como el supra grafo en caso de que la red tenga varios fuentes o sumideros, son liberados al final del cálculo. Si el parámetro es true, entonces la red residual queda instanciada y eventualmente utilizable por otros algoritmos. |
| bad_alloc | si no hay suficiente memoria. |
Here is the call graph for this function:
Here is the caller graph for this function:| Net::Flow_Type Aleph::increase_flow | ( | Net & | net, |
| const Path< Net > & | path | ||
| ) |
Incrementa el flujo de una red según un camino de aumento.
increase_flow(net, path) toma el camino de aumento contenido en path e incrementa el valor de flujo de net en el eslabón mÃnimo (slack) del camino.
La biblioteca permite calcular caminos de aumento sobre la red residual de dos maneras:
Para que tenga sentido cualquiera de estas maneras de encontrar caminos de aumento, la red residual sobre net debe estar instanciada. Pare ello, debe haberse llamado previamente a make_residual_net().
| [in] | net | la red capacitada por donde se desea incrementar el flujo por el camino de aumento. |
| [in] | path | el camino de tipo Path donde se quiere almacenar el camino de aumento. |
| domain_error | si la red residual no ha sido creada |
Here is the call graph for this function:| void Aleph::increase_flow | ( | Net & | net, |
| const DynList< Parc< Net >> & | semi_path, | ||
| const typename Net::Flow_Type | slack | ||
| ) |
Incrementa el flujo de una red según un camino de aumento.
increase_flow(net, semi_path) toma el camino de aumento contenido en path e incrementa el valor de flujo de net en el eslabón mÃnimo (slack) del camino.
| [in] | net | la red capacitada por donde se desea incrementar el flujo por el camino de aumento. |
| [in] | semi_path | semicamino por donde se aumentará el flujo |
| [in] | slack | valor de aumento dl camino. Debe ser menor o igual al slack mÃnimo del camino. |
Here is the caller graph for this function:| tuple<size_t, double> Aleph::max_flow_min_cost_by_cycle_canceling | ( | Net & | net, |
| double | it_factor = 0.4, |
||
| size_t | step = 10 |
||
| ) |
Calcula el flujo máximo a coste mÃnimo mediante la técnica de cancelación de ciclos.
Esta primitiva emplea el tÃpico algoritmo de cancelación de ciclos para calcular el flujo máximo a coste mÃnimo de una red capacitada de flujo.
Primero, la rutina calcula un flujo máximo mediante un algoritmo de maximización de flujo. El algoritmo es un parámetro tipo, llamado Max_Flow_Algo, instanciado sobre una red de tipo genérico Net. Una vez calculado un flujo máximo inicial, el algoritmo busca ciclos negativos sobre la red residual mediante el algoritmo de Bellman-Ford. Por cada ciclo negativo encontrado, se cancela el ciclo por aumento del flujo por el ciclo y asà se elimina.
El procedimiento anterior se repite hasta que ya no se encuentren más ciclos negativos. Momento en el cual el flujo es máximo y el coste mÃnimo.
| [in] | net | la red a maximizar flujo y minimizar coste. |
| [in] | it_factor | factor de iteraciones en el cual el algoritmo de Bellman-Ford comenzará a buscar ciclos negativos |
| bad_alloc | si no hay suficiente memoria. |
Here is the call graph for this function:| Net::Flow_Type Aleph::min_cut | ( | Net & | net, |
| DynSetTree< typename Net::Node *> & | vs, | ||
| DynSetTree< typename Net::Node *> & | vt, | ||
| DynList< typename Net::Arc *> & | cuts, | ||
| DynList< typename Net::Arc *> & | cutt | ||
| ) |
Calcula el flujo máximo de una red capacitada y determina el corte mÃnimo.
min_cut() recibe una red capacitada cuyo flujo es maximizado y luego, a partir del flujo máximo, se calcula el corte mÃnimo. La rutina recibe dos parámetros tipo:
| [in,out] | net | la red a maximizar el flujo y de la cual se desea calcular un corte mÃnimo |
| [out] | vs | el conjunto de nodos . |
| [out] | vt | el conjunto de nodos . |
| [out] | cuts | el conjunto de arcos que van de hacia . Este es el corte. |
| [out] | cutt | el conjunto de arcos que van de hacia . |
| leave_residual | leave_residual indica si la red residual requerida para los cálculos parciales debe dejarse instanciada o no. Por omisión, la red residual, asà como el supra grafo en caso de que la red tenga varios fuentes o sumideros, son liberados al final del cálculo. Si el parámetro es true, entonces la red residual queda instanciada y eventualmente utilizable por otros algoritmos. |
Here is the call graph for this function:| Net::Flow_Type Aleph::random_preflow_maximum_flow | ( | Net & | net | ) |
Flujo máximo de empuje de preflujo con cola aleatoria de nodos activos.
random_preflow_vertex_push_maximum_flow(net) calcula el flujo máximo de la red net en donde los nodos activos, aquellos cuyo flujo de entrada es mayor que el de salida son almacenados en una cola aleatoria.
Durante la ejecución del algoritmo se emplean los contadores y cookies de todos los nodos de la red. El bit Maximum_Flow es usado para los arcos.
| [in,out] | net | una red capacitada a maximizar su flujo. net puede tener varios fuentes y sumideros. |
| [in] | leave_residual | indica si la red residual requerida para los cálculos parciales debe dejarse instanciada o no. Por omisión, la red residual, asà como el supra grafo en caso de que la red tenga varios fuentes o sumideros, son liberados al final del cálculo. Si el parámetro es true, entonces la red residual queda instanciada y eventualmente utilizable por otros algoritmos. |
| bad_alloc | si no hay suficiente memoria. |
Here is the caller graph for this function:
|
noexcept |
Retorna el flujo restante según que a respecto al nodo p sea o no un arco residual.