You are on page 1of 50

El entorno GAMS

GAMS (General Algebraic Modeling System) es un entorno


para definir, analizar y resolver problemas de optimización.
Los elementos más importantes de GAMS son:
1. Su capacidad para resolver problemas pequeños (docenas
de variables y restricciones) y grandes problemas (miles
de variables y restricciones) escribiendo básicamente el
mismo programa. Dispone de una forma compacta y
eficiente para escribir bloques de ecuaciones similares sin
más que escribir “una de ellas”.
2. Se separa la definición del modelo de la técnica de re-
solución. El usuario de GAMS formula el modelo con-
sistentemente, y una vez expresado en notación GAMS,
uno de los programas disponibles se encarga de generar
la solución. Como resultado, el usuario se centra en el
modelado, sin ser perturbado por los problemas técnicos
de los algoritmos de resolución. Esto hace posible un
proceso de modelado muy sencillo y agradable.
3. GAMS prácticamente reproduce la descripción del pro-
blema de programación matemática. Como resultado, el
código GAMS is casi auto-explicativo para los lectores
que tengan una mı́nima formación en optimización.
4. GAMS suministra también mecanismos que permiten re-
solver colecciones de problemas de optimización estruc-
turados, tales como los de técnicas de descomposición.

273
EL problema del transporte

Distancias en Km.
mercados
plantas m1 m2 m3
p1 2.0 1.6 1.8
p2 2.5 1.2 1.4
El problema consiste en
XX
Minimizar cij xij
i j

P
j xij ≤ ai, ∀i
i xij ≥ bj , ∀j
P
sujeta a
xij ≥ 0, ∀i, j,
Los datos son:
i: Número de plantas (2).
j: Número de mercados (3).
ai: La máxima capacidad de producción de la planta i en
toneladas (300 y 500 toneladas),
bj : La demanda del mercado j en toneladas (100, 200 y 300
toneladas), y
cij : el coste de transporte de la planta i al mercado j (0.09
dólares por tonelada y km).
Las variables de decisión son:
xij : la cantidad de producto a enviar de la planta i al mercado
j, en toneladas.
274
Problema del transporte
Código GAMS

$Title The Transportation Problem


* Simple transportation example
Sets
i production plants / p1, p2 /
j markets / m1*m3 /;
Table d(i,j) distance in km
m1 m2 m3
p1 2.0 1.6 1.8
p2 2.5 1.2 1.4;
Scalar f freight (dollars per ton y km) /0.09/;
Parameters
a(i) capacity of plant i in tons
/ p1 300
p2 500 /
b(j) demand at market j in tons
/ m1 100
m2 200
m3 300 /
c(i,j) transportation cost in dollars per ton;
c(i,j) = f * d(i,j);
Variables
x(i,j) shipment quantities in tons
z total transportation costs in dollars;
Positive Variable x;
Equations
cost objective function
supply(i) meet supply limit at plant i
demand(j) satisfy demand at market j;

cost .. z =e= sum((i,j), c(i,j)*x(i,j));


supply(i) .. sum(j, x(i,j)) =l= a(i);
demand(j) .. sum(i, x(i,j)) =g= b(j);
Model transport /all/;
Solve transport using lp minimizing z;
Display x.l;

275
Algunos comandos de GAMS

Comando Propósito
Set(s) Dar nombre a los ı́ndices
y definir sus posibles valores
Scalar(s) Dar nombre a los escalares
y asignarles valores
Parameter(s) Dar nombre a los vectores
y asignarles valores
Table(s) Dar nombre a las matrices
y asignarles valores
Variable(s) Declarar variables,
asignarles un tipo (opcional)
y darles cotas inferior y superior
Equation(s) Definir la función a optimizar
y las restricciones
Model Dar nombre a los modelos
y asignarles la lista de restricciones
Solve Indicar a GAMS el programa
que debe resolverlo
Display Decir a GAMS los elementos
a listar en el informe de salida

276
Reglas de GAMS

1. GAMS no diferencia entre letras mayúsculas y


minúsculas.
2. Todo comando debe terminar en punto y coma.
3. Los comandos pueden definirse en cualquier orden, con
la única restricción de que un elemento debe haber sido
definido antes de usarlo.
4. GAMS tiene palabras reservadas, que no pueden usarse
para otro fin que el suyo propio.
5. Algunos comandos se identifican por sus primeras letras,
por lo que puede añadirse una ‘s’ para facilitar la lectura.
6. Los comandos pueden escribirse en estilo libre (una o
varias lı́neas, uno o varios espacios, etc.)
7. Para definir un bloque de elementos basta usar el co-
mando una vez.
8. Una lı́nea precedida por un asterisco (en la primera
columna) es interpretada como un comentario.
9. La mayorı́a de los comandos (sets, scalar, parameter,
table, variables, equations y model) se utilizan para
declarar elementos y/o darles valores, lo que los con-
vierte en válidos para GAMS.
10. Los nombres deben comenzar por una letra y seguir con
letras o dı́gitos, hasta un máximo de 9.

277
SETS y SCALARS

La palabra reservada Set o Sets identifica el comando SET, que se usa


en GAMS para declarar ı́ndices, y especificar el conjunto de valores que
toman. Por ejemplo
Sets
i production plants / p1, p2 /
j markets / m1*m3 /;
que define los dos ı́ndices i y j.
El texto tras el número de los ı́ndices es ignorado por el compilador de
GAMS. La asignación de valores se hace entre dos sı́mbolos ‘/’. El
sı́mbolo ‘∗’ ayuda a definir, en forma compacta, conjuntos numéricos,
es decir, /m1∗m3/ es equivalente a /m1, m2, m3/. Sin embargo, GAMS
trata los valores de los ı́ndices como cadenas de caracteres. El comando
concluye con el punto y coma.
Los conjuntos anteriores tienen carácter estático, es decir, no cambian
durante la ejecución del programa. En GAMS se pueden definir también
conjuntos dinámicos, que son subconjuntos de los conjuntos estáticos, pero
que pueden cambiar durante la ejecución del programa.
Un comando ligado a la definición de conjuntos es el comando alias. Este
comando permite dar variaos nombres equivalentes, al mismo conjunto:

Alias(i,k);

da un segundo nombre k, al conjunto i. Éstos se usan en sumas, pro-


ductos, etc., cuando hay dos o más ı́ndices implicados y necesitan variar
independientemente.
Los escalares GAMS son escalares de datos.
La palabra reservada Scalar o Scalars identifica el comando:
Scalar f freight (dollars per ton y km) /0.09/;
Se define el escalar ‘f’ y se le asigna el valor 0.09 entre dos ‘/’.

278
PARAMETERS y TABLES I

Los comandos PARAMETER y TABLE se usan en GAMS para definir


