20
GUIA DE USUARIO DEL SOFTWARE DE OPTIMIZACION LINGO CURSO: INVESTIGACION OPERACIONAL Docentes: Luis Ulfe vega Gustavo Solis Vargas Septiembre de 2010 Copyright © 2010, Luis Ulfe / Gustavo Solis, Investigación de operaciones S.A. Se permite la copia de este material indicando la procedencia de los autores

Curso Lingo Resumido

Embed Size (px)

Citation preview

Page 1: Curso Lingo Resumido

GUIA DE USUARIO DEL SOFTWARE DE OPTIMIZACION LINGO

CURSO: INVESTIGACION OPERACIONAL

Docentes:

Luis Ulfe vega

Gustavo Solis Vargas

Septiembre de 2010

Copyright © 2010, Luis Ulfe / Gustavo Solis, Investigación de operaciones S.A. Se permite la copia de este material indicando la procedencia de los autores

Page 2: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

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

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 2

Page 3: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

ENTORNO DE DESARROLLO DE MODELOS EN EL SOFTWARE LINGO

Introducción El presente material describe los elementos principales del lenguaje de modelamiento matemático 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 tópicos revisados hasta ese punto. ¿Qué es LINGO? LINGO (Linear, INteractive, and General Optimizer), es un lenguaje de modelación matemática, que provee un entorno en el cual se puede desarrollar, correr y modificar modelos matemáticos. LINGO es una herramienta fácil de utilizar para desarrollar grandes modelos de optimización lineal y no lineal. 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. Definiendo un modelo en LINGO En general, un modelo de optimización consistirá de los siguientes elementos: Las Variables: Que indican el mejor curso de acción a seguir Las Restricciones: Que expresan los limites en los recursos o condiciones especiales restrictivas. La Función Objetivo: Que es aquella que expresa lo que se desea maximizar o minimizar. A continuación mostramos un ejemplo con un modelo de optimización que se desea maximizar expresado en el formato requerido por LINGO: MAX = 100 * X + 150 * Y; X <= 100; Y <= 120; 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: A continuación mostramos el mismo ejemplo pero colocando comentarios para documentar mejor el modelo, estos comentarios deben comenzar con el símbolo de admiración “!” y terminar con punto y coma “;” ¡Esta es la función objetivo; MAX = 100 * X + 150 * Y; X <= 100; ¡Esta es la primera restricción; Y <= 120; ¡La variable Y debe ser menor o igual a 120;

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 3

Page 4: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

Usando Mayúsculas o Minúsculas: En el modelo anterior definimos las variables con letras mayúsculas, pero, podemos definir una variable con mayúscula y minúscula en forma indistinta para referenciar a la misma variable. Longitud y Caracteres Validos Cuando definimos el nombre de una variable en LINGO, este debe comenzar con un carácter alfabético (A-Z), los siguientes caracteres pueden ser alfabéticos, numéricos (0-9) o el carácter under-line “_”, estos nombres pueden tener una longitud máxima de 32 caracteres.

LA SECCION “SETS” DE UN MODELO 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. La definición de un conjunto primitivo requiere:

– El nombre del conjunto. – Sus miembros (objetos contenidos en el conjunto). – Opcionalmente, cualquier atributo que los miembros del conjunto puedan tener.

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 4

Page 5: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

Sintaxis: nombre_conjunto / lista_miembros / [ : lista_atributos ] SUCURSAL / AREQUIPA, CUZCO, TRUJILLO / : INGRESOS; En algunos casos de definición de conjuntos no es necesario definir atributos asociados a los miembros del conjunto, por ejemplo el caso anterior podría quedar así: SUCURSAL / AREQUIPA, CUZCO, TRUJILLO / : ; Los miembros de los dos ejemplos anteriores han sido definidos por extensión, ahora veamos la siguiente definición de conjunto: nombre_conjunto / 1 ..n / [ : lista_atributos ] PROYECTO / 1 .. 3 / : RENTABILIDAD; Los miembros del ejemplo anterior han sido definidos por compresión. Ambos casos son validos. Conjunto Derivado Denso: Los conjuntos derivados, son creados a partir de otros conjuntos (uno o más 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 sección a manera de ejemplo. SETS: SUCURSAL / AREQUIPA, CUZCO /:; PROYECTO / PROY1, PROY2/:; PERIODO / 1 .. 2 /:; SUC_PROY_PER(SUCURSAL, POYECTO, PERIODO): TASA, INVMAXIMA; ENDSETS • El “nombre_conjunto” es un nombre cualquiera que se define para denominar al conjunto,

en lo posible algo que sugiera de que conjuntos se deriva, o el uso que se le va a dar al conjunto.

• La “Lista_conjuntos_padres” es una lista de conjuntos previamente definidos, separados

por comas. • Sin especificar los elementos de “especificaciones_lista_miembros”, LINGO construye

todas las combinaciones de miembros de cada uno de los conjuntos padres para crear los miembros del nuevo conjunto derivado.

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 5

Page 6: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

Miembros del conjunto SUC_PROY_PER

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: 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. 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 Miembros del conjunto CONEXION

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)

