Você está na página 1de 15

¿Qué es LINGO?

LINGO es una herramienta simple que permite utilizar el poder de la optimización


lineal y no lineal para formular grandes problemas concisamente, resolverlos, y analizar
la solución. La optimización ayuda a encontrar la respuesta que satisface el mejor
resultado. Frecuentemente, estos problemas involucraban el uso mas eficiente de los
recursos (dinero, tiempo, maquinaria, personal, etc.). Los problemas de optimización se
pueden clasificar en lineales o no lineales, dependiendo de cómo las relaciones entre las
variables.

La ventana inicial de LINGO.

Desarrollo de un modelo en LINGO.

Supongamos que CompuQuick Corp. Produce 2 modelos de computadoras: Standard y


Turbo. CompuQuick puede vender cada unidad Standard que produce a un precio de
$100, y cada unidad Turbo por $150. La fábrica puede producir a lo sumo 100
computadoras Standard por día y 120 computadoras Turbo. CompuQuick tiene una
capacidad de trabajo de 160 horas por día. Las computadoras Standard requieren 1 hora
de labor, mientras que las Turbo requieren 2 horas. El problema de CompuQuick es
determinar la mezcla de computadoras Standard y Turbo a producir cada día para
maximizar el total de las ventas sin exceder el límite de producción y de trabajo.
En general un modelo de optimización consiste en los siguientes 3 ítems:
1. Función objetivo
2. Variables
3. Restricciones

La sintaxis para escribir la función objetivo en LINGO es:


MAX = 100 * STANDARD + 150 * TURBO;
Nota: Cada línea en LINGO finaliza con un punto y coma. Los punto y coma son
requeridos. El modelo no se resolverá si falta algún punto y coma.

Las restricciones se introducen de la siguiente manera:


STANDARD <= 100;
TURBO <=120;
STANDARD + 2 * TURBO <= 160;

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 (≥).

Una expresión puede abarcar mas de una línea, por ejemplo:


MAX = 100 * STANDARD
+ 150 * TURBO;

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;

LINGO no distingue entre mayúsculas y minúsculas, por lo que es lo mismo


STANDARD que standard y que StAnDaRd.
Los nombres de las variables deben comenzar con un carácter alfabético (A-Z), los
siguientes caracteres pueden ser alfabéticos, numéricos o subrayado (_). Los nombres
pueden ser de hasta 32 caracteres de longitud.

Resolución del modelo.

Para ordenar a LINGO a que resuelva el problema, se debe seleccionar el comando


Solve del menú LINGO, o presionar el botón Solve de la barra de herramientas.
Si no hay errores en la formulación del problema durante la etapa de compilación,
LINGO invocará al módulo de resolución adecuado para buscar la solución óptima.

Ventana de estado.

En esta ventana se puede monitorear el proceso de resolución y las dimensiones del


modelo.
El recuadro "Variables" muestra el numero total de variables del modelo, las variables
que son no lineales y las enteras. Una variable es considerada no lineal si es parte de
una restricción no lineal en el modelo. Mientras mas variables no lineales y enteras
contenga el modelo, mas difícil será resolverlo de forma óptima en un tiempo razonable.
Los modelos lineales puros sin variables enteras tienden a resolverse mas rápidamente.
La cuenta de variables no incluye las que LINGO determina como de valor fijo, por
ejemplo: dadas las restricciones
X = 1;
X + Y = 3;
LINGO determina por la primera restricción que X está fija en 1, y, usando esta
información, deduce que Y está fija en 2. X e Y serán entonces excluidas del modelo.
En el recuadro "Constraints" se muestra la cantidad total de restricciones y el número de
éstos que son no lineales. Una restricción es considerada no lineal si una o mas
variables aparecen de forma no lineal en la restricción.
El recuadro "Nonzeros" muestra el total de coeficientes distintos de cero que aparecen
en el modelo y el número de estos que aparecen en variables no lineales.
El recuadro "Memory Used" muestra la cantidad de memoria que está utilizando
LINGO para resolver el modelo.
El recuadro "Elapsed Runtime" muestra el tiempo total utilizado para generar y resolver
el modelo.
El recuadro "Optinizer Status" muestra el estado actual del optimizador:

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:

En el informe de la solución se encuentra un valor de costo reducido para cada variable.


Hay dos interpretaciones válidas y equivalentes para el costo reducido.
Primero se puede interpretar como el monto por el cual el coeficiente objetivo de la
variable se debería incrementar antes de hacerse provechoso darle a la variable en
cuestión un valor positivo en la solución óptima. Por ejemplo, si la variable tuviera un
costo reducido de 10, el coeficiente objetivo de esta variable deberá incrementarse en 10
unidades en un problema de maximización o decrementarse en 10 unidades en un
problema de minimización para convertirse en una alternativa atractiva. Una variable
en la solución óptima automáticamente tiene un costo reducido de 0
Segundo, el costo reducido de una variable se puede interpretar como el monto de
penalización que habrá que pagar por introducir una unidad de esa variable en la
solución. Como antes, si la variable tuviera un costo reducido de 10, habrá que pagar
una penalización de 10 unidades para introducir la variable en la solución. En otras
palabras, el valor objetivo caerá en 10 unidades en un modelo de maximización, o se
incrementará 10 unidades en un problema de minimización.
Los costos reducidos son válidos sólo dentro de un rango de valores.

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.

El informe de la solución de LINGO también da un valor de precio dual para cada


restricción. El precio dual se puede interpretar como el monto en que la función
objetivo mejorará si el segundo miembro de la restricción se incrementase una unidad.
Por ejemplo, en la solución de CompuQuick, el precio dual en la fila 4 significa que
agregar una unidad mas al trabajo causará que la función objetivo mejore en 75, a un
valor de 14575.
Nótese que mejorar es un término relativo. En un problema de maximización, mejorar
significa que la función objetivo se incrementará, y en un problema de minimización el
valor objetivo se reducirá si el segundo miembro de una restricción con precio dual
positivo es incrementado.
Los precios duales son a veces llamados precios sombra, porque ellos dicen cuanto
debería pagar por una unidad de recurso. En el ejemplo anterior, CompuQuick podría
pagar hasta $75 por cada unidad de trabajo.
Al igual que los costos reducidos, los precios duales son válidos sólo dentro de un rango
de valores.

Para qué utilizar un lenguaje de modelación?

Una de las características más potentes de LINGO, es el lenguaje de modelación


matemática. Este lenguaje permite expresar el problema de una manera natural, similar
a la notación matemática standard. Además de poder ingresar cada término de cada
restricción explícitamente, LINGO permite expresar una serie de restricciones similares
en una sola sentencia compacta.
Otra característica conveniente del lenguaje de modelación de LINGO, es la sección de
datos. La sección de datos permite aislar los datos de la formulación del modelo. De
hecho, LINGO puede incluso, leer los datos de una planilla de cálculo, de una base de
datos o un archivo de texto. Con los datos independientes del modelo, es mucho mas
fácil hacer cambios, y hay menos oportunidad de cometer errores.
El modelo de CompuQuick del ejemplo anterior, usa variables escalares, cada variable
está explícitamente listada por nombre (STANDARD y TURBO) y cada restricción
aparece explícitamente. En la mayor parte de los grandes modelos, será necesario
trabajar con un grupo de varias restricciones y variables muy similares. Para esto,
LINGO tiene la habilidad de manejar conjuntos de objetos, que permiten efectuar estas
operaciones mas eficientemente.
El problema del transporte.

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

El siguiente paso es formular las restricciones. Hay dos conjuntos de restricciones en