vectores y matrices de datos. Ambos son equivalentes, excepto que para
definir vectores es necesario usar el comando PARAMETER.
La palabra reservada Parameter, o Parameters, identifica el comando
parameter the PARAMETER., que sirve para declarar vectores y matrices.
Los vectores de datos se declaran con ayuda de un ı́ndice, como en.
Parameters
a(i) capacity of plant i in tons
/ p1 300
p2 500 /;
que define el parámetro a(i) en función del conjunto (ı́ndice) i. Para
cada valor del ı́ndice (elemento del conjunto) (p1, p2) se da un valor del
parámetro (300, 500) entre dos sı́mbolos ‘/’. El comando termina con
punto y coma. Para asignar valores a vectores deben tenerse en cuenta las
reglas siguientes:
1. La lista opcional de posibles ı́ndices y sus correspondientes valores
deben ir entre sı́mbolos ‘/.../’ y separados por comas o pasos de
lı́nea.
2. Las parejas ı́ndice-valor pueden ir en cualquier orden.
3. El valor por defecto de cualquier parámetro es ‘cero’, por lo que sólo
aquellos que tomen valores diferentes, deben darse.
4. GAMS comprueba que los ı́ndices son válidos.
Se pueden definir valores de los parámetros mediante funciones:
Parameter c(i,j) transportation cost in dollars per ton;
c(i,j) = f * d(i,j);

279
PARAMETERS y TABLES II

La definición anterior es la forma compacta de la que sigue:


Parameter c(i,j) transportation cost in dollars per ton
/ p1.m1 0.180
p2.m1 0.225
p1.m2 0.144
p2.m2 0.108
p1.m3 0.162
p2.m3 0.126 /;
Las matrices de datos se definen en GAMS mediante tablas. La palabra
reservada Table o Tables identifica este comando. Las tablas se definen
usando dos o más ı́ndices. Se pueden introducir comentarios tras el nombre
de la tablas, como en:
Table d(i,j) distance in km
m1 m2 m3
p1 2.0 1.6 1.8
p2 2.5 1.2 1.4;
que define la matriz d(i,j) mediante los ı́ndices indices i y j. Para ca-
da pareja cruzada de ı́ndices (p1.m1, p1.m2, p1.m3, p2.m1, p2.m2,
p2.m3) se especifica un valor (2.0, 1.6, 1.8, 2.5, 1.2, 1.4).
Para mostrar la equivalencia entre los comandos PARAMETER y TABLE
se define la matriz c(i,j) usando ambos
Table c(i,j) transportation cost in dollars per ton
m1 m2 m3
p1 0.180 0.144 0.162
p2 0.225 0.108 0.126;
Nótese que ésta no es la forma más compacta de definir c(i,j).

280
Expresiones matemáticas

Para asignar valores utilizando expresiones matemáticas hay


que tener en cuenta las reglas siguientes:
1. El uso de ı́ndices en la asignación indica que la asignación
se hace para todos sus posibles valores y combinaciones de
ellos.
2. Se puede hacer una asignación especı́fica dando los valores
de los ı́ndices entre comillas:
c(’p1’,’m1’)=0.180;
3. Se pueden asignar más de una vez valores a los escalares,
parámetros y tablas. Los nuevos valores reemplazan a los
antiguos.
4. Las expresiones matemáticas pueden incorporar funciones
matemáticas estándar (ver tabla adjunta).

281
Funciones matemáticas en GAMS

Función Descripción
abs(x) Valor absoluto de x
arctan(x) Arco tangente (en radianes)
ceil(x) Mı́nimo entero mayor o igual que x
cos(x) Función coseno (x en radianes)
errorf(x) Función de distribuciónn
de la normal N (0, 1) en x
exp(x) Función exponencial
floor(x) Mayor entero menor o igual que x
log(x) Logaritmo natural de x
log10(x) Logaritmo en base 10 de x
mapval(x) Función proyección
max(x1,x2,...) Máximo de una lista
min(x1,x2,...) Mı̀nimo de una lista
mod(x,y) Resto al dividir x por y
normal(x,y) Número aleatorio de una variable normal
con media x y desviación tı́pica y
power(x,y) Función potencial xy (donde y debe ser un entero)
x ∗ ∗y Función potencial xy (donde x debe ser positiva)
round(x) Redondeo de x al entero más cercano
round(x,y) Redondea x a y decimales
sign(x) Signo de x, 1 si positivo, -1 si negativo, y 0 si nulo.
sin(x) Función seno (en radianes)
sqr(x) Cuadrado de x
sqrt(x) Raı́z cuadrada de x
trunc(x) Es igual a sign(x) * floor(abs(x))
uniform(x,y) Número aleatorio uniforme U (x, y)

282
Variables

Las variables se declaran en GAMS como sigue:


Variables
x(i,j) Cantidades enviadas en toneladas
z coste total del transporte en dólares;
La palabra reservada Variable o Variables identifica el comando
variable. La declaración de las variables debe incluir las dimensiones de las
mismas. Debe utilizarse siempre una variable para representar la función
objetivo.
También se pueden definir diferentes tipos de variables (ver tabla):

Positive Variable x;
Binary Variable r;

Tipo de variable Rango Rango por defecto


binary {0, 1} {0, 1}
free (default) (−∞, ∞) (−∞, ∞)
integer {0, 1, . . . , n} {0, 1, . . . , 100}
negative (−∞, 0) (−∞, 0)
positive (0, ∞) (0, ∞)

Se pueden fijar también cotas para las variables, o fijar sus valores (no
cambian durante la ejecución):
r.lo = 2.0;
r.up = 5.0;
y.fx(i) = 3.0;
y cambiar los valores de las variables durante la ejecución:

s.l(i,j) = 3.0;

283
EQUATIONS

La palabra reservada Equation o Equations identifica el comando


epara definir restricciones en GAMS. Las ecuaciones deben ser declaradas
primero y definidas después, usando el sı́mbolo ‘..’ para acoplar los nom-
bres con las definiciones de éstas.

Equations
cost objective function
supply(i) meet supply limit at plant i
demand(j) satisfy demand at market j;
cost .. z =e= sum((i,j), c(i,j)*x(i,j));
supply(i) .. sum(j, x(i,j)) =l= a(i);
demand(j) .. sum(i, x(i,j)) =g= b(j);
P
El sumatorio i xij se expresa sum(i, x(i,j)), y Πixij , se escribe
prod(i, x(i,j)).
Los sı́mbolos que se utilizan en las ecuaciones son:
• =e= indica ‘es igual a’,
• =l= indica ‘es menor o igual que’, y
• =g= indica ‘es mayor o igual que’.
Se pueden definir muchas ecuaciones simultáneamente, usando ı́ndices:
supply(i) .. sum(j, x(i,j)) =l= a(i);
es equivalente a:

supply1 .. sum(j,x(’p1’,j)) =l= a(’p1’);


supply2 .. sum(j,x(’p2’,j)) =l= a(’p2’);

284
MODEL AND SOLVE

El comando Model se usa para indicar a GAMS las restricciones que


debe incluir un determinado modelo. El comando Model que sigue in-
dica que el problema considerado incluye todas las restricciones definidas
previamente:
Model transport /all/;
También puede escribirse como:

Model transport /cost,supply,demand/;

El comando Solve indica a GAMS que resuelva el problema indicado.


