22
Investigación Operativa 1 PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ FACULTAD DE CIENCIAS E INGENIERÍA PRIMERA GUÍA DE LINGO PARA EL LABORATORIO DE INVESTIGACIÓN OPERATIVA 1 Temas: El lenguaje de modelación del software LINGO Resolución de modelos de programación lineal usando LINGO 1. OBJETIVOS La guía tiene como finalidad exponer el lenguaje de modelación del LINGO y que el alumno sea capaz de formular modelos de programación lineal usando este lenguaje. 2. METODOLOGÍA Los alumnos trabajarán individualmente en una computadora, bajo la tutoría de los jefes de práctica de laboratorio. 3. GUÍA DE LABORATORIO 3.1 INTRODUCCIÓN AL LINGO Según el LINGO 11 Users Manual, LINGO es una herramienta que permite formular modelos de programación lineal de manera sencilla y eficiente, para tal fin LINGO tiene, entre otras, las siguientes características: Un lenguaje algebraico para modelación LINGO tiene un potente lenguaje de modelación basado en sets que permite al usuario expresar los modelos matemáticos de manera compacta y eficiente. Manejo de datos conveniente LINGO permite construir modelos que importan la información y exportan los resultados desde y hacia las hojas de cálculo o bases de datos. Esta capacidad del LINGO facilita el análisis de sensibilidad de los modelos de programación lineal y la elaboración de reportes y gráficos apropiados para la toma de decisiones. Con estas ventajas, usted desarrollará habilidades para manejar un software potente que le permitirá realizar trabajos de investigación, tesis y usar la programación lineal en situaciones reales cuando la cantidad de variables y restricciones es a menudo sumamente grande. Los requisitos para leer esta guía son aprender primero el funcionamiento del LINDO; luego instale el LINGO. Este software es de libre disponibilidad y se encuentra en la web de LINDO Systems cuya dirección electrónica es http://www.lindo.com/ . Asimismo previamente debe leer el primer capítulo Getting Started with LINGO del LINGO 11 Users Manual en donde se explica el entorno de este software; se sugiere leer dicho capítulo y a la vez digite y resuelva los ejemplos en el LINGO. En el laboratorio de computadoras en el segundo piso del pabellón de Ingeniería Industrial está instalado este software. Luego de cumplir los requisitos, lea y simultáneamente ejecute las indicaciones de esta guía en su editor de LINGO. 3.2 INICIO DEL MODELO EN LINGO En LINGO, el modelo se inicia con el comando MODEL seguido del caracter :. En la figura 1 se muestra el editor del LINGO y el comando indicado.

Guia Lingo

Embed Size (px)

Citation preview

Page 1: Guia Lingo

Investigación Operativa 1

PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ FACULTAD DE CIENCIAS E INGENIERÍA

PRIMERA GUÍA DE LINGO PARA EL LABORATORIO DE INVESTIGACIÓN OPERATIVA 1

Temas: El lenguaje de modelación del software LINGO Resolución de modelos de programación lineal usando LINGO

1. OBJETIVOS La guía tiene como finalidad exponer el lenguaje de modelación del LINGO y que el alumno sea capaz de formular modelos de programación lineal usando este lenguaje.

2. METODOLOGÍA Los alumnos trabajarán individualmente en una computadora, bajo la tutoría de los jefes de práctica de laboratorio.

3. GUÍA DE LABORATORIO 3.1 INTRODUCCIÓN AL LINGO

Según el LINGO 11 Users Manual, LINGO es una herramienta que permite formular modelos de programación lineal de manera sencilla y eficiente, para tal fin LINGO tiene, entre otras, las siguientes características:

Un lenguaje algebraico para modelación LINGO tiene un potente lenguaje de modelación basado en sets que permite al usuario expresar los modelos matemáticos de manera compacta y eficiente.

Manejo de datos conveniente LINGO permite construir modelos que importan la información y exportan los resultados desde y hacia las hojas de cálculo o bases de datos. Esta capacidad del LINGO facilita el análisis de sensibilidad de los modelos de programación lineal y la elaboración de reportes y gráficos apropiados para la toma de decisiones. Con estas ventajas, usted desarrollará habilidades para manejar un software potente que le permitirá realizar trabajos de investigación, tesis y usar la programación lineal en situaciones reales cuando la cantidad de variables y restricciones es a menudo sumamente grande.

Los requisitos para leer esta guía son aprender primero el funcionamiento del LINDO; luego instale el LINGO. Este software es de libre disponibilidad y se encuentra en la web de LINDO Systems cuya dirección electrónica es http://www.lindo.com/. Asimismo previamente debe leer el primer capítulo Getting Started with LINGO del LINGO 11 Users Manual en donde se explica el entorno de este software; se sugiere leer dicho capítulo y a la vez digite y resuelva los ejemplos en el LINGO. En el laboratorio de computadoras en el segundo piso del pabellón de Ingeniería Industrial está instalado este software. Luego de cumplir los requisitos, lea y simultáneamente ejecute las indicaciones de esta guía en su editor de LINGO. 3.2 INICIO DEL MODELO EN LINGO En LINGO, el modelo se inicia con el comando MODEL seguido del caracter “:“. En la figura 1 se muestra el editor del LINGO y el comando indicado.

Page 2: Guia Lingo

2

Figura 1

