Posgrado → Personalización → Optimización Combinatoria ↓
Programación entera
La programación entera es una rama de la optimización matemática o programación matemática. En este contexto, "optimización" significa seleccionar el mejor elemento de un conjunto dado de alternativas disponibles, con respecto a algún criterio. La programación entera trata específicamente problemas de optimización donde algunas o todas las variables están restringidas a ser enteras.
Tipos de programación entera
- Programación entera pura (PIP): Todas las variables de decisión deben tomar valores enteros.
- Programación entera mixta (MIP): Solo algunas de las variables deben ser enteras, mientras que otras pueden no ser enteras.
- Programación entera binaria: Caso especial de programación entera donde las variables están limitadas a 0 o 1. A menudo se utiliza para decisiones de sí/no.
Importancia en la optimización combinatoria
Muchos problemas en optimización combinatoria pueden formularse como problemas de programación entera. La optimización combinatoria se centra en objetos que son discretos o que pueden contarse. Dado que los valores enteros son discretos, la programación entera es la mejor manera de resolver esos problemas y se vuelve importante en su resolución.
Formulación del problema de programación entera
El problema de programación entera generalmente se formula de la siguiente manera:
Maximizar (o Minimizar): c 1 x 1 + c 2 x 2 + ... + c n x n
Sujeto a:
a 11 x 1 + a 12 x 2 + ... + a 1n x n ≤ b 1
a 21 x 1 + a 22 x 2 + ... + a 2n x n ≤ b 2
...
a m1 x 1 + a m2 x 2 + ... + a mn x n ≤ b m
Donde: x 1 , x 2 , ..., x n son enteros
Aquí, c i
denota los coeficientes de la función objetivo que desea maximizar o minimizar, a ij
denota los coeficientes de las restricciones y b i
denota los límites de las restricciones.
Ejemplo: el problema de la mochila
Consideremos un ejemplo clásico de programación entera: el problema de la mochila. El objetivo es maximizar el valor total de los artículos colocados en la mochila, sin exceder su capacidad de carga.
Ejemplo de un problema de mochila:
- Artículos: 4 artículos con pesos
w = [2, 3, 4, 5]
y valoresv = [3, 4, 5, 6]
- Capacidad: Esta bolsa puede transportar el peso de máximo 5 personas.
Formule el problema de la mochila utilizando la programación entera:
Maximizar: 3x 1 + 4x 2 + 5x 3 + 6x 4
Sujeto a: 2x 1 + 3x 2 + 4x 3 + 5x 4 ≤ 5
Donde: x 1 , x 2 , x 3 , x 4 ∈ {0, 1}
La restricción x i ∈ {0, 1}
asegura que cada artículo pueda incluirse o no en la bolsa.
Representación visual
Esta vista muestra un modelo simplificado de una bolsa con el peso empaquetado en orden descendente.
Resolución de problemas de programación entera
Los problemas de programación entera son generalmente NP-duros, lo que significa que no se conocen algoritmos que puedan resolver todos esos problemas de manera eficiente (en tiempo polinómico). Sin embargo, se pueden adoptar varios enfoques para resolver problemas específicos.
1. Método de ramificación y acotación
Es un método ampliamente utilizado para resolver problemas de programación entera. La idea básica es dividir el problema en problemas más pequeños (ramificaciones) y encontrar la solución óptima evaluando los límites de estos subproblemas, mientras que los subproblemas deben eliminarse sistemáticamente si sus límites indican que no pueden contener una mejor solución (límite).
2. Método de planos de corte
Este método mejora la relajación lineal del problema de programación entera al insertar iterativamente restricciones lineales (planos de corte) en el problema, con el objetivo de filtrar las regiones del espacio de soluciones que no tienen soluciones enteras.
Aplicaciones prácticas de la programación entera
- Asignación de recursos: asignación de recursos limitados entre actividades competitivas.
- Programación: Asignar marcos de tiempo a tareas, como horarios de trabajo, horarios de transporte, etc.
- Diseño de redes: diseño de rutas de redes, especificación de ancho de banda, etc.
- Planificación de producción: Planificación de actividades de producción, como la cantidad de productos a producir.
Ejemplo de problema: programación de tareas
Considere un conjunto de algunas tareas, cada una de las cuales tiene un tiempo de procesamiento y una fecha límite específicos. El objetivo es programar las tareas de tal manera que se minimice la latencia total, que es la cantidad en que se retrasan las tareas para completar y tardan más que la fecha límite.
Ejemplo:
- Trabajos: Trabajo 1, Trabajo 2, Trabajo 3, tiempos de procesamiento 2, 4, 3 y fechas límite 2, 6, 5 respectivamente.
Formule este problema de programación utilizando la programación entera:
Minimizar: T 1 + T 2 + T 3
Sujeto a:
x 1,1 + x 1,2 + x 1,3 = 1
x 2,1 + x 2,2 + x 2,3 = 1
x 3,1 + x 3,2 + x 3,3 = 1
Restricciones de finalización:
C 1 = 2x 1,1 + 4x 2,1 + 3x 3,1
C 2 = C 1 + 2x 1,2 + 4x 2,2 + 3x 3,2
C 3 = C 2 + 2x 1,3 + 4x 2,3 + 3x 3,3
Donde:
T i = max(0, C i - plazo i )
x i,j ∈ {0, 1}
Ventajas de la programación entera
La programación entera proporciona un marco poderoso para resolver muchos problemas complejos de toma de decisiones, debido a su capacidad para modelar requisitos lógicos dentro de problemas de optimización. Esto es particularmente beneficioso cuando:
- Las decisiones pueden representarse naturalmente en términos de encendido/apagado (por ejemplo, si invertir o no).
- Su solución debe adherirse a restricciones lógicas estrictas.
- Deberá resolver problemas donde algunas de las variables requieran valores diferentes.
Conclusión
La programación entera juega un papel vital no solo en el amplio campo de la optimización sino también en muchas aplicaciones prácticas en diversas industrias. A pesar de su complejidad e intensidad computacional, existen estrategias y heurísticas efectivas que pueden usarse para obtener soluciones factibles a problemas del mundo real. A medida que el poder de cálculo continúa aumentando, la programación entera se está volviendo más útil y generalizada en la gestión de desafíos complejos de toma de decisiones.