El comando Solve que sigue indica a GAMS que resuelva el problema
transport usando el programa de programación lineal (lp) y minimizan-
do la variable z.
Solve transport using lp minimizing z;
La palabra reservada lp se usa para programación lineal. Otras opciones
se dan en la tabla.
Programa Propósito
lp Programación lineal
nlp Programación no lineal
dnlp Programación no lineal con derivadas discontinuas
mip Programación entera mixta
rmip Programación entera mixta relajada
minlp Programación no lineal entera mixta
rminlp Programación no lineal entera mixta relajada
mcp Problemas complementarios mixtos
mpec Problemas matemáticos con restricciones de equilibrio
cns Sistemas no lineales con restricciones

285
Información sobre recursos

En GAMS pueden usarse subı́ndices para obtener información valiosa so-


bre ciertos recursos, una vez que se ha resuelto el problema.
Algunos subı́ndices notables son: modelstat para comprobar el estado
del modelo, solvestat para comprobar el estado del programa que lo
resuelve y resusd para comprobar el tiempo (en segundos de CPU)
empleado para resolverlo. Véanse los posibles valores de modelstat y
solvestat en la tabla adjunta.
Un ejemplo es:
Display transport.resusd;

Valor modelstat solvestat


1 optimal normal completion
2 locally optimal iteration interrupt
3 unbounded resource interrupt
4 infeasible terminated by solver
5 locally infeasible evaluation error limit
6 intermediate infeasible unknown
7 intermediate non-optimal -
8 integer solution error: preprocessor error
9 intermediate non-integer error: setup failure
10 integer infeasible error: solver failure
11 - error: internal solver error
12 error unknown error: post-processor error
13 error no solution error: system failure

286
Uso del asterisco

Se puede usar el asterisco para:


• Añadir comentarios (primera columna de una lı́nea).
• Para listar los elementos de un conjunto en forma compacta.
• Para marcar errores en el fichero de salida (cuatro asteriscos al comien-
zo de la lı́nea).
• Para indicar en el fichero de salida que las restricciones no lineales no
son factibles en el punto de partida (tres asteriscos al final de la lı́nea).
• Como operador producto.
• Para definir conjuntos indirectamente en las estructuras de GAMS
(sets, parameters, tables, variables o equations). Por ejemplo:

Set A conjunto de artı́culos /a1,a2/;


Table g(A,*) aspectos de los A artı́culos
altura anchura peso
* (cm) (cm) (kg)
a1 1.0 2.7 3.5
a2 2.4 1.8 4.4;

es euivalente a

Sets A set of articles /a1,a2/


B set of features /height,width,weight/;
Table g(A,B) features of the A articles
altura anchura peso
* (cm) (cm) (kg)
a1 1.0 2.7 3.5
a2 2.4 1.8 4.4;

287
Comandos condicionales

El sı́mbolo ‘$’ puede utilizarse para generar subconjuntos convenientes de


los conjuntos ordenados originales. La sentencia.
demand(j)$(ord(j) gt 1).. sum(i, x(i,j))=g=b(j);
es equivalente a
demand2.. sum(i, x(i,’m2’)) =g= b(’m2’);
demand3.. sum(i, x(i,’m3’)) =g= b(’m3’);
Nótese que $(ord(j) gt 1) indica que sólo los elementos cuyo ordinal
sea mayor que 1 deben ser incluı́dos.

Estas condiciones se pueden utilizar también en otros comandos de GAMS


como: asignaciones de datos, comando ‘put’, etc. En todos estos casos
es posible reemplazar el operador ‘$’ por los comandos ‘if-then-else’. Sin
embargo, por compacidad se usa más el ‘$’.

Otros operadores comunes en otros lenguajes son también válidos en


GAMS:
• not, y, or, xor como operadores lógicos;
• < (lt), <= (le), = (eq),<> (ne), >= (ge), > (gt) como operadores
relacionales.

288
Conjuntos dinámicos I

Una caracterı́stica muy potente de GAMS es que permite usar con-


juntos dinámicos. Usando éstos se pueden modificar los elementos que
pertenecen a un conjunto durante la ejecución de un programa GAMS.

Los conjuntos dinámicos se definen siempre como subconjuntos de uno


estático previamente definido. Las variables, parámetros, tablas y ecua-
ciones que dependen de un conjunto dinámico pueden ser modificadas cada
vez que se actualiza un conjunto dinámico. La tabla que sigue muestra la
equivalencia entre las expresiones matemáticas y las de GAMS.
Expresión matemática Expresión GAMS
k = {a, b, c} Set k /a,b,c/
s⊆k s(k);
s=∅ s(k)=no;
s = {c} s(k)=no;
s(k)$(ord(k) eq card(k))=yes;
s = {b, c} s(k)=no;
s(k)$(ord(k) gt 1)=yes;
En la primera fila se define el conjunto estático ‘k’ y luego el subconjunto
dinámico ‘s(k)’ como función de ‘k’.

Antes de usar un conjunto dinámico hay que definir su estado inicial.


Uno de ellos es el conjunto vacı́o, que se define en la segunda fila.

289
Conjuntos dinámicos II

La tercera fila muestra cómo asignar el último elemento de ‘k’ al ‘s(k)’,


mediante los operadores‘ord(k)’ y ‘card(k)’. El operador ‘card’ de-
vuelve el número de elementos, y el ‘ord’, la posición de un elemento.

El operador ‘ord’ sólo es válido para conjuntos estáticos).

La última fila indica cómo asignar dos elementos a ‘s(k)’.


Se pueden implementar en GAMS operaciones entre conjuntos usando
conjuntos dinámicos. Los ejemplos de la tabla adjunta muestran algunos
interesantes:
Expresión matemática Expresión GAMS
A = {a1, a2, a3, a4, a5} set A static set /a1*a5/;
b ⊆ A, b = {a1, a2, a5} set B(A) subset /a1,a2,a5/;
c ⊆ A, c = {a2, a3, a5} set C(A) subset /a2,a3,a5/;
b ∪ c = {a1, a2, a3, a5} set UN(A) dynamic subset;
UN(A)=B(A)+C(A);
b ∩ c = {a2, a5} set IN(A) dynamic subset;
IN(A)=B(A)*C(A);
b̄ = {a3, a4} set COMP(A) dynamic subset;
COMP(A)=not B(A);
b − c = {a1} set DIFF(A) dynamic subset;
DIFF(A)=B(A)-C(A);

290
Comandos de control

El ejemplo siguiente ilustra cómo se usan los comandos de control.

