1) El documento describe el uso de la programación lineal en IBM, incluyendo el lenguaje OPL desarrollado para modelar problemas de optimización. 2) OPL permite expresar problemas de asignación de recursos y planificación de una manera simplificada. 3) Se presentan ejemplos de cómo usar OPL para abordar problemas de programación lineal, programación de enteros, programación lineal mixta y programación lineal por partes.
1. Actividad 7B
Álgebra lineal en programas informáticos. En este caso de I.B.M.
Previamente una breve reseña histórica de Wikipedia
Historia de la programación lineal https://es.wikipedia.org/wiki/Programaci
%C3%B3n_lineal
El problema de la resolución de un sistema lineal de inecuaciones se remonta, al menos,
a Joseph Fourier, después de quien nace el método de eliminación de Fourier-Motzkin.
La programación lineal se plantea como un modelo matemático desarrollado durante
la Segunda Guerra Mundial para planificar los gastos y los retornos, a fin de reducir los
costos al ejército y aumentar las pérdidas del enemigo. Se mantuvo en secreto hasta
1947. En la posguerra, muchas industrias lo usaron en su planificación diaria.
Los fundadores de la técnica son George Dantzig, quien publicó el algoritmo simplex,
en 1947, John von Neumann, que desarrolló la teoría de la dualidad en el mismo año,
y Leonid Kantoróvich, un matemático de origen ruso, que utiliza técnicas similares en la
economía antes de Dantzig y ganó el premio Nobel en economía en 1975. En 1979, otro
matemático ruso, Leonid Khachiyan, diseñó el llamado Algoritmo del elipsoide, a
través del cual demostró que el problema de la programación lineal es resoluble de
manera eficiente, es decir, en tiempo polinomial.2 Más tarde, en 1984, Narendra
Karmarkar introduce un nuevo método del punto interior para resolver problemas de
programación lineal, lo que constituiría un enorme avance en los principios teóricos y
prácticos en el área.
El ejemplo original de Dantzig de la búsqueda de la mejor asignación de 70 personas a
70 puestos de trabajo es un ejemplo de la utilidad de la programación lineal. La potencia
de computación necesaria para examinar todas las permutaciones a fin de seleccionar la
mejor asignación es inmensa (factorial de 70, 70!) ; el número de posibles
configuraciones excede al número de partículas en el universo. Sin embargo, toma sólo
un momento encontrar la solución óptima mediante el planteamiento del problema
como una programación lineal y la aplicación del algoritmo simplex. La teoría de la
programación lineal reduce drásticamente el número de posibles soluciones factibles
que deben ser revisadas.
Utilización de la programación lineal en I.B.M
http://www.ibm.com/support/knowledgecenter/es/SSSA5P
1
3. Aumenta la capacidad de aplicación de los lenguajes de modelado
mediante la incorporación de técnicas de programación de restricciones.
o
o
Mejora la potencia expresiva de las herramientas tradicionales de
programación de restricciones adoptando ideas de lenguajes de
modelado.
o
•
OPL da soporte a aplicaciones de asignación de recursos y planificación, que son
omnipresentes en la industria.
•
•
OPL proporciona un novedoso modelado, así como acceso a algoritmos de
finalidad especial como el procedimiento de buscador de marcas.
Elementos del modelo de producción
http://www.ibm.com/support/knowledgecenter/es/SSSA5P_12.7.0/ilog.odms.ide.help/OPL_Stu
dio/opllanguser/topics/opl_languser_shortTour_LP_elements.html
•
Matrices
•
•
Declaraciones de datos
•
•
3
4. Cuantificadores y operadores de agregado
•
•
Aislar los datos
•
•
Inicialización de datos
•
•
Tuplas
•
•
Visualización de resultados
•
•
Establecimiento de parámetros de CPLEX
•
•
Programación de enteros: el problema de la mochila
•
•
Programación lineal entera mixta: un problema de mezcla
•
Aplicaciones de programación
lineal y con enteros
http://www.ibm.com/support/knowledgecenter/es/SSSA5P_12.7.0/ilog.odms.ide.
help/OPL_Studio/opllanguser/topics/opl_languser_app_areas_linearInteger.html
Estudia la aplicación de OPL a programación lineal, programación de enteros,
programación lineal de enteros mixta y programación lineal por partes.
4
5. • Programación lineal
Define la programación lineal y describe un problema de planificación de
producción simple, un problema de planificación de producción de varios
periodos, un problema de combinación y análisis de sensibilidad.
• Programación con enteros
Define la programación con enteros y describe un problema que abarca
conjuntos, un problema de ubicación de almacén, un problema de tarifa fija y
flexibilización de enteros.
• Programación lineal de enteros mixta
Define programación lineal de enteros mixta y describe una actualización del
problema de planificación de producción para incluir una tarifa fija para los
productos.
• Programación lineal por partes
Define la programación lineal por partes, describe un problema de inventario
con funciones lineales por partes, compara pwl con la programación lineal
simple e indica problemas de complejidad.
Lineal por partes vs. Lineal
http://www.ibm.com/support/knowledgecenter/es/SSSA5P_12.7.0/ilog.odms.ide.
help/OPL_Studio/opllanguser/topics/opl_languser_app_areas_pwl_vs.html
Impone una restricción que da como resultado un programa lineal de enteros mixto.
Tenga en cuenta que no todos los programas lineales por partes son programas lineales.
Recuerde la Nota y supongamos que el coste de los barcos adicionales ha disminuido a
350 $, por ejemplo (debido a economías de escala). La transformación no sería correcta,
porque un programa lineal tendería a utilizar barcos "adicionales" antes de que se
pudieran construir barcos “normales”. La transformación debe imponer una restricción
que estipule que sólo se pueden utilizar barcos “adicionales” cuando se han fabricado
todos los barcos “normales”. El programa resultante es un programa lineal de enteros
mixto.
Una solución para sailcopwg.mod
Para los datos de instancia que se proporcionan en Datos para el modelo lineal por
partes generalizado (sailcopwg1.dat), OPL devuelve la solución óptima
Un modelo lineal por partes generalizado para el problema de inventario simple
(sailcopwg.mod)
int NbPeriods = ...;
5
6. range Periods = 1..NbPeriods;
int NbPieces = ...;
float Cost[1..NbPieces] = ...;
float Breakpoint[1..NbPieces-1] = ...;
float Demand[Periods] = ...;
float Inventory = ...;
float InventoryCost = ...;
dvar float+ Boat[Periods];
dvar float+ Inv[0..NbPeriods];
minimize
sum( t in Periods )
piecewise(i in 1..NbPieces-1) {
Cost[i] -> Breakpoint[i];
Cost[NbPieces]
} Boat[t] +
InventoryCost * ( sum( t in Periods ) Inv[t] );
subject to {
ctInit:
Inv[0] == Inventory;
forall( t in Periods )
ctBoat:
Boat[t] + Inv[t-1] == Inv[t] + Demand[t];
}
6
7. range Periods = 1..NbPeriods;
int NbPieces = ...;
float Cost[1..NbPieces] = ...;
float Breakpoint[1..NbPieces-1] = ...;
float Demand[Periods] = ...;
float Inventory = ...;
float InventoryCost = ...;
dvar float+ Boat[Periods];
dvar float+ Inv[0..NbPeriods];
minimize
sum( t in Periods )
piecewise(i in 1..NbPieces-1) {
Cost[i] -> Breakpoint[i];
Cost[NbPieces]
} Boat[t] +
InventoryCost * ( sum( t in Periods ) Inv[t] );
subject to {
ctInit:
Inv[0] == Inventory;
forall( t in Periods )
ctBoat:
Boat[t] + Inv[t-1] == Inv[t] + Demand[t];
}
6