En la imagen también se lee el comentario “!Ejemplo en LINGO del primer laboratorio de Investigación Operativa 1;”, LINGO admite agregarlos con la condición que empiecen con el caracter “!” y finalicen con “;”. 3.3 DISEÑO DE SETS FINALIDAD E IDENTIFICACIÓN DE LOS SETS Una inquietud que quizá tenga el estudiante es por qué debe aprender otro software para la resolución de modelos de programación lineal. Si usted ya exploró el LINDO habrá notado que es necesario digitar completamente en su editor el programa lineal diseñado; ésta es una tarea muy laboriosa cuando los modelos son de gran magnitud, situación frecuente en la realidad. Los sets son un grupo de objetos relacionados que permite agrupar parámetros, variables y restricciones las cuales se agrupan en una serie de familias de características similares con lo cual el ingreso de los programas lineales de gran tamaño se hace de manera sencilla y ágil con LINGO. Ejemplo 1 En cierta empresa manufacturera se fabrica 20 diferentes productos y cada uno pasa por una secuencia se siete procesos distintos en donde la materia prima se agrega en los cinco primeros. Los dos últimos procesos son de acabado de los productos. La secuencia de los procesos para cada producto es la misma y se identifica con proceso 1 al primero, proceso 2 al segundo y así sucesivamente. En el anexo 1 se muestra los costos variables unitarios, los precios de venta, el margen de contribución, la demanda máxima de los 20 productos y la mínima por obligaciones contractuales. En el anexo 2 se presenta el tiempo en cada proceso requerido por cada unidad de tipo de producto y en el anexo 3 se encuentran los datos de la cantidad de materia prima por cada kilogramo de producto terminado. Esta empresa desea determinar cuántos productos de cada tipo debe fabricar para maximizar las utilidades pero sujeta a las restricciones de recursos y demanda; para tal fin, las variables de decisión son:

Pi: cantidad de kilogramos por fabricar de cada tipo de producto.

i= 1,2,3…20

En el anexo 4 se muestra el resto del modelo de programación lineal y lo llamaremos modelo 1. Quizá usted ya habrá notado que digitar el modelo 1 en el editor del LINDO es laborioso, asimismo, por su magnitud es probable que cometa varios errores en esta tarea. Por otro lado, la revisión de sus parámetros con el fin de detectar errores es también engorrosa porque exige observar exhaustivamente todo lo que se ingresó en el editor. Usando notación matemática, el modelo 1 equivalente es el siguiente y lo llamaremos modelo 2: Modelo 2

Maximizar i=1..20(MCi*Pi) Restricciones de demanda:

Pi ≥ Dmínima i ; i=1,2…20

Page 3: Guia Lingo

3

Pi ≤ Dmáxima i ; i=1,2…20

Restricciones de tiempo:

j=1..20(Tuji*Pj) ≤ Ti ; i=1,2…7

Restriccones de materia prima:

j=1..20(MPuji*Pj) ≤ MPi ; i=1,2…5

Ahora lea nuevamente el texto del ejemplo 1, observe el modelo 2 e identifique la siguiente lista de parámetros:

El margen de contribución de cada producto: MCi.

La demanda mínima de cada producto: Dmínima i.

La demanda máxima de cada producto: Dmáxima i.

Disponibilidad del recurso tiempo en cada proceso: Ti.

Disponibilidad de recurso materia prima: MPi.

El tiempo unitario de cada producto en cada proceso: Tuji.

El consumo de materia prima de cada producto: MPuji.

Finalmente, identifique la lista de las variables:

Cantidad de cada tipo de producto por fabricar. SETS PRIMITIVOS En la lista de parámetros y variables anterior, identificamos tres grupos con características similares: el margen de contribución, la demanda y las variables. Cada grupo se denomina atributo (attributes), y a este conjunto de grupos se denomina set. Revise los anexos 1, 2 y 3 y note que los atributos margen de contribución y demanda tienen 20 datos; el atributo variables tendrá 20 valores que se determinarán al resolver el programa lineal, éstas son las variables de decisión. La dimensión 20 es una característica común de estos atributos del set al que llamaremos PRODUCTOS; LINGO permite que usted elija el nombre del set con un máximo de 32 caracteres pero necesariamente el primero es alfabético. Para indicar la dimensión escriba después de PRODUCTOS la secuencia de caracteres “/1..20/” . Antes de ingresar los sets en el editor, primero escriba el comando SETS seguido del caracter “:” ; hasta aquí el editor del LINGO tendrá la apariencia de la figura 2. Figura 2

Nuevamente se observa comentarios en el editor; en este caso se anotó “!Sets primitivos;” y el otro referido a las variables de decisión. Para declarar los atributos del set PRODUCTOS usaremos las etiquetas MARGEN, DEMANDAMIN, DEMANDAMAX y P (usted puede elegir otros nombres). La etiqueta MARGEN contiene los 20 datos del margen de contribución unitario de cada producto; las etiquetas

Page 4: Guia Lingo

4

DEMANDAMIN y DEMANDAMAX contienen cada una los datos de la demanda mínima y máxima de los 20 productos respectivamente y la etiqueta P son las 20 variables de decisión de este modelo. Luego de digitar los nombres de estos atributos, la figura 3 muestra cómo se verá el editor. Figura 3

En la pantalla hemos anotado el comentario “!VARIABLES DE DECISIÓN definidas en la matriz P;” para recordar que cada elemento de la matriz P es una de las 20 variables de decisión. En la lista de parámetros identificamos otro set cuyo atributo es la disponibilidad del recurso tiempo en cada proceso, como son siete procesos, son siete los datos de este atributo (vea el anexo 2). No hay otro atributo con esta dimensión. En la figura 4 se muestra el set PROCESOS (usted puede elegir otro nombre) y para indicar su dimensión PROCESOS/1..7/:. Figura 4