loop(S,
loop(JJ,
x0=0.0001;
x1=2.0;
aux=W0.l(JJ)+sum(I,W.l(JJ,I)*X(I,S));
error=1000;

f0=sum(R$(ord(R)<4),alpha.l(JJ,R)*(x0**ord(R)))
+alpha.l(JJ,’4’)*arctan(x0)-aux;
f1=sum(R$(ord(R)<4),alpha.l(JJ,R)*(x1**ord(R)))
+alpha.l(JJ,’4’)*arctan(x1)-aux;
put "aux=",aux:12:8, " f0=",f0:12:8," f1=",f1:12:8/;
if(f0*f1>0.0,
put "POSSIBLE ERROR EN INVERSAS"/;
);
while(error gt 0.00001,
error=abs(x0-x1);
x2=(x0+x1)*0.5;
f2=sum(R$(ord(R)<4),alpha.l(JJ,R)*(x2**ord(R)))
+alpha.l(JJ,’4’)*arctan(x2)-aux;
if(f2*f0>0.0,
f0=f2;
x0=x2;
else
f1=f2;
x1=x2;
););
aux=(x0+x1)*0.5;
gam(JJ,S)=rho*gam(JJ,S)+(1.0-rho)*(1.0/abs(aux-Y(JJ,S)));
if(maxerror(J)<abs(aux-Y(JJ,S)),maxerror(J)=abs(aux-Y(JJ,S)));
meanerror(JJ)=meanerror(JJ)+abs(aux-Y(JJ,S));
var(JJ)=var(JJ)+sqr(abs(aux-Y(JJ,S)));
););

291
Salidas usando ficheros

El ejemplo siguiente ilustra cómo grabar resultados en en fichero de salida


y los formatos.

SOLVE onelayer USING lp MINIMIZING z;


put "J=",J.tl:2," z=",z.l:15:9/;
loop(JJ,
put "W(0 ,",JJ.tl:3,")=",W0.l(JJ):15:7/;
loop(I,
put "W(",I.tl:4,",",JJ.tl:3,")=",W.l(JJ,I):15:7/;
);
);
loop(JJ,
loop(R,
put "ALPHA(",JJ.tl:3,",",R.tl:3,")=",alpha.l(JJ,R):10:6/;
);
);
loop(S,
loop(I,
put " X(",I.tl:4,",",S.tl:3,")=",X(I,S):15:7;
);
put " "/;
loop(JJ,
put " Y(",JJ.tl:4,",",S.tl:3,")=",Y(JJ,S):15:7;
);
put " "//;
);
put "x0=",x0:12:6," x1=",x1:12:6/;

292
El problema del transporte I

m
X n
X
Minimizar Z = cij xij . (1)
i=1 j=1
sujeta a
n
P
xij = ui; ∀i = 1 . . . m,
j=1
m
P
xij = vj ; ∀j = 1 . . . n, (2)
i=1
xij ≥ 0; ∀i = 1 . . . m; ∀j = 1 . . . n,
donde m = n = 3 y
     
1 2 3 

 2 5
     
C = 2 1 2  , u =  3  , y v =  2  .



 





 
3 2 1 4 2
$title THE TRANSPORTATION PROBLEM

SETS
I index of shipping origins /I1*I3/
J index of shipping destinations /J1*J3/;

PARAMETERS
U(I) the amount of good to be shipped from origin I
/I1 2
I2 3
I3 4/
V(J) the amount of good to be received in destination J
/J1 5
J2 2
J3 2/;

293
El problema del transporte II

TABLE C(I,J) cost of sending a unit from I to J


J1 J2 J3
I1 1 2 3
I2 2 1 2
I3 3 2 1;

VARIABLES
z objective function variable
x(I,J) the amount of product to be shipped from I to J;

POSITIVE VARIABLE x(I,J);

EQUATIONS
COST objective function equation
SHIP(I) shipping equation
RECEIVE(J) receiving equation;

COST .. z =E= SUM((I,J), C(I,J)*x(I,J)) ;


SHIP(I) .. SUM(J, x(I,J)) =E= U(I) ;
RECEIVE(J) .. SUM(I, x(I,J)) =E= V(J) ;

MODEL transport /COST,SHIP,RECEIVE/;

SOLVE transport USING lp MINIMIZING z;

294
El problema de planificación
de la producción I

n
X
Maximizar Z = (atyt − btxt − ctst), (3)
t=1
sujeta a
st−1 + xt − st = yt, ∀t = 1 . . . n,
(4)
s t , x t , yt ≥ 0.
donde at = bt = ct = 1, ∀t = 1 . . . n; n = 4; s0 = 2 y
y = (2, 3, 6, 1)T .

$title PRODUCTION_SCHEDULING PROBLEM

SET
T The month index /0*4/;

PARAMETER
Y(T) demand in month T
/1 2
2 3
3 6
4 1/
A(T)
B(T)
C(T);

A(T)=1; B(T)=1; C(T)=1;

295
El problema de planificación
de la producción II

VARIABLES
z objective function variable
x(T) number of units produced in month T
s(T) number of units in storage in month T;

POSITIVE VARIABLES x(T),s(T);

s.fx(‘0’)=2;

EQUATIONS
COST objective function
INOUT(T) input and output balance;

COST.. z =E= SUM(T$(ord(T) gt 1),


A(T)*Y(T)-B(T)*x(T)-C(T)*s(T));
INOUT(T)$(ord(T) gt 1)..s(T)=E= s(T-1)+x(T)-Y(T);

MODEL scheduling /ALL/;

SOLVE scheduling USING lp MAXIMIZING z;

Por tanto, la solución del problema es:


Z = 2, x = (0, 3, 6, 1)T , s = (2, 0, 0, 0, 0)T .

296
El problema de la dieta I
n
X
Minimizar Z = cj xj , (5)
j=1
sujeta a
n
P
aij xj ≥ bi; i = 1 . . . m
j=1
xj ≥ 0; j = 1 . . . n.
donde m = 4, n = 5 y
 
   

1 
78.6
 70.1 80.1 67.2 77.0   74.2   
 0.5 
     

6.50
 9.40 8.80 13.7 30.4 

 
 14.7   
A= 


, b = 
 
,
 and c =  2 

 .

0.02
 0.09 0.03 0.14 0.41 

 0.14 
  



     1.2 
0.27 0.34 0.30 1.29 0.86 0.55  
3

$title DIET PROBLEM

SET
I set of nutrients /DN,DP,Ca,Ph/
J set of foods /Corn,Oats,Milo,Bran,Linseed/;

PARAMETERS
B(I) the minimum required amount of nutrient I
/DN 74.2
DP 14.7
Ca 0.14
Ph 0.55/
C(J) cost of one unit of food J
/Corn 1
Oats 0.5
Milo 2
Bran 1.2
Linseed 3/;

297
El problema de la dieta II

TABLE A(I,J) amount of nutrient I in one unit of food J


Corn Oats Milo Bran Linseed
DN 78.6 70.1 80.1 67.2 77.0
DP 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;

VARIABLES
z objective function variable
x(J) the amount of food J to be purchased

POSITIVE VARIABLE x(J);

EQUATIONS
COST objective function
NUTFOOD(I) nutrients and food relation;

COST .. z =E= SUM(J, C(J)*x(J));


NUTFOOD(I) .. SUM(J, A(I,J)*x(J)) =G= B(I);

MODEL diet /ALL/;


SOLVE diet USING lp MINIMIZING z;

La solución óptima de este problema es :


Z = 0.793, x = (0, 1.53, 0, 0.023, 0)T . (6)

298
Despacho económico I