este modelo. El primero garantiza que cada vendedor recibe el número de unidades
requerida (restricciones de demanda). El segundo conjunto de restricciones asegura que
cada depósito no envía mas de lo que tiene (restricciones de capacidad).
Comenzando con las restricciones de demanda del Vendedor 1, necesitamos sumar los
envíos de todos los depósitos hacia el Vendedor 1 e igualarlo a la demanda, que es de
35 unidades. Si usáramos la notación basada en escalares, necesitaríamos construir lo
siguiente:

VOLUME_1_1 + VOLUME_2_1 + VOLUME_3_1 +

VOLUME_4_1 + VOLUME_5_1 + VOLUME_6_1 = 35;

Además de otras 7 restricciones de demanda, para cubrir a los 8 vendedores. Pero,


utilizando el lenguaje de modelado basado en conjuntos de LINGO, podemos
simplificar esta tarea. La sentencia correspondiente queda así:

@FOR( VENDORS( J):


@SUM( WAREHOUSES( I): VOLUME( I, J)) =

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:

@FOR( WAREHOUSES( I):


@SUM( VENDORS( J): VOLUME( I, J))<=

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:

MIN = @SUM( LINKS( I, J):


COST( I, J) * VOLUME( I, J));
@FOR( VENDORS( J):
@SUM( WAREHOUSES( I): VOLUME( I, J)) =
DEMAND( J));
@FOR( WAREHOUSES( I):
@SUM( VENDORS( J): VOLUME( I, J)) <=
CAPACITY( I));

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"

Definición de los Conjuntos

LINGO permite definir conjuntos de objetos relacionados en la "sección de conjuntos"


(sets section). Esta sección comienza con la palabra clave SETS: y termina con
ENDSETS. Una vez definidos los miembros del conjunto, LINGO tiene un grupo de
funciones (p.e. @FOR) que aplican operaciones a todos los miembros de un conjunto
utilizando sólo una sentencia.
En el caso del modelo de Wireless Widget, hemos construido 3 conjuntos:
• Depósitos
• Vendedores
• Arcos de envío desde cada depósito a cada vendedor

SETS:

WAREHOUSES / WH1 WH2 WH3 WH4 WH5 WH6/: CAPACITY;


VENDORS / V1 V2 V3 V4 V5 V6 V7 V8/ : DEMAND;
LINKS( WAREHOUSES, VENDORS): COST, VOLUME;

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:

!A 6 Warehouse 8 Vendor Transportation Problem;


SETS:
WAREHOUSES/ WH1 WH2 WH3 WH4 WH5 WH6/:
CAPACITY;
VENDORS/ V1 V2 V3 V4 V5 V6 V7 V8/: DEMAND;
LINKS (Warehouses, Vendors): COST, VOLUME;
ENDSETS
!The objective;
MIN = @SUM( LINKS( I, J):
COST( I, J) * VOLUME( I, J));
!The demand constraints;
@FOR( VENDORS( J):
@SUM( WAREHOUSES( I): VOLUME( I, J)) =
DEMAND( J));
!The capacity constraints;
@FOR( WAREHOUSES( I):
@SUM( VENDORS( J): VOLUME( I, J)) <=

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

Resolución del modelo del transporte.

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

El número máximo de restricciones y variables que LINGO puede manejar depende de


la versión. Los límites de las distintas versiones son:

Versión Restricciones Variables


Demo/Web 50 100
Solver Suite 100 200
Super 500 1,000
Hyper 2,000 4,000
Industrial 8,000 16,000
Extended 32,000 100,000

Uso de funciones de dominio de variables

A menos que se especifique lo contrario, las variables en un modelo de LINGO son


continuas y no negativas. Mas específicamente las variables pueden asumir cualquier
valor real desde cero hasta mas infinito. En muchos casos este dominio para una
variable puede ser inapropiado. Por ejemplo puede necesitarse que una variable asuma
valores negativos, o solamente valores enteros. LINGO está provisto de cuatro
funciones de dominio de variables que permiten sobrepasar el dominio por omisión de
una variable:

@GIN Limita la variable sólo a valores enteros


@BIN Hace una variable binaria (0 ó 1)
@FREE Permite que la variable tome cualquier
valor real (positivo o negativo)
@BND Limita la variable para que se ajuste a un
rango finito

Ejemplos de uso de variables enteras:

@GIN(X); Transforma la variable escalar X en entera


@GIN(PRODUCE(5)); Transforma la variable PRODUCE(5) en
entera
@FOR(DAYS(I): @GIN(START(I))); Transforma todas las variables del atributo
START en enteras

Ejemplos de uso de variables binarias:

@BIN(X); Transforma la variable escalar X en binaria


@BIN(INCLUDE(4)); Transforma la variable INCLUDE(4) en
binaria
@FOR(ITEMS: @BIN(INCLUDE)); Transforma todas las variables del atributo
INCLUDE en binarias

Ejemplos de uso de variables libres:

@FREE(X); Transforma la variable escalar X en libre


@FREEE(QUANTITY(4)); Transforma la variable QUANTITY(4) en libre
@FOR(ITEMS: @FREE(QUANTITY)) Transforma todas las variables del atributo
QUANTITY en libres

Ejemplos de uso de variables con límites:

@BND(-1, X, 1); Restringe la variable X al intervalo [-1, 1]


@BND(100, QUANTITY(4), 200) ; Limita QUANTITY(4) entre 100 y 200
@FOR(ITEMS: @BND( 10, Q, 20)); Fija los límites de todas las variables del
atributo Q en 10 y 20
@FOR(ITEMS: @BND(QL, Q, QU)); Fija los límites de todas las variables del
atributo Q en QL y QU
(A QL y QU deben habérsele asignado valores en
la sección de datos)
Rango

El comando rango se utiliza para generar un reporte de rango para el modelo de la


ventana activa. El reporte de rango muestra sobre que rangos se puede: 1) cambiar un
coeficiente en la función objetivo sin causar un cambio en alguno de los valores
óptimos en las variables de decisión, ó 2) cambiar una constante de una fila (coeficiente
del segundo miembro) sin provocar un cambio en los valores óptimos de los precios
duales o costos reducidos.

Ejemplo:

[OBJECTIVE] MAX = 20 * A + 30 * C;
[ALIM] A <= 60;
[CLIM] C <= 50;
[JOINT] A + 2 * C <= 120;

El reporte de rango del modelo anterior es el siguiente:

Ranges in which the basis is unchanged:

Objective Coefficient Ranges


Current Allowable Allowable
Variable Coefficient Increase Decrease
A 20.00000 INFINITY 5.000000
C 30.00000 10.00000 30.00000

Righthand Side Ranges


Row Current Allowable Allowable
RHS Increase Decrease
ALIM 60.00000 60.00000 40.00000
CLIM 50.00000 INFINITY 20.00000
JOINT 120.0000 40.00000 60.00000

La primera sección del reporte se titula Rangos de Coeficientes Objetivos. En la


primera columna, titulada Variable, se listan por su nombre todas las variables a
optimizar. La siguiente columna, titulada Current Coefficient (Coeficiente actual)
muestra el coeficiente actual de la variable en la función objetivo. La siguiente columna
Allowable Increase (Incremento permitido) nos dice el monto en que podríamos
incrementar el coeficiente en la función objetivo sin cambiar los valores óptimos de las
variables. La última columna, Allowable Decrease (Decremento permitido) muestra el
monto en que podríamos decrementar el coeficiente en la función objetivo sin que
cambien los valores óptimos en las variables. La información de los incrementos y
decrementos permitidos de los coeficientes de la función objetivo es útil para responder
a las preguntas como: "Cuanto mas (menos) provechoso puede ser esta actividad antes
de que estemos dispuestos a hacer mas (menos) de esto?"
Nota: Los rangos son válidos si se quiere cambiar un solo coeficiente de la función
objetivo o del segundo miembro de alguna restricción.

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.

Você também pode gostar