Quizá se esté preguntando por qué se digitó PROCESOS: en vez de PROCESOS/1..7/:, es decir, sin dimensión. Esto es posible siempre y cuando se declare la dimensión en la zona de datos, este detalle se explicará más adelante, sin embargo, si desea digite PROCESOS/1..7/:. Para declarar el único atributo del set PROCESOS usaremos la etiqueta RECURSOT (u otro nombre) que contiene los siete datos del tiempo disponible de cada proceso, observe la figura 5. Figura 5

En la lista de parámetros también tenemos la disponibilidad del recurso materia prima en cada proceso, el texto del ejemplo 1 indica que sólo en los cinco primeros procesos se agregan distintos tipos de materia prima. Este es otro atributo al que llamaremos RECURSOMP (u otro nombre) y

Page 5: Guia Lingo

5

definimos el set PROCESOMP/1..5/ (vea el anexo 3 y verifique la dimensión). La figura 6 presenta este set y su atributo. Figura 6

Los tres primeros sets diseñados son llamados sets primitivos y son semejantes a matrices cuya dimensión es una fila y n columnas, por ejemplo, el set PRODUCTOS es un arreglo de números de 20 datos (columnas). La lista de parámetros muestra dos grupos de datos que son el tiempo unitario de cada producto en cada proceso y el consumo de materia prima de cada producto. Estos grupos de datos son de dos entradas: el primero tiene 140 datos porque son tiempos unitarios de los 20 productos en cada uno de los siete procesos; el segundo tiene 100 datos porque son los consumos de materia prima por cada unidad de los 20 productos en cada uno de los cinco procesos que sí requieren estos materiales. SETS DERIVADOS Los sets derivados ayudan a definir los arreglos de datos o variables cuyo orden es nxm donde n es la cantidad de filas y m la cantidad de columnas. Como usted ya habrá notado, tanto los datos de los tiempos unitarios como los de la materia prima por unidad son matrices de n filas y m columnas; así por ejemplo, el tiempo unitario tiene 20 filas y 7 columnas, (o viceversa, usted elija cómo) mientras que la materia prima por unidad tiene 20 filas y 5 columnas (en los anexos 2 y 3 verifique las dimensiones indicadas). Para el grupo de datos tiempos unitarios de cada producto en cada proceso, definamos el atributo TIEMPO (u otro nombre) dentro del set derivado MATRIZ1 (u otro nombre). Este set es derivado de los sets primitivos PRODUCTOS y PROCESOS cuyas dimensiones son 20 y 7 respectivamente, lo que permite indicar a LINGO que la MATRIZ1 (PRODUCTOS , PROCESOS) es de orden 20x7. Este set y su atributo se muestran en la figura 7. Figura 7

Por otro lado, los consumos de materia prima de cada producto en cada uno de los cinco primeros procesos, se asignarán al atributo MP (u otro nombre) dentro del set derivado MATRIZ2 (u otro nombre). Este set es derivado de los sets primitivos PRODUCTOS y PROCESOMP cuyas dimensiones son 20 y 5 respectivamente, lo que permite indicar a LINGO que la MATRIZ2 (PRODUCTOS , PROCESOMP) es de orden 20x5.

Page 6: Guia Lingo

6

La zona de los sets termina con el comando ENDSETS, esto y todos los sets diseñados se muestran en la figura 8. Figura 8

ASPECTOS CLAVES EN EL DISEÑO DE SETS Culminada la definición de los sets, observe nuevamente la figura 8 y anotemos algunos aspectos claves que a menudo son fuentes de error:

Los comentarios y las líneas que contienen los nombres de los sets y atributos terminan con el caracter “;”.

Después de los comandos MODEL y SETS anote “:”, no el caracter “;” .

Termine la zona de los sets con el comando ENDSETS sin el caracter “;” ni “:”.

Los nombres de los atributos y de los sets primitivos invocados en los sets derivados se separan con comas, por ejemplo, MARGEN , DEMANDAMIN , DEMANDAMAX , P y (PRODUCTOS , PROCESOS).

Se recomienda nombres para los sets y atributos que sean fáciles de recordar (se sugiere que tengan relación con los datos que contienen o las variables de decisión definidas) porque serán usados en el resto del programa y usted deberá invocarlos exactamente igual a como los definió en la zona de sets. A menudo es fuente de error omitir alguna de las letras o agregar otras, por ejemplo, anotar en las restricciones PROCESO en vez de PROCESOS; LINGO no reconocerá la etiqueta PROCESO y enviará un mensaje de error.

Defina la dimensión de los sets, usando los caracteres “/1..m/”. Note que el primer número necesariamente es uno seguido de “..” (dos puntos, no tres o más) y m debe ser un número entero positivo. En caso omita la dimensión, deberá ser definida en la zona de datos como se explicará en la siguiente sección. También es posible definir implícitamente la dimensión con nombres y otras secuencias de caracteres en cuyo caso la cantidad de nombres anotadas será la dimensión. Si desea conocer más detalles, consulte el segundo capítulo del LINGO 11 Users Manual.