n
X
Minimizar Z = Ci pi, (7)
i=1
sujeto a
δk = 0
j∈Ωi Bij (δi − δj ) + pi
P
= Di; i = 1, 2, . . . , n.
−P ij ≤ Bij (δi − δj ) ≤ P ij ; ∀j ∈ Ωi, i = 1, 2, . . . , n.
P i ≤ pi ≤ P i; i = 1, 2, . . . , n.
(8)
donde n = 3, k = 3 ,
     
 0.15   0.6  6
p=   , p=   , c =  ,
0.10 0.4 7
     
 0.0 2.5 3.5   0.0   0.0 0.3 0.5 
     
B =  2.5 0.0 3.0  , D =  0.0  , P =  0.3 0.0 0.4  ,
3.5 3.0 0.0 0.85 0.5 0.4 0.0
Ω1 = {2, 3}, Ω2 = {1, 3}, y Ω3 = {1, 2},
y la variables son p1, p2, δ1 and δ2.
$title THE ECONOMIC DISPATCH PROBLEM

SETS
G index of generators /G1*G2/
N index of buses /N1*N3/
MAP(G,N) associates generators with buses /G1.N1,G2.N2/;

ALIAS(N,NP);

299
Despacho económico II

TABLE GDATA(G,*) generator input data


PMIN PMAX COST
* (kW) (kW) (E/kWh)
G1 0.15 0.6 6
G2 0.10 0.4 7;
TABLE LDATA(N,N,*) line input data
SUS LIMIT
* (S) (kW)
N1.N2 2.5 0.3
N1.N3 3.5 0.5
N2.N3 3.0 0.4;

PARAMETER
LOAD(N) load at bus N / N3 0.85 /

VARIABLES
z objective function variable
p(G) output power for generator G
d(N) angle at bus N;
p.lo(G)=GDATA(G,’PMIN’);
p.up(G)=GDATA(G,’PMAX’);
d.fx(’N3’)=0;

EQUATIONS
COST objective function
MAXPOW(N,N) maximum line power limit
MINPOW(N,N) minimum line power limit
LOADBAL(N) load balance equation;
COST.. z =e= SUM(G,GDATA(G,’COST’)*p(G));
MAXPOW(N,NP).. LDATA(N,NP,’SUS’)*(d(N)-d(NP))=l= LDATA(N,NP,’LIMIT’);
MINPOW(N,NP).. LDATA(N,NP,’SUS’)*(d(N)-d(NP))=g=-LDATA(N,NP,’LIMIT’);
LOADBAL(N).. SUM(G$MAP(G,N),p(G))+SUM(NP,LDATA(N,NP,’SUS’)
*(d(N)-d(NP))+LDATA(NP,N,’SUS’)*(d(N)-d(NP)))=e=LOAD(N);

MODEL ed /COST,MAXPOW,MINPOW,LOADBAL/;
SOLVE ed USING lp MINIMIZING z;

300
Problema de la red de flujo I

X
Minimizar Z = cij xij
ij
sujeta a
P
(xij − xji) = fi; i = 1, . . . , n;
j
−fij ≤ xij ≤ fij ; ∀i < j.
donde n = 4, se supone que fij = 4, ∀i, j, y (f1, f2, f3, f4) =
(7, −4, −1, −2) y cij = 1; ∀i, j.
$title NETWORK FLOW PROBLEM

SET
I set of nodes in the network /I1*I4/
CONEX(I,I) set of node connections
/I1.I2,I1.I3,I1.I4,I2.I4,I3.I4/;

ALIAS(I,J)

PARAMETERS
F(I) the input or output flow at node I
/I1 7
I2 -4
I3 -1
I4 -2/
FMAX(I,J) maximum flow capacity of conduction from I to J;

FMAX(I,J)=4;

VARIABLES
z objective function variable
x(I,J) the flow going from node I to node J

301
Problema de la red de flujo II

POSITIVE VARIABLE x(I,J);


x.lo(I,J)=-FMAX(I,J);
x.up(I,J)=FMAX(I,J);
EQUATIONS
COST objective function
BALANCE(I) conservation of flow conditions;
COST .. z =E= SUM((I,J)$CONEX(I,J),x(I,J)) ;
BALANCE(I) .. SUM(J$CONEX(I,J),x(I,J))
-SUM(J$CONEX(J,I),x(J,I)) =E= F(I) ;
MODEL netflow /ALL/;
SOLVE netflow USING lp MINIMIZING z;

Una parte del fichero de salida es:


LOWER LEVEL UPPER MARGINAL
---- VAR Z -INF 5.000 +INF .
Z objective function variable

---- VAR X the flow going from node I to node J


LOWER LEVEL UPPER MARGINAL
I1.I2 -4.000 . 4.000 .
I1.I3 -4.000 3.000 4.000 .
I1.I4 -4.000 4.000 4.000 -1.000
I2.I4 -4.000 -4.000 4.000 EPS
I3.I4 -4.000 2.000 4.000 .

La solución es:
Z = 5, x12 = 0, x13 = 3, x14 = 4, x24 = −4, x34 = 2.

302
La cartera de valores I

X
Maximizar Z = dj (bj + xj ) (9)
j
sujeta a
bi + xi ≥ 0
r(Pj vj (bj + xj )) ≤ vi(bi + xi)
P (10)
j vj x j = 0
P
j wj (bj + xj ) ≥ (1 + s) Pj vj bj .
Sea el caso particular de tres acciones, 75 de A1, 100 de A2
y 35 de A3, con valores $20, $20 y $100, respectivamente.
Además, se tiene la información: A1 no dará dividendos con
un nuevo valor $18, A2 pagará $3 por acción y su valor será
$23, y A3 pagará $5 por acción con nuevo valor $102. Si se
toma r = 0.25 y s = 0.03, se tiene
xA ≥ −75,
xB ≥ −100,
xC ≥ −35,
0.25 [20(75 + xA) + 20(100 + xB ) + 100(35 + xC )] ≤ 20(75 + xA),
0.25 [20(75 + xA) + 20(100 + xB ) + 100(35 + xC )] ≤ 20(100 + xB ),
0.25 [20(75 + xA) + 20(100 + xB ) + 100(35 + xC )] ≤ 100(35 + xC ),
20xA + 20xB + 100xC = 0,
18(75 + xA) + 23(100 + xB ) + 102(35 + xC ) ≥ 1.03(20(175)+3500).

$title THE PORTFOLIO PROBLEM


SET
I set of stocks /A1,A2,A3/;

ALIAS(I,J);

303
La cartera de valores II

SCALARS r percentage /0.25/


s percentage /0.03/;

TABLE data(I,*)
B V D W
* ($) ($) ($)
A1 75 20 0 18
A2 100 20 3 23
A3 35 100 5 102

VARIABLES
z objective function variable
x(I) number of shares of stock I;
POSITIVE VARIABLE x(I);

x.lo(I)=-data(I,’B’);

EQUATIONS
COST objective function
NOCHANGE no change in the current value
INFLATION future value must be 3\% greater than the current value
BALANCE(I) to avoid excessive reliance on a single stock;

COST .. z =E= SUM(I,data(I,’D’)*(x(I)+data(I,’B’))) ;


