Facultad de Ingeniería Escuela de Ingeniería Industrial y Estadística Profesor: Julio César Londoño O Técnicas de solución • Este tipo de modelos pueden llegar a tener decenas (e incluso cientos) de miles de variables y restricciones. • Lenguajes generadores de modelos, como por ejemplo AMPL, OPL, GAMS, XPRESS. • Software para resolver problemas de programación mixta, por ejemplo CPLEX, MINTO, MINOS. • Métodos heurísticos, basados en transformaciones del modelo no-lineal y en PL sucesivos. • Algoritmos de optimización global. Marco general de un generador de modelos FORMULACIÓN DEL MODELO MATEMÁTICO ARCHIVO DEL MODELO SOLUCIÓN Y RESULTADOS ARCHIVO DE DATOS GENERADOR DE MODELOS (AMPL) SOLVER (CPLEX) MODELO ESPECÍFICO (Archivo MPS) AMPL A Modeling Language for Mathematical Programming AMPL is a comprehensive and powerful algebraic modeling language for linear and nonlinear optimization problems, in discrete or continuous variables. Using the NEOS Server for MINTO • ARCHIVO MODELO: Contiene la definición de conjuntos, parámetros variables, la función objetivo y el conjunto de restricciones • ARCHIVO DATOS: Contiene los elementos de los conjuntos y la información tabulada de los parámetros • ARCHIVO COMANDOS: Son las instrucciones que se dan al sistema acerca de cómo se desea que salgan los resultados y cuáles de éstos se quieren tener en la salida. Problema Red de Abastecimiento Ejercicio del libro de Chopra Parámetros y variables Parámetros D j = Demanda anual del mercado j K i = Capacidad potencial de la instalacion i f i = Costo fijo de apertura de la instalacion i cij = Costo de transportar una unidad desde la instalacion i al mercado j Variables de Decisión xij = Cantidad en unidades a transportar desde i hacia j yi = 1 si la instalacion se abre, 0 de lo contrario Formulación Algebraica Minimizar Costo Total : n n m ∑ f × y + ∑∑ C Min i =1 i i i =1 j =1 ij × xij Sujeto A : n ∑x i =1 ij m ∑x j =1 ij = D j ∀ j = 1, 2, ...., m ≤ K i yi ∀ i = 1, 2, ...., n xij ≥ 0 yi ∈ [0,1] ∀ i = 1, 2, ...., n Modelo AMPL Conjuntos set INSTALACIONES; # Conjunto de instalaciones candidatas set MERCADOS; # Conjunto de mercados Parámetros param demanda{j in MERCADOS} >=0; # Demanda Dj anual del mercado j param cap{i in INSTALACIONES} >=0; # Capacidad Ki de la instalacion i param c_fijo{i in INSTALACIONES} >=0; # Costo fi de apertura de la instalacion i param c_tran{i in INSTALACIONES, j in MERCADOS} >=0; # Costo de transportar una unidad desde la instalacion i hacia el mercado j Variables var x{i in INSTALACIONES, j in MERCADOS} >= 0; var y{i in INSTALACIONES} binary; Función Objetivo minimize costo_total: sum{i in INSTALACIONES} (c_fijo[i]*y[i]) + sum{i in INSTALACIONES, j in MERCADOS} (c_tran[i,j]*x[i,j]); Restricciones subject to cump_dem{j in MERCADOS}: sum{i in INSTALACIONES} (x[i,j]) = demanda[j]; subject to capacidad{i in INSTALACIONES}: sum{j in MERCADOS} (x[i,j]) <= cap[i]*y[i]; # Los paréntesis no son necesarios en este caso, dan mayor claridad a la expresión contenida dentro de la sumatoria PROBLEMA DEL TRANSBORDO Cap í i j k Y jk 5000 4000 3500 A B C X ij CALI IBAGUE NEIVA Dem k Cali: 1500 Medellín : 2000 Bogotá: 4500 Barranquilla: 2500 Pasto: 1500 Xij: Cantidad de producto a enviar desde i a j Yjk: Cantidad de producto a enviar desde j a k Cij: Costo de enviar producto de i a j Cjk: Costo de enviar producto de j a k DATOS • Plantas: A, B, C • Sitios de Transbordo: CALI, IBAGUE Y NEIVA • Zonas de consumo: CAL, MED, BGTA, BLLA Y PTO • Demanda Clientes: – – – – – CAL: 1500 Ton/año MED: 2000 Ton/año BGTA: 4500 Ton/año BLLA: 2500 Ton/año PTO: 1500 Ton/año • Capacidades plantas: – A: 5000 Ton/año – B: 4000 Ton/año – C: 3500 Ton/ año DATOS Costos de transporte de i a j DESTINO ($/Ton) CALI IBAGUE NEIVA A 10000 20000 30000 B 20000 30000 10000 C 30000 50000 15000 ORIGEN DATOS Costos de transporte de j a k DESTINO ORIGEN CALI CALI MEDELLIN BOGOTA ($/Ton) B/QUILL A PASTO 0 75908 83184 133706 69707 IBAGUE 57067 73630 45991 114487 109520 NEIVA 69604 84105 63116 135524 110175 Fuente. DECRETO 2663 / 21 JULIO 2008 CON BASE EN LA RESOLUCIÓN 3175 DE 2008 MODELO MATEMATICO Función Objetivo : Min Costo Total : ∑∑ Xij Cij + i∈I j∈J ∑ ∑ Yjk Cjk j = k k∈K S . A. ∑ Yjk = Dem k ∀ k ∈K j∈J ∑ Xij ≤ Cap i ∀ i∈ I j∈J ∑ Xij i∈I = ∑ Yjk k∈K ∀ j∈ J ARCHIVO MODELO # CONJUNTOS set I; # Conjunto de plantas ubicados en la zona de consumo i set J; # Conjunto de zonas de trasbordo ubicados en la zona de consumo j set K; # Conjunto de clientes ubicados en la zona de consumo k # PARAMETROS param Cap_plantai{i in I} >= 0; # Capacidad de la planta ubicada en la localidad i (Toneladas de producto/ año) param Dem_clientesk{k in K} >= 0; # Demanda de producto de los clientes ubicados en la zona de consumo k (Toneladas de producto/año) param Cost_tteij{i in I, j in J}; # Costo de transporte de producto de la planta i al sitio de transbordo j ($/Ton) param Cost_ttejk{j in J, k in K}; # Costo de transporte de producto del sitio de transbordo j a la zona de consumo k ($/Ton) # VARIABLES DE DECISIÓN var x{i in I, j in J}>= 0; # Toneladas de producto a enviar de i a j por año (Ton/año) var y{j in J, k in K}>= 0; # Toneladas de producto a enviar de j a k por año (Ton/año) # FUNCION OBJETIVO minimize costo_total: # ($/año) sum{i in I, j in J} (x[i,j]*Cost_tteij[i,j]) # Costo anual de enviar producto de i a j + sum{j in J, k in K} (y[j,k]*Cost_ttejk[j,k]; # Costo anual de enviar producto de j a k # RESTRICCIONES # Por capacidad de la planta i (Ton/año): subject to Cap_pdni{i in I}: sum {j in J} (x[i,j]) <= Cap_plantai[i]; # Por demanda de los clientes k (Ton/año): subject to Dem_client{k in K}: sum {j in J} (y[j,k]) <= Dem_clientesk [k]; # Por balance de flujos en zonas de transbordo j (Ton/año): subject to Balance_CD{j in J}: sum {i in I} (x[i,j]) = sum {k in K} (y[j,k]) ; ARCHIVO DATOS # CONJUNTO DE DATOS CORRESPONDIENTE AL PROBLEMA DEL TRANSBORDO # CONJUNTOS PRINCIPALES set I:= A B C; set J:= CALI IBAGUE NEIVA; set K:= CAL MED BGTA BLLA PTO; # PARAMETROS # Capacidad de las plantas ubicadas en la localidad i # (Ton/año) param Cap_plantai:= A 5000 B 4000 C 3500; # Demanda de los clientes ubicados en la zona de consumo k # (Ton/año) param Dem_clientesk:= CAL 1500 MED 2000 BGTA 4500 BLLA 2500 PTO 1500; # Costo de transportar producto de la planta i al sitio de transbordo j # ($/Ton) param Cost_tteij: CALI IBAGUE NEIVA:= A 10000 20000 30000 B 20000 30000 10000 C 30000 50000 15000; # Costo de transportar producto del sitio de transbordo j a la zona de consumo k # ($/Ton) param Cost_ttejk: CAL MED BGTA BLLA PTO := CALI 0 75908 83184 133706 69707 IBAGUE 57067 73630 45991 114487 109520 NEIVA 69604 84105 63116 135524 110175; Archivo Comandos # COMANDOS DE INICIALIZACIÓN DE CONDICIONES: option show_stats 1: Muestra las estadísticas del problema a resolver (No. de variables, No. de restricciones, No. de variables binarias, etc.). option solution_precision 0: Define la máxima precisión para llevar a cabo los cálculos. option omit_zero_rows 1: Omite de los resultados aquéllas filas (restricciones) cuyo valor sea cero. option omit_zero_cols 1: Omite de los resultados aquéllas columnas (variables) cuyo valor sea cero (esto es muy útil para problemas con resultados muy dispersos). option display_precision 6: Define como seis los campos de precisión a presentar de cada variable. option display_round 1: Redondea a una cifra decimal lo que muestra en los resultados. option display_width 50: Este es un comando que controla el ancho de la fila para motivos de impresión de resultados. Archivo Comandos # COMANDOS DE SOLUCIÓN: model nombre_archivo.txt; data nombredato.txt; option solver cplex; solve; # COMANDOS DE IMPRESIÓN DE RESULTADOS: printf "\n\n**************************************\n" > nombre_ sol.txt; printf "RESULTADOS DEL PROBLEMA\n" >> nombre_ sol.txt; printf "*************************************\n\n" >> nombre_ sol.txt; printf "\nCOSTO TOTAL = \t%12.1f", costo_total >> nombre_ sol.txt; printf "\nFLUJO DESDE PROVEEDORES HACIA ZONAS TRASBORDO=\n\n" >> nombre_ sol.txt ; display x >> nombre_ sol.txt; Archivo Comandos # COMANDOS DE IMPRESIÓN DE RESULTADOS: display y >> nombre_ sol.txt; printf "\nCAPACIDAD SOBRANTE DE PROVEEDORES =\n\n" >> nombre_ sol.txt; display Cap_plantai.slack >> nombre_ sol.txt; printf "\nCOSTOS DE OPORTUNIDAD DE PROVEEDORES =\n\n" >> nombre_ sol.txt; display Dem_clientek >> nombre_ sol.txt t; SIGNIFICADO DE LOS COMANDOS DE IMPRESIÓN • \n significa salto de línea; • \t tabulador; %12.1f significa que se va a imprimir un número de punto flotante (un número real) con 12 espacios, de los cuales uno es decimal Modelo de Bauxita Problema de una cadena de abastecimiento Una compañía multinacional de aluminio tiene depósitos de bauxita (materia prima) en tres lugares del mundo A, B y C. Tiene además cuatro plantas donde la bauxita se convierte en alúmina (un producto intermedio), en lugares B, C, D y E. También tiene plantas de esmaltado en los lugares D y E. El proceso de conversión de la bauxita en alúmina es relativamente poco costoso. El esmaltado, sin embargo, es costoso puesto que se requiere de un equipo electrónico especial. Una tonelada de alúmina produce 0.4 toneladas de aluminio terminado. Los datos siguientes están disponibles: Problema de una cadena de abastecimiento Problema de una cadena de abastecimiento Las ventas anuales de aluminio terminado son de 1000 ton en la planta D y de 1200 ton en la planta E. Problema de una cadena de abastecimiento Los lingotes de producto terminado no se transportan entre D y E y viceversa. Formule y resuelva un modelo de optimización para determinar la mejor configuración y diseño de la cadena de abastecimiento presentada. Note que existe el problema de determinar cuáles plantas de alúmina deben ser abiertas. El problema de la Bauxita Variables de decisión Xij = Ton/año de bauxita a transportar desde la mina i hacia la planta de alúmina j; i = A, B, C; j = B, C, D, E. Yjk = Ton/año de alúmina a transportar desde la planta de alúmina j hacia la planta de esmaltado k; j = B, C, D, E; k = D, E. Wj = 1, si la planta de alúmina j se abre; 0, de lo contrario; j = B, C, D, E. Función objetivo – Minimizar costo total anual Función Objetivo Problema Bauxita Costo anual de explotación de bauxita ($/año): Costo anual de producción de alúmina ($/año): Función Objetivo Problema Bauxita Costo anual de procesamiento de alúmina en las plantas de esmaltado ($/año): Costo anual de transporte desde las minas de bauxita hacia las plantas de alúmina ($/año): Función Objetivo Problema Bauxita Costo anual de transporte desde las plantas de alúmina hacia las plantas de esmaltado ($/año): Costo fijo anual de plantas de alúmina ($/año): Restricciones Problema Bauxita 1) Por capacidad anual de explotación de bauxita en cada mina (Ton de bauxita/año): 2) Por capacidad anual de procesamiento de bauxita en cada planta de alúmina (Ton de bauxita/año): Restricciones Problema Bauxita 3) Por capacidad anual de procesamiento de alúmina en cada planta de esmaltado (Ton de alúmina/año): 4) Por ventas anuales de aluminio terminado en cada planta de esmaltado (Ton de aluminio terminado/año): 5) Por balance de masa en cada una de las plantas de alúmina: Restricciones Problema Bauxita 6) Por límites en los valores de cada una de las variables: CONJUNTOS PRINCIPALES MINAS = Conjunto de minas de bauxita indexado por I PLALU = Conjunto de plantas de alúmina indexado por j PLESM = Conjunto de plantas de esmaltado indexado por k PARÁMETROS capal_es = Capacidad de procesamiento de alúmina en la planta de esmaltado k (Ton de alúmina/año) capb_al = Capacidad de procesamiento de bauxita en la planta de alúmina j (Ton de bauxita/año) capbaux = Capacidad de explotación de bauxita de la mina i (Ton de bauxita/año) cexp = Costo de explotación de la mina i ($/Ton de bauxita) cfijo = Costo fijo de la planta de alúmina j ($/año) cpal = Costo de producción de alúmina en la planta de alúmina j ($/Ton de alúmina) cpes = Costo de procesamiento de la alúmina para producir aluminio terminado en la planta de esmaltado k ($/Ton de alúmina) ctran_al = Costo de transporte de alúmina desde la planta de alúmina j hacia la planta de esmaltado k ($/Ton de alúmina) ctran_b = Costo de transporte de bauxita desde la mina de bauxita i hacia la planta de alúmina j ($/Ton de bauxita) demanda = Demanda de aluminio terminado en la planta de esmaltado k (Ton de aluminio terminado/año) rendal = Rendimiento de alúmina de la bauxita extraída de la mina i (Ton de alúmina/Ton de bauxita) rendim = Rendimiento de alúmina para producir aluminio terminado (Ton de aluminio terminado/Ton de alúmina) Variables de decisión Variables de decisión Xij = Ton/año de bauxita a transportar desde la mina i hacia la planta de alúmina j; i = A, B, C; j = B, C, D, E. Yjk = Ton/año de alúmina a transportar desde la planta de alúmina j hacia la planta de esmaltado k; j = B, C, D, E; k = D, E. Wj = 1, si la planta de alúmina j se abre; 0, de lo contrario; j = B, C, D, E. Código AMPL var x{i in MINAS, j in PLALU} >= 0; var y{j in PLALU, k in PLESM} >= 0; var w{j in PLALU} binary; Función Objetivo Código AMPL Minimizar costo_total: minimize costo_total: ∑∑cexp(i)× x sum{i in MINAS, j in PLALU} (cexp[i]*x[i,j]) ij i j ∑∑cpal(j)× y j + sum{j in PLALU, k in PLESM} (cpal[j]*y[j,k]) jk k ∑∑cpes(k)× y j + sum{j in PLALU, k in PLESM} (cpes[k]*y[j,k]) jk k ∑∑ctran_b(i,j) × x + sum{i in MINAS, j in PLALU} (ctran_b[i,j]*x[i,j]) ij i j ∑∑ctran_al(j,k)× y j jk + sum{j in PLALU, k in PLESM} (ctran_al[j,k]*y[j,k]) k ∑cfijo(j)× w(j) j + sum{j in PLALU} (cfijo[j]*w[j]); Restricciones Código AMPL subject to cap_exp{i in MINAS}: sum{j in PLALU} (x[i,j]) <= capbaux[i]; subject to cap_prodal{j in PLALU}: sum{i in MINAS} (x[i,j]) <= capb_al[j]*w[j]; subject to demand_es{k in PLESM}: sum{j in PLALU } (rendim*y[j,k]) = demanda[k]; subject to balance{j in PLALU}: sum{i in MINAS } (rendal[i]*x[i,j]) = sum{k in PLESM} (y[j,k]); *Datos de parámetros de tres y más dimensiones (1) • param pmformula {i in PM, hh in HRPM[i], r in RAWPM[i]} >= 0; • # toneladas de cada materia prima por cada tonelada de producto intermedio consumidas en cada máquina de la 1a etapa [tons de mat. Prima / ton de producto terminado] * Tomado de Vidal, notas de clase curso Optimización Avanzada Datos de parámetros de tres y más dimensiones (2) param pmformula:= [MAQ1, PROD_INTERM1, *] MAT_PRIMA1 MAT_PRIMA2 MAT_PRIMA3 MAT_PRIMA4 MAT_PRIMA5 MAT_PRIMA6 0.30 0.00 0.20 0.05 0.40 0.10 [MAQ2, PROD_INTERM1, *] MAT_PRIMA1 MAT_PRIMA2 MAT_PRIMA3 MAT_PRIMA4 MAT_PRIMA5 MAT_PRIMA6 0.25 0.05 0.15 0.03 0.40 0.20 [MAQ1, PROD_INTERM2, *] MAT_PRIMA1 MAT_PRIMA2 MAT_PRIMA3 MAT_PRIMA4 MAT_PRIMA5 MAT_PRIMA6 0.50 0.30 0.20 0.00 0.05 0.05 [MAQ2, PROD_INTERM2, *] MAT_PRIMA1 MAT_PRIMA2 MAT_PRIMA3 MAT_PRIMA4 MAT_PRIMA5 MAT_PRIMA6 0.45 0.30 0.25 0.05 0.00 0.07; Datos de parámetros de tres y más dimensiones (3) param pmformula:= [MAQ1, *, *]: MAT_PRIMA1 MAT_PRIMA2 MAT_PRIMA3 MAT_PRIMA4 MAT_PRIMA5 MAT_PRIMA6 := PROD_INTERM1 0.30 0.00 0.20 0.05 0.40 0.10 PROD_INTERM2 0.50 0.30 0.20 0.00 0.05 0.05 [MAQ2, *, *]: MAT_PRIMA MAT_PRIMA MAT_PRIMA MAT_PRIMA MAT_PRIMA MAT_PRIMA 1 2 3 4 5 6 := PROD_INTERM1 0.25 0.05 0.15 0.03 0.40 0.20 PROD_INTERM2 0.45 0.30 0.25 0.05 0.00 0.07 ; Datos de parámetros de tres y más dimensiones (4) param pmformula:= [MAQ1, *, *] (tr): PROD_INTERM1 PROD_INTERM2 MAT_PRIMA1 0.30 0.50 MAT_PRIMA2 0.00 0.30 MAT_PRIMA3 0.20 0.20 MAT_PRIMA4 0.05 0.00 MAT_PRIMA5 0.40 0.05 MAT_PRIMA6 0.10 0.05 PROD_INTERM1 PROD_INTERM2 MAT_PRIMA1 0.25 0.45 MAT_PRIMA2 0.05 0.30 MAT_PRIMA3 0.15 0.25 MAT_PRIMA4 0.03 0.05 MAT_PRIMA5 0.40 0.00 MAT_PRIMA6 0.20 0.07 [MAQ2, *, *] (tr): := := ; Conjuntos y Subconjuntos - Definición set FIGGEOMETRICAS; # Conjunto de figuras geometricas set ESTRELLAS within FIGGEOMETRICAS; set ESTRELLAS within FIGGEOMETRICAS; set FIGGEOMETRICAS: EST_R EST_V EST_N DEC_R DEC_N …..CUBO_N set ESTRELLAS: EST_R EST_V EST_N ;