Materia: #técnicas_y_diseños_de_algoritmos
Tags: Dígrafos
Flujo en redes
Llamamos red a un grafo orientado
El flujo es una corriente de una entidad (que depende del contexto) que viaja a traves del grafo. La fuente produce esta corriente de manera indefinida, y el sumidero la consume de igual forma. Los vértices que no son ni la fuente ni el sumidero, no producen ni consumen el material, por lo que la cantidad que entra debe ser igual a la cantidad que sale. El grafo es pesado, pero en este contexto, el peso de cada arista se considera la capacidad maxima de flujo de la misma.
Un ejemplo podria ser una red de cañería, que atraviesa varias ciudades. Los caños son representados por las aristas, y los vértices indican las ciudades. A su vez, cada cañeria tiene su capacidad maxima de liquido. Graficamente, e inventando los numeros, el ejemplo podria verse asi:
flowchart LR nodeSource((s)) nodeEnd((t)) nodeA((a)) nodeB((b)) nodeC((c)) nodeD((d)) nodeSource -->|2| nodeB nodeA -->|1| nodeB nodeA -->|10| nodeC nodeB -->|2| nodeD nodeC -->|3| nodeD nodeC -->|5| nodeEnd nodeD -->|7| nodeEnd nodeSource -->|5| nodeA
La idea no se aleja mucho de un digrafo pesado.
Llamamos flujo factible a una función
para toda arista . - La ley de conversación de flujo, que dice:
para todo vértice
El valor del flujo es
En el ejemplo de antes, un flujo factible (pero no el unico), podria ser:
flowchart LR nodeSource((s)); nodeEnd((t)); nodeA((a)); nodeB((b)); nodeC((c)); nodeD((d)); nodeSource -->|2/2| nodeB; nodeA -->|0/1| nodeB; nodeA -->|4/10| nodeC; nodeB -->|2/2| nodeD; nodeC -->|2/3| nodeD; nodeC -->|2/5| nodeEnd; nodeD -->|4/7| nodeEnd; nodeSource -->|4/5| nodeA;
Cortes, redes residuales y camino de aumento
Es normal preguntarse si, dada una red
En nuestro ejemplo de antes, es facil ver que
flowchart LR nodeSource((s)); nodeEnd((t)); nodeA((a)); nodeB((b)); nodeC((c)); nodeD((d)); nodeSource -->|2/2| nodeB; nodeA -->|0/1| nodeB; nodeA -->|5/10| nodeC; nodeB -->|2/2| nodeD; nodeC -->|2/3| nodeD; nodeC -->|3/5| nodeEnd; nodeD -->|4/7| nodeEnd; nodeSource -->|5/5| nodeA;
Haciendo que ahora
Para resolver el problema del flujo máximo necesitamos definir mas propiedades de las redes.
Llamamos corte en la red
donde
Todo esto, en criollo, significa que un corte es para una red lo que un subgrafo es para un grafo. Es decir, un corte es una porción de una red. Para contar el valor de
flowchart LR nodeSource((s)); nodeEnd((t)); nodeA((a)); nodeB((b)); nodeC((c)); nodeD((d)); subgraph Corte 1 nodeSource; end nodeSource -->|2/2| nodeB; nodeA -->|0/1| nodeB; nodeA -->|5/10| nodeC; nodeB -->|2/2| nodeD; nodeC -->|2/3| nodeD; nodeC -->|3/5| nodeEnd; nodeD -->|4/7| nodeEnd; nodeSource -->|5/5| nodeA;
flowchart LR nodeSource((s)); nodeEnd((t)); nodeA((a)); nodeB((b)); nodeC((c)); nodeD((d)); subgraph Corte 2 nodeSource; nodeA; end nodeSource -->|2/2| nodeB; nodeA -->|0/1| nodeB; nodeA -->|5/10| nodeC; nodeB -->|2/2| nodeD; nodeC -->|2/3| nodeD; nodeC -->|3/5| nodeEnd; nodeD -->|4/7| nodeEnd; nodeSource -->|5/5| nodeA;
flowchart LR nodeSource((s)); nodeEnd((t)); nodeA((a)); nodeB((b)); nodeC((c)); nodeD((d)); subgraph Corte 3 nodeSource; nodeA; nodeB; nodeC; end nodeSource -->|2/2| nodeB; nodeA -->|0/1| nodeB; nodeA -->|5/10| nodeC; nodeB -->|2/2| nodeD; nodeC -->|2/3| nodeD; nodeC -->|3/5| nodeEnd; nodeD -->|4/7| nodeEnd; nodeSource -->|5/5| nodeA;
Definimos la capacidad de un corte como la suma de las capacidades de todos las aristas que salen del corte. Por ejemplo, en los dibujos de arriba las capacidades del corte 1, 2 y 3 son 7, 13 y 10 respectivamente. Un problema conocido en redes es el de buscar el corte de capacidad mínima.
Otra definición importante es la de red residual. Dada una red
-
si . -
si .
Es decir, una red residual es una red que, en base a una red con un flujo factible, indica hacia donde el flujo podria moverse. Nos va a ser util mas adelante para maximizar el valor del flujo final
flowchart LR nodeSource((s)); nodeEnd((t)); nodeA((a)); nodeB((b)); nodeC((c)); nodeD((d)); nodeC -->|1| nodeD; nodeA -->|1| nodeB; nodeA -->|5| nodeC; nodeC -->|5| nodeA; nodeD -->|2| nodeB; nodeD -->|2| nodeC; nodeC -->|2| nodeEnd; nodeEnd -->|3| nodeC; nodeD -->|3| nodeEnd; nodeEnd -->|4| nodeD; nodeA -->|5| nodeSource; nodeB -->|2| nodeSource;
Finalmente, un camino de aumento es un camino orientado de