NOCHANGE .. SUM(I,data(I,’V’)*x(I)) =E= 0;
INFLATION .. SUM(I,data(I,’W’)*(x(I)+data(I,’B’)))=G=
(1+s)*SUM(I,data(I,’V’)*data(I,’B’));
BALANCE(I).. r*SUM(J,data(J,’V’)*(x(J)+data(J,’B’)))=L=
data(I,’V’)*(x(I)+data(I,’B’));
MODEL portfolio /ALL/;
SOLVE portfolio USING lp MAXIMIZING z;

La solución es:
Z = 612.5 en el punto xA = 12.5, xB = 75.0, xC = −17.5.

304
El andamio I

X
Maximizar Z = xi
i
sujeta a
TE + TF = x2 ,
TC + TD = TF ,
TA + TB = x1 + TC + TD ,
10TF = 5x2,
8TD = 6TF ,
10TB = 5x1 + 2TC + 10TD .
$title SCAFFOLDING PROBLEM (LINEAR)
SET
B set of beams /B1*B3/
R set of ropes /RA,RB,RC,RD,RE,RF/
L set of loads /L1,L2/
UPP(B,R)
/ B1.(RA,RB)
B2.(RC,RD)
B3.(RE,RF)/
DOWN(B,R)
/ B1.(RC,RD)
B2.(RF)/
LOAD(B,L)
/ B1.L1
B3.L2/;
PARAMETER LMAX(R) maximum load for ropes
/ (RA,RB) 300
(RC,RD) 200
(RE,RF) 100/;

305
El andamio II

PARAMETER DL(L) coordinates of load L/ L1 7 L2 5/;


PARAMETER DR(R) coordinates of rope R
/ RA 2
RB 12
RC 4
RD 12
RE 0
RF 10/;
VARIABLES
z objective function variable
x(L) the applied load
t(R) tension on rope R ;
t.up(R) = LMAX(R);
EQUATIONS
COST objective function
FORCES(B) force equilibrium equation
MOMENT(B) moment equilibrium equation;
COST .. z =E= SUM(L, x(L)) ;
FORCES(B)..SUM(R$UPP(B,R),t(R))=E= SUM(L$LOAD(B,L),x(L))+
SUM(R$DOWN(B,R),t(R));
MOMENT(B)..SUM(R$UPP(B,R),DR(R)*t(R))=E=SUM(L$LOAD(B,L),
DL(L)*x(L))+SUM(R$DOWN(B,R),DR(R)*t(R));
MODEL scaffold /COST,FORCES,MOMENT/;
SOLVE scaffold USING lp MAXIMIZING z;

La solución es:
Z = 640; x1 = 440, x2 = 200; TA = 240,
TB = 300, TC = 25, TD = 75, TE = 100, TF = 100.

306
El armador I
n
X
Maximizar Z = cj xj
j=1
sujeta a
n
X
aj xj ≤ b,
j=1
xj ∈ {0, 1} ∀j = 1 · · · n.
donde se ha supuesto que aj = cj , b = 700 y
a = (100, 155, 50, 112, 70, 80, 60, 118, 110, 55)T .
$title 0-1 KNAPSACK PROBLEM.

OPTION OPTCR=1e-10;

SET
J set of containers /c1*c10/;

PARAMETERS
C(J) benefit of container J
/c1 100
c2 155
c3 50
c4 112
c5 70
c6 80
c7 60
c8 118
c9 110
c10 55/
A(J) weight of container J;
A(J) = C(J);

307
El armador II

SCALAR B maximum capacity of the freighter/700/;

VARIABLES
z objective function variable
x(J) binary choice;

BINARY VARIABLE x;

EQUATIONS
COST objective function
CAPA is the loading of the freighter;

COST .. z=E= SUM(J,C(J)*x(J));


CAPA .. SUM(J,A(J)* x(J)) =L= B;

MODEL knapsack /ALL/;


SOLVE knapsack USING mip MAXIMIZING z;
La solución indica que deben estar los contenedores:
c1, c3, c4, c5, c6, c7, c8, c9.
El valor óptimo es Z = 700 Tn., lo que implica que el barco
irá lleno.

308
Problema de la distribución de energı́a I

K X
X J
Minimizar Z = [Aj vj (k) + Bj pj (k) + Cj yj (k) + Dj zj (k)]
k=1 j=1
(11)
sujeta a
P j vj (k) ≤ pj (k) ≤ P j vj (k); ∀j, ∀k,
pj (k + 1) − pj (k) ≤ Sj ; ∀j, k = 0, · · · , K − 1,
pj (k) − pj (k + 1) ≤ Tj ; ∀j, k = 0, · · · , K − 1,
(12)
yj (k) − zj (k) = vj (k) − vj (k − 1); ∀j, k = 1, · · · , K,
PJ
j=1 pj (k) = D(k); ∀k,
PJ
j=1 P j vj (k) ≥ D(k) + R(k); ∀k,
donde K = 4, J = 3, y
       

50  
350  
300  
200 
       
P=       
 80  , P =  200  , T =  150  , S =  100  ,
       
40 140 100 100
       
5
  
20  
0.5  
0.100 
       
A=       
 7  , B =  18  , C =  0.3  , E =  0.125  ,
       
6 5 1.0 0.150
   

150  
15 
   
D=   
 500  , R =  50  .
   
400 40
$title THE UNIT COMMITMENT PROBLEM

SETS
K index of periods of time /1*4/
J index of generators /1*3/

309
Problema de la distribución de energı́a I

TABLE GDATA(J,*) generator input data


PMIN PMAX T S A B C D
* (kW) (kW) (kW/h) (kW/h) (E) (E) (E) (E/kWh)
1 50 350 300 200 5 20 0.5 0.100
2 80 200 150 100 7 18 0.3 0.125
3 40 140 100 100 6 5 1.0 0.150;
TABLE PDATA(K,*) data per period
D R
* (kW) (kW)
2 150 15
3 500 50
4 400 40;
VARIABLES
z objective function variable
p(J,K) output power of generator j at period k
v(J,K) is 1 if generator j is active in period k
y(J,K) is 1 if generator j is started-up at
the beginning of period k
s(J,K) is 1 if generator j is shut-down in period k;
POSITIVE VARIABLES p(J,K);
BINARY VARIABLES v(J,K),y(J,K),s(J,K);
v.fx(J,’1’)=0;
p.fx(J,’1’)=0;
EQUATIONS
COST objective function
PMAXL(J,K) maximum output power equation
PMINL(J,K) minimum output power equation
LOAD(K) load balance equation

310
Problema de la distribución de energı́a I

