Está en la página 1de 27

Optimitzaci Curs 2006/2007

Assignatura d`Estadstica, UAB


LINGO - Parte 1
Introduccin a LINGO
Una de las caracteristicas mas potentes de LINGO, es el lenguaje de modelacion matematica. Este
lenguaje permite expresar el problema de una manera natural, similar a la notacion matematica
standard. Ademas de poder ingresar cada termino de cada restriccion explicitamente, LINGO
permite expresar una serie de restricciones similares en una sola sentencia compacta.
Ejemplo 1
Una Iabrica que tiene dos plantas localizadas en las ciudades A y B, necesita suministrar un
determinado producto a tres almacenes situados en las ciudades C, D y E. Las plantas A y B pueden
suministrar semanalmente 80 y 90 unidades del producto, respectivamente. Los almacenes
necesitan semanalmente 40, 50 y 80 unidades del producto para satisIacer su demanda. Los costes
de transporte por unidad de producto se recogen en la tabla siguiente:
Ciuda
d
C D E
A 5 3 4
B 6 7 2
El problema consiste en determinar cuantas unidades del producto se deberan transportar desde
cada planta a cada almacen, de Iorma que se minimice el coste total de transporte.
Denotando por AC, AD, AE las unidades enviadas de la planta A hacia los almacenes C, D y E,
respectivamente, y por BC, BD, BE las unidades enviadas de la planta B hacia los almacenes C, D y
E, respectivamente, la Iormulacion del problema de programacion lineal asociado es la siguiente:
Minimizar 5AC3AD4AE6BC7BD2BE
Sujeto a:
ACADAE 80
BCBDBE90
ACBC~40
ADBD~50
AEBE~80
AC, AD, AE, BC, BD, BE~0
Las dos primeras restricciones imponen que la cantidad suministrada en las plantas A
y B no supere su disponibilidad semanal, mientras que las tres siguientes imponen que
se cubra el requerimiento minimo en los almacenes C, D y E.
1
Modelo en LINGO
La escritura del modelo en LINGO se basa en las siguientes reglas:
a) La Iuncion objetivo va precedida de ~max o ~min y Iinaliza en ~; al igual que cada
una de las restricciones.
b) Las desigualdades pueden escribirse de Iorma estricta, aunque LINGO las interpreta siempre
como <= o >=, segun el caso.
c) No es necesario introducir las restricciones de no negatividad, si las hubiera, ya que LINGO
las considera por deIecto.
d) Es necesario indicar el producto con ~`.
e) LINGO no distingue entre mayusculas y minusculas, por lo que es lo mismo ESTADISTICA
que estadistica y que EsTADistiCA.
I) Los nombres de las variables deben comenzar con un caracter alIabetico (A-Z), los
siguientes caracteres pueden ser alIabeticos, numericos o subrayado (). Los nombres
pueden ser de hasta 32 caracteres de longitud.
Ejercicio 1
Abra el editor del LINGO y escriba el modelo matematico del problema del ejemplo 1, teniendo en
cuenta las reglas del LINGO.
El modelo puede escribirse como sigue:
MIN = 5*AC+3*AD+4*AE+6*BC+7*BD+2*BE;
AC+AD+AE<80!
BC+BD+BE<90!
AC+BC>40!
AD+BD>50!
AE+BE>80!
Nota:
a) Cada linea en LINGO Iinaliza con un punto y coma. Los punto y coma son requeridos. El
modelo no se resolvera si Ialta algun punto y coma.
b) Una expresion puede abarcar mas de una linea, por ejemplo:
MIN = 5*AC+3*AD+4*AE
+6*BC+7*BD+2*BE;
Se pueden introducir comentarios, que seran ignorados por LINGO, comenzando con un signo de
exclamacin ! y terminando con un punto y coma.
Los comentarios tambien pueden ocupar varias lineas.
Por ejemplo:
AC+AD+AE<80!"! Esto es
Un comentario;
AC+AD ! Esto es un comentario en el medio de una restriccin; +AE<80 ;
2
Ademas se puede asignar un nombre a cada restriccion, como en el LINDO.
Por ejemplo, escribiendo
R1] ACADAE 80
R2] BCBDBE90
La primera restriccion de nuestro ejemplo tiene ya el nombre R1 y la segunda el nombre R2.

