1. INTRODUCCION A GAMS
GAMS: GENERIC ALGEBRAIC MODELING SYSTEM
Es un lenguaje de programación que sirve:
La modelización de cierto problema de optimización
Su resolución(mediante otros programas llamados SOLVERS) y el análisis de la solución
Características:
Las formas en que GAMS representa un problema es casi idéntica a la que se espera en el pizarrón
Índices: arreglos matriciales
Datos: matrices , vectores y parámetros
Variables y función objetivo
Naturaleza de las variables
Cotas superiores e inferiores
Restricciones +funciones objetivo
Llamaremos al SOLVER y desplegaremos las soluciones (o parte de ella)
Permite pasar de un modelo de pocas variables (<=200) a un modelo de talla mayor sin modificaciones
substanciales del modelo.
Separa el PROCESO DE MODELIZACIÓN de la RESOLUCION
Una vez resuelto el modelo siguiendo las sintaxis se llama a un programa específico de resolución
Ej: para la PL usaremos el paquete CPLEX
GAMS permite resolver problemas estructurales
Reglas para producir un archivo .gams
GAMS no distingue entre mayúsculas o minúsculas
Cada comando debe terminar en ;
Los comandos pueden aparecer en “cualquier parte del programa” siempre y cuando las variables que utilizan se
hayan definido posteriormente
Los IDENTIFICADORES (nombres para variables , indices ) no pueden ser las palabras restringidas de GAMS
Los identificadores pueden tener hasta 9 caracteres alfanuméricos y debe comenzar con una letra
No usar tildes ñ / *
En algunos comandos es indeferente usando en plural o singular
Ej:Parameter o Parameters
Set o Sets
Es posible escribir varios comandos en un misma línea siempre y cuando esten separados por ;
Cuando se quiere poner un comando o no incluir algunas líneas del programa las instrucciones debe comenzar
con *
*El peso en kg
Un comando es válido para declarar o definir varios elementos al mismo tiempo
La mayoría de los comandos sirve para la DECLARACIÓN de sus elementos y/o para asignarles valores
COMANDOS OBJETIVO
INDICES:
Set
Declarar conjuntos de índices de
vectores o matrices
2. DATOS:
Scala
Declara un parámetro (numero o cte del
modelo) y/o les asigna un valor
Parameters Declara vectores de datos y/o les asigna
un valor
Table Declara y asigna matrices
Variables Declara las variables del modelo, sin tipo
y cotas superiores e inferiores o
preasigna valores
RESTRICCIONES:
Equations
Declara las restricciones y la función
objetiva
Model Declara el modelo , le da un nombre y las
restricciones que incluye
SOLUCION:
Solve
Llama al SOLVER y resuelve el problema
Display Muestra toda o parte de la solución
*Poblema del restaurante 13-10-2014.version1
variables
x1 cantidad de platos de tipo1 para elaborarse al dìa
x2 cantidad de platos de tipo2 para elaborarse al dìa
z ingreso diario por ventas ; // termino el comando de declaración de variables
positive variables // variables positivas
x1,x2;
Equations
ingreso funcion objetivo_ingresos diarios totales por ventas en u.m.
restriccion1 limitacion diaria de langostinos
restriccion2 limitacion diaria de mejillones
restriccion3 limitacion diaria de ostras ;
ingreso.. z=e=8*x1+6*x2; // .. es quivalente a :
restriccion1.. 5*x1+3*x2=l=30 // <= =l=
restriccion2.. 2*x1+3*x2=l=24 ;
restriccion3.. x1+3*x2=l=18 ;
model restaurante_v1 /all/;
solve restaurante_v1 using LP maximizing z;
MODELO DEL RESTAURANTE PODRIA ESCRIBIRSE COMO
Max 푧 = Σ 푝(푗) ∗ 푥(푗) 2푗
=1
Sor
퐴푥 ≤ 푏 (푥 ≥ 0) ≅ Σ 푎(푖, 푗)푎(푗) ≤ 푏(푖) ( 푖 = 1,2,3) 2푗
=1 matriz tecnica
x, y ∈ 푅 푥 ≤ 푦 ≅ 푥푖 ≤ 푦푖 (푖 = 1 … 푚)
3. *Poblema del restaurante 13-10-2014.version2
sets
i mariscos /langostinos,mejillones,ostras/
j platos /platos1, platos2/;
table
a(i,j) contenido del marisco i en una unidad de plato
platos1 platos2
langostinos 5 3
mejillones 2 3
ostras 1 3
parameters
p(j) precio unitario de cada plato1 en u.m. por plato
/platos1 8
platos2 6/
b(i) disponibilidad diaria del i-esimo marisco
/langostinos 30
mejillones 24
ostras 18/;
variables
x(j) cantidad de platos j al producirse al dia
z ingreso total por ventas
*z es u.m
X ;
equations
ingreso funcion objetivo_ingreso total por ventas diarias
restriccion(i) disponibilida diaria del i-esimo recurso ;
ingreso.. z=e=sum(j,p(j)*x(j));
restriccion(i).. sum(j,a(i,j)*x(j))=l=b(i);
model restaurante_v2/all/;
solve restaurante_v2 using LP maximizing z;
display x.l, z.l; // LEVEL NIVEL DE EJERCICIOS DE ACTIVIDAD 1 ETC
PROBLEMA DE REGRESION
set
i indice de la abscisa /1*6/;
parameters
x(i) abscisa de la i-esima medida
4. /1 0.5
2 1.2
3 1.9
4 2.5
5 3.0
6 3.2 /
q(i) medidas aproximadas de Q(x) en la abscisa x(i)
/1 3.5
2 6.2
3 4.8
4 5.5
5 1.2
6 3.3 /;
variables
a,b,c,d,er,z;
*por defecto en GAMS las variables son libres (sin restriccion sobre su signo)
equations
objetivo maximo de los errores en valor absoluto
restriccion1(i) restriccion del valor absoluto
restriccion2(i) otra restriccion del valor absoluto;
objetivo.. z=e=er;
restriccion1(i).. a+b*x(i)+c*sin(x(i))+d*cos(x(i))-er=l=q(i);
restriccion2(i).. a+b*x(i)+c*sin(x(i))+d*cos(x(i))+er=g=q(i);
model regresion /all/;
solve regresion using LP minimizing z;
display a.l,b.l,c.l,d.l,er.l,z.l;
5. PROBLEMA DE LA DIETA
sets
i ingredientes/nd,pd,ca,ph/
j alimentos/maiza,avena, maizb, salmado, linaza/
;
table
a(i,j) contenido de los ingrediente i en los alimentos j
maiza avena maizb salmado linaza
nd 78.6 70.1 80.1 67.2 77.0
pd 6.5 9.4 8.8 13.7 30.4
ca 0.02 0.09 0.03 0.14 0.41
ph 0.27 0.34 0.30 1.29 0.86
parameters
p(j) precio unitario del alimento j
/maiza 1
avena 0.5
maizb 2
salmado 1.2
linaza 3 /
r(i) requerimiento minimo del ingrediente i
/nd 74.2
pd 14.7
ca 0.14
ph 0.55 /;
variables
x(j) cantidad de alimento j a comprar
z costo total de adquisicion de alimentos en um
positive variables
x;
6. equations
costo funcion objetivo_costo total por compras
restriccion(i) requerimiento minimo del ingrediente i;
costo.. z=e=sum(j,x(j)*p(j));
restriccion(i).. sum(j,a(i,j)*x(j))=g=r(i)
model dieta /all/;
solve dieta using LP minimizing z;
display z.l, x.l;
PROBLEMAS DE TRANSPORTE
UN PRODUCTO DE ELABORA EN 3 FABRICAS fi,f2,f3 Y SE LOS DISTRIBUYE A 5 CUIDADES POR CAJAS C1.C2.C3.C4.C5
$title Modelo de transporte
sets
i indice para las fabricas /f1*f3/
j indices para las ciudades /c1*c5/;
table
d(i,j) matriz que da la distancia en km de la fabrica fi a cj
c1 c2 c3 c4 c5
f1 20 15.8 51.2 67 85
f2 19 10 45 5 16
f3 45 80 25.5 47 10
scalar
f flete de transporte en um por kilimetros y cajas /0.5/
parameters
a(i) oferta de la fabrica fi (en cajas)
/
f1 300
7. f2 400
f3 800
/
b(j) demanda de la ciudad cj (en cajas)
/
c1 200
c2 150
c3 400
c4 300
c5 300
/
c(i,j) matriz de costo unitario;
c(i,j)=f*d(i,j);
*c(i,j) esta en u.m. por caja
variables
x(i,j) cantidad de cajas que se envian desde la fi a la cj
z costo total de transporte
positive variables
x;
equations
costo_transporte costo total de transporte
oferta(i) oferta de las fabricas fi
demanda(j) demanda de las ciudades cj;
costo_transporte.. z=e=sum((i,j), c(i,j)*x(i,j));
oferta(i).. sum(j,x(i,j))=l=a(i);
demanda(j).. sum(i, x(i,j))=g=b(j);
model transporte/all/;
8. solve transporte using LP minimizing z;
display x.l, z.l;
PROBLEMAS DE ASIGNACION:
Supongamos que tenemos m trabajos T1*Tm que deben asignarse a cualquiera de las n maquinas M1*Mn. Se conoce
c(i,j) :rendimiento(eficiencia) de asignar el trabajo Ti a la maquina Mj.
PROBLEMA:
Como hacer una asignación de rendimiento máximo
VARIABLE DIVALENTE: Sirven para modelar si se hace o no una acción determinada.
Xij= 1 si se asigna el trabajo Ti a la maquina Mj
0 si no
EJERCICIO:
Se tienen 4 trabajos a asignarse a 4 maquinas . se conoce el costo de preparación c(i,j) que implica el Trabajo ti se haga
en la maquina mj
PROBLEMA: realizar un programa de asignación máxima
$title Problema de asignacion
sets
i indice para los trabajos /t1*t4/
j indices para las maquinas /m1*m4/;
table
c(i,j) costo de preparacion para realizar el trabajo ti en la maquina mj
m1 m2 m3 m4
t1 14 2 7 2
t2 5 12 8 4
t3 8 6 3 6
t4 7 5 9 10
variables
9. x(i,j) variable si se asigna el trabajo ti en la maquina mj
z costo total de preparacion
positive variables
x;
equations
costo funcion costo total por preparacion
trabajo(i) numero de trabajos ti
maquina(j) numero de maquinas mj ;
costo.. z=e=sum((i,j), c(i,j)*x(i,j));
trabajo(i).. sum(j,x(i,j))=e=1;
maquina(j).. sum(i,x(i,j))=e=1;
model asignacion /all/;
solve asignacion using LP minimizing z;
display x.L, z.L;