EQUATIONS
RESERVE(K) spinning reserve equation
LOGIC(J,K) start-up shut-down and running logic
RUP(J,K) maximum up ramp rate limit
RDOWN(J,K) maximum down ramp rate limit;
COST..z=e= SUM((K,J),GDATA(J,’A’)*v(J,K)+GDATA(J,’B’)
*y(J,K)+GDATA(J,’C’)*s(J,K)+GDATA(J,’D’)*p(J,K));
PMAXL(J,K)$(ord(K) GT 1)..p(J,K)=l=GDATA(J,’PMAX’)*v(J,K);
PMINL(J,K)$(ord(K) GT 1)..p(J,K)=g=GDATA(J,’PMIN’)*v(J,K);
LOAD(K)$(ord(K) GT 1)..SUM(J,p(J,K))=e=PDATA(K,’D’);
RESERVE(K)$(ord(K) GT 1)..SUM(J,GDATA(J,’PMAX’)*v(J,K))=g=
PDATA(K,’D’)+PDATA(K,’R’);
LOGIC(J,K)$(ord(K) GT 1)..y(J,K)-s(J,K)=e=v(J,K)-v(J,K-1);
RUP(J,K)$(ord(K) GT 1)..p(J,K)-p(J,K-1)=l=GDATA(J,’S’);
RDOWN(J,K)$(ord(K) GT 1)..p(J,K-1)-p(J,K)=l=GDATA(J,’T’);

MODEL uc /ALL/;

SOLVE uc USING mip MINIMIZING z;

La solución es:
   
 150 350 320  1 1 1
   
Z = 191, P =  0 100 80  , V =  0 1 1 





0 50 0 0 1 0
   
1 0 0 0 0 0
   
yj (k) =  0 1 0  , pj (k) =  0 0 0  .





0 1 0 0 0 1

311
Modelos de localización I

X X X
Maximizar Z = cij xij − fj yj .
i∈I j∈J j∈J
sujeta a X
xij = bi, ∀i ∈ I
j∈J
X
xij ≤ uj yj , ∀j ∈ J
i∈I
yj ∈ {0, 1}, ∀j ∈ J
xij ≥ 0, ∀i ∈ I, ∀j ∈ J.
donde se supone que uj = 6 ∀j, fj = 10 ∀j y

b = (1.5, 2.0, 3.0, 4.0, 2.5, 1.0, 2.0).


$Title MODEL OF DISCRETE LOCATION

OPTION OPTCR=1e-10;

SET
I index of cities /C1*C7/
J index of locations /L1*L6/;

PARAMETERS

B(I) demand of a certain good in the city I


/C1 1.5 C2 2.0 C3 3.0 C4 4.0 C5 2.5 C6 1.0 C7 2.0/
F(J) amortization cost of an industrial plant at J
U(J) maximum production capacity of a plant in J;
F(J) = 10;
U(J) = 6;

312
Modelos de localización II
Ciudades
Situación C1 C2 C3 C4 C5 C6 C7
L2 1.5 2.0 1.0
L4 3.0 2.5
L5 3.0 1.0 2.0
TABLE C(J,I) benefits according to different locations
C1 C2 C3 C4 C5 C6 C7
L1 4.0 4.5 2.5 0.5 1.0 0.5 -3.5
L2 4.0 4.5 2.5 4.2 3.5 1.5 -0.5
L3 3.5 5.0 4.0 3.5 4.5 1.5 0.0
L4 1.3 3.0 5.0 3.3 5.5 1.8 1.3
L5 0.5 1.0 1.5 5.0 4.0 5.5 3.0
L6 -1.0 0.0 1.5 3.3 4.0 4.5 2.0 ;
VARIABLES
z objective function variable
x(I,J) the amount of good that is made at J and sold at I
y(J) location variable. Equal to 1 if the plant is at J,
and 0 otherwise.
POSITIVE VARIABLE x;
BINARY VARIABLE y;
EQUATIONS
COST objective function
SD(I) satisfying demand of city I
CAPA(J) capacity of production of the plant I;
COST .. z=e= SUM((I,J),C(J,I)*x(I,J))-SUM(J,F(J)*y(J));
SD(I) .. SUM(J,x(I,J)) =e= B(I);
CAPA(J).. SUM(I,x(I,J)) =l= U(J)*y(J);
MODEL loc /all/;
SOLVE loc USING mip MAXIMIZING z;
DISPLAY x.l;

313
EL problema de la Academia I

I
X S
X
Maximizar y Minimizar Zj = xijs, ∀j ∈ {1, 2, . . . , J}
i=1 s=1
sujeta a
S
X
xijs ≤ 1, ∀i ∈ {1, 2, . . . , I}, j ∈ {1, 2, . . . , J}
s=1
J
X
xijs ≤ 1, ∀i ∈ {1, 2, . . . , I}, s ∈ {1, 2, . . . , S}
j=1
I
X S
X
psxijs = cj , ∀j ∈ {1, 2, . . . , J}
i=1 s=1
xijs ∈ {0, 1}, ∀i, j, s
$title ACADEMY
SETS
I number of actual members /1*20/
J number of candidates /1*8/
DIN(J)
S the number of different scores to be assigned /1*4/;
ALIAS(J,J1);
PARAMETER P(S) the $s$-th score
/1 10
2 8
3 3
4 1/;
SCALARS zmin,zmax;
PARAMETER C(J) total score obtained by candidate J;
C(J)=sum(I,N(I,J));
VARIABLES
z function to be optimized ;
BINARY VARIABLE
x(I,J,S) if member I assigns score P(S) to J is 1.

314
EL problema de la Academia II

TABLE N(I,J) score assigned to candidate J by member I


1 2 3 4 5 6 7 8
**************************************************
1 3 10 8 1
2 1 10 8 3
3 1 3 10 8
4 3 10 8 1
5 3 8 10 1
6 1 10 8 3
7 10 8 3 1
8 3 10 1 8
9 8 3 10 1
10 3 10 1 8
11 8 1 10 3
12 10
13 10 8
14 10 1 3 8
15 3 10 8 1
16 10 1 8 3
17 1 3 10 8
18 1 3 8 10
19 1 10 3 8
20 8 1 10 3
;
EQUATIONS
OBJ function to be optimized
L1(I,J) Can assign at most one score to each candidate
L2(I,S) Can asign score S to at most one candidate
TOTALSCORE(J) totalscore given;

315
EL problema de la Academia III

OBJ(J)$DIN(J)..z=e=sum(I,sum(S,x(I,J,S)));
L1(I,J)..sum(S,x(I,J,S))=l=1;
L2(I,S)..sum(J,x(I,J,S))=l=1;
TOTALSCORE(J)..sum(I,sum(S,P(S)*x(I,J,S)))=e=C(J);
MODEL Academy /ALL/;
file aux /academy.out/;
put aux;
DIN(J)=NO;
loop(J1,
DIN(J1)=YES;
Solve Academy using mip Minimizing z;
zmin=z.l;
Solve Academy using mip Maximizing z;
zmax=z.l;
put "J=",J1.tl:3," zmin= ",zmin:3:0," zmax= ",zmax:3:0/;
DIN(J1)=NO;
);

y el contenido del fichero de salida es:


J=1 zmin= 8 zmax= 20
J=2 zmin= 3 zmax= 14
J=3 zmin= 15 zmax= 20
J=4 zmin= 2 zmax= 13
J=5 zmin= 15 zmax= 20
J=6 zmin= 2 zmax= 18
J=7 zmin= 3 zmax= 20
J=8 zmin= 1 zmax= 8