3.4 EL INGRESO DE DATOS El ingreso de datos empieza con el comando DATA seguido del caracter “:”. Recuerde que el ejemplo 1 tiene varios conjuntos de datos, a saber, margen de contribución unitario de cada producto; demanda mínima y máxima de cada producto; recurso tiempo disponible de cada proceso; recurso materia prima disponible de cada tipo; tiempo unitario de cada producto en cada proceso y cantidad de materia prima por unidad de cada tipo de producto en cada proceso. Estos datos se identificaron como atributos en la zona de sets y se les asignó los nombres MARGEN, DEMANDAMIN, DEMANDAMAX, RECURSOT, RECURSOMP, TIEMPO y MP, respectivamente. Los datos de estos atributos son parámetros del modelo conocidos de antemano y deben ser ingresados al LINGO. El ingreso consiste en anotar el nombre del atributo seguido del caracter “=” y de los datos del atributo. Evite digitar los datos, cópielos directamente del archivo Excel “Datos.xls” que se proporcionó junto con esta guía. Si los pega directamente desde el Excel al

Page 7: Guia Lingo

7

editor del LINGO pegará también la cuadrícula, para evitar esto y así mejorar la apariencia del modelo, primero pegue los datos del Excel al Bloc de notas

1 y de éste al LINGO.

En la figura 9 se muestra el ingreso de los datos MARGEN, DEMANDAMIN, DEMANDAMAX, RECURSOT y RECURSOMP. Figura 9

Note en la figura 9 que cada arreglo de datos culmina con “;”. Un detalle pendiente de la sección 3.3 fue por qué se omitió la dimensión del set primitivo PROCESOS en la zona de los sets. En la figura 9 observe en la zona sets que se escribió PROCESOS en vez de PROCESOS/1..7/, sin embargo, en la zona de datos implícitamente se ha definido su dimensión al anotar “PROCESOS =” seguido de siete etiquetas, la primera es PROCESO1 y así sucesivamente. ¿Recuerda que la dimensión de este set es siete porque esa es la cantidad de procesos en la línea de producción?

1 Para ubicar el Bloc de notas presione el ícono de Windows ubicado en la zona inferior izquierda y en el menú busque

“Todos los programas“ y luego “Accesorios”, ahí encontrará dicha aplicación.

Page 8: Guia Lingo

8

La figura 10 presenta el resto de datos, observe los atributos TIEMPO Y MP que son las matrices de orden 20x10 y 20x5 que se diseñaron con el apoyo de los sets derivados. La zona de datos finaliza con el comando ENDDATA. Figura 10

ASPECTOS CLAVES EN EL INGRESO DE DATOS Culminada la definición de los datos, observe nuevamente las figuras 9 y 10 y anotemos algunos aspectos claves que a menudo son fuentes de error:

Cada grupo de datos termina con el caracter “;”.

Después del comando DATA anote “:”, no el caracter “;”.

Termine la zona de los datos con el comando ENDDATA sin el caracter “;” ni “:”.

No olvide de usar el nombre exacto de cada set o atributo tal como se definió en la zona de sets, cualquier diferencia en los nombres LINGO no las reconocerá y automáticamente enviará un mensaje de error. Por ejemplo, observe la figura 10, luego pruebe en su editor qué ocurre si en la zona de datos, en vez de usar la etiqueta TIEMPO usa TIEMPOS.

Los datos de los atributos de sets derivados nxm deben anotarse en n filas y m columnas; n y m deben ser iguales a las dimensiones del primer y segundo set primitivo invocados en el set derivado, de lo contrario, LINGO generará un modelo que no corresponde al caso que usted

Page 9: Guia Lingo

9

quiere resolver. Por ejemplo, TIEMPO es un atributo del set derivado MATRIZ1, éste invoca a los sets primitivos PRODUCTOS y PROCESOS así: MATRIZ1 (PRODUCTOS , PROCESOS). Como la dimensión de PRODUCTOS es 20 y la de PROCESOS es siete, entonces el orden del set derivado MATRIZ1 es 20x7 (20 filas y 7 columnas); luego los datos deben ser ingresados según dicho orden: 20 filas y 7 columnas, verifique esto en la figura 10. Por ningún motivo ingrese los datos en 7 filas y 20 columnas. Observe de nuevo la figura 10, ¿cómo se ha ingresado los datos del atributo MP?

3.5 DEFINICIÓN DE LA FUNCIÓN OBJETIVO, LAS RESTRICCIONES Y EL RANGO DE EXISTENCIA USANDO EL LENGUAJE DE MODELACIÓN

SET LOOPING FUNCTIONS Según el LINGO 11 Users Manual, el poder de la modelación basada en sets está en la habilidad de este software para aplicar una operación a una parte o a todos los miembros de los sets usando una sola sentencia. Las funciones que permiten esto son las denominadas set looping functions En esta sección presentaremos las funciones @SUM y @FOR, sin embargo, hay otras funciones que usted podrá encontrar en el segundo capítulo del Users Manual. LA FUNCIÓN OBJETIVO En el ejemplo 1 la función objetivo es la maximización de las utilidades (el margen de contribución) y en el modelo 1 tenemos la siguiente función objetivo en lenguaje algebraico:

MAX

11P1+15.75P2+10.5P3+10.75P4+14.5P5+17.25P6+13.5P7+12P8+16P9+17P10+20P11+22P12+18.5P13+17P14

+15.5P15+19P16+21.5P17+21.5P18+15.5P19+14.5P20

Con el lenguaje de modelación del LINGO evitaremos digitar esta expresión engorrosa, para tal fin, escriba en el editor lo que se muestra en la figura 11. Figura 11

En el modelo 2 se definió la función objetivo así:

Maximizar i=1..20(MCi*Pi)

