Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso Lingo Resumido
Curso Lingo Resumido
OPTIMIZACION LINGO
Docentes:
Luis Ulfe vega
Gustavo Solis Vargas
Septiembre de 2010
INVESTIGACION OPERACIONAL
INDICE
Introduccin
Qu es LINGO?
Definiendo un modelo en LINGO
LA SECCION SETS DE UN MODELO
Conjunto Primitivo
Conjunto Derivado Denso
Conjunto Derivado No Denso
LA SECCIN DATA DE UN MODELO
LA SECCIN INIT DE UN MODELO
LA SECCIN CALC DE UN MODELO
FUNCIONES DE BUCLES Y CONJUNTOS
La Funcin @FOR
La Funcin @SUM
Funciones Anidadas
@SUM y Filtros
Funciones @MIN y @MAX
DOMINIO DE LAS VARIABLES
OPERADORES EN LINGO
Operadores Aritmticos
Operadores Lgicos
Operadores Relacionales
INTERFASE CON ARCHIVOS EXTERNOS
Trabajando con Hojas de Clculo
Trabajando con Bases de Datos
COLOCANDO NOMBRES A LAS RESTRICCIONES
FUNCIONES DE REPORTE DE LINGO
Docentes:
Pag. 3
Pag. 3
Pag. 3
Pag. 4
Pag. 4
Pag. 5
Pag. 6
Pag. 7
Pag. 8
Pag. 9
Pag. 10
Pag. 10
Pag. 11
Pag. 11
Pag. 12
Pag. 12
Pag. 13
Pag. 14
Pag. 14
Pag. 14
Pag. 15
Pag. 15
Pag. 15
Pag. 16
Pag. 19
Pag. 19
INVESTIGACION OPERACIONAL
Introduccin
El presente material describe los elementos principales del lenguaje de modelamiento
matemtico LINGO, se explica como definir las secciones principales del modelo asociados a
ejemplos aplicados simples y se termina construyendo modelos medianamente complejos que
requieren los tpicos revisados hasta ese punto.
Qu es LINGO?
LINGO (Linear, INteractive, and General Optimizer), es un lenguaje de modelacin matemtica,
que provee un entorno en el cual se puede desarrollar, correr y modificar modelos
matemticos.
LINGO es una herramienta fcil de utilizar para desarrollar grandes modelos de optimizacin
lineal y no lineal.
Comnmente los grandes modelos requieren expresar grupos de muchas restricciones, las
cuales mantienen una estructura similar. Dada esta caracterstica, LINGO, permite manejarlo
como conjuntos (SET) de informacin y realizar las operaciones de una manera ms eficiente.
Usando el estilo del modelo directo, usted necesitar digitar de manera repetitiva cada trmino
de cada restriccin.
Los SETS le permiten definir y trabajar con grupos de objetos que necesitan ser procesados de
formas similares. En efecto, los mismos objetos pueden incluso ser otros conjuntos. Los SETS
son el fundamento del Lenguaje de Modelacin de LINGO. Con una definicin de conjuntos
pude escribir una serie de restricciones similares en una sentencia simple y expresar
formulaciones largas y complejas consistentemente. Esto le permite expresar sus modelos ms
grandes muy rpidamente, y de cierta manera es fcil de leer y entender.
Docentes:
INVESTIGACION OPERACIONAL
Los SETS son la caracterstica ms poderosa en LINGO para modelar sistemas grandes,
estos permite expresar muchas restricciones similares en pocas lneas.
Antes de usar conjuntos en un modelo LINGO, tenemos que definirlos en la seccin de
conjuntos del modelo, la seccin de conjuntos comienza con la palabra clave SETS:
(incluyendo los dos puntos) y termina con la palabra clave ENDSETS.
Un modelo puede no tener la seccin de conjuntos, una sola seccin o mltiples secciones.
Una seccin de conjuntos puede aparecer en cualquier lugar del modelo, la nica restriccin es
que se debe definir cualquier conjunto y sus atributos antes de que los mismos sean
referenciados en las restricciones del modelo.
El nombre del conjunto es cualquiera que el usuario seleccione, comenzando con un carcter
alfabtico, seguido de hasta 31 caracteres alfanumricos o el carcter underline _.
Un conjunto posee una lista de miembros o elementos del conjunto, la lista de miembros del
conjunto son aquellas que constituyen el conjunto, estos pueden ser listados en forma explicita
o implcita.
Los miembros del conjunto pueden tener cero o ms atributos especificados en la lista de
atributos de la definicin del conjunto, un atributo es simplemente alguna propiedad que cada
uno de los miembros del conjunto posee.
Los SETS (conjuntos) son simplemente grupos de objetos seleccionados. Un SET puede ser
una lista de productos, tareas, o stocks. Cada elemento del conjunto puede tener una o ms
caractersticas asociadas con ste. Llamaremos a estas caractersticas atributos, por ejemplo,
un SET de producto puede tener un atributo que lista el precio de cada producto.
Tipos de Conjuntos
Primitivos
Densos
Derivados
Lista Explicita
No Densos
Filtros
Conjunto Primitivo:
Los conjuntos primitivos son los objetos fundamentales en un modelo y no pueden ser
desmenuzados en componentes ms pequeos.
La definicin de un conjunto primitivo requiere:
Docentes:
INVESTIGACION OPERACIONAL
Sintaxis:
nombre_conjunto / lista_miembros / [ : lista_atributos ]
SUCURSAL / AREQUIPA, CUZCO, TRUJILLO / : INGRESOS;
En algunos casos de definicin de conjuntos no es necesario definir atributos asociados a los
miembros del conjunto, por ejemplo el caso anterior podra quedar as:
SUCURSAL / AREQUIPA, CUZCO, TRUJILLO / : ;
Los miembros de los dos ejemplos anteriores han sido definidos por extensin, ahora veamos
la siguiente definicin de conjunto:
nombre_conjunto / 1 ..n / [ : lista_atributos ]
PROYECTO / 1 .. 3 / : RENTABILIDAD;
Los miembros del ejemplo anterior han sido definidos por compresin.
Ambos casos son validos.
Conjunto Derivado Denso:
Los conjuntos derivados, son creados a partir de otros conjuntos (uno o ms de otros
conjuntos). Estos conjuntos componentes son referenciados como los padres del conjunto
derivado y pueden ser primitivos o derivados.
Para definir un conjunto derivado se requiere:
El nombre del conjunto
Sus conjuntos padres
Opcionalmente, sus miembros y
Opcionalmente, cualquier atributo que los miembros del conjunto puedan tener.
Se tiene la siguiente sintaxis:
nombre_conjunto (Lista_conjuntos_padres)
[ /especificaciones_lista_miembros/ ] [ :lista_atributos ];
Consideremos la siguiente seccin a manera de ejemplo.
SETS:
SUCURSAL / AREQUIPA, CUZCO /:;
PROYECTO / PROY1, PROY2/:;
PERIODO
/ 1 .. 2 /:;
SUC_PROY_PER(SUCURSAL, POYECTO, PERIODO): TASA, INVMAXIMA;
ENDSETS
Docentes:
INVESTIGACION OPERACIONAL
Miembro
( AREQUIPA,
( AREQUIPA,
( AREQUIPA,
( AREQUIPA,
( CUZCO,
(CUZCO,
(CUZCO,
(CUZCO,
PROY1,
PROY1,
PROY2,
PROY2,
PROY1,
PROY1,
PROY2,
PROY2,
1)
2)
1)
2)
1)
2)
1)
2)
Los conjuntos SUCURSAL, PROYECTO y PERIODO son conjuntos primitivos que conforman
el conjunto derivado SUC_PROY_PER. Tomando todas las combinaciones de los miembros de
cada uno de los tres conjuntos padres, LINGO construye el conjunto SUC_PROY_PER:
La lista de miembros es opcional y es usada cuando se desea limitar el conjunto a algunos
subconjuntos del conjunto completo. Una lista de miembros de un conjunto derivado puede ser
construido usando: Una lista de miembros explicita o Como un filtro de miembros.
Tambin se podra generar un SET derivado a partir de un solo tipo de SET padre:
SETS:
SUCURSAL / AREQUIPA, CUZCO, TRUJILLO /:;
CONEXION(SUCURSAL, SUCURSAL): DISTANCIA;
ENDSETS
Miembros del conjunto CONEXION
Indice
1
2
3
4
5
6
7
8
9
Miembro
( AREQUIPA,
( AREQUIPA,
( AREQUIPA,
( CUZCO,
( CUZCO,
(CUZCO,
(TRUJILLO,
(TRUJILLO,
(TRUJILLO,
AREQUIPA)
CUZCO
)
TRUJILLO )
AREQUIPA)
CUZCO
)
TRUJILLO )
AREQUIPA)
CUZCO
)
TRUJILLO)
Docentes:
INVESTIGACION OPERACIONAL
Suponga que tiene un conjunto llamado CAMIONES y cada camin tiene un atributo
llamado CAPACIDAD. Adems, se desea generar un subconjunto solamente de aquellos
camiones que son capaces de transportar grandes cargas.
Se podra usar una lista de miembros explcita, e ingresar cada uno de los camiones que
pueden transportar grandes cargas, pero, por que hacer todo ese trabajo cuando se puede
usar un filtro de miembros, tal como se describe a continuacin:
CAMIONES_PESADOS(CAMIONES) | CAPACIDAD(&1) #GT# 50000;
Resumen de Conjuntos
En resumen, LINGO reconoce dos tipos de conjuntos - primitivos y derivados.
Los conjuntos primitivos son los objetos fundamentales en un modelo y no pueden ser
desmenuzados en componentes ms pequeos.
Los conjuntos derivados, por otro lado, son creados a partir de otros conjuntos. Estos
conjuntos componentes son referenciados como los padres del conjunto derivado y pueden
ser primitivos o derivados.
Los datos que requiere el modelo son ledos desde la seccin de datos, esta seccin es
descrita a continuacin.
Esta seccin comienza con la palabra reservada DATA: (incluyendo los dos puntos) y
terminando con la palabra reservada ENDDATA, en esta seccin podemos realizar las
siguientes operaciones:
Docentes:
INVESTIGACION OPERACIONAL
DATA:
X = 1 2 3;
Y = 4 5 6;
ENDDATA
En el ejemplo mostrado a continuacin, podramos pensar que a X se le asignaran los valores
1, 4 y 2, debido a su ubicacin en la lista, en vez de los valores 1, 2 y 3.
Cuando LINGO lee los datos, lo hace en columnas en lugar de filas.
SETS:
CONJUNTO1 / 1..3 / : X, Y;
ENDSETS
DATA:
X Y =
1 4
2 5
3 6;
ENDDATA
LINGO, adems tiene la habilidad para especificar los miembros del conjunto en la seccin de
datos, junto con los valores de los atributos.
SETS:
CONJUNTO1: X, Y;
ENDSETS
DATA:
CONJUNTO1 X Y = A 1 4
B 2 5
C 3 6;
ENDDATA
Usted necesitar dar valores a algunos atributos de SET (conjuntos) antes de que LINGO
pueda resolver su modelo. Para este propsito LINGO usa una segunda seccin opcional, la
seccin DATA. Similar a la seccin SETS, la seccin DATA empieza con la palabra reservada
DATA: (incluyendo los 2 puntos) y termina con la palabra ENDDATA (sin poner los 2
puntos).
En la seccin DATA se puede digitar las expresiones para inicializar los atributos de los SETS
que defini en la seccin SETS. Estas expresiones tienen la sintaxis:
Atributo = valor_lista
El valor_lista debe tener el mismo nmero de valores como el atributo que inicializa. Los
nmeros de cada valor deben ser separados por espacios o comas.
LA SECCIN INIT DE UN MODELO
Esta es una seccion opcional ofrecida por LINGO, los valores colocados en la seccion INIT son
usados como puntos de inicio por el solver no lineal de LINGO, de un modo distinto a la
asignacin de valores en la seccion DATA, el solver de LINGO es libre de alterar los valores de
las variables que son inicializadas en la seccion INIT.
Los puntos de inicio especificados en la seccion INIT son usados solamente en modelos No
Lineales
Una seccion INIT comienza con la palabra reservada INIT y termina con ENDINIT
Por ejm. si resolvemos el siguiente ejercicio (se recomienda crear el grafico de esta funcin
en la hoja de calculo Excel):
Docentes:
INVESTIGACION OPERACIONAL
y si resolvemos el mismo modelo usando una seccion de inicio INIT tal como se muestra en la
parte inferior:
INIT:
X = 4.6;
ENDINIT
MIN = X * @COS( 3.1416 * X);
X < 6;
La solucin ptima local partiendo de dicho punto ser:
Docentes:
INVESTIGACION OPERACIONAL
CALC:
PROMEDIO = ( X + Y + Z) / 3;
ENDCALC
END
FUNCIONES DE BUCLES Y CONJUNTOS
Estas funciones nos permiten aplicar una operacin a todos los miembros de un conjunto
usando una sentencia simple, estas son:
@FOR
@SUM
@MIN
@MAX
La sintaxis para estas sentencias es:
@funcin (nombre_conjunto[ (lista_indices_conjunto)
[ | calificador_condicional ]]: lista_expresiones);
La Funcin @FOR
Ahora que puede definir los SETS y los atributos para almacenar informacin, necesitar una
forma de acceder a los elementos de esos SETS. La funcin @FOR le permite acceder a los
elementos de un SET individual, sus atributos y ejecutar operaciones sobre ellas. Cuando use
el @FOR, LINGO crea y mantiene un ndice dentro de los miembros del SET y ejecuta o realiza
cualquier operacin que halla especificado sobre cada uno de los miembros.
La sintaxis es la siguiente:
@FOR (Set_index_list) | Conditional_qualifier : Expression);
El Conditional_qualifier es opcional. Si lo usa, ste es precedido por la barra carcter ( | ) .
Por lo menos se requiere una expresin para @FOR, pero un nmero ilimitado puede ser
especificado; cada uno separado por un punto y coma ( ; ).
El Set_index_list es opcional. Si no lo usa, LINGO aplicar Expression para todos los
miembros del SET. Si lo usa, los miembros de la funcin lista indicarn los miembros del
conjunto que est enlazando. Cuando lo ha especificado, el ndice en Set_index_list puede
ser usado en el Conditional_qualifier .
Ejemplo:
MODEL
SETS
Numeros / 1..5/ : X ;
ENDSETS
@FOR (Numeros( I ) : X( I ) = I - 1);
END
La funcin @FOR es usada para generar restricciones con los miembros de un conjunto,
consideremos el siguiente ejemplo:
SETS:
CAMIONETAS / TOYOTA, HYUNDAI, FORD, NISSAN / : CARGA;
ENDSETS
Si el atributo CARGA es usado para denotar la capacidad de carga de dicha camioneta,
entonces podemos usar la funcin @FOR para restringir dicha capacidad de carga con la
siguiente expresin:
@FOR (CAMIONETAS(C): CARGA(C) <= 2500 );
Docentes:
10
INVESTIGACION OPERACIONAL
el
comando
);
La solucin del modelo anterior nos da los siguientes valores para los valores triples:
Variable
TRIPLE(1)
TRIPLE(2)
TRIPLE(3)
TRIPLE(4)
TRIPLE(5)
Value
9
12
6
21
30
La Funcin @SUM
Calcula la suma de una expresin sobre todos los miembros de un conjunto, consideremos el
modelo:
SETS:
VENDEDOR / V1 V2 V3 V4 V5 / : DEMANDA;
ENDSETS
DATA:
DEMANDA = 5 1 3 4 6;
ENDDATA
Podramos sumar todos los valores de la DEMANDA usando la siguiente expresin despus de
la sentencia ENDDATA:
TOTAL_DEMANDA = @SUM(VENDEDOR: DEMANDA );
Por ejemplo:
@SUM (Peso: valor);
Retornar la suma del atributo valor de todos los miembros del conjunto Peso.
Funciones Anidadas
Estas funciones nos permiten definir diversas funciones de bucles dentro de otras, el siguiente,
es un ejemplo de la funcin @SUM anidada dentro de @FOR:
Las restricciones de demanda:
@FOR ( VENDEDORES (J):
@SUM ( ALMACENES (I): VOLUMEN (I,J)) =
Docentes:
DEMANDA (J) );
11
INVESTIGACION OPERACIONAL
Especficamente, para cada vendedor, sumamos los envos que van desde todos los
almacenes a dicho vendedor e igualamos esta suma con la demanda del vendedor.
Las funciones @SUM, @MAX y @MIN pueden ser anidados dentro de cualquier funcin de
bucle, la funcin @FOR, por otra parte, solo puede ser anidada dentro de otra funcin @FOR.
Caso de Anlisis:
Revisar en el anexo 1 el enunciado del caso de transporte y definir para este modelo las
restricciones de oferta y demanda usando las funciones @FOR y @SUM. Adems, deber
implementar estas restricciones en el LINGO.
@SUM y Filtros
Supongamos que deseamos sumar los primeros tres elementos de DEMANDA, entonces
podramos usar un calificador condicional en el ndice del conjunto como sigue:
DEMANDA_3 = @SUM( VENDEDOR(J) | J #LE# 3 : DEMANDA(J) );
El smbolo #LE# es llamado un operador lgico, este operador compara el operando de la
izquierda (J) con el de la derecha (3) y retorna el valor de verdad si el operador de la izquierda
es menor que o igual al de la derecha, en otro caso, este retorna falso.
El resultado final es que LINGO suma los primeros tres trminos en X, omitiendo el cuarto y
quinto trmino, para una suma total de 9.
Caso de Anlisis:
Para el modelo del anexo 1, modelo en el cual ya se crearon las restricciones asociadas,
modificar las restricciones de modo tal que el origen 1 no pueda enviar nada al destino 4
Funciones @MIN y @MAX
@MIN calcula el valor mnimo de una expresin sobre todos los miembros de un conjunto
@MAX calcula el valor mximo de una expresin sobre todos los miembros de un conjunto,
otra vez, consideremos el modelo:
SETS:
VENDEDOR / V1 V2 V3 V4 V5 / : DEMANDA;
ENDSETS
DATA:
X = 5 1 3 4 6;
ENDDATA
Value
5.000
Docentes:
12
INVESTIGACION OPERACIONAL
General:
Binary:
Variables Libres
Por default, una variable LINGO tiene una cota inferior de cero y una cota superior de infinito,
@FREE elimina la cota inferior de cero y permite que la variable tome valores negativos,
permitiendo que esta sea irrestricta en signo o libre, la sintaxis es:
@FREE( nombre_variable);
Variables Acotadas
La funcin @BND permite especificar cotas inferiores y superiores en una variable, @BND
limita el rango de una variable dentro de un intervalo especfico. La sintaxis para @BND es:
@BND( cota_inferior, nombre_variable, cota_superior);
Ejemplo 2:
Ejemplo 3:
@FOR( PRODUCTOS:
@BND( 10, CANTIDAD, 20));
Ejemplo 4:
@FOR( PRODUCTOS:
@BND( CI, CANTIDAD, CS));
Caso de Anlisis:
Para el modelo del anexo 1 (caso de anlisis 2 - seleccin de proyectos), formular y resolver el
modelo respectivo
Docentes:
13
INVESTIGACION OPERACIONAL
OPERADORES EN LINGO
LINGO tiene tres tipos de operadores:
Aritmticos
trabajan con operandos numricos, LINGO tiene cinco operadores aritmticos
Lgicos
En LINGO, los operadores lgicos son principalmente usados en expresiones
condicionales en las funciones de bucles con conjuntos, para controlar que miembros
de un conjunto deben ser incluidos o excluidos de la funcin.
Relacionales
Los operadores relacionales son usados en un modelo para especificar cuando el lado
izquierdo de una expresin debe ser igual a, menor que o igual a, o mayor que o igual
al lado derecho.
Operadores Aritmticos
^
*
/
+
-
Potencia
Multiplicacin
Divisin
Adicin
Substraccin
Estos operadores deben parecernos familiares y ellos funcionan exactamente del modo ya
conocido. Las prioridades de tales operadores estn dadas en la siguiente tabla:
Nivel PrioridadOperador(es)
Alto
- (negacin)
^
* /
Bajo
+-
Operadores Lgicos
Los operadores lgicos retornan como resultado los valores Verdad o Falso. LINGO usa el
valor de 1 para representar el valor de Verdad y 0 para Falso. LINGO considera que un
argumento es verdadero si y solo si, este es igual a 1
Operador Valor
#NOT#
Verdad si el operando a la derecha es Falso, en otro
caso, Falso
#EQ#
Verdad si ambos operandos son iguales, de lo contrario
Falso
#NE#
Verdad si ambos operandos son no iguales, en otro caso,
Falso
#GT#
Verdad si el operando izquierdo es mayor que el
derecho, en otro caso, Falso
#GE#
Verdad si el operando izquierdo es mayor que o igual al
operando derecho, en otro caso, Falso.
#LT#
Verdad si el operando izquierdo es menor que el
derecho, en otro caso, Falso
#LE#
Verdad si el operando izquierdo es menor que o igual al
del lado derecho, en otro caso, Falso
#AND#
Verdad si ambos argumentos son verdaderos, en otro
caso, Falso
#OR#
Falso si ambos argumentos son falsos, en otro coso,
Verdad
Docentes:
14
INVESTIGACION OPERACIONAL
Nivel de Prioridad
Operador(es)
Alto
#NOT#
#EQ# #NE# #GT# #GE# #LT# #LE#
#AND# #OR#
Bajo
Operadores Relacionales
Son usados para formar las restricciones de un modelo, son distintos de los operadores lgicos
#EQ#, #LE# y #GE#, en que, ellos le indican a LINGO que el resultado del modelo debe
satisfacer la direccin del operador relacional.
Los operadores lgicos, solamente reportan cuando una condicin es satisfecha o no, estos
operadores son:
LINGO acepta < como menor o igual que y > por mayor o igual que.
LINGO no soporta operadores estrictamente menor que o mayor que. En general es inusual
encontrar una buena formulacin que requiera tal caracterstica.
Si se desea que A sea estrictamente menor que B: A < B, podemos convertir esta expresin a:
A+e<B
Donde e es una constante pequea
Docentes:
15
INVESTIGACION OPERACIONAL
La sintaxis al utilizar @OLE para importar datos en las secciones Datos e Init es:
Objeto = @OLE( ArchivoHC'[, Rango]);
Ejemplo 1:
Ejemplo 2:
Docentes:
16
INVESTIGACION OPERACIONAL
4.- En este cuadro seleccionar el botn Add donde aparecer el siguiente cuadro de
dialogo que nos permitir seleccionar el driver deseado, en nuestro caso debemos seleccionar
Microsoft Access Driver (*mdb)
5.- Luego seleccionar el botn Finalizar, donde aparecer el siguiente cuadro de dialogo
donde definiremos lo siguiente:
Docentes:
17
INVESTIGACION OPERACIONAL
Nombre del origen de datos: Colocar un nombre con el cual se referenciar al registro ODBC.
Descripcin: Colocar algn texto descriptivo.
6.- Una vez que halla completado los campos respectivos seleccionar la base de datos, dando
un clic en el botn Seleccionar para seleccionar la base de datos deseada.
Importando datos desde Access
Para poder leer y enviar informacin a una base de datos se debe crear un registro de base de
datos ODBC.
En el siguiente ejemplo se enva la informacin ubicada en el campo Requerido de la tabla
TablaAsignaPersonal al atributo REQUERIDO
DATA:
REQUERIDO = @ODBC( 'BDPERSONAL', 'TablaAsignaPersonal','Requerido');
ENDDATA
Exportando datos hacia Access
En el siguiente ejemplo se enva la informacin del atributo INICIAN al campo Asignado
de la tabla TablaAsignaPersonal
DATA:
@ODBC( 'BDPERSONAL', 'TablaAsignaPersonal','Asignado') = INICIAN;
ENDDATA
Caso de Anlisis:
Para el modelo del anexo 1 (caso de anlisis 1 modelo de transporte), modificar el modelo de
modo que todos los datos sean ledos desde la base de datos Access.
Docentes:
18
INVESTIGACION OPERACIONAL
Docentes:
19
INVESTIGACION OPERACIONAL
Docentes:
20