El siguiente paso es pedirle a LINGO que resuelva el problema. Para ello es suIiciente con hacer
clic sobre el boton Solve (el que tiene Iorma de diana, como en el LINDO), o bien seleccionar esta
opcion en la barra de menus:
LINGO intentara primero compilar el modelo formulado (para determinar si esta bien planteado o no) v, en el caso
de que la formulacion sea incorrecta (va sea desde un punto de vista matematico o de sintaxis), nos devolvera una
ventana con la siguiente mensafe.
LNGO error message
.
Si no hay errores en la Iormulacion del problema durante la etapa de compilacion, LINGO invocara
al modulo de resolucion adecuado para buscar la solucion optima.
En la ventana STATUS` de LINGO (ventana de estado) se puede monitorear el proceso de
resolucion y las dimensiones del modelo:
El recuadro "Variables" muestra el numero total de variables del modelo, las variables que son
no lineales y las enteras. Una variable es considerada no lineal si es parte de una restriccion no
3
lineal en el modelo. Mientras mas variables no lineales y enteras contenga el modelo, mas diIicil
sera resolverlo de Iorma optima en un tiempo razonable. Los modelos lineales puros sin variables
enteras tienden a resolverse mas rapidamente.
La cuenta de variables no incluve las que LINGO determina como de valor fifo, por efemplo. dadas
las restricciones
X 1,
X Y 3,
LINGO determina por la primera restriccion que X esta fifa en 1, v, usando esta informacion,
deduce que Y esta fifa en 2. X e Y seran entonces excluidas del modelo.
En el recuadro "Constraints" se muestra la cantidad total de restricciones y el numero de estos
que son no lineales. Una restriccion es considerada no lineal si una o mas variables aparecen de
Iorma no lineal en la restriccion.
El recuadro "Nonzeros" muestra el total de coeficientes distintos de cero que aparecen en el
modelo y el numero de estos que aparecen en variables no lineales.
El recuadro "Generator Memory Used" muestra la cantidad de memoria que est utilizando
LINGO para resolver el modelo.
El recuadro "Elapsed Runtime" muestra el tiempo total utilizado para generar y resolver el
modelo.
El recuadro "Optinizer Status" muestra el estado actual del optimizador:
Campo Descripcin
State Estado de la solucion actual, puede ser
"Global optimum", "Local optimum",
"Feesible", "Unbounded", "Interrupted",
"Undetermined"
Iterations Numero de iteraciones
InIeasibility Cantidad de veces que es violada una
restriccion
Objetive Valor actual de la Iuncion objetivo
Best IP Valor de la Iuncion objetivo de la mejor
solucion entera encontrada (solo en
modelos de programacion entera)
IP Bound Limite teorico de la Iuncion objetivo para
modelos de programacion entera.
4
Cuando LINGO termine de resolver el modelo, creara una nueva ventana con el titulo !"#$%&"'(
)*+",%(-.'/",0*(1*(#2(3"#$4&5'67 conteniendo los detalles de la solucin:
Costo Reducido.
En el inIorme de la solucion se encuentra un valor de costo reducido para cada variable. Como
hemos visto en LINDO, hay dos interpretaciones validas y equivalentes para el costo reducido.
a) Primero se puede interpretar como el monto por el cual el coeIiciente objetivo de la variable
se deberia incrementar antes de hacerse provechoso darle a la variable en cuestion un valor
positivo en la solucion optima. Por ejemplo, si la variable tuviera un costo reducido de 10,
el coeIiciente objetivo de esta variable debera incrementarse en 10 unidades en un problema
de maximizacion o disminuirse en 10 unidades en un problema de minimizacion para
convertirse en una alternativa atractiva. Una variable en la solucion optima
automaticamente tiene un costo reducido de 0.
b) Segundo, el costo reducido de una variable se puede interpretar como el monto de
penalizacion que habra que pagar por introducir una unidad de esa variable en la solucion.
Como antes, si la variable tuviera un costo reducido de 10, habra que pagar una penalizacion
de 10 unidades para introducir la variable en la solucion. En otras palabras, el valor objetivo
caera en 10 unidades en un modelo de maximizacion, o se incrementara 10 unidades en un
problema de minimizacion.
Los costos reducidos son validos solo dentro de un rango de valores.
5
Holgura o excedente
La columna Slack or Surplus en el inIorme de la solucion de LINGO (como en LINDO) muestra
que tan cerca se esta de satisIacer una restriccion como una igualdad. Esta cantidad, en
restricciones de menor o igual, se denomina generalmente holgura. En restricciones de mayor o
igual se la llama excedente.
Si una restriccion es exactamente satisIecha como una igualdad, la holgura o excedente valdra cero.
Si una restriccion es violada, este valor sera negativo. Esto ayuda a encontrar las restricciones
violadas cuando en el modelo no existe un conjunto de valores para las variables que satisIacen
simultaneamente todas las restricciones.
Precio Dual.
El inIorme de la solucion de LINGO tambien da un valor de precio dual para cada restriccion. El
precio dual se puede interpretar como el monto en que la Iuncion objetivo mejorara si el segundo
miembro de la restriccion se incrementase una unidad.
Al igual que los costos reducidos, los precios duales son validos solo dentro de un rango de valores.
Como puede observarse en la ventana de estado del LINGO, para minimizar los costes de transporte
han de enviarse 30 unidades de la planta A al almacen C y el resto, es decir 50, al almacen D.
En la planta B se ha de asignar 10 unidades al almacen C y el resto (80) al E.
El coste de transporte minimo es 520.
Como puede observarse, todas las holguras son nulas.
6
Anlisis de sensibilidad
Para hacer un analisis de sensibilidad de nuestro ejemplo hay que seleccionar el comando Range del
menu del LINGO
Aparece la ventana siguiente:
Se puede observar
a) el rango de variacion permitido de cada coeIiciente (tolerancia) en la Iuncion objetivo
(objective coeIIicient ranges`) para que, permaneciendo inalterados el resto de ellos, la
solucion del problema primal no cambie.
b) el rango de variacion permitido (tolerancia) en el termino independiente de cada
restricciones (righthand side changes`) para que, permaneciendo inalterados el resto, la
solucion siga siendo la misma.
Por ejemplo, el coste unitario de transporte entre las ciudades A y C puede variar en el intervalo
|2,6| sin que la solucion del problema cambie.
(Para la variable AC5.0 en el optimo, Allowable CoeIIicient Increase`1.0 y Allowable
CoeIIicient Decrease` 3.0)
De Iorma similar, la produccion en la planta A puede variar en el intervalo |80,90| y los precios
duales seguirian siendo los mismos.
(RHS` valor en el lado derecho de la primera restriccion 80, Allowable RHS Increase`10.0
y Allowable RHS Decrease` 0.0)
7
Ejercicio 2
Una empresa de reIrescos produce dos tipos de bebidas con sabor de naranja: de bajo contenido en
azucar y de contenido normal, denominadas naranjada ligera y naranjada extra, respectivamente.
Para su Iabricacion se emplean tres procesos productivos (designados como P1, P2 y P3) siendo, en
cada uno de ellos, el numero de horas empleado por unidad de bebida producida los que Iiguran en
la tabla, en la cual se recogen tambien los beneIicios unitarios por unidad vendida de reIresco.
Proceso Naranjada ligera Naranjada extra
P1 6 8
P2 4 3
P3 5 4
BeneIicio unitario 6.5 8
Las caracteristicas del proceso de produccion dan lugar a que por cada unidad de naranjada ligera se
generen 3 unidades de residuo que deben eliminarse, con un coste unitario de 0.25 euros.
Analogamente, por cada unidad de naranjada extra se obtienen 1.5 unidades de cierto subproducto,
que puede venderse con un beneIicio unitario de 1.5 euros. Sin embargo, la cantidad sobrante de
subproducto que no haya podido colocarse en el mercado debe eliminarse, con un coste unitario de
0.75 euro.
La demanda prevista de subproducto es, como mucho, de 15 unidades y que los tiempos de
produccion disponibles son de 350 horas para P1, 300 horas para P2 y 320 horas para P3.
a) Formular un problema lineal que proporcione el plan de produccion con maximo beneIicio.
Supongamos que
NL : unidades de naranjada ligera que se van a Iabricar
NE : unidades de naranjada extra que se van a Iabricar
RE : unidades de residuo que se deben eliminar
SB : unidades de subproducto (de naranjada extra) que se van a producir
SE : unidades de subproducto que no haya podido colocarse en el mercado
El beneIicio de la compaia (Iuncion objetivo) es 6.5*NL8*NE1.5*SB
-0.25*RE-0.75*SE
Y las restricciones del problema son:
6*NL8*NE350 (horas disponibles para P1)
4*NL3*NE300 (horas disponibles para P2)
5*NL4*NE320 (horas disponibles para P3)
SB15 (demanda prevista de subproducto)
RE3*NL (por cada unidad de naranjada ligera se generen 3 unidades de residuo que deben eliminarse)
SBSE1.5*NE (por cada unidad de naranjada extra se obtienen 1.5 unidades de subproducto)
8
b) Escribir el problema en LINGO
c) Resolver el problema usando LINGO. Cual es el maximo beneIicio? (361.25 euros)
d) Cuales son los valores optimos de las variables NL, NE, RE, SB, SE? (45, 10 , 135, 15, 0)
e) Cuales son las restricciones activas en el optimo? (restricciones. de las horas disponibles
para P1, de la demanda prevista de subproducto, v las dos igualdades)
I) Cuanto se deberia bajar el coste unitario de la cantidad sobrante de subproducto que no
haya podido colocarse en el mercado y que debe eliminarse? (precio dual de SE aprox. 0.53
euros)
Noviembre 2006 Maria
Zakvnthinaki
9
Optimitzaci Curs 2006/2007
Assignatura d`Estadstica, UAB
LINGO - Parte 2
Programacin en LINGO
Ejemplo 1: El problema del transporte
La compaia Mega Transporte (MT) tiene 6 depositos que proveen a 8 vendedores. Cada deposito
puede proveer una cantidad de materiales que no puede ser excedida, y cada vendedor tiene una
demanda que debe ser satisIecha. MT quiere determinar cuanto material enviar de cada deposito a
cada vendedor para minimizar el coste.
Este es un problema clasico de optimizacion llamado el problema del transporte.
El siguiente diagrama ilustra el problema:
Puesto que cada deposito puede enviar a cada vendedor, hay un total de 48 caminos o arcos de
envio posibles, se necesitara 1 variable para cada uno de estos arcos que representen la cantidad
enviada.
1
Estan disponibles los siguientes datos:
Deposito (DP) Capacidad
1 60
2 55
3 51
4 43
5 41
6 52
Vendedor (V) Demanda
1 35
2 37
3 22
4 32
5 41
6 32
7 43
8 38
coste de envio por unidad (euros):
V1 V2 V3 V4 V5 V6 V7 V8
DP1 6 2 6 7 4 2 5 9
DP2 4 9 5 3 8 5 8 2
DP3 5 2 1 9 7 4 3 3
DP4 7 6 7 3 9 2 7 1
DP5 2 3 9 5 7 2 6 5
DP6 5 5 2 2 8 1 4 3
!"#$%&'()&#*+,-.(/*
El primer paso para plantear el modelo sera construir la Iuncion objetivo. MT quiere minimizar el
total de los costes de envio.
Haremos que la variable CANTIDADij indique la cantidad de mercaderia enviada desde el deposito
i hacia el vendedor j.
Entonces, si tuvieramos que escribir la Iuncion objetivo usando variables escalares tendriamos:
MIN
6 *CANTIDAD
11
2 * CANTIDAD
12

6 * CANTIDAD
13
7 * CANTIDAD
14

4 * CANTIDAD
15

0
0
0
8 * CANTIDAD
65
CANTIDAD
66
4 * CANTIDAD
67

3 * CANTIDAD
68
;
2
Como se ve, ingresar una Iormula como esta es tedioso y propenso a errores. En un caso mas
realista, los vendedores podrian ser miles, y el modelado con variables escalares se vuelve muy
problematico.
Con una notacion matematica, se podria expresar esta ecuacion de esta Iorma:
Minimizar _
ij
( COSTE
ij
` CANTIDAD
ij
)
donde la variable CANTIDADij indica la cantidad de mercaderia enviada desde el deposito i hacia
el vendedor j, y la variable COSTEij indica el coste de envio por unidad.
En otras palabras, el objetivo es minimizar la suma de los costes de envio por unidad por la cantidad
de mercaderia enviada por todos los caminos entre los depositos y los vendedores.
Definicin de los Conjuntos
LINGO permite deIinir conjuntos de objetos relacionados en la "seccion de conjuntos" (!"#!$
!"%#&'().
Esta seccion comienza con la palabra clave SETS:
y termina con ENDSETS.
En el caso del modelo de Mega Transporte, vamos a construir 3 conjuntos,
los 2 conjuntos principales:
1. Depositos
2. Vendedores
y un conjunto derivado:
3. Arcos de envio desde cada deposito a cada vendedor
Tenemos 6 depositos DP1, DP2, DP3, DP4, DP5 y DP6,
y 8 vendedores V2, V3, V4, V5, V6, V7 y V8.
Cada deposito puede proveer una cantidad de materiales que no puede ser excedida (tiene una
capacidad) y cada vendedor tiene una demanda que debe ser satisIecha.
Se puede deIinir los conjuntos del problema, escribiendo en LINGO:
SETS:
DEPOSITOS / DP1 DP2 DP3 DP4 DP5 DP6/: CAPACIDAD;
VENDEDORES / V1 V2 V3 V4 V5 V6 V7 V8/: DEMANDA;
ARCOS_ENVIO( DEPOSITOS, VENDEDORES) : COSTE, CANTIDAD;
ENDSETS
3
La segunda linea dice que el conjunto DEPOSITOS tiene los elementos DP1, DP2, DP3, DP4, DP5
y DP6, cada uno con un atributo llamado CAPACIDAD.
Los vendedores se deIinen en la tercera linea, cada uno con un atributo llamado DEMANDA.
El ultimo conjunto, titulado ARCOSENVIO representa los 48 caminos entre los depositos y los
vendedores. Cada camino tiene los atributos COSTE y CANTIDAD asociados. La sintaxis para
deIinir este conjunto, diIiere de las dos anteriores.
EspeciIicando ARCOSENVIO(DEPOSITOS, VENDEDORES) estamos diciendo a LINGO que el
conjunto ARCOSENVIO deriva de DEPOSITOS y VENDEDORES.
En este caso, LINGO genera cada par ordenado de (depositos, vendedores) y cada uno de estos 48
pares ordenados es un elemento del conjunto ARCOSENVIO.
La funcin objetivo en LINGO
Vamos a expresar la Iuncion objetivo
Minimizar _
ij
( COSTE
ij
` CANTIDAD
ij
) en el lenguaje de LINGO:
a) La suma _

( ) se puede expresar en LINGO como SUM( )
b) Los subindices ij se reIieren a los ij elementos del conjunto ARCOSENVIO.
Entonces la sentencia de LINGO equivalente a _
ij
( ) es SUM(ARCOS_ENVIO(I,1) : )
c) La sentencia de LINGO para la Iuncion objetivo es
MIN SUM(ARCOS_ENVIO(I,1): COSTE(I,1) ` CANTIDAD(I,1));
.
Restricciones
El siguiente paso es Iormular las restricciones. Hay dos conjuntos de restricciones en este modelo:
a) El primero garantiza que cada vendedor recibe el numero de unidades requerida
(restricciones de demanda).
b) El segundo conjunto de restricciones asegura que cada deposito no envia mas de lo que tiene
(restricciones de capacidad).
Comenzando con las restricciones de demanda del Vendedor 1, necesitamos sumar los envios de
todos los i depositos hacia el Vendedor 1 e igualarlo a la demanda del Vendedor 1:
_
i
(CANTIDAD
i1
) DEMANDA
1
Ademas de otras 7 restricciones de demanda, para cubrir a los 8 vendedores.
Con una notacion matematica, se podria expresar todas las restricciones de esta Iorma:
For
jnmero de vendedor
_
i
(CANTIDAD
ij
) DEMANDAj }
SigniIica: para todos los vendedores, la suma de la CANTIDAD enviada desde cada uno de los
4
depositos a ese vendedor debe ser igual a la demanda correspondiente del vendedor.
En LINGO la sentencia correspondiente queda asi:
FOR( VENDEDORES( 1):
SUM( DEPOSITOS( I): CANTIDAD( I, 1))
DEMANDA( 1));
Esta sentencia reemplaza a las 8 restricciones de demanda. Notese la gran similitud con la notacion
matematica.
De manera analoga pueden expresarse las restricciones de capacidad:
FOR( DEPOSITOS( I):
SUM( VENDEDORES( 1): CANTIDAD( I, 1) )<
CAPACIDAD( I));
Equivale a: para cada miembro del conjunto DEPOSITOS, la suma del CANTIDAD enviado a cada
vendedor desde ese deposito, debe ser menor o igual a la capacidad del deposito.
El modelo completo
MODEL:
MIN SUM( ARCOS_ENVIO( I, 1):
COST( I, 1) ` CANTIDAD( I, 1));
FOR( VENDEDORES( 1):
R_demanda] SUM( DEPOSITOS( I): CANTIDAD( I, 1))
DEMANDA( 1));
FOR( DEPOSITOS( I):
R_capacidad] SUM( VENDEDORES( 1): CANTIDAD( I, 1)) <
CAPACIDAD( I));
END
5
!"#$%&'()%()*+'&
LINGO permite al usuario aislar los datos en una seccion separada del modelo. Con los datos
independientes del modelo, es mucho mas Iacil hacer cambios, y hay menos oportunidad de
cometer errores.
La seccion de datos comienza con la sentencia ,-.-/ y Iinaliza con 01,,-.-.
En el ejemplo de Mega Transporte, tenemos la siguiente seccion de datos:
,-.-/
(((2-3-2!,-,(4(56(77(78(9:(98(7;<
(((,0=-1,-(4(:7(:>(;;(:;(98(:;(9:(:?<
(((2@A.0(4(5(;(5(>(9(;(7(B
((((((((((9(B(7(:(?(7(?(;
((((((((((7(;(8(B(>(9(:(:
((((((((((>(5(>(:(B(;(>(8
((((((((((;(:(B(7(>(;(5(7
((((((((((7(7(;(;(?(8(9(:<
01,,-.-
Observe que: los atributos CAPACIDAD del conjunto DEPOSITOS y DEMANDA de
VENDEDORES se inicializan de Iorma directa.
El atributo COSTE del conjunto bidimensional ARCOSENVIO es un poco mas oscuro. Cuando
LINGO inicializa una matriz multidimensional, incrementa el indice exterior mas rapidamente, en
este caso COSTE(DP1, V1) se inicializa primero, seguido de COSTE(DP1, V2) hasta COSTE(DP1,
V8). Despues se inicializara COSTE(DP2, V1), y asi sucesivamente.
6
Poniendo juntas las secciones de datos, de conjuntos, la Iuncion objetivo y las restricciones, el
modelo queda como sigue:
MODEL:
! Un problema de transporte con 6 depsitos y 8 vendedores ;
SETS:
DEPOSITOS/ DP1 DP2 DP3 DP4 DP5 DP6/: CAPACIDAD;
VENDEDORES/ V1 V2 V3 V4 V5 V6 V7 V8/: DEMANDA;
ARCOS_ENVIO (DEPOSITOS, VENDEDORES):COSTE, CANTIDAD;
ENDSETS
!El objetivo;
Objetivo] MIN SUM( ARCOS_ENVIO( I, 1):
COSTE( I, 1) ` CANTIDAD( I, 1));
!Restriccin de demanda;
FOR( VENDEDORES( 1):
[R_demanda]! SUM( DEPOSITOS( I): CANTIDAD( I, 1))
DEMANDA( 1));
!Restriccin de capacidad;
FOR( DEPOSITOS( I):
[R_capacidad]!SUM( VENDEDORES( 1): CANTIDAD( I, 1)) <
CAPACIDAD( I));
!Los datos;
DATA:
CAPACIDAD 60 55 51 43 41 52;
DEMANDA 35 37 22 32 41 32 43 38;
COSTE 6 2 6 7 4 2 5 9
4 9 5 3 8 5 8 2
5 2 1 9 7 4 3 3
7 6 7 3 9 2 7 1
2 3 9 5 7 2 6 5
5 5 2 2 8 1 4 3 ;
ENDDATA
END
7
!"#$%&%&'()
Escribir el modelo completo en el archivo LINGO del ejercicio 1.
Nota: los nombres de las restricciones de demanda y de capacidad se debe poner entre el bucle
FOR y antes de la suma SUM!
(Hay un nombre para cada indice i del FOR y para cada restriccion)
!"#$%&%&'(*
Resolver el modelo usando LINGO para determinar la cantidad optima de material para enviar
desde cada deposito hacia cada vendedor.
a) Cual es el coste optimo de envios? !""#$%&'()*
b) Cuanto material se debe enviar cada deposito hacia cada vendedor en el caso optimo?
c) Cuales son las restricciones activas en el modelo?
+(,-%./'%$011"$2$34'54$
64789:;-947-
8
Optimitzaci Curs 2006/2007
Assignatura d`Estadstica, UAB
LINGO - Parte 3
Anlisis de sensibilidad con LINGO
Ejemplo
Una carpinteria industrial produce tablas de madera de cuatro tamaos: pequeas, medianas,
gruesas y extra-gruesas. Dichas tablas se pueden Iabricar en cualquiera de los tres tipos siguientes
de maquina: basica, normal y especial. Las capacidades de procesamiento de cada maquina (en
terminos de centimetros de tabla por hora) son las que Iiguran en la tabla siguiente:
Mquina
Tabla Bsica Normal Especial
Pequea 350 650 850
Mediana 300 450 750
Gruesa 250 400 650
Extra-gruesa 150 250 350
Cada maquina se puede usar hasta 300 horas por mes.
Los costes de procesamiento por hora, para cada tipo de maquina, son de 25, 40 y 60 euros
respectivamente.
Mensualmente se requieren 12000, 9000, 8000 y 8000 centimetros de los distintos tamaos de las
tablas.
Cuanto tiempo se debe usar cada maquina (mensualmente) para producir cada uno de los 4 tipos de
tablas en el plan optimo que minimice los costes de produccion?
Hay cuatro tipos de tablas (T1, T2, T3, T4) y tres maquinas (M1, M2, M3).
Para cada tipo de tabla i hay una demanda (en centimetros) DEMANDAi.
Para cada maquina j hay un coste por hora (en euros) COSTEj.
Para producir una tabla de tipo i en la maquina j:
-las horas necesarias son HORASij
-hay una capacidad de procesamiento por hora, PRODUCCIONij
El objetivo es:
Minimizar _
j
COSTEj ` (horas total en la mquina j ) ]
El tiempo total en la maquina j es _
i
( HORAS ij ), entonces el objetivo es:
Minimizar _
j
COSTEj ` _
i
( HORAS ij ) ]
1
La primera restriccion es la de demanda: la produccion total para cada tipo de tabla no se puede se
mayor que la demanda para este tipo de tabla:
Para cada tipo de tabla (i): _
j
( PRODUCCIONij ` HORASij )>DEMANDAi ]
La segunda restriccion es la restriccion de horas disponibles en cada maquina:
Para cada tipo de mquina (j): _
i
( HORAS ij ) < 300 ]
Para expresar este problema en el lenguaje del LINGO:
Primero deIinimos los SETS (conjuntos) de problema,
es decir los conjuntos primarios
TABLAS/ T1 T2 T3 T4 /: DEMANDA;
MAQUINAS/ M1 M2 M3 /: COSTE;
y el conjunto derivado
ENLACE (TABLAS, MAQUINAS):PRODUCCION, HORAS;
El objetivo es
|objetivo| MIN SUM( MAQUINAS(J):COSTE(J)*
SUM(TABLAS(I):HORAS(I, J)) );
Las restricciones son:
1. Restriccion de demanda;
FOR( TABLAS( I):
|Rdemanda| SUM( MAQUINAS( J): PRODUCCION( I, J) * HORAS(I, J) ) ~
DEMANDA( I));
2. Restriccion de tiempo disponible
FOR( MAQUINAS( J):
|Rhoras| SUM( TABLAS( I): HORAS( I, J)) 300);
Ejercicio 1
Crear un archivo LINGO y escribir el programa anterior.
No olvidar ingresar los datos del problema.
2
MODEL:
TITLE LINGO3_EJEMPLO;
SETS:
TABLAS/ T1 T2 T3 T4 /: DEMANDA;
MAQUINAS/ M1 M2 M3 /: COSTE;
ENLACE (TABLAS, MAQUINAS):PRODUCCION, HORAS;
ENDSETS
!El objetivo;
[Objetivo] MIN = @SUM( MAQUINAS(J):COSTE(J)*
@SUM(TABLAS(I):HORAS(I,J)) );
!Restriccion de demanda;
@FOR( TABLAS( I):
[R_demanda] @SUM( MAQUINAS( J): PRODUCCION( I, J) * HORAS(I,J) ) >=
DEMANDA( I));
!Restriccion de capacidad;
@FOR( MAQUINAS( J):
[R_horas] @SUM( TABLAS( I): HORAS( I, J)) <= 300);
!Los datos;
DATA:
DEMANDA = 12000 9000 8000 8000;
COSTE = 25 40 60 ;
PRODUCCION = 350 650 850
300 450 750
250 400 650
150 250 350 ;
ENDDATA
END
Observar, en el programa anterior, la linea
TITLE LINGO3_EJEMPLO;'
que asigna un ttulo a nuestro modelo y se pone despus de la lnea `MODEL:'.
Si queremos asegurar que hemos ingresado las ecuaciones (objetivo-restricciones) del problema
correctamente, LINGO puede crear un inIorme en que se puede ver todas las ecuaciones en una
Iorma expandida.
Por ejemplo, en el programa anterior, se puede seleccionar LINGO -~ GENERATE.
Aparece el dialogo
3
Seleccionando ALGEBRAIC`, LINGO nos da el inIorme siguiente:
MIN 60 HORAS( T4, M3) 40 HORAS( T4, M2) 25 HORAS( T4, M1)
60 HORAS( T3, M3) 40 HORAS( T3, M2) 25 HORAS( T3, M1)
60 HORAS( T2, M3) 40 HORAS( T2, M2) 25 HORAS( T2, M1)
60 HORAS( T1, M3) 40 HORAS( T1, M2) 25 HORAS( T1, M1)
SUBJECT TO
RDEMANDA( T1)| 850 HORAS( T1, M3) 650 HORAS( T1, M2)
350 HORAS( T1, M1) ~ 12000
RDEMANDA( T2)| 750 HORAS( T2, M3) 450 HORAS( T2, M2)
300 HORAS( T2, M1) ~ 9000
RDEMANDA( T3)| 650 HORAS( T3, M3) 400 HORAS( T3, M2)
250 HORAS( T3, M1) ~ 8000
RDEMANDA( T4)| 350 HORAS( T4, M3) 250 HORAS( T4, M2)
150 HORAS( T4, M1) ~ 8000
RHORAS( M1)| HORAS( T4, M1) HORAS( T3, M1) HORAS( T2, M1)
HORAS( T1, M1) 300
RHORAS( M2)| HORAS( T4, M2) HORAS( T3, M2) HORAS( T2, M2)
HORAS( T1, M2) 300
RHORAS( M3)| HORAS( T4, M3) HORAS( T3, M3) HORAS( T2, M3)
HORAS( T1, M3) 300
END
El inIorme anterior contiene todas las ecuaciones de nuestro modelo en Iorma expandida.