En la tabla 1 compare cada uno de los componentes de la expresión anterior con la sintaxis de la función objetivo en LINGO. Tabla 1

Función objetivo en notación matemática

Función objetivo en LINGO

Maximizar MAX =

i=1..20( @SUM( PRODUCTOS ( I ) :

MCi MARGEN ( I )

* *

Pi) P( I ) );

La expresión “@SUM( PRODUCTO ( I ): MARGEN( I )* P( I ) ) ;” toma cada una de las 20

variables de decisión en el atributo P y las multiplica por sus correspondientes márgenes de

contribución anotados en el atributo MARGEN. El caracter “I” es similar a un contador que

empieza en uno y con un loop de 20 iteraciones suma el producto de cada margen de contribución por cada variable de decisión.

Page 10: Guia Lingo

10

Un aspecto relevante en la sintaxis de la función @SUM es que enseguida debe escribir el nombre de un set; en caso lo omita, LINGO enviará un mensaje de error en la sintaxis; también es posible que lea el atributo, lo confunda con un set y envíe otro mensaje de error. Por ejemplo, vea

la figura 11, luego en su editor omita el set PRODUCTO ( I ) y lea el mensaje que arroja LINGO.

Finalmente, no se olvide de retornar a las condiciones originales. LAS RESTRICCIONES En el modelo 2 ubicado en la página 2 identifique esta lista de restricciones:

Restricciones de demanda.

Restricciones de tiempo disponible para cada proceso.

Restricciones de materia prima disponible. En el anexo 4 se muestra las restricciones de demanda en lenguaje algebraico. Con el lenguaje de modelación del LINGO evitaremos digitar estas restricciones, para tal fin, escriba en el editor lo que se muestra en la figura 12. Figura 12

En el modelo 2 se definió las restricciones de demanda así:

Pi ≥ Dmínima i ; i=1,2…20

Pi ≤ Dmáxima i ; i=1,2…20

En la tabla 2 compare cada uno de los componentes de la expresión anterior para la demanda mínima con la sintaxis de las restricciones en LINGO. Tabla 2

Restricciones de demanda en notación matemática

Restricciones de demanda en LINGO

Pi ≥ Dmínima i P( I ) >= DEMANDAMIN ( I ) );

i=1,2…20 @FOR( PRODUCTOS ( I ):

La expresión “@FOR( PRODUCTOS ( I ): P( I ) >= DEMANDAMIN( I ) ) ;” toma cada una de

las 20 variables de decisión en el atributo P e indica que sean mayores o iguales que la demanda mínima correspondiente que se registraron en los datos del atributo DEMANDAMIN. El caracter

“I” es similar a un contador que empieza en uno y en con loop de 20 iteraciones genera las 20

restricciones de demanda mínima (o menos en caso algunas de las demandas mínimas sean cero). De manera similar usted puede explicar la sentencia para la demanda máxima escrita en la figura 12. En el anexo 4 se muestran las restricciones del recurso tiempo en lenguaje algebraico, éstas son especialmente engorrosas de digitar. En la figura 13 se muestra cómo el lenguaje de modelación del LINGO con una sola sentencia genera las siete restricciones de tiempo.

Page 11: Guia Lingo

11

Figura 13

En el modelo 2 se definió las restricciones del recurso tiempo en cada proceso así:

j=1..20(Tuji*Pj) ≤ Ti ; i=1,2…7

En la tabla 3 compare cada uno de los componentes de la expresión anterior con la sintaxis de las restricciones en LINGO. Tabla 3

Restricciones de tiempo en notación matemática

Restricciones de tiempo en LINGO

j=1..20(Tuji*Pj) ≤ Ti @SUM( PRODUCTOS ( J ) : TIEMPO ( J , I )*P( J ) ) <= RECURSOT ( I ) );

i=1,2…7 @FOR( PROCESOS ( I ):

La expresión “@SUM( PRODUCTOS ( J ): TIEMPO ( J , I )*P( J ) ) <= RECURSOT ( I ) )” suma

para el proceso i los productos de cada tiempo unitario del producto j en el proceso i (elemento j,i del atributo TIEMPO) por la variable de decisión j (elemento j del atributo P). Por otro lado, la