316
EL problema de los horarios I

X nc
X
n
X h
Minimizar (c + h) v(s, c, h)
s∈Ω c=1 h=1
sujeta a
Pnh
P
s∈Ωi
Pnc
h=1 v(s, c, h)
c=1 = ni , ∀i
P Pnc
s∈Ωi c=1 v(s, c, h) ≤ 1, ∀h, ∀i
Pnc Pnh
c=1 h=1 v(s, c, h) = 1, ∀s
s∈Ω v(s, c, h) ≤ ∀c, ∀h
P
1,
s∈∆b c=1 v(s, c, h) ≤ ∀h, ∀b
P Pnc
1,
$title CLASS TIMETABLE
SETS
C classrooms /c1*c3/
H hours /h1*h5/
S subjects /s1*s8/
I instructors /i1,i2/
B blocks /b1,b2/
SI(S,I) maps subjects and instructors
/(s1,s2,s8).i1,(s3*s7).i2/
SB(S,B) maps subjects and blocks /(s1*s4).b1,(s5*s8).b2/;
VARIABLE z;
BINARY VARIABLE v(S,C,H);
EQUATIONS
cost compact the timetable
const1(I) instructors teach all his subjects
const2(H,I) instructors teach at most 1 subject per hour
const3(S) every subject is taught once
const4(C,H) in every classroom-hour pair 1 subject
const5(H,B) every hour at most 1 subject of any blockt;

317
EL problema de los horarios II

EQUATIONS
cost.. SUM((S,C,H),(ord(C)+ord(H))*v(S,C,H))=e=z ;
const1(I).. SUM((S,C,H)$SI(S,I),v(S,C,H))=e=
SUM(S$SI(S,I),card(S))/card(S);
const2(H,I)..SUM((S,C)$SI(S,I),v(S,C,H)) =l= 1;
const3(S).. SUM((C,H),v(S,C,H)) =e= 1;
const4(C,H)..SUM(S,v(S,C,H)) =l= 1;
const5(H,B)..SUM((S,C)$SB(S,B),v(S,C,H)) =l= 1;
model timetable /all/;
solve timetable using mip minimizing z;

DISPLAY v.L;

Parte del fichero de salida es:


LOWER LEVEL UPPER MARGINAL
---- VAR Z -INF 32.000 +INF .

---- 34 VARIABLE V.L


H1 H2 H3 H4 H5
S1.C2 1.000
S2.C2 1.000
S3.C1 1.000
S4.C1 1.000
S5.C1 1.000
S6.C1 1.000
S7.C1 1.000
S8.C2 1.000

318
El problema del abastecimiento de agua I
Planteamiento no lineal

La nueva función objetivo es:


X −
Z= cij (x+
ij + xij ),
ij

que corresponde a
X
Z= cij |xij |.
ij

$title WATER SUPPLY NETWORK (nonlinear)


SET
I set of nodes in the network /I1*I4/
CONEX(I,I) set of node connections
/I1.I2,I1.I3,I1.I4,I2.I4,I3.I4/;
ALIAS(I,J)
PARAMETERS
F(I) the input or output flow at node I
/I1 20
I2 -3
I3 -10
I4 -7/
FMAX(I,J) maximum flow capacity of conduction from I to J;
FMAX(I,J)=8;
VARIABLES
z objective function variable
x(I,J) the flow going from node I to node J
POSITIVE VARIABLE x(I,J);
x.lo(I,J)=-FMAX(I,J);
x.up(I,J)=FMAX(I,J);

319
El problema del abastecimiento de agua II
Planteamiento no lineal

EQUATIONS
COST objective function
BALANCE(I) conservation of flow conditions;
COST .. z=e=SUM((I,J)$CONEX(I,J),ABS(x(I,J)));
BALANCE(I) ..SUM(J$CONEX(I,J),x(I,J))
-SUM(J$CONEX(J,I),x(J,I))=e=F(I);

MODEL wsn_dnlp /ALL/;


SOLVE wsn_dnlp USING dnlp MINIMIZING z;

Una parte del fichero de salida es:


LOWER LEVEL UPPER MARGINAL
---- VAR Z -INF 23.000 +INF .
Z objective function variable

---- VAR X the flow going from node I to node J


LOWER LEVEL UPPER MARGINAL
I1.I2 -8.000 4.000 8.000 .
I1.I3 -8.000 8.000 8.000 -2.000
I1.I4 -8.000 8.000 8.000 -1.000
I2.I4 -8.000 1.000 8.000 .
I3.I4 -8.000 -2.000 8.000 .

La solución es:
 
0 

4 8 8 
 
−4 
 0 0 1 
Z = 23.000, X = 
 .
−8 


0 0 −2 
 
−8 −1 2 0

320
El problema del andamio I

X
Maximizzar xi
i
sujeta a
P
ts = P
xi + P
ts, b ∈ B,
s∈Ψb i∈Ωb x∈Θb

P
drsts = P
xlixi + P
drsts, b ∈ B,
s∈Ψb i∈Ωb x∈Θb

0 ≤ ts ≤ Ts, s ∈ S,

0 ≤ xli ≤ lb, i ∈ Ωb,

0 ≤ xi .
$title SCAFFOLDING (NON-LINEAR)
SET
B set of beams /B1*B3/
R set of ropes /RA,RB,RC,RD,RE,RF/
L set of loads /L1,L2/
UPP(B,R)
/B1.(RA,RB)
B2.(RC,RD)
B3.(RE,RF)/
DOWN(B,R)
/B1.(RC,RD)
B2.(RF)/
LOAD(B,L)
/B1.L1
B3.L2/;

321
El problema del andamio II

PARAMETER LMAX(R) maximum load for ropes


/ (RA,RB) 300 (RC,RD) 200 (RE,RF) 100/;
PARAMETER dr(R) coordinates of rope R
/ RA 2 RB 12 RC 4 RD 12 RE 0 RF 10/;
VARIABLES
z objective function variable
x(L) the amount of food J to be purchased
T(R) tension on rope R
d(L) distance from the left end-points of beams;
POSITIVE VARIABLE d;
T.UP(R) = LMAX(R);
EQUATIONS
COST objective function
FORCES(B) force equilibrium equation
MOMENT(B) moment equilibrium equation;
COST .. z =E= SUM(L, x(L)) ;
FORCES(B)..SUM(R$UPP(B,R),T(R))=E= SUM(L$LOAD(B,L),x(L))+
SUM(R$DOWN(B,R),T(R));
MOMENT(B)..SUM(R$UPP(B,R),dr(R)*T(R))=E=SUM(L$LOAD(B,L),
d(L)*x(L))+SUM(R$DOWN(B,R),dr(R)*T(R));
MODEL ropebeam /COST,FORCES,MOMENT/;
SOLVE ropebeam USING nlp MAXIMIZING z;

La solución es:
Z = 700 en x1 = 500, x2 = 200, d1 = 6.4, d2 = 5.0,
TA = 300, TB = 300, TC = 25,
TD = 75, TE = 100, TF = 100.

322