Conjunto Derivado No Denso (Usando una Lista de Miembros Explícita)

nombre_conjunto (Lista_conjuntos_padres) [ /especificaciones_lista_miembros/ ] [ :lista_atributos ];

SUC_PROY_PER (SUCURSAL, POYECTO, PERIODO) / AREQUIPA PROY1 1, AREQUIPA PROY2 2, CUZCO PROY2 1 / : TASA, INVMAXIMA; SUC_PROY_PER tendrá solo tres miembros del conjunto disperso. ( AREQUIPA, PROY1, 1), ( AREQUIPA, PROY2, 2) y ( CUZCO, PROY2, 1) Conjunto Derivado No Denso (Usando un Filtro de Miembros) 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.

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 6

Page 7: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

• 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:

CAMIONES_PESADOS(CAMIONES) | CAPACIDAD(&1) #GT# 50000;

• El conjunto CAMIONES_PESADOS ha sido derivado del conjunto padre CAMIONES. La

barra vertical “|” es usada para marcar el inicio de un filtro de miembros (Ver ejemplo en LINGO).

• Los operadores lógicos reconocidos por LINGO incluyen: – #EQ# Igual – #NE# No igual – #GE# Mayor que o igual a – #LT# Menor que – #LE# Menor que o igual a

• 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 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 más pequeños. • 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 leídos desde la sección de datos, esta sección es descrita a continuación.

LA SECCIÓN “DATA” DE UN MODELO 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: • Asignar valores a algunos atributos de conjuntos. • Aislar datos del resto del modelo. • Mantenimiento fácil del modelo. • Dimensionamiento fácil y rápido del modelo (Escalabilidad). • Se pueden tener sentencias para inicializar los atributos de los conjuntos definidos en la

sección “SETS”. Estas expresiones tienen la siguiente sintaxis: Lista_Atributos = Lista_Valores;

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

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 7

Page 8: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

DATA: X = 1 2 3; Y = 4 5 6; ENDDATA En el ejemplo mostrado a continuación, podríamos pensar que a X se le asignaran los valores 1, 4 y 2, debido a su ubicación 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, 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. LA SECCIÓN “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 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):

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 8

Page 9: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

MIN = X * @COS( 3.1416 * X); X < 6; La solución óptima local será:

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 solución óptima local partiendo de dicho punto será:

LA SECCIÓN “CALC” DE UN MODELO 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” A continuación mostramos un ejemplo donde se halla el promedio de X,Y y Z MODEL: DATA: X, Y, Z = 1, 2, 3; ENDDATA

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 9

Page 10: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

CALC: PROMEDIO = ( X + Y + Z) / 3; ENDCALC END

FUNCIONES DE BUCLES Y CONJUNTOS 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: @función (nombre_conjunto[ (lista_indices_conjunto) [ | calificador_condicional ]]: lista_expresiones); 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: @FOR (Set_index_list) | Conditional_qualifier : Expression); El Conditional_qualifier es opcional. Si lo usa, éste es precedido por la barra carácter ( | ) . Por lo menos se requiere una expresión para @FOR, pero un número 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 función lista indicarán 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 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 Si el atributo CARGA es usado para denotar la capacidad de carga de dicha camioneta, entonces podemos usar la función @FOR para restringir dicha capacidad de carga con la siguiente expresión: @FOR (CAMIONETAS(C): CARGA(C) <= 2500 );

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 10

Page 11: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

Una vez ingresado el código arriba mostrado en LINGO, usando el comando “LINGO/Generate”, veremos que se generan las siguientes restricciones: CARGA(TOYOTA) <= 2500; CARGA(HYUNDAI) <= 2500; CARGA(FORD) <= 2500; CARGA(NISSAN) <= 2500; 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 @FOR (NUMEROS(I): TRIPLE(I) = 3 * VALOR(I) ); 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: 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 función @SUM anidada dentro de @FOR: ¡ Las restricciones de demanda: @FOR ( VENDEDORES (J): @SUM ( ALMACENES (I): VOLUMEN (I,J)) = DEMANDA (J) );

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 11

Page 12: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

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:

DEMANDA_3 = @SUM( VENDEDOR(J) | J #LE# 3 : DEMANDA(J) ); El símbolo #LE# es llamado un operador lógico, 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 términos en X, omitiendo el cuarto y quinto término, para una suma total de 9. 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 Funciones @MIN y @MAX • @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 • Para encontrar los valores mínimos de la DEMANDA, podemos usar:

EL_MINIMO = @MIN(VENDEDOR(J): DEMANDA(J)); EL_MINIMO = @MIN(VENDEDOR: DEMANDA);

@MIN, @MAX y Filtros 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:

EL_MAXIMO = @MAX(VENDEDOR(J) | J #LE# 3 : DEMANDA(J)); La solución será: Variable Value EL_MAXIMO 5.000

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 12

Page 13: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

DOMINIO DE LAS VARIABLES

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. LINGO provee 4 funciones de dominio de variables:

• @GIN restringe los valores de una variable a enteros. • @BIN crea una variable binaria (0 o 1). • @FREE permite que una variable asuma cualquier valor real, positivo o negativo. • @BND limita una variable dentro de un rango finito.

Variables Enteras • General: @GIN - Define variables enteras con cualquier valor • Binary: @BIN - Define variables binarias con valores cero o uno 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); • Ejemplo 1: @FREE( X); • Ejemplo 2: @FREE( CANTIDAD( 4)); • Ejemplo 3: @FOR( PRODUCTOS: @FREE( CANTIDAD)); 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:

@BND( cota_inferior, nombre_variable, cota_superior); • En términos matemáticos, LINGO interpreta la función @BND como:

Cota_inferior < Nombre_variable < Cota_supeior

Ejemplo 1: @BND( -1, X, 1);

Ejemplo 2: @BND( 100, CANTIDAD( 4), 200);

Ejemplo 3: @FOR( PRODUCTOS: @BND( 10, CANTIDAD, 20));

Ejemplo 4: @FOR( PRODUCTOS:

@BND( CI, CANTIDAD, CS)); 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

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 13

Page 14: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

OPERADORES EN LINGO LINGO tiene tres tipos de operadores: • Aritméticos

trabajan con operandos numéricos, LINGO tiene cinco operadores aritméticos • Lógicos

En LINGO, los operadores lógicos 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 función.

• Relacionales Los operadores relacionales son usados en un modelo para especificar cuando el lado

izquierdo de una expresión debe ser igual a, menor que o igual a, o mayor que o igual al lado derecho.

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 Prioridad Operador(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 El ranking de prioridades de los operadores lógicos es:

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 14

Page 15: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

Nivel de Prioridad Operador(es) 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: • = La expresión a la izquierda debe ser igual a la de la derecha. • <= La expresión a la izquierda debe ser menor que o igual a la expresión de la derecha. • >= La expresión a la izquierda debe ser mayor que o igual a la expresión en la derecha. 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

Donde e es una constante pequeña

INTERFASE CON ARCHIVOS EXTERNOS Resulta impráctico tratar de mantener su información en un modelo LINGO, en la mayoría de casos, los datos residen en archivos externos. En forma adicional, una solución generada por LINGO es de poca utilización si no puede exportarla a otras aplicaciones. Revisaremos los métodos para mover información hacia y desde LINGO, trabajando en base a:

– Archivos ASCII (No será revisado) – Hojas de Cálculo – Base de Datos

Trabajando con Hojas de Cálculo 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: Importar Datos desde Excel: Usando @OLE LINGO utiliza el comando @OLE para importar datos desde Excel, usando @OLE, LINGO carga Excel, el archivo deseado y solicita los rangos de datos requeridos en la hoja de cálculo. La función @OLE puede ser usada en las secciones “Data” e “Init”.

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 15

Page 16: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

La sintaxis al utilizar @OLE para importar datos en las secciones “Datos” e “Init” es:

Objeto = @OLE( ’ArchivoHC'[, Rango]); Ejemplo 1: COSTO = @OLE( ’ESPECIFICACIONES.XLS'); En este caso no se especifica el rango, debido a que el rango tiene el nombre del atributo COSTO Ejemplo 2: COSTO = @OLE( 'ESPECIFICACIONES', ’RANGOCOSTOS'); Exportar Datos hacia Excel: Usando @OLE La sintaxis al utilizar @OLE para exportar datos en la sección “Datos” es:

@OLE( ’ArchivoHC'[, Rango]) = Objeto ; Esta función es ejecutada, al final de la ejecución del modelo, ejem.

@OLE('ManejoPersonal.Xls','RangoAsignado') = INICIAN; 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”. Trabajando con Bases de Datos 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 instala drivers ODBC para los siguientes DBMS’s:

Access, dBase, Excel, FoxPro, Oracle, Paradox, SQL Server y archivos de texto 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. Creando un registro de datos ODBC Para crear un registro de datos ODBC seleccionar:

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 16

Page 17: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

1.- Inicio/Configuración/Panel de Control – de las opciones de Windows 2.- Herramientas administrativas 3.- Orígenes de datos ODBC Luego aparecerá un cuadro de dialogo similar al mostrado a continuación:

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:

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 17

Page 18: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

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. Importando datos desde Access Para poder leer y enviar información a una base de datos se debe crear un registro de base de datos ODBC. En el siguiente ejemplo se envía la información 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 envía la información del atributo “INICIAN” al campo “Asignado” de la tabla “TablaAsignaPersonal” 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.

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 18

Page 19: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

COLOCANDO NOMBRES A LAS RESTRICCIONES

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 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

FUNCIONES DE REPORTE DE LINGO 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.

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 19

Page 20: Curso Lingo Resumido

INVESTIGACION OPERACIONAL

Docentes: Luis Ulfe Vega / Gustavo Solis Vargas 20

En el modelo de transporte desarrollado anteriormente enviaremos los resultados de los valores duales asociados a las restricciones de oferta a una hoja Excel. 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 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; @OLE() = @DUAL(FILA_ORIGEN); ENDDATA END