De misma manera, seleccionando LINDO`, LINGO nos devuelve nuestro programa escrito en el
lenguaje del LINDO.
!"#$%&%&'()
Resolver el problema con LINGO.
a) Cual es el coste de produccion minimo? !"#$%&'(")*+,-./
b) Cual es el tiempo total (en horas) en cada maquina en el optimo? !01234)0()56,-7)834)0")
56,-7)(#&"/
*+,-'(.*+,-#/(0(+,12&3&3(4#(3#,3&5&2&4+4
El comando rango (LINGO -~ RANGE) se utiliza para generar un inIorme de rango para el modelo
de la ventana activa.
El inIorme de rango muestra sobre que rangos se puede:
1) cambiar un coeIiciente en la Iuncion objetivo sin causar un cambio en alguno de los valores
optimos de las variables de decision, o
2) cambiar una constante de una restriccion (coeIiciente del segundo miembro) sin provocar un
cambio en los valores optimos de los precios duales o costos reducidos.
4
Por ejemplo, seleccionando RANGE en nuestro ejemplo, aparece la ventana son los datos
siguientes:
Ranges in which the basis is unchanged:
Objective Coefficient Ranges
Current Allowable Allowable
Variable Coefficient Increase Decrease
HORAS( T1, M1) 25.00000 INFINITY 3.461538
HORAS( T1, M2) 40.00000 5.882353 40.00000
HORAS( T1, M3) 60.00000 INFINITY 7.692308
HORAS( T2, M1) 25.00000 INFINITY 1.000001
HORAS( T2, M2) 40.00000 INFINITY 4.000001
HORAS( T2, M3) 60.00000 2.500001 60.00000
HORAS( T3, M1) 25.00000 INFINITY 1.923076
HORAS( T3, M2) 40.00000 INFINITY 3.076922
HORAS( T3, M3) 60.00000 4.999999 60.00000
HORAS( T4, M1) 25.00000 INFINITY 1.000001
HORAS( T4, M2) 40.00000 1.666667 40.00000
HORAS( T4, M3) 60.00000 INFINITY 4.000001
Righthand Side Ranges
Row Current Allowable Allowable
RHS Increase Decrease
R_DEMANDA( T1) 12000.00 162200.0 12000.00
R_DEMANDA( T2) 9000.000 206769.2 9000.000
R_DEMANDA( T3) 8000.000 179200.0 8000.000
R_DEMANDA( T4) 8000.000 62384.61 8000.000
R_HORAS( M1) 300.0000 INFINITY 300.0000
R_HORAS( M2) 300.0000 INFINITY 249.5385
R_HORAS( M3) 300.0000 INFINITY 275.6923
La primera seccion del inIorme se titula Rangos de CoeIicientes Objetivos (Objective
Coefficient Ranges).
En la primera columna, titulada Variable, se listan por su nombre todas las variables a optimizar. La
siguiente columna, titulada Current CoeIIicient (CoeIiciente actual) muestra el coeIiciente actual de
la variable en la Iuncion objetivo.
La columna Allowable Increase (Incremento permitido) nos dice el monto en que podriamos
incrementar el coeIiciente en la Iuncion objetivo sin cambiar los valores optimos de las variables.
La ultima columna, Allowable Decrease (Decremento permitido) muestra el monto en que
podriamos disminuir el coeIiciente en la Iuncion objetivo sin que cambien los valores optimos en
las variables.
La informacion de los incrementos v decrementos permitidos de los coeficientes de la funcion
obfetivo es util para responder a las preguntas como. "Cuanto mas (menos) provechoso puede ser
esta actividad antes de que estemos dispuestos a hacer mas (menos) de esto?"
Nota: Los rangos son validos si se quiere cambiar !"#$%&%#'%()*'*("+( de la Iuncion objetivo o del
segundo miembro de alguna restriccion.
5
La segunda seccion del inIorme de rango se titula Rangos del Lado Derecho (Righthand Side
Ranges).
La primera columna, Row (Iila), muestra los nombres de todas las Iilas a optimizar, o restricciones
del modelo.
La segunda columna, Current RHS (RHS Actual) dice el termino constante, o segundo miembro
(miembro del lado derecho) de la restriccion.
Las dos columnas siguientes, Allowable Increase y Alolowable Decrease, nos dice cuanto podemos
incrementar o disminuir el coeIiciente correspondiente a la restriccion, sin aIectar a los valores de
los precios duales o costos reducidos.
Nota: Cada restriccion en el modelo del ejemplo esta precedida por un nombre encerrado entre
corchetes. Esta es una practica importante si se quiere generar inIormes de rango. Si no se le ponen
nombres a las restricciones, LINGO les asigna un numero de Iila que utiliza internamente como
indice. Este indice interno no correspondera siempre con el orden de la restriccion en el modelo
original.
Entonces es conveniente nombrar las restricciones para hacer mas entendible el inIorme de rango.
!"#$%&%&'()
Hacer un analisis de sensibilidad para el problema anterior.
a) Que cambiaria en el valor del coste optimo si los costes de procesamiento por hora para la
maquina 1 incrementarian a 35 euros? (Allowable increase de HORAS(T1,M1),
HORAS(T2,M1) v HORAS(T3,M1) INFINITY)
b) Que pasaria si los centimetros requeridos mensualmente del tamao mediano serian 7000?
(Allowable decrease de RDEMANDA(T2) 9000)
.
Noviembre 2006 Maria
Zakvnthinaki
6
Optimitzaci Curs 2006/2007
Assignatura d`Estadstica, UAB
LINGO - Parte 4
Uso de funciones de dominio de variables en LINGO
A menos que se especiIique lo contrario, las variables en un modelo de LINGO son continuas y no
negativas. Mas especiIicamente las variables pueden asumir cualquier valor real desde el cero hasta
el inIinito.
Pero en muchos casos este dominio para una variable puede ser inapropiado. Por ejemplo puede
necesitarse que una variable asuma valores negativos, o solamente valores enteros. LINGO esta
provisto de cuatro Iunciones de dominio de variables que permiten sobrepasar el dominio por
omision de una variable:
GIN Limita la variable solo a valores enteros
BIN Hace una variable binaria (0 o 1)
FREE Permite que la variable tome cualquier
valor real (positivo o negativo)
BND Limita la variable para que se ajuste a un
rango Iinito
Ejemplos de uso de variables enteras:
GIN(X); TransIorma la variable escalar X en entera
FOR(MESES(I): GIN(DIAS(I))); TransIorma todas las variables del atributo DIAS (del
conjunto MESES) en enteras
Ejemplos de uso de variables binarias:
BIN(X); TransIorma la variable escalar X en binaria
FOR(MENU(I): BIN(PLATO(I))); TransIorma todas las variables del atributo PLATO (del
conjunto MENU) en binarias
Ejemplos de uso de variables libres:
FREE(X); TransIorma la variable escalar X en libre
FOR(LISTA(I): FREE(NUMERO(I))); TransIorma todas las variables del atributo NUMERO
(del conjunto LISTA) en libres
1
Ejemplos de uso de variables con lmites:
BND(-1, X, 1); Restringe la variable X al intervalo |-1, 1|
FOR(LISTA(I): BND( 10, Q(I), 20)); Fija los limites de todas las variables del atributo Q en
10 y 20
FOR(LISTA(I): BND(QL, Q(I), QU)); Fija los limites de todas las variables del atributo Q en
QL y QU
(A QL y QU deben habersele asignado valores en la
seccion de datos)
Ejercicio:
Cierta multinacional del sector electronico posee cuatro Iactorias ubicadas en Atenas, FrankIurt,
Eindhoven y Turin, donde se Iabrica un determinado tipo de circuito integrado que luego es
suministrado a cuatro centros de montaje situados en Madrid, Barcelona, Bilbao y Las Palmas. La
gerencia de la empresa esta interesada en determinar como de debe planiIicar la produccion de
modo que el beneIicio obtenido sea maximo.
Para ello cuenta con la siguiente inIormacion, proporcionada por los departamento de produccion y
de ventas, recogida en las tablas siguientes:
Tabla 1: Costes unitarios de envio en euros desde las Iactorias a los puntos de distribucion
Madrid Barcelona Bilbao Las Palmas
Atenas 13 15 8 67
Frankfurt 25 22 16 73
Eindhoven 20 31 14 70
Turn 25 46 39 62
Tabla 2: Costes de produccion unitarios (en euros) y cuotas de produccion (en miles) de las distintas
Iactorias
Atenas Frankfur
t
Eindhoven Turn
Cuota 50 60 30 20
Coste unitario 13 8 11 17
Tabla 3. Demandas previstas (en miles) y precios unitarios de venta (en euros)
Madrid Barcelona Bilbao Las Palmas
Demanda 50 45 30 35
Precio unitario de venta 75 80 70 85
Cual es el plan optimo de la empresa para obtener el maximo beneIicio?
2
Para resolver este problema usando el LINGO deIinimos dos conjuntos principales,
los conjuntos !"#$%& (4 elementos) y '%()#&! (4 elementos).
El conjunto !"#$%& tiene el atributo !*%")+ y el conjunto '%()#&! tiene el atributo
'%,+&'+.
El problema es encontrar el numero optimo de unidades que se deben enviar desde cada !"#$%&-
hacia cada '%()#&!.
DeIinimos, entonces, el conjunto derivado %&/+0%- 1!"#$%&2 - '%()#&!3 que tiene como
atributo las variables del problema, 4&#'+'%(.
El conjunto derivado ENLACE (ORIGEN, DESTINO) tiene tambien el atributo
$+&+&0#+54&#)+"#+, que se reIiere a la ganancia neta para cada UNIDAD enviada.
La ganancia neta unitaria para cada envio se calcula como:
1$+&+&0#+-&%)+-4&#)+"#+3-6-
17"%0#!-4&#)+"#!-'%-8%&)+3-9-
:10!()%-4&#)+"#!3-9-
:10!()%-4&#)+"#!-'%-%&8#!3
*;<=>?<-!@ABC>DEF
Si el indice > se reIiere a los elementos del conjunto !"#$%& y el indice A se reIiere a los
elementos del conjunto '%()#&!, entonces:
El objetivo es maximizar la ganancia neta total, es decir
Maximizar G
>A-
1-$+&+&0#+54&#)+"#+
>A
-H-4&#'+'%(
>A-
)
"BICJ>==>E<BIF
Tenemos las dos restricciones siguientes,
1. restriccion de oIerta:
Para cada ORIGEN >2 G
A-
1-4&#'+'%(
>A-
) !*%")+>
2. restriccion de demanda:
Para cada DESTINO A2 G
>-
1-4&#'+'%(
>A-
) '%,+&'+A
Ademas queremos que las variables 4&#'+'%(>A son variables enteras (de tipo $#&).
%ABJ=>=>E-KF
Escribir el problema anterior en LINGO y ingresar los datos del problema.
Ojo!
(GANANCIA NETA UNITARIA)
(PRECIO UNITARIO DE VENTA)
-(COSTE UNITARIO)
-(COSTE UNITARIO DE ENVIO)
Entonces los datos para la variable ganancia son:
GANANCIA 49 52 49 5 0
42 50 46 4 0
44 38 45 4 0
33 17 14 6 0;
3
MODEL:
SETS:
ORIGEN /AT FR EIND TU /: OFERTA;
DESTINO/MAD BCN BIL LP/: DEMANDA;
ENLACE(ORIGEN, DESTINO): GANANCIA_UNITARIA, UNIDADES;
ENDSETS
DATA:
GANANCIA_UNITARIA= 49 52 49 5
42 50 46 4
44 38 45 4
33 17 14 6 ;
OFERTA= 50 60 30 20;
DEMANDA= 50 45 30 35 ;
ENDDATA
MAX=@SUM(ENLACE(I,J):GANANCIA_UNITARIA(I,J)*UNIDADES(I,J));
@FOR(DESTINO(J):@SUM(ORIGEN(I):UNIDADES(I,J) )=DEMANDA(J) );
@FOR(ORIGEN(I):@SUM(DESTINO(J):UNIDADES(I,J) )=OFERTA(I) );
@FOR(ENLACE(I,J):@GIN(UNIDADES(I,J) ));
END
!"#$%&%&'()*
a. Resolver el problema con el LINGO. Cual es la ganancia neta total en el optimo? (6245
euros)
b. Cual es el plan optimo de la empresa? (Atenas-Madrid.50, Frankfurt-Barcelona.45,
Frankfurt-Bilbao.15, Eindhoven-Bilbao.15, Eindhoven-Las Palmas. 15, Turin-Las
Palmas.20)
c. Cuales son las restricciones activas en el optimo? (todas)

Noviembre 2006 Maria
Zakvnthinaki
4

También podría gustarte