AMPL Datei - Campus Virtual

Anuncio
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 ;
Descargar