Algoritmo de Ford-Fulkerson (Flujo Máximo)
El algoritmo de Ford-Fulkerson es un método para encontrar el flujo máximo en una red de flujo, es decir, el flujo máximo que puede ser enviado desde una fuente a un sumidero en un grafo dirigido con capacidades en sus aristas. La idea básica del algoritmo es mejorar iterativamente el flujo a través del grafo hasta que no se pueda encontrar ningún camino adicional con capacidad residual positiva.
Definición Matemática
En un grafo dirigido \( G = (V, E) \) con una función de capacidad \( c: E \to \mathbb{R}^+ \), donde \( V \) es el conjunto de vértices y \( E \) es el conjunto de aristas, el flujo máximo se define como el máximo flujo que se puede enviar desde un vértice fuente \( s \) a un vértice sumidero \( t \). El flujo en una arista \( (u, v) \in E \) se denota como \( f(u, v) \) y debe cumplir las siguientes condiciones:
1. Conservación del Flujo:
El flujo en cada vértice, excepto la fuente y el sumidero, debe ser conservado, es decir, el flujo total que entra en el vértice debe ser igual al flujo total que sale del vértice.
\[
\sum_{u \in V} f(u, v) = \sum_{w \in V} f(v, w) \quad \text{para todo } v \in V \setminus \{s, t\}
\]
2. Capacidad de la Arista:
El flujo en cada arista no debe exceder su capacidad.
\[
0 \leq f(u, v) \leq c(u, v) \quad \text{para todo } (u, v) \in E
\]
3. Flujo Máximo:
El flujo total desde la fuente \( s \) al sumidero \( t \) es:
\[
\text{Flujo Total} = \sum_{v \in V} f(s, v) - \sum_{v \in V} f(v, s)
\]
El objetivo es maximizar este flujo total.
Proceso del Algoritmo de Ford-Fulkerson
1. Inicialización:
Inicializa el flujo en todas las aristas a cero. Define el flujo máximo inicial como 0.
2. Búsqueda de Caminos Aumentantes:
Busca un camino aumentante desde la fuente \( s \) al sumidero \( t \) en el grafo residual. El grafo residual es el grafo en el que las capacidades de las aristas reflejan las capacidades residuales disponibles después de considerar el flujo actual.
- Camino Aumentante: Un camino en el grafo residual a lo largo del cual se puede aumentar el flujo.
3. Aumento de Flujo:
Para el camino aumentante encontrado, determina la capacidad mínima residual en ese camino, llamada \( \text{capacidad de aumento} \). Luego, aumenta el flujo a lo largo del camino por esa capacidad de aumento.
4. Actualización del Grafo Residual:
Actualiza las capacidades residuales en el grafo residual. Reduce la capacidad de las aristas a lo largo del camino aumentante en la cantidad de flujo aumentado y aumenta la capacidad de las aristas en sentido inverso en la misma cantidad.
5. Repetición:
Repite el proceso de búsqueda de caminos aumentantes y aumento de flujo hasta que no se pueda encontrar más caminos aumentantes en el grafo residual.
6. Resultado:
Cuando no se encuentran más caminos aumentantes, el flujo total acumulado es el flujo máximo desde la fuente \( s \) al sumidero \( t \).
Propiedades Matemáticas
1. Correctitud:
El algoritmo de Ford-Fulkerson siempre encuentra el flujo máximo, dado que el grafo tiene capacidades enteras y se encuentra un camino aumentante en cada iteración.
2. Complejidad:
La complejidad del algoritmo depende del método de búsqueda de caminos aumentantes. Si se usa búsqueda en profundidad (DFS), el tiempo de ejecución puede ser exponencial en el peor caso. Usar búsqueda en anchura (BFS) para encontrar el camino aumentante (algoritmo de Edmonds-Karp) mejora la complejidad a \( O(VE^2) \).
3. Capacidades Fraccionarias:
En el caso de capacidades fraccionarias (no enteras), el algoritmo puede no terminar en un número finito de pasos. En tal caso, se usa el algoritmo de flujo máximo de capacidad fraccionaria.
Aplicaciones
- Redes de Transporte: Optimizar el flujo de recursos o datos en redes de transporte o comunicación.
- Sistemas de Distribución de Recursos: Maximizar el suministro de recursos desde varias fuentes a varios destinos en un sistema de distribución.
- Problemas de Emparejamiento: Resolver problemas de emparejamiento en bipartitos y redes de emparejamiento.
El algoritmo de Ford-Fulkerson proporciona una solución fundamental para problemas de flujo en redes, permitiendo la optimización de recursos en diversas aplicaciones prácticas.
Algoritmo de Dijkstra para Flujos Mínimos de Costo
El algoritmo de Dijkstra es un método clásico para encontrar el camino más corto desde una fuente a todos los demás vértices en un grafo ponderado. Aunque tradicionalmente se usa para problemas de caminos más cortos, también se puede adaptar para resolver problemas de flujo mínimo de costo en redes, donde se busca el flujo que minimice el costo total en una red con costos asociados a las aristas.
Definición Matemática
En un grafo dirigido \( G = (V, E) \) con una función de capacidad \( c: E \to \mathbb{R}^+ \) y una función de costo \( \text{cost}: E \to \mathbb{R}^+ \), donde \( V \) es el conjunto de vértices y \( E \) es el conjunto de aristas, el problema de flujo mínimo de costo busca encontrar el flujo que minimice el costo total desde una fuente \( s \) a un sumidero \( t \).
El flujo en una arista \( (u, v) \in E \) se denota como \( f(u, v) \) y debe cumplir las siguientes condiciones:
1. Conservación del Flujo:
El flujo en cada vértice, excepto la fuente y el sumidero, debe ser conservado, es decir, el flujo total que entra en el vértice debe ser igual al flujo total que sale del vértice.
\[
\sum_{u \in V} f(u, v) = \sum_{w \in V} f(v, w) \quad \text{para todo } v \in V \setminus \{s, t\}
\]
2. Capacidad de la Arista:
El flujo en cada arista no debe exceder su capacidad.
\[
0 \leq f(u, v) \leq c(u, v) \quad \text{para todo } (u, v) \in E
\]
3. Costo del Flujo:
El costo total del flujo se define como:
\[
\text{Costo Total} = \sum_{(u, v) \in E} \text{cost}(u, v) \cdot f(u, v)
\]
El objetivo es minimizar este costo total mientras se satisface la demanda de flujo desde \( s \) hasta \( t \).
Adaptación del Algoritmo de Dijkstra
El algoritmo de Dijkstra puede adaptarse para encontrar el camino más corto en términos de costo en un grafo dirigido con costos en las aristas. Este enfoque se utiliza como parte del algoritmo de flujo mínimo de costo.
1. Inicialización:
Inicializa la distancia de la fuente \( s \) a sí misma como 0 y a todos los demás vértices como infinito. Inicializa un conjunto de vértices no visitados.
2. Relajación de Aristas:
Para el vértice actual \( u \), actualiza las distancias a los vecinos \( v \) a través de la arista \( (u, v) \) si se encuentra un camino de menor costo:
\[
\text{dist}(v) = \min(\text{dist}(v), \text{dist}(u) + \text{cost}(u, v))
\]
3. Selección del Vértice Siguiente:
Selecciona el vértice no visitado con la menor distancia calculada y márcalo como visitado.
4. Repetición:
Repite el proceso de relajación y selección de vértices hasta que todos los vértices hayan sido visitados.
5. Resultado:
Las distancias finales proporcionan el costo mínimo de alcanzar cada vértice desde la fuente.
Aplicaciones en Flujos Mínimos de Costo
- Redes de Transporte: Encontrar la forma más económica de transportar bienes a través de una red.
- Redes de Comunicación: Minimizar el costo del uso de la red para la transmisión de datos.
- Sistemas de Distribución de Recursos: Optimizar el costo total en la distribución de recursos en redes logísticas.
El algoritmo de Dijkstra adaptado para flujos mínimos de costo proporciona una solución eficiente para problemas de optimización en redes, permitiendo la minimización de costos en diversas aplicaciones prácticas.
Algoritmo de Ford-Fulkerson con Costos Mínimos (Algoritmo de Flujo Máximo de Costo Mínimo):
El algoritmo de Ford-Fulkerson es un método utilizado para encontrar el flujo máximo en una red de flujo. Cuando se incorporan los costos de las aristas, el problema se convierte en encontrar el flujo máximo con el costo mínimo. Esta variante se conoce como el algoritmo de flujo máximo de costo mínimo.
Definición Matemática
Dado un grafo dirigido \( G = (V, E) \) con una función de capacidad \( c: E \to \mathbb{R}^+ \), una función de costo \( \text{cost}: E \to \mathbb{R}^+ \), y dos vértices, la fuente \( s \) y el sumidero \( t \), el objetivo es encontrar el flujo máximo desde \( s \) a \( t \) que minimice el costo total. El flujo en una arista \( (u, v) \in E \) se denota como \( f(u, v) \).
El problema de flujo máximo de costo mínimo se define como:
1. Conservación del Flujo:
El flujo en cada vértice, excepto la fuente y el sumidero, debe ser conservado:
\[
\sum_{u \in V} f(u, v) = \sum_{w \in V} f(v, w) \quad \text{para todo } v \in V \setminus \{s, t\}
\]
2. Capacidad de la Arista:
El flujo en cada arista no debe exceder su capacidad:
\[
0 \leq f(u, v) \leq c(u, v) \quad \text{para todo } (u, v) \in E
\]
3. Costo del Flujo:
El costo total del flujo se define como:
\[
\text{Costo Total} = \sum_{(u, v) \in E} \text{cost}(u, v) \cdot f(u, v)
\]
El objetivo es maximizar el flujo desde \( s \) a \( t \) mientras se minimiza el costo total.
Algoritmo de Flujo Máximo de Costo Mínimo
1. Inicialización:
Comienza con un flujo inicial de 0 en todas las aristas. Calcula el camino aumentante utilizando un algoritmo que considere los costos de las aristas.
2. Búsqueda de Caminos Aumentantes:
Encuentra el camino aumentante de costo mínimo desde la fuente \( s \) al sumidero \( t \). Un algoritmo comúnmente usado es una versión modificada del algoritmo de Dijkstra para encontrar el camino de menor costo en términos de flujo.
3. Ajuste del Flujo:
Aumenta el flujo a lo largo del camino encontrado. Ajusta el flujo en cada arista del camino y actualiza las capacidades residuales. La capacidad residual de una arista \( (u, v) \) se actualiza restando el flujo \( f(u, v) \), y la capacidad residual inversa se actualiza sumando el flujo.
4. Repetición:
Repite el proceso de búsqueda de caminos aumentantes y ajuste del flujo hasta que no se pueda encontrar más caminos aumentantes.
5. Cálculo del Costo:
Una vez que el flujo máximo ha sido encontrado, calcula el costo total utilizando la fórmula del costo total del flujo.
6. Resultado:
El flujo máximo con el costo mínimo y el costo total asociado se obtiene como el resultado final.
Aplicaciones
- Optimización de Redes: Minimizar el costo total en redes de transporte y comunicación mientras se maximiza el flujo de recursos.
- Sistemas Logísticos: Encontrar la forma más económica de distribuir recursos en una red de distribución.
- Problemas de Planificación: Resolver problemas en los que se necesita optimizar tanto el flujo como el costo en sistemas de planificación.
El algoritmo de flujo máximo de costo mínimo combina la capacidad de maximizar el flujo con la optimización del costo total, proporcionando una solución eficiente para una amplia gama de problemas en redes de flujo.