Métodos de Programación Lineal
Herramienta educativa con visualización paso a paso de siete métodos de optimización
Investigación de Operaciones - Universidad Tecnológica de Pereira (UTP) - 2025
¿Qué es la Programación Lineal?
La programación lineal (PL) es una técnica matemática de optimización que permite encontrar la mejor solución (máximo o mínimo) de una función objetivo lineal, sujeta a un conjunto de restricciones lineales.
Componentes de un Problema de PL:
- Variables de decisión: Cantidades a determinar (x₁, x₂, ..., xₙ)
- Función objetivo: Expresión matemática a optimizar
- Restricciones: Limitaciones del problema (desigualdades o ecuaciones)
- No-negatividad: xᵢ ≥ 0 (cuando aplica)
Aplicaciones Prácticas:
- Planificación de producción
- Asignación de recursos
- Optimización de rutas y logística
- Gestión de inventarios
- Planificación financiera
- Mezcla de productos
Métodos de Resolución Implementados
Esta aplicación implementa siete algoritmos con visualización paso a paso para propósitos educativos
Método Gráfico
📊 Especialidad: Problemas con 2 variables
🎯 Características:
- Representación visual de restricciones
- Región factible en el plano
- Evaluación de vértices
- Gráfica interactiva generada
✅ Ventajas: Intuitivo, visual, ideal para aprendizaje
⚠️ Limitaciones: Solo funciona con 2 variables
Método Simplex
🚀 Especialidad: Problemas de n variables
🎯 Características:
- Algoritmo iterativo eficiente
- Tableau con variables slack/surplus
- Identificación de pivotes
- Operaciones de fila documentadas
✅ Ventajas: Escalable, sistemático, robusto
⚠️ Limitaciones: Requiere forma estándar inicial
Dual Simplex
🔄 Especialidad: Problemas duales y análisis
🎯 Características:
- Comienza con solución dual factible
- Selección de fila con RHS negativo
- Cálculo de ratios zⱼ/aᵢⱼ
- Ideal para restricciones ≥
✅ Ventajas: Análisis de sensibilidad, complementario
⚠️ Limitaciones: Requiere configuración específica
Dijkstra
🛣️ Especialidad: Camino más corto en grafos
🎯 Características:
- Algoritmo de camino mínimo
- Usa cola de prioridad (heap)
- Visualización interactiva con Vis.js
- Soporta grafos dirigidos/no dirigidos
✅ Ventajas: Eficiente O((V+E)log V), versátil
⚠️ Limitaciones: No funciona con pesos negativos
Kruskal
🌳 Especialidad: Árbol de expansión mínima
🎯 Características:
- Algoritmo MST (Minimum Spanning Tree)
- Usa estructura Union-Find
- Doble visualización con Vis.js
- Ordena aristas por peso
✅ Ventajas: O(E log E), conexión óptima
⚠️ Limitaciones: Solo grafos no dirigidos
Método Gráfico en Detalle
El método gráfico es la forma más intuitiva de resolver problemas de programación lineal, pero está limitado a dos variables de decisión (x₁ y x₂).
Procedimiento:
- Graficar restricciones: Cada desigualdad se representa como una línea en el plano cartesiano
- Identificar región factible: Área que satisface todas las restricciones simultáneamente
- Localizar vértices: Intersecciones de las rectas
- Evaluar función objetivo: Calcular Z en cada vértice
- Seleccionar óptimo: El vértice con mejor valor de Z
Casos de Uso Ideales:
- Problemas de mezcla de dos productos
- Asignación de dos recursos
- Enseñanza y aprendizaje de PL
- Validación de resultados de otros métodos
Método Simplex en Detalle
El método Simplex es el algoritmo estándar para resolver problemas de programación lineal con cualquier número de variables. Desarrollado por George Dantzig en 1947.
Fundamento Teórico:
El algoritmo se basa en el teorema de que si existe una solución óptima, se encuentra en un vértice del poliedro convexo definido por las restricciones. El método se mueve sistemáticamente de un vértice a otro adyacente, mejorando el valor de la función objetivo hasta alcanzar el óptimo.
Fases del Algoritmo:
- Forma estándar: Convertir restricciones ≤ en ecuaciones con variables slack
- Tableau inicial: Construir la matriz del sistema con solución básica factible
- Test de optimalidad: Verificar si todos los coeficientes de Z son ≤ 0 (max) o ≥ 0 (min)
- Seleccionar pivote: Columna (más negativa) y fila (ratio mínimo RHS/coef)
- Operaciones de fila: Hacer pivote = 1 y ceros en su columna
- Iterar: Repetir hasta alcanzar optimalidad
Ventajas Principales:
- Escalabilidad: Puede resolver problemas con cientos de variables
- Eficiencia: Polinomial en la práctica (aunque exponencial en el peor caso)
- Robustez: Maneja múltiples tipos de restricciones
- Base teórica: Fundamentado matemáticamente
Aplicaciones Típicas:
- Planificación de producción con múltiples productos
- Problemas de transporte y asignación
- Optimización de dietas y mezclas
- Programación de personal y turnos
Método Dual Simplex en Detalle
El método Dual Simplex es una variante complementaria del Simplex que trabaja desde una solución dual factible hacia la factibilidad primal, manteniendo la optimalidad dual en cada iteración.
Dualidad en Programación Lineal:
Cada problema de PL (primal) tiene un problema asociado (dual). El método Dual Simplex es especialmente útil cuando:
- El problema tiene muchas restricciones del tipo ≥ (minimización)
- Se requiere análisis de sensibilidad
- La solución inicial viola restricciones (RHS negativo)
Procedimiento Dual:
- Tableau inicial: Con optimalidad dual (Z row no negativa para min)
- Verificar factibilidad: ¿Todos los RHS ≥ 0?
- Fila saliente: Seleccionar la más negativa en RHS
- Columna entrante: Calcular ratios zⱼ/aᵢⱼ (solo aᵢⱼ < 0), elegir mínimo
- Pivot y actualizar: Operaciones de fila estándar
- Iterar: Hasta factibilidad primal
Casos de Uso Especiales:
- Post-optimización: Cuando se agregan restricciones a una solución óptima existente
- Análisis de sensibilidad: Estudiar cambios en restricciones
- Problemas de minimización: Con restricciones ≥ (forma natural)
- Branch and Bound: En algoritmos de programación entera
En esta Aplicación:
Nuestra implementación muestra:
- Identificación visual de filas con RHS negativo (highlighting rojo)
- Cálculo explícito de ratios zⱼ/aᵢⱼ para selección de columna
- Documentación completa de operaciones de fila
- Convergencia paso a paso hacia factibilidad primal
Algoritmo de Dijkstra en Detalle
El algoritmo de Dijkstra encuentra el camino más corto desde un nodo origen a todos los demás nodos en un grafo con pesos no negativos. Desarrollado por Edsger W. Dijkstra en 1956.
Fundamento:
El algoritmo usa una estrategia greedy (voraz) que mantiene un conjunto de nodos visitados y actualiza iterativamente las distancias mínimas a los nodos no visitados, garantizando optimalidad cuando todos los pesos son no negativos.
Procedimiento:
- Inicialización: Distancia al origen = 0, resto = ∞
- Cola de prioridad: Usar heap para extraer nodo con distancia mínima
- Relajación: Actualizar distancias a vecinos no visitados
- Marcar visitado: El nodo actual no se revisará de nuevo
- Repetir: Hasta visitar todos los nodos alcanzables
- Reconstruir camino: Usar predecesores para obtener ruta óptima
Visualización Interactiva:
Esta aplicación utiliza Vis.js para mostrar el grafo de manera interactiva:
- Nodos arrastrables y ajustables
- Camino óptimo resaltado en azul y verde
- Tabla de distancias a todos los nodos
- Iteraciones detalladas mostrando nodos visitados/no visitados
Aplicaciones Reales:
- GPS y navegación: Rutas óptimas en mapas
- Redes de telecomunicaciones: Enrutamiento de paquetes
- Logística: Rutas de distribución óptimas
- Juegos: Pathfinding para personajes
- Redes sociales: Grados de separación
- Planificación urbana: Diseño de rutas de transporte
Algoritmo de Kruskal en Detalle
El algoritmo de Kruskal encuentra el Árbol de Expansión Mínima (MST) de un grafo conexo no dirigido, conectando todos los nodos con el menor costo total sin formar ciclos. Desarrollado por Joseph Kruskal en 1956.
Concepto de MST:
Un Minimum Spanning Tree es un subgrafo que:
- Conecta todos los vértices del grafo original
- Es un árbol (sin ciclos, con V-1 aristas)
- Tiene la suma mínima de pesos de aristas
- Es único si todos los pesos son diferentes
Procedimiento:
- Ordenar aristas: Por peso ascendente
- Inicializar Union-Find: Cada nodo en su propio conjunto
- Iterar aristas: En orden de peso
- Verificar ciclo: ¿Los extremos están en el mismo conjunto?
- Agregar arista: Si no forma ciclo, incluir en MST y unir conjuntos
- Terminar: Al tener V-1 aristas
Estructura Union-Find:
También llamada Disjoint Set Union (DSU), permite:
- Find: Determinar a qué conjunto pertenece un elemento (con compresión de ruta)
- Union: Unir dos conjuntos (con unión por rango/tamaño)
- Detección de ciclos: Si find(u) == find(v), la arista (u,v) forma ciclo
- Eficiencia: Operaciones casi constantes O(α(n)) ≈ O(1) en la práctica
Doble Visualización:
Esta aplicación muestra dos grafos con Vis.js:
- MST final: Solo aristas seleccionadas (verde) con peso total
- Grafo original: Todas las aristas con indicación de pertenencia al MST
- Tabla de iteraciones: Aristas aceptadas/rechazadas con razón
- Aristas ordenadas: Vista completa con estado de selección
Aplicaciones Reales:
- Redes eléctricas: Cableado con costo mínimo
- Telecomunicaciones: Tendido de fibra óptica
- Redes de tuberías: Distribución de agua/gas
- Diseño de circuitos: Conexiones PCB óptimas
- Clustering: Análisis de datos y agrupamiento
- Redes de transporte: Infraestructura vial mínima
Modelo de Transporte
Distribución óptima desde orígenes a destinos
El Modelo de Transporte es un caso especial de programación lineal que optimiza la distribución de un producto homogéneo desde múltiples orígenes (plantas, almacenes) a múltiples destinos (tiendas, ciudades), minimizando el costo total de transporte.
¿Cuándo usar cada método?
Esquina Noroeste
- Solución rápida inicial
- Fácil de entender y aplicar
- No siempre es óptima
- Buena para empezar otros métodos
Costo Mínimo
- Prioriza costos bajos
- Mejor solución que Noroeste
- Lógica intuitiva: lo más barato primero
- Rápido y eficiente
Vogel (VAM)
- Mejor aproximación a óptimo
- Usa penalizaciones inteligentes
- Más complejo pero más preciso
- Recomendado para uso profesional
Estructura del Problema
Formulación Matemática
Minimizar:
Z = Σᵢ Σⱼ cᵢⱼ × xᵢⱼ
Sujeto a:
Σⱼ xᵢⱼ = sᵢ (oferta del origen i)
Σᵢ xᵢⱼ = dⱼ (demanda del destino j)
xᵢⱼ ≥ 0
Variables del Modelo
- xᵢⱼ: Cantidad transportada del origen i al destino j
- cᵢⱼ: Costo unitario de transporte de i a j
- sᵢ: Oferta disponible en el origen i
- dⱼ: Demanda requerida en el destino j
- m: Número de orígenes
- n: Número de destinos
Comparación de los 3 Métodos
| Característica | Esquina Noroeste | Costo Mínimo | Vogel (VAM) |
|---|---|---|---|
| Complejidad | ⭐ Baja | ⭐⭐ Media | ⭐⭐⭐ Alta |
| Calidad de Solución | Básica | Buena | Excelente |
| Tiempo de Cálculo | Muy rápido | Rápido | Moderado |
| Uso Recomendado | Aprendizaje inicial | Problemas simples | Uso profesional |
Ejemplo Práctico: Distribución de Energía
Problema: Una empresa energética tiene 4 plantas generadoras que deben abastecer la demanda eléctrica de 4 ciudades. Cada planta tiene capacidad limitada y cada ciudad tiene necesidades específicas. El costo de transporte por millón de KW varía según la ruta.
- Planta 1: 80 millones KW
- Planta 2: 30 millones KW
- Planta 3: 60 millones KW
- Planta 4: 45 millones KW
- Cali: 70 millones KW
- Bogotá: 40 millones KW
- Medellín: 70 millones KW
- Barranquilla: 35 millones KW
Objetivo: Determinar cuánta energía debe enviar cada planta a cada ciudad para minimizar el costo total de distribución.
Ventajas del Modelo de Transporte
Comparación de Métodos
| Característica | Gráfico | Simplex | Dual Simplex |
|---|---|---|---|
| Número de variables | Exactamente 2 | 2 a n | 2 a n |
| Complejidad visual | Baja | Media | Media-Alta |
| Mejor para aprender | ✅ Excelente | ✅ Muy bueno | ⚠️ Avanzado |
| Velocidad (problemas grandes) | N/A | Rápido | Rápido |
| Tipo de restricciones ideal | ≤, ≥, = | ≤ (max), ≥ (min) | ≥ (min), análisis |
| Visualización paso a paso | ✅ Gráfica | ✅ Tableau | ✅ Tableau + ratios |
Características de esta Aplicación
Enfoque Educativo:
- Visualización paso a paso de cada iteración
- Explicación de operaciones realizadas
- Highlighting de elementos clave (pivotes, RHS negativo)
- Interfaz intuitiva con colores distintivos
Implementación Técnica:
- Backend: Flask + NumPy (algoritmos manuales)
- Frontend: Bootstrap 5 + CSS personalizado
- Gráficos: Matplotlib para método gráfico
- Tipografía: Google Fonts (Poppins/Inter)
Sistema de Diseño:
- Colores distintivos por método
- Modo oscuro completo
- Animaciones suaves
- Diseño responsivo
Validaciones:
- Parsing robusto de restricciones
- Detección de problemas no factibles
- Manejo de casos especiales
- Mensajes de error informativos
¿Listo para resolver tu problema de PL?
Información Académica
Universidad
Universidad Tecnológica de Pereira
UTP - ColombiaMateria
Investigación de Operaciones
Prof. Bibiana Patricia Arias VilladaDesarrollador
José Miguel Herrera Gutiérrez
Proyecto Investigacion De Operaciones 2025Stack Tecnológico:
Algoritmos Implementados:
- Método Gráfico con Matplotlib
- Simplex Manual con Tableau
- Dual Simplex con Ratios
- Simplex Dos Fases con Artificiales
- Modelo de Transporte (3 métodos)
- Dijkstra con Visualización Vis.js
- Kruskal MST con Union-Find