expresión “@FOR( PROCESOS ( I ):” despliega las siete restricciones correspondientes a los

siete procesos apoyado en su contador “I” que empieza en uno y en con un loop de siete

iteraciones genera las restricciones de tiempo. Nuevamente en el anexo 4 se muestra las restricciones del recurso materia prima en lenguaje algebraico, al igual que las restricciones de tiempo éstas también son engorrosas. En la figura 14 se muestra en la última sentencia cómo se generan las restricciones de este recurso; para finalizar el modelo se agrega el comando END. Figura 14

De manera similar como se explicó para las otras restricciones, descubra usted cómo se elaboró la última sentencia para las restricciones de la materia prima.

Page 12: Guia Lingo

12

EL RANGO DE EXISTENCIA Las variables de decisión del modelo del ejemplo 1 son no negativas (≥0), este tipo de variables no es necesario declararlas en LINGO porque el software asume que son no negativas cuando no se declaran. Para las variables de tipo enteras, sin restricción de signo, acotadas o binarias (0 ó 1) LINGO tiene comandos con el fin de declararlas, estos comandos los aprenderá en los próximos laboratorios. Finalmente, el rango de existencia se ubica antes del comando END.

ASPECTOS CLAVES EN LA MODELACIÓN DE LA FUNCIÓN OBJETIVO Y LAS RESTRICCIONES Culminada la definición de la función objetivo y las restricciones, observe de nuevo las figuras 11 y 14 y anotemos algunos aspectos claves que a menudo son fuentes de error: En la función objetivo:

La sentencia termina con el caracter “;”.

No olvide de usar el nombre exacto de cada atributo definido en la zona de sets, cualquier diferencia en los nombres LINGO no las reconocerá y enviará un mensaje de error. Por ejemplo, en la restricción de materia prima cambie MP por MPPROD, ¿qué ocurre?

LINGO no admite anidar la función @FOR dentro de la función @SUM.

La sintaxis de la función @SUM exige que enseguida se escriba el nombre de un set.

LINGO reconocerá en @SUM exclusivamente los atributos (definidos en la zona de sets) asignados al set invocado. Por ejemplo, se digitó la sentencia “MAX = @SUM( PRODUCTOS ( I ): MARGEN ( I )*P( I ) )”; aquí se invoca al set primitivo PRODUCTOS, si a continuación escribe el atributo RECURSOT( I ), LINGO enviará un mensaje de error porque RECURSOT no está en el rango del set PRODUCTOS, confírmelo en la figura 5.

Si la función objetivo es de minimización use el comando MIN seguido del carácter “=”. En las restricciones:

Cada sentencia termina con el caracter “;”.

La sintaxis de @FOR exige anotar enseguida el nombre de un set, en caso lo omita ocurrirá algo similar a lo que antes se explicó con @SUM.

Una vez que anote el nombre del set en el comando @FOR, los atributos que se aniden dentro de esta función deben estar necesariamente en el rango del set anotado. Dicho de otra manera, ocurrirá algo similar a lo explicado con @SUM. Vea la figura 14 y ejecute el siguiente ejemplo: en su editor en la sentencia “@FOR( PROCESOS ( I ): @SUM( PRODUCTOS ( J ): TIEMPO ( J , I )*P( J ) ) <= RECURSOT ( I ) )” cambie TIEMPO ( J , I ) por MP ( J , I ). Lea el mensaje del LINGO; ¡no reconoce a MP ( J , I )! ¿Por qué? Porque MP ( J , I ) no está en el rango del set derivado MATRIZ1. Es cierto que este set no se escribió en la sentencia, pero fue implícitamente invocado a través de los sets primitivos PROCESOS y PRODUCTOS.

Tenga cuidado cuando defina el orden de los contadores en los atributos de los sets derivados. Por ejemplo, en la misma sentencia del acápite inmediato anterior observe que se anotó TIEMPO ( J , I ) y no TIEMPO ( I , J ). ¿Por qué? La respuesta se encuentra en la figura 8, vea que TIEMPO es un atributo en el rango del set derivado MATRIZ1, cuyo orden está dado por la dimensión de los sets PRODUCTOS y PROCESOS así: MATRIZ1 ( PRODUCTOS , PROCESOS). Como en la sentencia “@FOR( PROCESOS ( I ): @SUM( PRODUCTOS ( J ): TIEMPO ( J , I )*P( J ) ) <= RECURSOT ( I ) )” se asignó el contador “J“ a PRODUCTOS y el contador “I“ a PROCESOS, entonces, el orden correcto para el atributo TIEMPO es ( J , I ); en caso contrario, LINGO enviará un mensaje de error. Se recomienda que usted ejecute este ejemplo en su editor.

Revise los paréntesis, cuando los olvida LINGO envía el mensaje Missing right parenthesis, advirtiendo que se ha olvido un paréntesis. Normalmente LINGO ubica el cursor donde olvidó el signo, si no es claro dónde, entonces, primero subraye un paréntesis y luego en la ventana Edit seleccione la aplicación Match parenthesis, o presione Ctrl P, o el siguiente botón ubicado en el menú.

Page 13: Guia Lingo

13

LINGO marcará el paréntesis que cierra el que usted subrayó, en caso contrario mostrará el mensaje de error No matching parenthesis was found, que indica que el paréntesis de cierre no fue encontrado.

No olvide el comando END.

3.6 SOLUCIÓN DEL MODELO El modelo del ejemplo 1 está listo, para resolverlo seleccione en la ventana LINGO la aplicación Solve como se muestra en la figura 15. Figura 15

También puede presionar Ctrl U o presionar el siguiente botón en el menú:

En caso no haya errores, LINGO mostrará la pantalla de la figura 16, esta ventana tiene información de la cantidad de variables y restricciones, en este modelo 20 y 52, respectivamente, sin incluir la función objetivo ni el rango de existencia, sin embargo, usted lee 53 porque LINGO asigna el número uno a la función objetivo y a la primera restricción el número dos y así sucesivamente. Presione el botón Close en la ventana Solver Status […]. Si luego de intentar resolver el modelo el LINGO envía mensaje de error, deberá corregirlos; apóyese con los aspectos claves explicados en esta guía. La figura 17 muestra la ventana [Solution Report-…]. Este reporte muestra para los programas lineales, todos los parámetros del modelo y los resultados de las variables de decisión en el óptimo. También presenta el valor óptimo de la función objetivo las variables de holgura y exceso, así como los costos reducidos y los precios sombra, de forma similar al reporte del LINDO.

Page 14: Guia Lingo

14

Figura 16

Figura 17

Page 15: Guia Lingo

15

La figura 18 muestra cómo obtener el reporte de sensibilidad, seleccione en la ventana LINGO la aplicación Range. Esto deberá ejecutarlo en la pantalla [LINGO Model…] al que en esta guía la hemos llamado editor. No intente ejecutar Range en la pantalla [Solution Report-…] porque en ésta se desactivan la mayoría de aplicaciones del menú LINGO. Figura 18

La figura 19 muestra la pantalla con el reporte de sensibilidad. La figura 20 ilustra cómo obtener los valores óptimos de las variables de decisión omitiendo la lista de los parámetros, así el reporte estará en un formato resumido. Seleccione en la ventana LINGO la aplicación Solution o presiones Ctrl W. LINGO mostrará la ventana Solution Report or Graph (vea la figura 21), en esta ventana seleccione en “Attribute or Row Name:” las variables de decisión que en este caso es el atributo P. Recuerde que esto necesariamente deberá ejecutarlo en la pantalla [LINGO Mode[…]. La figura 22 muestra el resultado. 3.7 GENERACIÓN DEL MODELO ALGEBRAICO LINGO ofrece la aplicación Generate para generar el modelo algebraico. En el menú LINGO seleccione Generate/Display model o presione Ctrl G. La figura 23 muestra el resultado. En la ventana Solver Status […] presione el botón Close, luego la figura 24 muestra el modelo algebraico similar al que digitó en LINDO.

Page 16: Guia Lingo

16

Figura 19

Figura 20

Page 17: Guia Lingo

17

Figura 21

Figura 22

Figura 23

Page 18: Guia Lingo

18

Figura 24

4. OBSERVACIONES FINALES El ejemplo 1 de mediano tamaño ayudó a ilustrar las ventajas que ofrece el lenguaje de modelación del LINGO, piense el ahorro de tiempo y reducción de la probabilidad de error que se lograría con modelos de gran escala. Sin embargo, es evidente que resulta más complejo preparar un modelo con el lenguaje del LINGO que digitarlo en el editor del LINDO. Moraleja, usted debe practicar elaborando una cantidad apreciable de modelos usando el lenguaje del LINGO. En las figuras 9 y 10 quizá tuvo la sensación que resulta engorroso anotar esa gran cantidad de datos, sin embargo, es más sencillo si los pega directamente desde el Excel, previo paso por el Bloc de notas. LINGO ofrece comandos que importan todos los datos anotados en Excel y así evitará digitarlos o copiarlos en el editor del LINGO. También hay comandos que exportan los resultados al Excel. En los próximos laboratorios usted aprenderá estas ventajas del software.

Elaborado por: Ing. Christian Cornejo S.

Page 19: Guia Lingo

19

Anexo 1

Costos variables

unitarios

en US$

Precio de venta

en US$

Margen de contribución

en US$

Demanda mínima del

producto

en kilogramos

Demanda máxima del

producto

en kilogramos

Producto 1 5.00 16.00 11.00 10.00 150

Producto 2 3.00 18.75 15.75 15.00 80

Producto 3 4.50 15.00 10.50 0.00 90

Producto 4 4.25 15.00 10.75 0.00 100

Producto 5 3.50 18.00 14.50 10.00 180

Producto 6 2.75 20.00 17.25 0.00 150

Producto 7 6.50 20.00 13.50 10.00 150

Producto 8 8.00 20.00 12.00 0.00 145

Producto 9 9.00 25.00 16.00 20.00 100

Producto 10 8.00 25.00 17.00 25.00 110

Producto 11 5.00 25.00 20.00 15.00 150

Producto 12 4.00 26.00 22.00 10.00 160

Producto 13 8.50 27.00 18.50 0.00 165

Producto 14 7.50 24.50 17.00 0.00 155

Producto 15 6.50 22.00 15.50 0.00 150

Producto 16 4.00 23.00 19.00 10.00 250

Producto 17 3.50 25.00 21.50 0.00 150

Producto 18 2.50 24.00 21.50 0.00 200

Producto 19 3.50 19.00 15.50 0.00 250

Producto 20 5.50 20.00 14.50 0.00 180

Page 20: Guia Lingo

20

Anexo 2

Proceso 1 Proceso 2 Proceso 3 Proceso 4 Proceso 5 Proceso 6 Proceso 7

Producto 1 10 5 6 4 3 6 5

Producto 2 12 4 4 5 2 7 6

Producto 3 25 8 10 4 4 7 3

Producto 4 12 9 11 6 4 8 4

Producto 5 15 2 12 6 4 8 7

Producto 6 17 2 13 7 5 9 8

Producto 7 19 3 8 8 7 9 7

Producto 8 30 4 11 9 6 8 6

Producto 9 20 5 14 10 8 10 5

Producto 10 21 6 15 11 9 11 6

Producto 11 20 5 10 7 5 10 7

Producto 12 22 8 13 9 7 11 7

Producto 13 20 10 15 6 4 5 8

Producto 14 15 11 14 10 8 6 7

Producto 15 18 5 13 4 2 8 4

Producto 16 17 3 12 5 3 9 3

Producto 17 15 4 12 4 3 8 2

Producto 18 16 2 11 6 4 9 9

Producto 19 14 3 10 7 5 10 8

Producto 20 12 2 9 8 6 9 4

Disponibilidad de tiempo

en horas900 250 600 380 270 450 300

Tiempo unitario de cada producto i en el proceso j

en minutos

Page 21: Guia Lingo

21

Anexo 3

Proceso 1 Proceso 2 Proceso 3 Proceso 4 Proceso 5

Producto 1 400 200 200 100 100

Producto 2 300 200 100 200 200

Producto 3 400 300 100 100 100

Producto 4 300 300 200 100 100

Producto 5 400 300 100 100 100

Producto 6 500 150 0 150 200

Producto 7 400 300 0 100 200

Producto 8 500 300 200 0 0

Producto 9 300 300 300 100 0

Producto 10 400 200 200 100 100

Producto 11 350 150 250 150 100

Producto 12 450 50 200 150 150

Producto 13 500 200 200 50 50

Producto 14 250 250 300 0 200

Producto 15 350 150 300 100 100

Producto 16 450 50 100 200 200

Producto 17 400 200 250 100 50

Producto 18 300 250 250 100 100

Producto 19 350 250 200 100 100

Producto 20 300 200 200 150 150

Disponibilidad de

materia prima en

kilogramos

1200 650 600 350 400

Materia prima requerida por el producto i en el proceso j

en gramos

Page 22: Guia Lingo

22

Anexo 4

Modelo 1

MAX

11P1+15.75P2+10.5P3+10.75P4+14.5P5+17.25P6+13.5P7+12P8+16P9+17P10+20P11+22P12+18.5P13+17P14

+15.5P15+19P16+21.5P17+21.5P18+15.5P19+14.5P20

SUBJECT TO

!Restricciones de demanda:

P1>=10

P2>=15

P5>=10

P7>=10

P9>=20

P10>=25

P11>=15

P12>=10

P16>=10

P1<=150

P2<=80

P3<=90

P4<=100

P5<=180

P6<=150

P7<=150

P8<=145

P9<=100

P10<=110

P11<=150

P12<=160

P13<=165

P14<=155

P15<=150

P16<=250

P17<=150

P18<=200

P19<=250

P20<=180

!Restricciones de tiempo:

0.167P1+0.2P2+0.417P3+0.2P4+0.25P5+0.283P6+0.317P7+0.5P8+0.333P9+0.35P10+0.333P11+0.367P12+

0.333P13+0.25P14+0.3P15+0.283P16+0.25P17+0.267P18+0.233P19+0.2P20 <= 900

0.083P1+0.067P2+0.133P3+0.15P4+0.033P5+0.033P6+0.05P7+0.067P8+0.083P9+0.1P10+0.083P11+0.133

P12+0.167P13+0.183P14+0.083P15+0.05P16+0.067P17+0.033P18+0.05P19+0.033P20 <= 250

0.1P1+0.067P2+0.167P3+0.183P4+0.2P5+0.217P6+0.133P7+0.183P8+0.233P9+0.25P10+0.167P11+0.217P

12+0.25P13+0.233P14+0.217P15+0.2P16+0.2P17+0.183P18+0.167P19+0.15P20 <= 600

0.067P1+0.083P2+0.067P3+0.1P4+0.1P5+0.117P6+0.133P7+0.15P8+0.167P9+0.183P10+0.117P11+0.15P1

2+0.1P13+0.167P14+0.067P15+0.083P16+0.067P17+0.1P18+0.117P19+0.133P20 <= 380

0.05P1+0.033P2+0.067P3+0.067P4+0.067P5+0.083P6+0.117P7+0.1P8+0.133P9+0.15P10+0.083P11+0.117

P12+0.067P13+0.133P14+0.033P15+0.05P16+0.05P17+0.067P18+0.083P19+0.1P20 <= 270

0.1P1+0.117P2+0.117P3+0.133P4+0.133P5+0.15P6+0.15P7+0.133P8+0.167P9+0.183P10+0.167P11+0.183

P12+0.083P13+0.1P14+0.133P15+0.15P16+0.133P17+0.15P18+0.167P19+0.15P20 <= 450

0.083P1+0.1P2+0.05P3+0.067P4+0.117P5+0.133P6+0.117P7+0.1P8+0.083P9+0.1P10+0.117P11+0.117P12

+0.133P13+0.117P14+0.067P15+0.05P16+0.033P17+0.15P18+0.133P19+0.067P20 <= 300

!Restricciones de material prima:

0.4P1+0.3P2+0.4P3+0.3P4+0.4P5+0.5P6+0.4P7+0.5P8+0.3P9+0.4P10+0.35P11+0.45P12+0.5P13+0.25P14

+0.35P15+0.45P16+0.4P17+0.3P18+0.35P19+0.3P20 <= 1200

0.2P1+0.2P2+0.3P3+0.3P4+0.3P5+0.15P6+0.3P7+0.3P8+0.3P9+0.2P10+0.15P11+0.05P12+0.2P13+0.25P1

4+0.15P15+0.05P16+0.2P17+0.25P18+0.25P19+0.2P20 <= 650

0.2P1+0.1P2+0.1P3+0.2P4+0.1P5+0P6+0P7+0.2P8+0.3P9+0.2P10+0.25P11+0.2P12+0.2P13+0.3P14+0.3P1

5+0.1P16+0.25P17+0.25P18+0.2P19+0.2P20 <= 600

0.1P1+0.2P2+0.1P3+0.1P4+0.1P5+0.15P6+0.1P7+0P8+0.1P9+0.1P10+0.15P11+0.15P12+0.05P13+0P14+0.

1P15+0.2P16+0.1P17+0.1P18+0.1P19+0.15P20 <= 350

0.1P1+0.2P2+0.1P3+0.1P4+0.1P5+0.2P6+0.2P7+0P8+0P9+0.1P10+0.1P11+0.15P12+0.05P13+0.2P14+0.1P

15+0.2P16+0.05P17+0.1P18+0.1P19+0.15P20 <= 400

END