Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CURSO LINGO Resumido PDF
CURSO LINGO Resumido PDF
OPTIMIZACION LINGO
Docentes:
Septiembre de 2010
INDICE
Introducción Pag. 3
¿Qué es LINGO? Pag. 3
Definiendo un modelo en LINGO Pag. 3
LA SECCION “SETS” DE UN MODELO Pag. 4
Conjunto Primitivo Pag. 4
Conjunto Derivado Denso Pag. 5
Conjunto Derivado No Denso Pag. 6
LA SECCIÓN “DATA” DE UN MODELO Pag. 7
LA SECCIÓN “INIT” DE UN MODELO Pag. 8
LA SECCIÓN “CALC” DE UN MODELO Pag. 9
FUNCIONES DE BUCLES Y CONJUNTOS Pag. 10
La Función @FOR Pag. 10
La Función @SUM Pag. 11
Funciones Anidadas Pag. 11
@SUM y Filtros Pag. 12
Funciones @MIN y @MAX Pag. 12
DOMINIO DE LAS VARIABLES Pag. 13
OPERADORES EN LINGO Pag. 14
Operadores Aritméticos Pag. 14
Operadores Lógicos Pag. 14
Operadores Relacionales Pag. 15
INTERFASE CON ARCHIVOS EXTERNOS Pag. 15
Trabajando con Hojas de Cálculo Pag. 15
Trabajando con Bases de Datos Pag. 16
COLOCANDO NOMBRES A LAS RESTRICCIONES Pag. 19
FUNCIONES DE REPORTE DE LINGO Pag. 19
Introducción
¿Qué es LINGO?
Comúnmente los grandes modelos requieren expresar grupos de muchas restricciones, las
cuales mantienen una estructura similar. Dada esta característica, LINGO, permite manejarlo
como conjuntos (SET) de información y realizar las operaciones de una manera más eficiente.
Usando el estilo del modelo directo, usted necesitará digitar de manera repetitiva cada término
de cada restricción.
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 Modelación de LINGO. Con una definición 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 más
grandes muy rápidamente, y de cierta manera es fácil de leer y entender.
Note que cada una de las expresiones matemáticas son finalizadas con el punto y coma “;”, si
no se coloca el “;”, el modelo mandara un mensaje de error.
Usando Comentarios:
Los “SETS” son la característica más poderosa en LINGO para modelar sistemas grandes,
estos permite expresar muchas restricciones similares en pocas líneas.
Antes de usar conjuntos en un modelo LINGO, tenemos que definirlos en la sección de
conjuntos del modelo, la sección 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 sección de conjuntos, una sola sección o múltiples secciones.
Una sección de conjuntos puede aparecer en cualquier lugar del modelo, la única restricción 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 carácter
alfabético, seguido de hasta 31 caracteres alfanuméricos o el carácter 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 implícita.
Los miembros del conjunto pueden tener cero o más atributos especificados en la lista de
atributos de la definición 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 más
características asociadas con éste. Llamaremos a estas características 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 más pequeños.
Sintaxis:
Los miembros de los dos ejemplos anteriores han sido definidos por extensión, ahora veamos
la siguiente definición de conjunto:
Los miembros del ejemplo anterior han sido definidos por compresión.
Ambos casos son validos.
nombre_conjunto (Lista_conjuntos_padres)
[ /especificaciones_lista_miembros/ ] [ :lista_atributos ];
SETS:
SUCURSAL / AREQUIPA, CUZCO /:;
PROYECTO / PROY1, PROY2/:;
PERIODO / 1 .. 2 /:;
SUC_PROY_PER(SUCURSAL, POYECTO, PERIODO): TASA, INVMAXIMA;
ENDSETS
Indice Miembro
1 ( AREQUIPA, PROY1, 1)
2 ( AREQUIPA, PROY1, 2)
3 ( AREQUIPA, PROY2, 1)
4 ( AREQUIPA, PROY2, 2)
5 ( CUZCO, PROY1, 1)
6 (CUZCO, PROY1, 2)
7 (CUZCO, PROY2, 1)
8 (CUZCO, PROY2, 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:
También se podría generar un SET derivado a partir de un solo tipo de SET padre:
SETS:
SUCURSAL / AREQUIPA, CUZCO, TRUJILLO /:;
CONEXION(SUCURSAL, SUCURSAL): DISTANCIA;
ENDSETS
Indice Miembro
1 ( AREQUIPA, AREQUIPA)
2 ( AREQUIPA, CUZCO )
3 ( AREQUIPA, TRUJILLO )
4 ( CUZCO, AREQUIPA)
5 ( CUZCO, CUZCO )
6 (CUZCO, TRUJILLO )
7 (TRUJILLO, AREQUIPA)
8 (TRUJILLO, CUZCO )
9 (TRUJILLO, TRUJILLO)
nombre_conjunto (Lista_conjuntos_padres)
[ /especificaciones_lista_miembros/ ] [ :lista_atributos ];
Nos permite definir una lista de miembros derivada del conjunto, esta involucra la
especificación de una condición lógica que cada miembro potencial del conjunto debe
satisfacer para su inclusión en el conjunto.
• Suponga que tiene un conjunto llamado CAMIONES y cada camión tiene un atributo
llamado CAPACIDAD. Además, se desea generar un subconjunto solamente de aquellos
camiones que son capaces de transportar grandes cargas.
• Se podría usar una lista de miembros explícita, 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 continuación:
• El filtro de miembros permite solo aquellos camiones que tienen una capacidad de carga
(CAPACIDAD(&1)) mayor que (#GT) 50,000 en el conjunto CAMIONES_PESADOS.
• El símbolo &1 en el filtro es conocido como un ubicador de índice del conjunto.
• El primer conjunto primitivo padre es colocado en &1, el segundo en &2 y así
sucesivamente. En este ejm. Solo tenemos un conjunto padre, de modo que &2 no tiene
sentido.
Resumen de Conjuntos
Los datos que requiere el modelo son leídos desde la sección de datos, esta sección es
descrita a continuación.
Esta sección comienza con la palabra reservada “DATA:” (incluyendo los dos puntos) y
terminando con la palabra reservada “ENDDATA”, en esta sección podemos realizar las
siguientes operaciones:
A continuación mostramos un ejemplo en el que se asignan valores a los atributos “x” e “y”.
SETS :
CONJUNTO1 / 1..3 / : X, Y;
ENDSETS
DATA:
X = 1 2 3;
Y = 4 5 6;
ENDDATA
SETS:
CONJUNTO1 / 1..3 / : X, Y;
ENDSETS
DATA:
X Y = 1 4
2 5
3 6;
ENDDATA
LINGO, además tiene la habilidad para especificar los miembros del conjunto en la sección 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 propósito LINGO usa una segunda sección opcional, la
sección DATA. Similar a la sección SETS, la sección DATA empieza con la palabra reservada
“DATA:” (incluyendo los 2 puntos) y termina con la palabra “ENDDATA” (sin poner los 2
puntos).
En la sección DATA se puede digitar las expresiones para inicializar los atributos de los SETS
que definió en la sección SETS. Estas expresiones tienen la sintaxis:
Atributo = valor_lista
El valor_lista debe tener el mismo número de valores como el atributo que inicializa. Los
números de cada valor deben ser separados por espacios o comas.
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
asignación 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 función
en la hoja de calculo Excel):
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
X < 6;
En algunas ocasiones los datos iniciales leídos por el modelo requieren algunas operaciones
adicionales para que estén en un formato adecuado.
La seccion de calculo comienza con la palabra reservada “CALC:” y termina con la palabra
reservada “ENDCALC”
MODEL:
DATA:
X, Y, Z = 1, 2, 3;
ENDDATA
CALC:
PROMEDIO = ( X + Y + Z) / 3;
ENDCALC
END
Estas funciones nos permiten aplicar una operación a todos los miembros de un conjunto
usando una sentencia simple, estas son:
– @FOR
– @SUM
– @MIN
– @MAX
La sintaxis para estas sentencias es:
La Función @FOR
Ahora que puede definir los SETS y los atributos para almacenar información, necesitará una
forma de acceder a los elementos de esos SETS. La función @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 operación que halla especificado sobre cada uno de los miembros.
La sintaxis es la siguiente:
La función @FOR es usada para generar restricciones con los miembros de un conjunto,
consideremos el siguiente ejemplo:
SETS:
CAMIONETAS / TOYOTA, HYUNDAI, FORD, NISSAN / : CARGA;
ENDSETS
Ahora, mostramos un modelo usando la función @FOR para calcular el número triple de de
cualquiera de los cinco números ubicados en el atributo VALOR:
SETS
NUMEROS / 1 .. 5 / : VALOR, TRIPLE;
ENDSETS
DATA:
VALOR = 3 4 2 7 10;
ENDDATA
La solución del modelo anterior nos da los siguientes valores para los valores triples:
Variable Value
TRIPLE(1) 9
TRIPLE(2) 12
TRIPLE(3) 6
TRIPLE(4) 21
TRIPLE(5) 30
La Función @SUM
Calcula la suma de una expresión 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
Podríamos sumar todos los valores de la DEMANDA usando la siguiente expresión después de
la sentencia ENDDATA:
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 función @SUM anidada dentro de @FOR:
Específicamente, para cada vendedor, sumamos los envíos 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 función de
bucle, la función @FOR, por otra parte, solo puede ser anidada dentro de otra función @FOR.
Caso de Análisis:
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. Además, deberá
implementar estas restricciones en el LINGO.
@SUM y Filtros
Supongamos que deseamos sumar los primeros tres elementos de DEMANDA, entonces
podríamos usar un calificador condicional en el índice del conjunto como sigue:
Caso de Análisis:
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
• @MIN calcula el valor mínimo de una expresión sobre todos los miembros de un conjunto
• @MAX calcula el valor máximo de una expresión 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
Suponga que deseamos calcular el valor máximo de los tres primeros elementos de
DEMANDA. Como con el ejemplo de @SUM, todo lo que necesitamos hacer es añadir el
calificador condicional J #LE# 3, esto es:
La solución será:
Variable Value
EL_MAXIMO 5.000
Las variables en un modelo LINGO por “default” son no-negativos y continuos, es decir,
pueden asumir cualquier valor real de cero a infinito positivo, en muchos casos, sin embargo,
este dominio de las variables es inapropiado pues, podríamos desear que una variable tome
valores negativos o que una variable sea restringida solo a valores enteros.
Variables Enteras
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 función @BND permite especificar cotas inferiores y superiores en una variable, @BND
limita el rango de una variable dentro de un intervalo específico. La sintaxis para @BND es:
Caso de Análisis:
Para el modelo del anexo 1 (caso de análisis 2 - selección de proyectos), formular y resolver el
modelo respectivo
OPERADORES EN LINGO
Operadores Aritméticos
• ^ Potencia
• * Multiplicación
• / División
• + Adición
• - Substracción
Estos operadores deben parecernos familiares y ellos funcionan exactamente del modo ya
conocido. Las prioridades de tales operadores están dadas en la siguiente tabla:
Nivel PrioridadOperador(es)
Alto - (negación)
^
* /
Bajo +-
Operadores Lógicos
• Los operadores lógicos 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
Alto #NOT#
#EQ# #NE# #GT# #GE# #LT# #LE#
Bajo #AND# #OR#
Operadores Relacionales
Son usados para formar las restricciones de un modelo, son distintos de los operadores lógicos
#EQ#, #LE# y #GE#, en que, ellos le indican a LINGO que el resultado del modelo debe
satisfacer la dirección del operador relacional.
Los operadores lógicos, solamente reportan cuando una condición 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 formulación que requiera tal característica.
Si se desea que A sea estrictamente menor que B: A < B, podemos convertir esta expresión a:
A+e<B
Las hojas de cálculo son buenas para manipular desde una pequeña hasta moderada cantidad
de datos.
LINGO permite al usuario importar datos de las hojas de cálculo y exportarlas también hacia las
hojas de cálculo usando enlaces de tiempo-real Object Linking and Embedding (OLE), cuyo
procedimiento revisaremos a continuación:
La sintaxis al utilizar @OLE para importar datos en las secciones “Datos” e “Init” es:
Observación:
Si se usa la función @OLE sin especificar el nombre de la hoja de calculo y el rango asociado,
el atributo al que se le asigna los valores y el rango definido en la hoja de calculo deben tener
el mismo nombre, además, la hoja de calculo debe estar abierta con el archivo a usar, por
ejemplo en el siguiente caso:
DATA:
COSTO = @OLE();
@OLE() = PRODUCIR;
ENDDATA
Implica que existe una hoja de cálculo que tiene definido un rango de datos llamado “COSTO”,
los valores que se encuentren en este rango serán asignados al atributo “COSTO” definido en
el modelo LINGO.
Del mismo modo los valores del atributo “PRODUCIR” son enviados a la hoja de cálculo,
donde deberá existir un rango de datos llamado “PRODUCIR”.
Cuando los modelos comienzan a manejar una gran cantidad de datos, los sistemas
administradores de bases de datos (DBMS’s), son, incuestionablemente, la mejor herramienta
a utilizar, en la mayoría de negocios, encontraremos que la mayor parte de la información esta
en una o muchas bases de datos, LINGO acepta enlaces a cualquier DBMS que tenga un
driver ODBC (Open DataBase Connectivity).
LINGO usa la función @ODBC para acceder a las bases de datos @ODBC es usada para
importar y exportar datos desde y hacia bases de datos.
Un origen de datos ODBC es una base de datos que reside en un DBMS, para el que tenemos
un driver ODBC, esta base de datos debe ser registrada con el administrador ODBC.
4.- En este cuadro seleccionar el botón “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 botón “Finalizar”, donde aparecerá el siguiente cuadro de dialogo
donde definiremos lo siguiente:
Nombre del origen de datos: Colocar un nombre con el cual se referenciará al registro ODBC.
Descripción: Colocar algún texto descriptivo.
6.- Una vez que halla completado los campos respectivos seleccionar la base de datos, dando
un clic en el botón “Seleccionar” para seleccionar la base de datos deseada.
Para poder leer y enviar información a una base de datos se debe crear un registro de base de
datos ODBC.
DATA:
REQUERIDO = @ODBC( 'BDPERSONAL', 'TablaAsignaPersonal','Requerido');
ENDDATA
DATA:
@ODBC( 'BDPERSONAL', 'TablaAsignaPersonal','Asignado') = INICIAN;
ENDDATA
Caso de Análisis:
Para el modelo del anexo 1 (caso de análisis 1 – modelo de transporte), modificar el modelo de
modo que todos los datos sean leídos desde la base de datos Access.
LINGO permite colocarle nombres a las restricciones en un modelo, esta es una buena práctica
por dos razones:
Primero, que los nombres de las restricciones son usados en el reporte solución, haciendo
fácil su interpretación.
Segundo, muchos mensajes de error de LINGO se refieren a una restricción dada por su
nombre, si no ha colocado nombres a sus restricciones, el rastreo del origen de estos
errores puede ser dificultoso.
Lo que se requiere para colocar un nombre de una restricción es colocar un nombre entre los
“brackets” – [nombre de restricción], el siguiente ejemplo de transporte muestra la asignación
de nombres a las restricciones, implemente el cambio en su modelo y verifique el resultado.
MODEL:
! Un proble de transporte con 6 Origenes y 8 Destinos;
SETS:
ORIGEN/O1,O2,O3,O4,O5,O6/: OFERTA;
DESTINO/D1,D2,D3,D4,D5,D6,D7,D8/: DEMANDA;
ORI_DES(ORIGEN, DESTINO): COSTO, T;
ENDSETS
! La Funcion Objetivo;
[OBJETIVO] MIN = @SUM( ORI_DES( I, J):
COSTO( I, J) * T( I, J));
! Restricciones de Demanda;
@FOR( DESTINO( J): [FILA_DESTINO]
@SUM( ORIGEN( I): T( I, J)) >= DEMANDA( J));
! Restricciones de Oferta;
@FOR( ORIGEN( I): [FILA_ORIGEN]
@SUM( DESTINO( J): T( I, J)) <= OFERTA( I));
DATA:
!Valores de los Atributos;
OFERTA= 60 55 51 43 41 52;
DEMANDA= 35 37 22 32 41 32 43 38;
COSTO = 6 2 6 7 4 2 5 9
49538582
52197433
76739271
23957265
5 5 2 2 8 1 4 3;
ENDDATA
END
Las funciones de reporte de LINGO son usados para construir reportes basados en los
resultados del modelo y son validos en las secciones de datos (DATA) y cálculos (CALC),
mostraremos algunas opciones principales.
@DUAL
La función @DUAL permite obtener el valor dual cuando se asocia a una restricción o los
costos reducidos cuando se asocia a una variable.
MODEL:
! Un proble de transporte con 6 Origenes y 8 Destinos;
SETS:
ORIGEN/O1,O2,O3,O4,O5,O6/: OFERTA;
DESTINO/D1,D2,D3,D4,D5,D6,D7,D8/: DEMANDA;
ORI_DES(ORIGEN, DESTINO): COSTO, T;
ENDSETS
! La Funcion Objetivo;
[OBJETIVO] MIN = @SUM( ORI_DES( I, J):
COSTO( I, J) * T( I, J));
! Restricciones de Demanda;
@FOR( DESTINO( J): [FILA_DESTINO]
@SUM( ORIGEN( I): T( I, J)) >= DEMANDA( J));
! Restricciones de Oferta;
@FOR( ORIGEN( I): [FILA_ORIGEN]
@SUM( DESTINO( J): T( I, J)) <= OFERTA( I));
DATA:
!Valores de los Atributos;
OFERTA= 60 55 51 43 41 52;
DEMANDA= 35 37 22 32 41 32 43 38;
COSTO = 6 2 6 7 4 2 5 9
49538582
52197433
76739271
23957265
5 5 2 2 8 1 4 3;
@OLE() = @DUAL(FILA_ORIGEN);
ENDDATA
END