50. Proyecto integrador de teoría de grafos aplicada

Diseñaremos un analizador de red logística que reutiliza una misma estructura para responder preguntas diferentes: conectividad, ruta mínima, infraestructura básica, capacidad de transporte y tolerancia a fallos.

50.1 Planteamiento del proyecto

Una empresa opera centros logísticos conectados por rutas bidireccionales. Cada conexión posee distancia y capacidad máxima.

El sistema debe analizar la red, visualizar resultados y comparar el funcionamiento normal con escenarios de fallo.

50.2 Objetivos funcionales

  • Cargar y validar centros y conexiones.
  • Comprobar que toda la red sea alcanzable.
  • Encontrar la ruta de menor distancia.
  • Calcular una infraestructura de conexión mínima.
  • Estimar el flujo máximo entre origen y destino.
  • Simular la pérdida de una conexión.
  • Explicar visualmente cada resultado.

50.3 Modelo del dominio

Cada centro es un vértice. Cada ruta es una arista no dirigida con dos atributos numéricos.

centro: { id, nombre, coordenadas }
ruta: { origen, destino, distancia, capacidad }

La distancia se usa para caminos mínimos y MST; la capacidad se usa para flujo.

50.4 Una red, varias interpretaciones

La misma arista tiene diferentes significados según la pregunta:

AnálisisValor usadoObjetivo
RutaDistanciaMinimizar recorrido
MSTDistancia o costo de instalaciónConectar con costo total mínimo
FlujoCapacidadMaximizar transporte
ResilienciaTopologíaMantener conectividad ante fallos

50.5 Datos del ejemplo

El laboratorio contiene siete centros y once rutas. Los datos son pequeños para poder inspeccionar los resultados, pero la arquitectura separa modelo, algoritmos y vista.

const ruta = {
  origen: "C",
  destino: "D",
  distancia: 3,
  capacidad: 4
};

50.6 Laboratorio integrador

Ejecuta cada análisis. Luego falla C–D y vuelve a calcular la ruta para observar cómo la alternativa aumenta la distancia.

Conexiones seleccionadas

Resultado

Selecciona un análisis.

Interpretación

La red inicial es conexa.
Escenario normal.
Centros7
Rutas activas11
Componentes1
Análisis actual

50.7 Validación de entrada

Antes de ejecutar algoritmos se comprueba:

  • Identificadores de centros únicos.
  • Extremos existentes para cada ruta.
  • Distancias y capacidades finitas no negativas.
  • Política explícita para rutas duplicadas y bucles.
  • Existencia del origen y destino solicitados.

50.8 Conectividad

BFS o DFS desde cualquier centro debe visitar los siete vértices. Si no ocurre, las rutas y flujos entre componentes son imposibles.

visitados = |V| ⇒ red conexa

La conectividad es una precondición útil antes de calcular un árbol generador.

50.9 Ruta mínima

Dijkstra usa la distancia de cada ruta. En el escenario normal obtiene A–C–D–F–G con costo 12.

La ruta se reconstruye mediante predecesores; no basta con devolver solamente el costo.

50.10 Árbol de expansión mínima

Kruskal selecciona seis rutas para conectar los siete centros con costo total 15.

MST: B–C, D–E, F–G, A–C, C–D y E–F

El MST minimiza infraestructura, pero elimina redundancia; no debe confundirse con la red operativa más resiliente.

50.11 Flujo máximo

Para el flujo, cada ruta bidireccional se modela con capacidad en ambos sentidos y se aplican caminos aumentantes. Entre A y G, Edmonds–Karp obtiene un flujo máximo de 11 unidades.

El resultado mide capacidad agregada bajo el modelo, no garantiza que una política logística real permita dividir envíos de esa manera.

50.12 Simulación de fallos

Al retirar C–D, la red continúa conectada, pero la ruta mínima cambia a A–C–E–G y aumenta de 12 a 14. En este caso, el flujo máximo se mantiene en 11: un fallo puede degradar una métrica sin afectar otra.

impacto del fallo = métrica posterior − métrica inicial

Repetir la simulación para cada arista produce un ranking de criticidad.

50.13 Resiliencia

Puentes y vértices de corte revelan fallos que desconectan la red. Sin embargo, un enlace también puede ser crítico por aumentar mucho costos o reducir capacidad aunque no desconecte.

La resiliencia debe evaluar conectividad, degradación de rutas y pérdida de flujo.

50.14 Separación de responsabilidades

class RedLogistica {
  agregarCentro(centro) { /* modelo */ }
  agregarRuta(ruta) { /* modelo */ }
  validar() { /* reglas del dominio */ }
}

function rutaMinima(red, origen, destino) { /* algoritmo */ }
function dibujarRed(red, resultado) { /* vista */ }

Separar capas permite probar algoritmos sin canvas y cambiar la interfaz sin reescribir el modelo.

50.15 Pruebas automatizadas

Cada algoritmo necesita casos pequeños con respuestas conocidas y pruebas de integración sobre la red completa.

  • La ruta comienza y termina correctamente.
  • Cada par consecutivo tiene una arista activa.
  • El costo coincide con la suma de distancias.
  • El MST contiene |V|−1 aristas, es conexo y acíclico.
  • El flujo respeta capacidad y conservación.

50.16 Complejidad

AnálisisImplementaciónTiempo
ConectividadBFS/DFSO(V+E)
RutaDijkstra con montículoO((V+E) log V)
MSTKruskalO(E log E)
FlujoEdmonds–KarpO(VE²)

50.17 Experiencia de usuario

La interfaz debe explicar qué representa cada color, peso y resultado. Un valor sin unidades o una ruta sin costo es difícil de interpretar.

Los controles deben reiniciar correctamente el estado y anunciar cambios para tecnologías de asistencia.

50.18 Entregables sugeridos

  • Documento del modelo y sus supuestos.
  • Archivo de datos de ejemplo.
  • Módulo reutilizable de estructura de grafo.
  • Implementaciones y pruebas de algoritmos.
  • Interfaz de visualización y simulación.
  • Informe con resultados normales y escenarios de fallo.

50.19 Extensiones

  • Editar centros y rutas desde la interfaz.
  • Importar y exportar JSON o GraphML.
  • Comparar varios orígenes y destinos.
  • Agregar ventanas de tiempo y costos variables.
  • Calcular centralidades y comunidades.
  • Persistir el modelo en una base de datos de grafos.
  • Generar reportes automáticos de resiliencia.

50.20 Cierre del curso

La teoría de grafos ofrece mucho más que una colección de algoritmos. Proporciona una forma de modelar relaciones, formular preguntas precisas y elegir estructuras que convierten problemas reales en cálculos verificables.

El paso siguiente consiste en aplicar estas técnicas a datos propios: comenzar con un modelo pequeño, validar cada resultado y ampliar la solución solo cuando las preguntas del dominio lo requieran.