Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Página 1
CAPÍTULO I
CONOCIENDO LINGO
1.1 INTRODUCCIÓN
LINGO (Linear, INteractive and General Optimizer), es un lenguaje de modelación matemática que ha sido desarrollado por
LINDO SYSTEMS INC. Permite resolver modelos de Programación Lineal y No Lineal y puede obtenerse una versión DEMO en
la siguiente dirección: http://lindo.com/index.php/component/content/article/80-news/120-requesting-an-educational-research-
license-for-lingo
Página 2
En el menú desplegable se pueden apreciar las siguientes opciones:
SOLVE
Permite obtener la solución del modelo.
(Ctrl + S)
SOLUTION Permite generar un reporte texto o gráfico de la solución del modelo o de algunas variables
(Ctrl + O) (opción disponible solamente después de haber obtenido la solución del modelo).
RANGE Permite obtener los rangos de sensibilidad de los coeficientes de la función objetivo y de los
coeficientes del lado derecho (opción disponible solamente después de haber obtenido la
(Ctrl + R) solución del modelo).
OPTIONS
Permite ingresar a las diversas opciones de configuración de LINGO.
(Ctrl + I)
PICTURE
Permite generar una ventana con un gráfico matricial de los coeficientes del modelo.
(Ctrl + K)
MODEL
STATISTICS Brinda información acerca de las estadísticas del modelo (número de contrastes, número total
de variables, número de los diferentes tipos de contrastes, etc.)
(Ctrl + E)
LOOK Permite generar una ventana para observar el modelo con la característica de que cada línea de
(Ctrl + L) código se encuentra numerada.
Si desea que aparezcan los rengos de sensibilidad, seguir los siguientes pasos:
Importante: El reporte de rangos de sensibilidad no aplica cuando el modelo posee al menos una variable restringida a entera o
binaria.
Aparte de los habituales iconos de todo programa en entorno Windows; hay unos iconos propios del LINGO en la barra principal;
a continuación una breve descripción de esos iconos:
Página 3
Matrix Picture Ejecuta el comando PICTURE.
(Ctrl + K)
Send to back Permite cambiar de una ventana a otra entre todas las ventanas activas.
(Ctrl + B)
Tile windows Ordena en forma horizontal o vertical todas las ventanas activas.
(Ctrl + 4)
Select All
Selecciona toda la ventana activa.
(Ctrl + A)
Select Font
Selecciona un nuevo estilo de fuente para la ventana activa.
(Ctrl + J)
Cascade Arregla todas las ventanas activas en forma de cascada, con la ventana activa en
(Ctrl + 5) la tapa.
NOTA: Cuando se utilice los atajos, trabajar con teclas numéricas del cuerpo principal del teclado, más no con las del bloque
numérico.
1.3 OPERADORES
LINGO tiene dos tipos de operadores: los clásicos operadores aritméticos y los operadores lógicos; además de las relaciones de
igualdad y/o desigualdad.
Potencia ^ Igual =
Operadores Lógicos
Página 4
Es verdadero si el operando de la izquierda es mayor o igual que de la derecha, de
#GE#
otro modo es falso.
CAPÍTULO II
2.1 LENGUAJE
LINGO es un lenguaje de modelamiento matemático. LINGO permite expresar el problema en una forma sencilla y clara, muy
cercana a la notación matemática estándar. LINGO permite utilizar variables con índices a diferencia de otros lenguajes.
2.2 MODELOS
LINGO resuelve tanto modelos lineales como no lineales. En este manual sólo se mencionan modelos lineales (En la carpeta donde
se instaló LINGO, existe una carpeta denominada Samples, en la cual hay una gran variedad de modelos).
2.4 MODELOS
• Modelo Directo
Un modelo simple directo es un sistema de ecuaciones simultáneas como:
Model:
2*X + 3*Y = 80;
5*X + 2*Y = 90;
End
El término directo significa que se pueden calcular los valores de las variables directamente. Luego de ingresar las sentencias
anteriores, LINGO presenta el siguiente reporte:
Variable Value
X 10.00000
Y 20.00000
Página 5
Row Slack or Surplus
1 0.0000000
2 0.0000000
Model:
Max = 2*X + 5*Y;
X + Y <= 52;
2*X + 3*Y <= 45;
End
LINGO presenta el siguiente reporte:
a) Usted puede interpretar el costo reducido de una variable como la cantidad en que debería mejorar el coeficiente de una
variable en la función objetivo, antes de que la variable llegue a convertirse en una variable básica.
b) El costo reducido de una variable puede ser interpretado como la cantidad de multa que usted debería pagar para introducir
una unidad de esa variable en la solución.
Si la restricción es satisfecha exactamente como una igualdad, el valor de la holgura será cero y la restricción será catalogada
como Restricción Activa. Si una restricción es violentada, como ocurre en una solución no factible, el valor de su holgura será
negativo. Saber esto puede ayudarle a encontrar las restricciones violentadas en un modelo no factible (un modelo para el cual
no existan valores para las variables de decisión, de tal manera que satisfaga simultáneamente todas las restricciones).
Las restricciones no limitantes (restricciones con holgura mayor que cero) tendrán un valor positivo distinto de cero en esta
columna.
Página 6
Página 7
CAPÍTULO III
MANEJO DE CONJUNTOS (Sets)
3.1 CONJUNTOS
• Los conjuntos son el fundamento de LINGO.
• Un conjunto es un grupo de objetos relacionados. Un conjunto puede ser una lista de productos, tareas, o inventarios. Cada
elemento en el conjunto puede tener una o más características (atributos) asociadas con este.
Ejemplos:
Ejemplo 3.1:
SETS:
ESTUDIANTES/Juan,Arturo,Silvia,Consuelo/: EDAD, SEXO;
ENDSETS
Ejemplo 3.2:
SETS:
ESTUDIANTES /1..n/ : EDAD, SEXO;
ENDSETS
En esta sección se asignan valores a algunos conjuntos de atributos. Empieza con la palabra DATA: (los dos puntos inclusive) y
termina con ENDDATA.
Ejemplo 3.3:
DATA:
EDAD = 20, 19, 18, 21;
SEXO = 1, 1, 0, 0;
ENDDATA
NOTA: Los valores de los atributos en lugar de estar separados por comas (,), también pueden estar separados solamente por
espacios.
Página 8
• Ingreso de valores durante la ejecución del modelo: Algunas veces es necesario ingresar los valores de una variable en el
momento de la ejecución de un modelo con LINGO. Para este fin, se reemplaza en la lista de valores el dato correspondiente
por el signo ?.
Ejemplo 3.4:
DATA:
INGRESO = 200,?, 400, 600;
ENDDATA
Cuando se ejecute el modelo anterior, LINGO presenta la siguiente pantalla en que se deberá ingresar el valor que corresponda.
Nombre_conjunto(conjuntos_primitivos): [atributos];
Ejemplo 3.5:
• Conjunto derivado no denso con lista explícita. El formato de este tipo de conjuntos es:
Ejemplo 3.6:
• Conjunto derivado no denso con filtros. El formato de este tipo de conjunto es:
Ejemplo 3.7:
PAR(I,I) | &1#LT#&2: C, X ;
Tipos de Conjuntos
* Primitivos
Densos
* Derivados Lista Explícita
No Densos
Filtros
Model:
SETS:
ESTUDIANTES/JUAN,ARTURO,SILVIA,CONSUELO/: EDAD, SEXO, GASTO;
ENDSETS
DATA:
EDAD = 20, 19, 18, 21;
SEXO = 1, 1, 0, 0;
ENDDATA
Ejemplo 3.9:
Model:
SETS:
ESTUDIANTES /JUAN, ARTURO, SILVIA , CONSUELO/ : EDAD;
ENDSETS
DATA:
EDAD = 20, 19, 18, 21;
ENDDATA
@max(estudiantes:edad) = Maximo;
@min(estudiantes:edad) = Minimo;
@sum(estudiantes:edad) = Suma;
El reporte de LINGO es:
Variable Value
Página 10
MAXIMO 21.00000
Resultados de @max, @min y @sum MINIMO 18.00000
SUMA 78.00000
EDAD( JUAN) 20.00000
EDAD( ARTURO) 19.00000
EDAD( SILVIA) 18.00000
EDAD( CONSUELO) 21.00000
Página 11
CAPÍTULO IV
FUNCIONES DE LINGO
Por ejemplo, si se desea que la variable X se encuentre en el intervalo [10, 20], entonces se debe escribir:
@BND(10, X, 20);
Página 12
CAPÍTULO V
MODELAMIENTO DE PROBLEMAS
El número de horas de máquina requeridas por cada unidad de los productos se da a continuación:
Tipo de Máquina
Producto
Fresadora Torno Rectificadora
A 9 5 3
B 3 4 0
C 5 0 2
El departamento de ventas indica que la demanda mínima esperada para los productos A y B es 100 unidades semanalmente y para
el producto C es de 20 unidades por semana. La utilidad unitaria será de $30, $12 y $15, para los productos A, B y C,
respectivamente.
Model:
endsets
Conjunto derivado
data:
utilidad = 30 12 15;
demanda_minima = 100 100 20;
disponibilidad = 1450 1350 350;
requerimiento = 9 5 3
3 4 0
5 0 2;
Página 13
enddata En estos casos los
índices i, j son
Max = @sum(producto(i):utilidad(i)*X(i)); opcionales
@for(maquina(j):
@sum(producto(i): requerimiento(i,j)*X(i))<= disponibilidad(j));
@for(producto(j): X(j) >= demanda_minima(j));
NOTA: Como se puede apreciar, se tiene que tener mucho cuidado con los paréntesis; cada paréntesis de apertura debe tener su
respectivo paréntesis de clausura
Utilizando la opción GENERATE (Ctrl + G) del menú LINGO, se obtiene lo siguiente en una nueva ventana:
MAX 30 X( A) + 12 X( B) + 15 X( C)
SUBJECT TO
2] 9 X( A) + 3 X( B) + 5 X( C) <= 1450
3] 5 X( A) + 4 X( B) <= 1350
4] 3 X( A) + 2 X( C) <= 350
5] X( A) >= 100
6] X( B) >= 100
7] X( C) >= 20
END
En el reporte se aprecia el problema en su forma algebraica; escrita en el formato LINDO (software de programación lineal)
Definición de variables:
i = A, B, y C
j = 1, 2 y 3
model:
Min = 2*X11 + 3*X12 + 5*X13 + 2.5*X21+ 4*X22+ 4*X23+ 3*X31+ 3.5*X32+ 3*X33;
end
sets:
Variable de decisión
cia_maderera/A,B,C/: capacidad_surtir;
fabrica/1..3/: requerimiento;
envio(cia_maderera,fabrica): costo, X;
En lugar de escribir: 1,2,3 se puede hacer
endsets colocando dos puntos en forma consecutiva
entre el primer y el último número
data:
@for( fabrica(j):
@sum( cia_maderera(i): X(i,j)) = requerimiento(j)); En estos casos si
@for(cia_maderera(i): son necesarios los
@sum( fabrica(j): X(i,j)) <= capacidad_surtir(i)); índices.
@for(cia_maderera(i):
@for(fabrica(j): X(i,j) <= 250));
end
Página 15
ANEXO
A continuación una breve descripción de cada uno de los campos que aparecen en la ventana del SOLVER STATUS.
Variables
Indica el conteo del número total de variables enteras que hay en el modelo. En general, mientras más variables no lineales haya y
mientras más variables enteras haya en el modelo, más difícil será encontrar una solución óptima en una cantidad de tiempo
razonable. Los más rápidos de solucionar son los modelos lineales puros, sin variables enteras.
El conteo de variables no incluye aquellas variables que LINGO determina tienen un valor fijo. Por ejemplo, considere las siguientes
restricciones:
X = 1;
X + Y = 3;
De la primera restricción LINGO determina que X tiene un valor fijo de 1. Usando esta información en la restricción 2 LINGO
determina que Y tiene un valor fijo de 2. X e Y serán luego sustituidas en el modelo y no contribuirán en la contabilización del total
de variables.
Constraints
Muestra el total de restricciones y el número de éstas que son no lineales. Una restricción es considerada como no lineal si una o
más variables tienen relaciones no lineales en esa restricción. LINGO busca en su modelo restricciones que sean fijas. Una
restricción es considerada fija si todas las variables en ella son fijas. Las restricciones fijas son sustituidas y sacadas del modelo por
lo que no contribuyen en la contabilización del total de restricciones.
Nonzeros
Muestra el número total de coeficientes distintos de cero en el modelo y de éstos cuantos están asociados a variables no lineales. En
una restricción específica aparece sólo un grupo pequeño de variables del total de variables del modelo. El coeficiente implícito
para todas las variables que no aparecen es cero, mientras que los coeficientes de las variables que si aparecen son "nonzeros". Por
lo tanto se puede interpretar el número total de coeficientes distintos de cero como la contabilización del número de veces que las
variables aparecen en todas las restricciones. El número de coeficientes distintos de cero, no lineales, se puede interpretar como el
número de veces que las variables no lineales aparecen en todas las restricciones.
Elapsed Runtime
Muestra el total de tiempo usado hasta el momento para generar y resolver el modelo.
Página 16
Optimizer Status
Muestra el estado actual de optimización y la descripción de cada campo aparece en la siguiente tabla:
Campo Descripción
Indica el Estado actual de solución. Los estados posibles son: "Global Optimum" (Optimo
State global), "Local Optimum" (Optimo local), "Feasible" (Factible), "Infeasible" (No factible),
"Unbounded" (No acotado), "Interrupted" (Interrumpida) y "Undetermined" (Indeterminada)
IP Bound Límite teórico del valor de la de la Función Objetivo para modelos de programación entera
Cuando LINGO comienza a resolver su problema, el estado inicial de la solución actual será "indeterminada". Esto se debe a que
"Solver" no ha tenido aún la oportunidad de generar una solución para su problema. Una vez que "Solver" comienza las iteraciones
el estado avanzará a la condición "no factible". En el estado no factible LINGO ha generado soluciones tentativas, pero ninguna que
satisfaga todas las restricciones del modelo. Asumiendo que existe una solución factible "Solver" luego avanzará al estado
"Factible".
En el estado factible LINGO ha encontrado una solución que satisface todas las restricciones del modelo, pero aún no ha encontrado
la mejor solución para su modelo. Una vez que "Solver" ya no puede encontrar mejores soluciones para su modelo terminará ya sea
en el estado "Optimo Global" o bien en el "Optimo Local". Si su modelo no tiene restricciones no lineales, cualquier solución óptima
local será también óptima global. Por lo tanto, todo modelo lineal terminará en el estado "Optimo Global". Si, por otro lado, su
modelo tiene una o más restricciones no lineales, entonces cualquier solución óptima local puede no ser la mejor solución a su
modelo.
Si un modelo termina en el estado "No Acotado", significa que LINGO puede mejorar la función objetivo sin tener un límite. En la
vida real esto correspondería a una situación en la que usted podría generar utilidades infinitas. Debido a que esa situación es por
decir lo menos "extraña", sino imposible, lo que realmente ocurre es que usted o bien ha omitido o ha planteado erróneamente en
su modelo, alguna restricción del sistema.
Finalmente, el estado "Interrumpida" ocurrirá cuando usted prematuramente interrumpa el trabajo de LINGO antes de que haya
encontrado la solución final para su modelo.
Página 17