Qué Es LINGO
Qué Es LINGO
Qué Es LINGO
Nota: Dado que la mayor parte de las computadoras no tienen una tecla de menor o
igual (≤ ), LINGO ha adoptado como convención utilizar el símbolo <= para representar
≤. Como alternativa, se puede usar el símbolo < para expresar menor o igual. Lo
mismo se usa >= ó > para expresar mayor o igual (≥).
Se pueden introducir comentarios, que serán ignorados por LINGO, comenzando con un
signo de exclamación ! y terminando con un punto y coma. Los comentarios también
pueden ocupar varias líneas. Por ejemplo:
X= 1.5 * Y + Z / 2 * Y; ! Esto es
Un comentario;
X= 1.5 * ! Esto es un comentario en el medio de una restricción; Y + Z / 2 * Y;
Ventana de estado.
Campo Descripción
State Estado de la solución actual, puede ser
"Global optimum", "Local optimum",
"Feesible", "Unbounded", "Interrupted",
"Undetermined"
Iterations Numero de iteraciones
Infeasibility Cantidad de veces que es violada una
restricción
Objetive Valor actual de la función objetivo
Best IP Valor de la función objetivo de la mejor
solución entera encontrada (solo en
modelos de programación entera)
IP Bound Límite teórico de la función objetivo para
modelos de programación entera.
Cuando LINGO termine de resolver el modelo, creará una nueva ventana con el título
Solution Report, conteniendo los detalles de la solución:
Informe de la solución.
Costo Reducido:
Holgura o excedente
La columna Slack or Surplus en el informe de la solución de LINGO muestra que tan
cerca se está de satisfacer una restricción como una igualdad. Esta cantidad, en
restricciones de menor o igual, se denomina generalmente holgura. En restricciones de
mayor o igual se la llama excedente.
Si una restricción es exactamente satisfecha como una igualdad, la holgura o excedente
valdrá cero. Si una restricción es violada, este valor será negativo. Esto ayuda a
encontrar las restricciones violadas cuando en el modelo no existe un conjunto de
valores para las variables que satisfacen simultáneamente todas las restricciones.
En el ejemplo de CompuQuick, nótese que la fila 3 (TURBO <= 120) tiene un slack de
90, porque el valor óptimo de TURBO es 30, esta fila está a 90 unidades de ser
satisfecha como una igualdad.
Precio Dual.
Por ejemplo: supóngase que la compañía Wireless Widget (WW) tiene 6 depósitos que
proveen a 8 vendedores. Cada deposito puede proveer una cantidad de materiales que
no puede ser excedida, y cada vendedor tiene una demanda que debe ser satisfecha.
WW quiere determinar cuánto material enviar de cada depósito a cada vendedor para
minimizar el costo. Este es un problema clásico de optimización llamado es problema
del transporte.
El siguiente diagrama ilustra el problema:
Puesto que cada depósito puede enviar a cada vendedor, hay un total de 48 caminos o
arcos de envío posibles, se necesitará 1 variable para cada uno de estos arcos que
representen la cantidad enviada.
Están disponibles los siguientes datos:
Depósito Capacidad
1 60
2 55
3 51
4 43
5 41
6 52
Vendedor Demanda
1 35
2 37
3 22
4 32
5 41
6 32
7 43
8 38
Costo de envío por unidad ($):
V1 V2 V3 V4 V5 V6 V7 V8
Wh1 6 2 6 7 4 2 5 9
Wh2 4 9 5 3 8 5 8 2
Wh3 5 2 1 9 7 4 3 3
Wh4 7 6 7 3 9 2 7 1
Wh5 2 3 9 5 7 2 6 5
Wh6 5 5 2 2 8 1 4 3
La función objetivo:
El primer paso para plantear el modelo será construir la función objetivo. Como
mencionamos, WW quiere minimizar el total de los costos de envío. Haremos que la
variable VOLUME_I_J indique la cantidad de mercadería enviada desde el depósito i
hacia el vendedor j. Entonces, si tuviéramos que escribir la función objetivo usando
variables escalares tendríamos:
MIN = 6 *
VOLUME_1_1 + 2 * VOLUME_1_2 +
6 * VOLUME_1_3 + 7 * VOLUME_1_4 +
4 * VOLUME_1_5 +
.
.
.
8 * VOLUME_6_5 + VOLUME_6_6 + 4 * VOLUME_6_7 +
3 * VOLUME_6_8;
Estos son 9 de los 48 términos de la función objetivo. Como se ve, ingresar una
fórmula como esta es tedioso y propenso a errores. En un caso mas realista, los
vendedores podrían ser miles, y el modelado con variables escalares se vuelve muy
problemático.
Con la notación matemática, se podría expresar esta ecuación de esta forma:
Minimizar Σ ij COSTij * VOLUMEij
De una forma similar, el lenguaje de modelado de LINGO permite expresar la función
objetivo de una forma corta, fácil de tipear, y fácil de entender. La sentencia de LINGO
equivalente es:
MIN = @SUM(LINKS(I,J): COST(I,J) * VOUME(I,J));
En otras palabras, Minimizar la suma de los costos de envío (COST) por unidad por el
Cantidad (VOLUME) de mercadería enviada por todos los caminos (LINKS) entre los
depósitos y los vendedores.
Restricciones
DEMAND( J));
Esta sentencia reemplaza a las 8 restricciones de demanda. Significa: para todos los
vendedores (VENDORS), la suma del volumen (VOLUME) enviado desde cada uno de
los depósitos (WAREHAUSES) a ese vendedor debe ser igual a la demanda
correspondiente (DEMANDA) del vendedor. Nótese la gran similitud con la notación
matemática.
De manera análoga pueden expresarse las restricciones de capacidad:
CAPACITY( I));
Equivale a: para cada miembro del conjunto WAREHAUSES, la suma del Volumen
(VOLUME) enviado a cada vendedor (VENDORS) desde ese depósito, debe ser menor
o igual a la capacidad del depósito.
El modelo completo
MODEL:
END
Sin embargo, todavía faltan definir los datos del modelo que LINGO llama "la sección
de conjuntos" y "la sección de datos"
SETS:
ENDSETS
La segunda línea dice que el conjunto WAREHOUSES tiene los elementos WH1,
WH2, WH3, WH4, WH5 y WH6, cada uno con un atributo llamado CAPACITY
(capacidad). Los vendedores se definen en la tercera línea, cada uno con un atributo
llamado DEMANDA.
El último conjunto, titulado LINKS (enlaces) representa los 48 caminos entre los
depósitos y los vendedores. Cada camino tiene los atributos costo (COST) y volumen
(VOLUME) asociados. La sintaxis para definir este conjunto, difiere de las dos
anteriores. Especificando LINKS( WAREHOUSES, VENDORS) estamos diciendo a
LINGO que el conjunto LINKS deriva de WHAREHOUSES y VENDORS. En este
caso, LINGO genera cada par ordenado de (depósitos, vendedores). Cada uno de estos
48 pares ordenados es un elemento del conjunto LINKS.
Ingreso de datos
LINGO permite al usuario aislar los datos en una sección separada del modelo. En el
ejemplo de Wireless Widget, tenemos la siguiente sección de datos:
DATA:
CAPACITY = 60 55 51 43 41 52;
DEMAND = 35 37 22 32 41 32 43 38;
COST = 6 2 6 7 4 2 5 9
49538582
52197433
76739271
23957265
5 5 2 2 8 1 4 3;
ENDDATA
La sección de datos comienza con la sentencia DATA: y finaliza con ENDDATA. Los
atributos CAPACITY del conjunto WAREHOUSES y DEMANDA de VENDORS se
inicializan de forma directa. El atributo COSTO del conjunto bidimensional LINKS es
un poco mas oscuro. Cuando LINGO inicializa una matriz multidimensional,
incrementa el índice exterior mas rápidamente, en este caso COST(WH1, V1) se
inicializa primero, seguido de COST(WH1, V2) hasta COSTO(WH1, V8). Después se
inicializará COST(WH2, V1), y así sucesivamente.
LINGO también tiene la capacidad de importar los datos desde fuentes externas,
específicamente de archivos de texto y planillas de cálculo, establecer vínculos OLE a
Excel y/o crear vínculos ODBC a las bases de datos mas populares. Poniendo juntas las
secciones de datos, de conjuntos, la función objetivo y las restricciones, el modelo
queda como sigue:
MODEL:
CAPACITY( I));
!Here is the data;
DATA:
CAPACITY = 60 55 51 43 41 52;
DEMAND = 35 37 22 32 41 32 43 38;
COST = 6 2 6 7 4 2 5 9
49538582
52197433
76739271
23957265
55228143
ENDDATA
END
Ahora, vamos a resolver el modelo para determinar el volumen óptimo de envíos desde
cada depósito hacia cada vendedor. Se debe seleccionar la opción SOLVE del menú
LINGO, o presionar el botón SOLVE de la barra de menú. LINGO responderá
resolviendo el modelo y retornando el informe de la solución que contiene los valores
de las variables, restricciones y datos en el modelo.
Dimensiones máximas
Ejemplo:
[OBJECTIVE] MAX = 20 * A + 30 * C;
[ALIM] A <= 60;
[CLIM] C <= 50;
[JOINT] A + 2 * C <= 120;
La segunda sección del reporte de rango se titula Rangos del Lado Derecho. La primera
columna, Row (fila), muestra los nombres de todas las filas a optimizar, o restricciones
del modelo. La segunda columna, Current RHs (RHS Actual) dice el término constante,
o segundo miembro de la fila. Las dos columnas siguientes, Allowable Increase y
Alolowable Decrease, nos dice cuanto podemos incrementar o decrementar el
coeficiente correspondiente a la fila, sin afectar a los valores de los precios duales o
costos reducidos. Recordemos que los precios duales son, efectivamente, precios
sombra que nos dicen que precio estamos dispuestos a pagar (o a vender) de un recurso.
El precio dual sin embargo, no nos dice cuanto estamos dispuestos a comprar (o a
vender). Esta información se obtiene de los incrementos y decrementos permitidos de
los coeficientes de los segundos miembros de cada fila.
Nota: Cada fila en el modelo del ejemplo está precedida por un nombre enserrado entre
corchetes. Esta es una práctica importante si se quiere generar reportes de rango. Si no
se le ponen nombres a las filas, LINGO les asigna un número de fila que utiliza
internamente como índice. Este índice interno no corresponderá siempre con el orden
de la fila en el modelo original. Entonces es conveniente nombrar las filas para hacer
mas enterndible el reporte de rango.