Tutorial de MPL

49
Visión del Tutor En este Tutor presentaremos a usted el Sistema de Modelado de MPL. Este Tutor contiene múltiples sesiones, con una serie de modelos, que gradualmente se incrementará en dificultad para explicar cómo formular modelos de programación lineal. Está diseñado específicamente para enseñar la manera que el Modelado de optimización está siendo aplicado en el mundo. Al final, usted debe tener un conocimiento de cómo formular modelos y cómo trabaja MPL. El tutor contiene las siguientes sesiones: Sesión 1: Ejecución de un Modelo Prueba con MPL La Sesión 1 presenta el Sistema de Modelado de MPL, y cómo usted puede usar el Ambiente Integrado de Desarrollo de Modelos para resolver problemas de optimización. Mostramos cómo iniciar una aplicación con MPL, y llamar un modelo de prueba, resolver el modelo usando los optimizadores disponibles y después ver la solución. La información de cómo accesar al sistema de ayuda en línea también será presentado. El propósito de esta sesión es brindar a ustedes una visión de cómo resolver modelos con MPL y se familiaricen con el programa. Sí usted ya está familiarizado con MPL y las interfaces gráficas de usuario, como el Windows, entonces puede pasar a la próxima sesión sin perder continuidad. Sesión 2: Formulación de un Modelo Simple de Mezcla de Productos En la Sesión 2, se presentará el proceso de formular modelos de programación lineal, identificando las variables de decisión, la función objetivo y las restricciones del modelo. La sesión contiene una descripción de un modelo simple Producto-Mixto, con 2 variables y 3 restricciones. El propósito de esta sesión es que usted use MPL, a través de un pequeño ejemplo, cree un modelo simple para entender los pasos básicos para formular un modelo. Luego resolver el modelo y analizar la solución que se generó. Sesión 3: Introducción a Vectores e Índices en Modelos En la Sesión 3, aprenderá la base de cómo usar índices y vectores para formular modelos. Verá como los índices son usados para definir el dominio del modelo, haciendo más fácil que el tamaño del problema se ajuste rápidamente. Usted aprenderá cómo usar vectores para definir los elementos del modelo, tales como datos, variables y restricciones de una manera más eficiente usando índices. Finalmente, verá cómo usar sumatorias y macros sobre los vectores en la formulación de su modelo. Sesión 4: Un Modelo de Planificación de la Producción con Períodos de Tiempo Múltiples En la Sesión 4, ampliará el modelo, desde la sesión previa, para incluir períodos de tiempo múltiples. Un nuevo índice es introducido en el modelo para definir esos períodos de tiempo, y entonces usted actualizará varios vectores en el modelo que son afectados para explicar el nuevo índice. Se familiarizará con una nueva clase de restricciones llamadas restricciones de equilibrio, esta es usada para asociar al mismo tiempo las variables de producción, ventas e inventarios. Sesión 5: Un Modelo de Planificación de la Producción con Múltiples Plantas En la Sesión 5, encontrará un modelo que tiene múltiples plantas disponibles para producir los productos. Usted tomará el modelo desde la sesión previa, y le hará un agregado incluyendo otro índice planta, el cual representará a todas las plantas. Después irá a través del modelo paso a paso, y actualizará todos los vectores variables y restricciones para explicar el nuevo índice. Finalmente, aprenderá cómo usar los archivos de datos externos para almacenar datos muy grandes que deben ser incluidos en el archivo actual del modelo. Sesión 6: Ampliando el Modelo para permitir Embarques entre Plantas En la Sesión 6, usted tomará el modelo de la sesión previa de múltiples plantas y le hará un agregado para permitir los embarques entre las plantas. Esto significará que cada planta puede vender los productos y mantener inventario independientemente, en lugar de hacerlo desde un solo almacén para toda la compañía. Para satisfacer la demanda total en la forma más eficiente es necesario que sea capaz de hacer embarques entre plantas. Finalmente, aprenderá cómo usar condiciones Where (donde) para sacar los elementos vectores que no son válidos, tal como retorno de envíos a la misma localización. Sesión 7: Usando Data Dispersos con Modelos MPL En la Sesión 7, usted tomará el modelo de la sesión previa y agregará máquinas múltiples para cada planta. Esto introducirá dispersión en el modelo, puesto que no todas las máquinas están disponibles en todas las plantas. Usará una nueva característica vector de datos dispersos, para representar qué máquinas están disponibles y en cuál planta. Aprenderá diferentes maneras para definir vectores de datos dispersos con MPL, incluyendo el uso del operador IN y el vector de archivos dispersos.

Transcript of Tutorial de MPL

Page 1: Tutorial de MPL

Visión del Tutor En este Tutor presentaremos a usted el Sistema de Modelado de MPL. Este Tutor contiene múltiples sesiones, con una serie de modelos, que gradualmente se incrementará en dificultad para explicar cómo formular modelos de programación lineal. Está diseñado específicamente para enseñar la manera que el Modelado de optimización está siendo aplicado en el mundo. Al final, usted debe tener un conocimiento de cómo formular modelos y cómo trabaja MPL. El tutor contiene las siguientes sesiones: Sesión 1: Ejecución de un Modelo Prueba con MPL La Sesión 1 presenta el Sistema de Modelado de MPL, y cómo usted puede usar el Ambiente Integrado de Desarrollo de Modelos para resolver problemas de optimización. Mostramos cómo iniciar una aplicación con MPL, y llamar un modelo de prueba, resolver el modelo usando los optimizadores disponibles y después ver la solución. La información de cómo accesar al sistema de ayuda en línea también será presentado. El propósito de esta sesión es brindar a ustedes una visión de cómo resolver modelos con MPL y se familiaricen con el programa. Sí usted ya está familiarizado con MPL y las interfaces gráficas de usuario, como el Windows, entonces puede pasar a la próxima sesión sin perder continuidad.

Sesión 2: Formulación de un Modelo Simple de Mezcla de Productos En la Sesión 2, se presentará el proceso de formular modelos de programación lineal, identificando las variables de decisión, la función objetivo y las restricciones del modelo. La sesión contiene una descripción de un modelo simple Producto-Mixto, con 2 variables y 3 restricciones. El propósito de esta sesión es que usted use MPL, a través de un pequeño ejemplo, cree un modelo simple para entender los pasos básicos para formular un modelo. Luego resolver el modelo y analizar la solución que se generó.

Sesión 3: Introducción a Vectores e Índices en Modelos En la Sesión 3, aprenderá la base de cómo usar índices y vectores para formular modelos. Verá como los índices son usados para definir el dominio del modelo, haciendo más fácil que el tamaño del problema se ajuste rápidamente. Usted aprenderá cómo usar vectores para definir los elementos del modelo, tales como datos, variables y restricciones de una manera más eficiente usando índices. Finalmente, verá cómo usar sumatorias y macros sobre los vectores en la formulación de su modelo.

Sesión 4: Un Modelo de Planificación de la Producción con Períodos de Tiempo Múltiples En la Sesión 4, ampliará el modelo, desde la sesión previa, para incluir períodos de tiempo múltiples. Un nuevo índice es introducido en el modelo para definir esos períodos de tiempo, y entonces usted actualizará varios vectores en el modelo que son afectados para explicar el nuevo índice. Se familiarizará con una nueva clase de restricciones llamadas restricciones de equilibrio, esta es usada para asociar al mismo tiempo las variables de producción, ventas e inventarios.

Sesión 5: Un Modelo de Planificación de la Producción con Múltiples Plantas En la Sesión 5, encontrará un modelo que tiene múltiples plantas disponibles para producir los productos. Usted tomará el modelo desde la sesión previa, y le hará un agregado incluyendo otro índice planta, el cual representará a todas las plantas. Después irá a través del modelo paso a paso, y actualizará todos los vectores variables y restricciones para explicar el nuevo índice. Finalmente, aprenderá cómo usar los archivos de datos externos para almacenar datos muy grandes que deben ser incluidos en el archivo actual del modelo.

Sesión 6: Ampliando el Modelo para permitir Embarques entre Plantas En la Sesión 6, usted tomará el modelo de la sesión previa de múltiples plantas y le hará un agregado para permitir los embarques entre las plantas. Esto significará que cada planta puede vender los productos y mantener inventario independientemente, en lugar de hacerlo desde un solo almacén para toda la compañía. Para satisfacer la demanda total en la forma más eficiente es necesario que sea capaz de hacer embarques entre plantas. Finalmente, aprenderá cómo usar condiciones Where (donde) para sacar los elementos vectores que no son válidos, tal como retorno de envíos a la misma localización.

Sesión 7: Usando Data Dispersos con Modelos MPL En la Sesión 7, usted tomará el modelo de la sesión previa y agregará máquinas múltiples para cada planta. Esto introducirá dispersión en el modelo, puesto que no todas las máquinas están disponibles en todas las plantas. Usará una nueva característica vector de datos dispersos, para representar qué máquinas están disponibles y en cuál planta. Aprenderá diferentes maneras para definir vectores de datos dispersos con MPL, incluyendo el uso del operador IN y el vector de archivos dispersos.

Page 2: Tutorial de MPL

Sesión 1: Ejecutando MPL en un Modelo Prueba En esta sesión, a través de una serie de pasos usted aprenderá cómo ejecutar MPL en un Modelo de prueba. Al final de la sesión, será capaz de iniciar MPL, cargar y resolver el modelo, y ver los resultados. En este punto, usted aprenderá cómo cambiar la opción instalar a través del cuadro de diálogos de MPL. Una breve descripción del Sistema de Ayuda MPL también es cubierta al final de esta sesión. Ahora usted puede ir y usar paso a paso la formulación en detalle de un modelo prueba.

Su Primera Sesión con MPL

Usando el sistema de Ayuda de MPL

Su Primera Sesión con MPL Usted necesita cuatro pasos simples para familiarizarse cómo resolver modelos en MPL.

Iniciar MPL

Cargar el modelo

Resolver el modelo

Ver la solución Paso 1: Iniciar la Aplicación MPL Iniciar MPL es sencillo en Windows. Cuando instaló MPL, el programa de instalación creó una entrada en el menú Inicio/Programas/ MPL for Windows. Sí MPL no ha sido instalado, por favor refiérase al Capítulo 2 para ver cómo instalar el software. Para iniciar MPL, haga clic en el botón inicio (Start) de la barra de tareas que aparece en la parte inferior de la ventana y seleccione Programas/MPL for Windows.

MPL for Windows en el Menú Inicio Paso 2: Cargar el Modelo a MPL Después que inició MPL, el próximo paso es cargar el archivo del modelo en el editor del modelo. La aplicación MPL viene con varios modelos de prueba que son instalados en el directorio Mplwin4. Los modelos MPL son almacenados como archivos texto estándar y típicamente tienen la extensión '.mpl'. El modelo que estamos usando en esta sesión es llamado Model1.mpl y es almacenado en una carpeta separada llamada Tutorial.

Page 3: Tutorial de MPL

1. Elija Open (Abrir) del menú File (Archivo) para visualizar el cuadro de diálogo Open (Abrir). 2. Haga doble clic en la Carpeta Tutorial y baje hasta el archivo llamado 'Model1.mpl' que está

almacenado como se muestra abajo.

Cuadro de Diálogo Abrir (Open) 3. El cuadro de diálogo Abrir (Open) muestra la lista de todos los archivos de modelos prueba

de MPL en la carpeta Tutorial. Haga clic sobre el archivo 'Model1.mpl' para seleccionar el archivo y luego presione Abrir (Open) para abrir el archivo. Alternativamente, usted puede abrir el archivo haciendo clic directamente en el nombre de archivo de la lista de archivos.

Este abrirá una ventana editor del nuevo modelo conteniendo la formulación para ese modelo.

Ventana: Editor del Modelo con el Model1.mpl

Paso 3: Resolver el Modelo En este Tutor estará usando el solver CPLEX, pero sí usted tiene otro solver ya instalado que es soportado por MPL, puede usarlo.

Cuando usted ejecuta MPL por primera vez después de la instalación, MPL automáticamente tratará de localizar algún solver que usted tenga disponible. Usted puede ver qué solver ha sido instalado por MPL yendo a Run que está en la barra Menú. Cada solver encontrado será listado en el menú con la palabra Solve.

Page 4: Tutorial de MPL

Sí no tiene algún solver disponible, verá el item No Solvers en el menú Run. En este caso refiérase al Capítulo 2.3: Instalando Solvers de MPL para informarse cómo agregar solvers a MPL. El resto de este Tutor asumirá que usted ha instalado satisfactoriamente CPLEX o algún otro solver y que éste ha sido instalado correctamente. El próximo paso es resolver el modelo que usted ha cargado en el editor del modelo. Para resolver el modelo siga los siguientes pasos:

1. Elija el Solver CPLEX del menú Run para resolver el modelo 'Model1'. 2. Mientras resuelve el modelo, la ventana Status Window (ventana de estado) es visualizada y le

proporciona información acerca del avance de la solución.

Ventana: Status Window (Ventana de estado) del Model1

La ventana Status Window (ventana de estado) le proporciona información tal como el número de líneas leídas, el número de variables y restricciones encontradas, y cuánta memoria ha sido usada. Mientras el optimizador está resolviendo el modelo, el número de iteraciones y el valor actual de la función objetivo también son mostrados. La figura arriba muestra la ventana Status Window (ventana de estado) después que el problema ha sido resuelto.

Paso 4: Ver la Solución MPL envía la solución a un archivo con el mismo nombre del modelo, pero con la extensión '.sol'. Use los siguientes pasos para ver el archivo de la solución Model1.sol que fué generado por el modelo que usted resolvió:

1. Presione el botón View (Ver) en la parte inferior de la ventana Status Window (Ventana de Estado), el cual aparece sobre la pantalla durante el proceso de solución. Esta abrirá una ventana View Window (Ventana Ver) conteniendo el archivo de la solución como se muestra abajo.

Ventana: View (Ver) con el archivo de la Solución 'Model1.sol'

Page 5: Tutorial de MPL

2. Usted puede mirar rápidamente la solución usando la barra desplazadora de la derecha. Note que los detalles de la solución son proporcionadas incluyendo el valor de la solución óptima para la función objetivo, valores para las variables de decisión y para las restricciones.

3. Cuando ha terminado de mirar a través de la solución presione el botón (X) que aparece en la esquina superior derecho, para cerrar la ventana View Window (ventana Ver).

Paso 5: Usando el Árbol de Definiciones del Modelo MPL también le permite ver en una ventana todo acerca de los ítems definidos, desde la formulación del modelo en un árbol jerárquico llamado Definiciones del Modelo. Cada rama corresponde a una sección en el modelo. Sí la ventana del árbol no está abierta, usted puede abrirla eligiendo Definiciones del Modelo del menú View (Ver). Mientras esté trabajando con MPL normalmente es buena idea dejar abiertas las ventanas todo el tiempo. Luego MPL actualizará automáticamente su contenido cada vez que usted resuelve su modelo. La ventana del árbol provee fácil acceso a diferentes áreas del modelo y le permite ver rápidamente partes seleccionadas de la solución del modelo. Para usar la ventana del árbol haga lo siguiente:

1. Asegúrese que la ventana del árbol está abierta eligiendo Definiciones del Modelo del menú Ver.

Ventana: Árbol de Definiciones del Modelo

2. Bajo el título VARIABLES en el árbol, usted verá tres nombres de variables: Producto, Inventario, Ventas, los cuales son las variables para el modelo. En frente de cada título de sección, hay un pequeño recuadro conteniendo el signo más o el signo menos. Este recuadro le permite rápidamente expandir y plegar cada rama del árbol.

3. Ahora, seleccione la variable Producto y presione el botón View (Ver) en la parte inferior de la ventana. Este abrirá una nueva ventana View (Ver) con los valores de la solución para la variable Producto.

Ventana: View (Ver) con los Valores de la Solución de la Variable Producto

Page 6: Tutorial de MPL

Usando El sistema de Ayuda (Help) de MPL MPL ofrece al usuario un sistema extenso de ayuda (help) conteniendo información muy útil sobre cómo usar el software. Accesando a los Temas de Ayuda (Help) Disponibles en MPL Para abrir la ventana principal del sistema de ayuda de MPL, vaya al menú Help (Ayuda) y elija Topics (Temas). Este visualizará la ventana Help (Ayuda) que se muestra abajo, donde usted puede seleccionar el tema de ayuda que desea leer.

Ventana: Ayuda de los Contenidos de MPL

El cuadro de Diálogo Help Topics (Ayuda de Temas) contiene tres tabuladores; el tabulador Contents (Contenidos), el tabulador Index (Índices), y el tabulador Find (Encontrar), ofreciéndole diferentes maneras de accesar a la ayuda (help). El tabulador Contents (Contenido), muestra todos los temas disponibles en el sistema de ayuda (help) en una estructura de árbol jerárquico. El tabulador Index (Índice), permite al usuario accesar a la lista de todas las palabras clave en el archivo (help) ayuda o para realizar la búsqueda de una palabra clave específica. El tabulador Find (Encontrar), permite al usuario encontrar un tema de ayuda buscando palabras específicas o frases en el texto. La base de datos Find (Encontrar) es construida por primera vez cuando se selecciona el tabulador Find a través de Find Setup Wizard. Buscando Ayuda Sensible de Contexto en los Cuadros de Diálogos Una de las características beneficiosas en Windows es la adición de la ayuda sensible de contexto en los cuadros de diálogos. Esta característica le permite obtener rápidamente información de ayuda acerca de un ítem en los cuadros de diálogos en el que usted está interesado. Para aprender a cómo usar la ayuda sensible de contexto en los cuadros de diálogos en MPL, siga los siguientes pasos:

1. Para abrir un cuadro de diálogos elija MPL Language (Lenguaje MPL) del menú Options (Opciones). Este mostrará el cuadro de diálogos MPL Language Options.

2. Haga clic sobre el símbolo “?” que está en la esquina superior derecha y suelte el botón del mouse. El cursor cambiará a “?” el cual puede usar para señalar el ítem que usted está interesado.

3. Mueva el mouse a través del diálogo y haga clic sobre el ítem Max subscript length (longitud máxima de subíndices). Una ventana pequeña aparecerá con una pequeña explicación del item seleccionado como se muestra abajo.

Page 7: Tutorial de MPL

Ayuda Sensible de Contexto en Cuadros de Diálogos Usted también puede visualizar la ayuda sensitiva de contexto, presionando el botón derecho del mouse sobre el ítem en el cuadro de diálogo y seleccionar What's This? (¿Qué es esto?) del menú que aparece.

Sesión 2: Formulando un Modelo de Mezcla de Productos En esta sesión usted será introducido a la formulación de modelos de programación lineal a través de un problema simple llamado La Panadería del Mejor Pan.

Formulando Modelos de Programación Lineal

Descripción del Problema: Un Modelo de Mezcla de Productos

Formulando el Modelo

Resolviendo el Modelo con MPL

Formulando Modelos de Programación Lineal El propósito de esta sesión es introducirlo a los conceptos básicos de:

Variables de Decisión

Función Objetivo

Restricciones

Usted necesita identificar esos conceptos cuando formula modelos de programación lineal. El primer paso cuando formula un modelo es identificar y dar nombres a las variables de decisión. Las Variables de Decisión son los elementos del modelo que el decisor controla y cuyos valores determina la solución del modelo. El próximo paso es determinar la función objetivo en términos de las variables de decisión. La función objetivo es donde usted especifica el objetivo o meta que está tratando de alcanzar. El objetivo puede ser o maximizar o minimizar el valor de la función objetivo. Algunas veces usamos la frase queremos optimizar el modelo. Esto significa que queremos encontrar los valores para las variables de decisión que den el máximo o mínimo valor de la función objetivo. En muchos casos, la función objetivo tiene un valor monetario, por ejemplo maximizar beneficios o minimizar costos, aunque esto no siempre es el caso.

Page 8: Tutorial de MPL

Las restricciones son las limitaciones del mundo real sobre las variables de decisión. Una restricción restringe los posibles valores que las variables pueden tomar. Un ejemplo de una restricción puede ser, por ejemplo, que ciertos recursos, tales como capacidad de máquinas o mano de obra sean limitadas.

Descripción del Problema: Un Modelo de Mezcla de Productos La Panadería del Mejor Pan es famosa por sus panes. Ellos hacen dos clases: "Sunshine", un pan blanco y "Moonlight", un pan grande y oscuro. El mercado para los famosos panes es interminable. Cada barra de pan Sunshine vendido da una ganancia de; $0.05 y cada barra de pan Moonlight da una ganancia de $0.08. Hay un costo fijo de funcionamiento de la panadería de $4000 por mes, indistintamente de la cantidad de pan horneado. La panadería está dividida en dos departamentos: Horneado y Mezcla, con capacidades limitadas ambos departamentos. En el departamento de horneado hay diez hornos grandes, cada uno con una capacidad de 140 recipientes para horneado por día. Esto hace posible poner diez Barras de Sunshine en cada una de esos recipientes, o cinco barras de pan Moonlight. Usted puede hacer alguna combinación de esos dos panes sobre los recipientes. Tenga en mente que cada barra de Moonlight ocupa dos espacios por una de Sunshine. El departamento de mezclas puede mezclar hasta 8000 barras de pan Sunshine por día y 5000 barras de pan Moonlight por día. Hay dos mezcladoras automáticas separadas y no hay conflicto para hacer las dos clases de masa. Puesto que el mercado de ambos tipos de pan es ilimitado, la administración de la Panadería ha decidido encontrar la mejor mezcla del producto. La pregunta es cuántas barras de cada tipo de pan debe ser horneado cada día para producir la más alta ganancia, dadas las limitaciones de la panadería. Mostraremos ahora cómo identificar las variables de decisión, la función objetivo y las restricciones para este modelo y luego ingresar la formulación en MPL.

Formulando el Modelo Identificar las Variables de Decisión; Para nuestra panadería, las variables de decisión corresponden al número de barras de pan de cada tipo que se hacen diariamente. Para hacer la formulación más fácil de leer, es una buena idea asignar nombres a las variables de decisión, las cuales le permiten identificar qué representan en el mundo real. Use dos variables de decisión, llamadas Sun y Moon y esté de acuerdo que ellas tienen el siguiente significado:

Sun = Es el número de Barras de pan tipo Sunshine producidas por día Moon = Es el número de Barras de pan tipo Moonlight producidas por día

Ahora usted quiere determinar los valores para esas dos variables de decisión para maximizar las ganancias de la panadería. Identificar la Función Objetivo En nuestro ejemplo, el objetivo es maximizar la ganancia diaria. Hacemos una ganancia de $0.05 por cada barra Sunshine, así que el total de la producción diaria de pan Sunshine da un beneficio de $0.05 multiplicado por el valor de la variable Sun. Para la producción de Moonlight, el beneficio correspondiente es $0.08 multiplicado por el valor de la variable Moon. Llamamos a los valores $0.05 y $0.08 los coeficientes para las correspondientes variables de decisión en la función objetivo. Para obtener la contribución total de la ganancia diaria. Agregamos las contribuciones de los dos tipos de pan. De eso, restamos el costo fijo de $4000 y lo dividimos entre 30 días de un mes, para obtener la ganancia neta diaria. Esto conduce a las siguientes cantidades que queremos maximizar:

Ganancia = 0.05 Sun + 0.08 Moon - 4000/30

Hemos definido la función objetivo para este problema particular. El solver usa la función objetivo como un criterio para determinar cuál solución es la óptima.

Page 9: Tutorial de MPL

Identificar las Restricciones La primera restricción en el departamento de Horneado es complicado puesto que hay una interacción entre los tipos de pan. Es posible poner 10 del tipo Sunshine y cinco de Moonlight en cada recipiente. También es posible usar alguna combinación de los dos. La expresión 1/10 Sun + 1/5 Moon nos da el total usado en los recipientes. Sí usted mide la capacidad de cada horno como el número de recipientes que puede manejar por día (10 x 140), puede expresar la restricción como:

1/10 Sun + 1/5 Moon <= 10 x 140

Expresamos las restricciones como fueron dadas por el departamento de mezclas.

Sun <= 8000 Moon <= 5000

Resumiendo la Formulación Tenemos definido hasta ahora la función objetivo y todas las restricciones. La formulación de un problema de programación lineal es como se muestra abajo:

Max Ganancia = 0.05 Sun + 0.08 Moon - 4000/30

Sujeto a: 1/10 Sun + 1/5 Moon <= 10 x 140 Sun <= 8000 Moon <= 5000

Una vez que tiene su formulación, casi todo el trabajo está hecho. Como ha visto, MPL acepta entradas justo en una forma similar a lo que ha escrito.

Resolviendo el Modelo en MPL Paso 1: Inicie MPL y Cree un Nuevo Archivo del Modelo

1. Inicie la aplicación MPL.

2. Elija New (Nuevo) del menú File (Archivo) para crear un nuevo archivo vacío del modelo.

3. Elija Save As (guardar como) del menú File (Archivo) y guarde el archivo como Bakery2.mpl. Paso 2: Ingrese la formulación del Modelo de la Panadería Usted ahora está listo para poner el modelo en el lenguaje de MPL. El editor del modelo en MPL es un editor de texto estándar que le permite ingresar el modelo y ejecutar varias operaciones de edición sobre el texto del modelo. En el editor del modelo, ingrese la siguiente formulación del modelo: TITLE BetterBreadBakery;

MAX

Profit = 0.05 Sun + 0.08 Moon - 4000/30;

SUBJECT TO

1/10 Sun + 1/5 Moon <= 10 * 140;

Sun <= 8000;

Moon <= 5000;

END

Note que hay una pequeña diferencia entre la formulación del paso anterior y el mostrado aquí. Hay un punto y coma ‘;‘ después de la función objetivo y después de cada restricción.; Esto permite a MPL separar las restricciones.

Page 10: Tutorial de MPL

El espacio usado entre las entradas y las líneas en MPL no es rígido. Es recomendable que cuando ingrese el modelo, use espacios y líneas extras para hacer la formulación del modelo más fácil de leer y entender. A MPL solo le preocupa el texto actual en el archivo del modelo. Cuando ha terminado de ingresar el modelo, elija Save (Guardar) del menú File (Archivo) para guardar el modelo. Paso 3: Verificar la Sintáxis del Modelo Después que ha ingresado la formulación en el editor del modelo, puede verificar los errores de Sintáxis del modelo. Si MPL encuentra un error en la formulación lo reportará en la ventana Error Message (Mensajes de Error) mostrando en el modelo la línea donde ocurrió el error, con una explicación breve del problema. El cursor automáticamente se posiciona en el error resaltando la palabra que lo ocasionó. Para verificar la sintaxis elija Check Syntax (Verificación de Sintáxis) del menú Run (Ejecutar). Si no se encontraron errores, MPL responderá con un mensaje indicando que la sintáxis del modelo es correcta. Si hubiera un error en el modelo, MPL visualizará la ventana Error Message (Mensajes de Error). Sí no tiene errores en su formulación (Felicitaciones) aún querrá ver cómo trabaja los mensajes de error. Vamos a introducir un error en el modelo y note cómo el mensaje de errores en MPL puede ayudarle a corregirlo.

1. En el editor del modelo elimine el punto y coma al final de la primera restricción, como sigue: SUBJECT TO

1/10 Sun + 1/5 Moon <= 10 * 140 ! note the missing

semicolon

Sun <= 8000;

Moon <= 5000;

2. Elija Check Syntax (Verificación de Sintáxis); del menú Run (Ejecutar). MPL irá a través del modelo y encontrará el punto y coma faltante cuando este analice la segunda restricción, visualizando el siguiente mensaje de error:

Ventana Error Message (Mensaje de Error)

La razón por la que MPL no avisó la falta del punto y coma hasta que llegó a la segunda restricción, es porque él piensa que 10*140 es un coeficiente para la variable Sun en la línea de abajo.

3. Cuando presiona el botón OK usted retorna al editor del modelo. El cursor automáticamente se posicionará en la ubicación donde MPL encontró el error, el cual para nuestro caso es `<=' en la segunda restricción.

4. Ahora puede reingresar el punto y coma en la primera restricción y sí usted verifica la sintáxis otra vez, MPL reportará esta vez que la sintáxis está correcta.

Paso 4: Resolver el Modelo El próximo paso es resolver el modelo 'Bakery2.mpl'. Resolver el modelo implica varias tareas para MPL, incluyendo la verificación de la sintáxis, análisis del modelo en la memoria, transferencia del modelo al solver, solución del modelo y luego recuperación de la solución desde el solver y la creación del

Page 11: Tutorial de MPL

archivo de la solución. Todas esas tareas son hechas transparentemente para el usuario cuando elige el comando solve del menú. Para resolver el modelo siga los siguientes pasos:

1. Elija Solve CPLEX del menú Run (Ejecutar) o presione el botón Run Solve en la barra de herramientas.

2. Mientras se está resolviendo el modelo aparece la ventana de estado Status Window (Ventana de Estado); proporcionando información acerca del avance de la solución.

Ventana de Estado: Status Window para el modelo Bakery2

Sí todo va bien MPL visualizará el mensaje "Optimal Solution Found" (la solución óptima fué encontrada). Sí hay una ventana de mensaje de error con un error de sintáxis, por favor verifique la formulación con el modelo detallado que se ingresó anteriormente en esta sesión. Paso 5: Ver y Analizar la Solución Después de resolver el modelo, MPL automáticamente crea un archivo estándar de la solución conteniendo varios elementos de la solución del modelo. Este incluye, entre otras cosas, el valor óptimo de la función objetivo, los costos de las actividades y los costos reducidos de las variables, los precios sombra y las restricciones de holgura. Este archivo solución es creado con el mismo nombre del archivo modelo pero con la extensión '.sol'. En nuestro caso el archivo solución será llamado; 'Bakery2.sol'. Después que ha resuelto el modelo puede visualizar el archivo solución en una pantalla View (Ver) presionando el botón View (Ver) que está en la parte inferior de la ventana de estado Status Window. Esta visualizará la ventana View (ver) como se muestra abajo. MPL Modeling System - Copyright (c) 1988-2009, Maximal Software, Inc. ------------------------------------------------------------------------------------------------ MODEL STATISTICS Problem name: BetterBreadBakery Filename: Bakery2.mpl Date: January 16, 2013 Time: 18:09 Parsing time: 0.01 sec Solver name: CPLEX (11.2.1) Objective value: 506.666666667 Iterations: 0 Solution time: 0.01 sec Result code: 1 Constraints: 3 Variables: 2 Non zeros: 4 Density: 67 %

Page 12: Tutorial de MPL

SOLUTION RESULT

Optimal solution found

MAX Profit = 506.7 DECISION VARIABLES PLAIN VARIABLES Variable Name Activity Reduced Cost -------------------------------------------------------------- Sun 8000.0 ---- Moon 3000.0 ---- ------------------------------------------------------------- CONSTRAINTS PLAIN CONSTRAINTS Constraint Name Slack Shadow Price --------------------------------------------------------------- c3 2000.0 ---- --------------------------------------------------------------- RANGES OBJECTIVE PLAIN VARIABLES Variable Name Coefficient Lower Range Upper Range ---------------------------------------------------------------------------------------------- Sun 0.1 0.0 1E+020 Moon 0.1 0.1 0.1 ----------------------------------------------------------------------------------------------- RANGES RHS PLAIN CONSTRAINTS Constraint Name RHS Value Lower Bound Upper Bound ----------------------------------------------------------------------------------------------- c1 1400.0 800.0 1800.0 c2 8000.0 4000.0 14000.0 c3 5000.0 3000.0 1E+020 ---------------------------------------------------------------------------------------------- END

Ventana: View (Ver) con el archivo solución Bakery2.sol La ventana View Window almacena el archivo solución en la memoria, permitiéndole mirar rápidamente a través de la solución usando la barra desplazadora. Una lista completa del archivo solución es mostrado como abajo:

La primera parte del archivo solución contiene varias estadísticas del modelo, como el nombre de archivo, fecha y hora que fué resuelto, qué solver fué usado, el valor de la función objetivo y el tamaño del modelo. La siguiente parte del archivo solución contiene los resultados de la solución. Aquí usted puede ver sí la solución que fué encontrada era la óptima o sí estaba acotada o era infactible. También muestra el nombre y el valor óptimo de la función objetivo, en nuestro caso la ganancia para la panadería es igual a $506.7 por día.

Page 13: Tutorial de MPL

En la sección VARIABLES DE DECISION usted obtuvo una lista de las variables en el modelo, Sun and Moon. Usted verá que para el pan Sun la solución sugiere que usted produce 8000 barras por día, lo cual es al mismo tiempo la capacidad del departamento de mezclas para el pan Sun. Para el pan Moon la solución sugiere que nosotros producimos 3000 barras por día, lo cual es menos que la capacidad máxima de 5000 barras del pan Moon por día en el departamento de mezclas.

En la sección RESTRICCIONES el archivo solución, lista todas las restricciones del modelo. En nuestro modelo teníamos tres restricciones, una para los hornos en el departamento de horneado, y dos restricciones en el departamento de mezclas para cada tipo de pan. Puesto que la holgura para la primera restricción es cero, esto significa que los hornos en el departamento de horneado están trabajando a su capacidad total. De manera similar, los mezcladores para el pan Sunshine están trabajando a total capacidad, pero los mezcladores para el pan Moonlight tienen una holgura de 2000. Además, puesto que los hornos en el departamento de horneado son compartidos entre los dos tipos de pan, el solver ha elegido producir tanto como el pan Sunshine sea posible, entonces usa el resto de la capacidad para producir pan Moonlight.

Sesión 3: Introduciendo Vectores e Índices en MPL MPL le permite concisamente expresar multitudes de vectores, datos, y restricciones, con un formato de expresión intuitivo y flexible. En la sección 2, usted fué introducido a variables planas, función objetivo y restricciones planas. En esta sesión introduciremos varios nuevos elementos del modelo que son necesarios para la construcción de modelos para problemas muy grandes. El modelo que usó en la sección 2 fué pequeño, involucraba solo 2 variables. Los modelos del mundo real tienen cientos o miles de variables y restricciones, y algunas veces pasan del millón de variables. MPL permite al usuario fijar un modelo usando Índices, Vectores de Datos, Variables Vector, y Restricciones Vector para definir el problema en una forma concisa y fácil de leer.

Nuevos Conceptos en esta Sesión

Descripción del Problema: Un modelo de Mezcla de Productos con tres Variables

Formulación del Modelo con MPL

Ingrese el Modelo en MPL paso a paso

Resuelva el Modelo y Analice la Solución

Nuevos Conceptos en esta Sesión Índices como Dominios del Modelo Los Índices definen los dominios del modelo, encapsula las dimensiones del problema, y hace fácil el ajuste rápido del tamaño del problema. Una vez que ha definido los índices para un modelo, usted puede usarlos para definir datos, variables, y vectores restricción. El dominio de las variables y restricciones mencionadas es donde un lenguaje de modelo como MPL, pueden permitir una productividad dramática, puesto que ello permite al modelador formular el modelo en una forma concisa y fácil de leer, usando índices y vectores. Ejemplos de esos índices incluye:

productos

meses

plantas Datos, Variables, y Vectores Restricción Los Vectores son básicamente agregar elementos en el modelo que comparten características y propósitos comunes. Una vez que usted ha definido los índices en un modelo, puede usarlos para definir vectores que contienen los datos, variables y restricciones del modelo. Esto le permite trabajar de una manera más abreviada, así no tiene que tipear cada elemento cada vez que los necesite.

Page 14: Tutorial de MPL

Los Vectores de Datos son usados cuando los coeficientes o estadísticas del problema vienen en listas o tablas de datos numéricos. Cuando un índice es definido hay un solo valor por cada valor del índice y los vectores de datos le permiten juntar colección de grupos de datos en el modelo. Estos datos pueden ser especificados como una lista de números en el archivo del modelo, o ser recuperados de un archivo externo, lo cual será cubierto en la próxima sesión. Ejemplos de vectores de datos, en un modelo de producción con un índice 'producto' son; incluidos:

Precio por cada producto

Costo de Producción por cada producto

Demanda para cada producto

Los Vectores Variable pueden ser definidos de manera similar como los vectores de datos, para formar una colección de variables definidas sobre cierto índice. Ejemplos de vectores variables son incluidos:

Cuánto producir de cada producto

Nivel de Inventario del producto en cada mes

Cuánto embarcar entre localizaciones o plantas

Los Vectores Restricción; son definidos sobre los índices, los cuales MPL extiende a una colección simple de restricciones cuando genera el modelo. Un vector restricción puede ser definido de varias maneras, sobre un número de índices como períodos y productos. Ejemplos de vectores restricción se incluyen:

Limitar la producción a la capacidad

Limitar cuánto debe vender a la demanda Datos Constantes Los Datos Constantes son usados en el modelo para ayudar a que sea legible, y hacer más fácil el mantenimiento del modelo. Ellos son asignados a un valor específico pero no definidos sobre un índice específico.

Usando Sumas sobre Vectores Una de las operaciones usualmente hechas sobre vectores es para sumar o agregar todos los valores por cada elemento del vector. Esto es hecho en MPL usando la palabra clave SUM circundante a la expresión vector a ser agregada. La expresión es prefijada por una lista de índices sobre la cual depende la suma. La expresión suma contiene un vector de variables simples por termino, a veces multiplicado por uno o más vectores de datos. SUM (product: Price * Sales);

SUM (product, month: ProdCost * Produce);

Descripción del Problema: Un Modelo de Mezcla de Productos Con tres Variables Usted está creando una formulación del modelo para ver cómo son usados los índices y vectores en MPL. Formulamos un pequeño modelo de mezcla de productos para una panadería que contiene dos productos y tres restricciones. En este ejemplo, estará haciendo algo similar, pero este incluye tres productos los cuales son llamados A1, A2 y A3. Para esos tres productos usted creará un índice, y luego creará un vector variable que representa cuánto de cada uno de esos productos necesita producir. Dadas las definiciones de esos nuevos términos, índices y vectores, los aplicaremos al modelo prueba. El modelo de Mezcla de Productos pregunta cómo distribuir la capacidad de producción entre los productos para determinar el nivel de producción, dada la demanda. El precio de venta para cada producto es fijado como sigue: $120.00 para A1, $100.00, para A2, y $115.00 para A3. También hay un límite para la demanda máxima de cada producto:; 4300 para A1, 4500 para A2, y 5400 para A3. La tasa de producción es medida por cuántos ítems de cada producto son producidos por cada día. En este problema, usted tiene un total de 22 días disponibles de producción. Esa tasa de producción y los costos de producción para cada producto están dados en la tabla que sigue:

Page 15: Tutorial de MPL

Producción A1 A2 A3

Costo de producción $73.30 $52.90 $65.40

Rata de producción 500 450 550

Formulación del Modelo con MPL El próximo paso es tomar el problema descrito en la sección previa, y formularlo como un modelo MPL. Puede dar un vistazo al modelo Planning3, ya creado. Una lista completa de la formulación del modelo se muestra a continuación:

{ Planning3.mpl }

TITLE

Producton_Planning3;

INDEX

product := (A1, A2, A3);

DATA

Price[product] := (120.00, 100.00, 115.00);

Demand[product] := (4300, 4500, 5400);

ProdCost[product] := (73.30, 52.90, 65.40);

ProdRate[product] := (500, 450, 550);

ProdDaysAvail := 22;

VARIABLES

Produce[product] -> Prod;

MACROS

TotalRevenue := SUM(product: Price * Produce);

TotalCost := SUM(product: ProdCost * Produce);

MODEL

MAX Profit = TotalRevenue - TotalCost;

SUBJECT TO

ProdCapacity -> PCap:

SUM(product: Produce / ProdRate) <= ProdDaysAvail;

BOUNDS

Produce <= Demand;

END

Ingrese el Modelo en MPL Paso a Paso Paso 1: Inicie MPL y Cree un nuevo archivo Modelo Usted ingresará ahora un modelo simple paso a paso, para permitirle entender la formulación del modelo como usted lo determinó.

1. Inicie la aplicación MPL. 2. Elija New(Nuevo) del menú File (Archivo) para crear un nuevo archivo vacio del modelo. 3. Elija Save As ( Guardar como ) del menú File(Archivo) y guarde el archivo del modelo

como;; Planning3.mpl.

Page 16: Tutorial de MPL

Paso 2: Especifique un Título para el Modelo El título es opcional, pero es conveniente colocar un nombre al modelo. El título será usado en la solución para identificar el modelo. Usted debe ahora tener una ventana editor vacía donde puede ingresar su formulación con MPL. Para ingresar el título para el modelo Planning3, escriba en el editor del modelo el siguiente texto: TITLE

Production_Planning3;

Paso 3: Defina un Índice para todos los Productos en el Modelo La primera sección en un modelo MPL usualmente es la sección INDEX (Índice) donde usted define los índices para el modelo. En este ejemplo, tiene tres productos, A1, A2, y A3 para los cuales está creando un índice llamado producto. En el editor del modelo, directamente debajo del título, agregue una sección INDEX (Índice) con una definición para el índice producto como sigue: INDEX

product:= (A1, A2, A3);

Paso 4: Definir los Datos para el Modelo La próxima sección en MPL usualmente es la sección de los DATOS donde usted define los Vectores de Datos y los Datos Constantes del modelo. El primer Vector de datos que ingresará, contiene los precios de cada producto, los cuales fueron dados en la descripción del problema. En el editor del modelo, directamente debajo de la definición del índice, agregue una sección de DATOS con una definición para el vector de datos Precio seguido por el índice [Product] entre corchetes. DATA

Price[product]:= (120.00, 100.00, 115.00);

Siguiendo la declaración, ingrese un símbolo de asignación ':=' y luego una lista de números conteniendo los precios de cada producto.; Encierre la lista con paréntesis y separe cada número por cualquiera de los dos, un espacio, coma o ambos. Debe haber un punto y coma después de cada definición de vector para separarlo de las otras definiciones en el modelo. El problema descrito también listó los datos de la demanda, costo de producción y tasa de producción. Hay cierta demanda para cada producto, una cantidad de costo para producirlo, y un límite superior de cuánto de cada producto usted puede producir por día. Para ingresar estos datos en MPL, agregue y siga las definiciones para la sección de DATOS directamente debajo del vector de datos Precio. Demand[product] := (4300, 4500, 5400);

ProdCost[product] := (73.30, 52.90, 65.40);

ProdRate[product] := (500, 450, 550);

La descripción del problema también listó cuántos días de producción estaban disponibles. Agregue la siguiente definición de datos constantes para los días disponibles de producción directamente debajo del vector de datos; ProdRate (Tasa de Producción): ProdDaysAvail := 22;

Paso 5: Defina un Vector Variable para Cuánto Producir de cada Producto Usualmente, la próxima sección será la sección VARIABLES donde usted define las variables del modelo. En la descripción del problema, al usar el modelo se le pidió que determine cuánto producir de cada producto. Para hacer esto, necesitó definir la variable llamada Produce (Producir) sobre el índice Producto. En el editor del modelo, directamente debajo de las definiciones de datos agregue la sección VARIABLES con una definición para el vector variable Producir como sigue: VARIABLES

Produce[product] -> Prod;

El nombre que aparece después del signo; '->' (léase hacerse) es una abreviación opcional del nombre de vector usado para compensar las limitaciones del tamaño del nombre de muchos solvers de Pl. Esto le permitirá a usted usar nombres de descripción largos para las variables de su modelo.

Page 17: Tutorial de MPL

Paso 6: Defina la Función Objetivo como el Total de Ingresos menos el Costo Total de Producción En la descripción del problema, se le pidió maximizar las ganancias de la compañía, la cual es representada como Total revenue - Total cost (Total Ingresos - Total Costos). El total de ingresos es calculado multiplicando el precio de cada producto por la cantidad producida de cada producto. Del mismo modo, el costo total es calculado multiplicando el costo de producción de cada producto por la cantidad producida de cada producto. Esas sumatorias serán utilizadas para definir la función objetivo del modelo. Cuando ingresa sumatorias para la función objetivo, usualmente es para definirlos separadamente como macros, para hacer que el modelo sea más fácil de leer. Usando Macros usted puede entonces, en el modelo referirse a esas sumatorias usando el nombre de la macro. En el editor del modelo, directamente debajo de la variable de definición ingrese la siguiente definición de macro en la sección de MACROS. MACROS

TotalRevenue := SUM (product: Price * Produce);

TotalCost := SUM (product: ProdCost * Produce);

La parte del modelo en MPL es donde usted define la función objetiva y las restricciones del modelo. Estará usando las macros definidas arriba, para crear la función objetivo refiriéndose al nombre de la macro cuando usted necesite usar las sumatorias. Puesto que usted está maximizando las ganancias en este modelo, el nombre de esta función objetivo será Profit (Ganancia). En editor del modelo, ingrese la palabra clave MODEL para notar que empieza la parte del modelo, seguido por la definición de la función objetivo. MODEL

MAX Profit = TotalRevenue - TotalCost;

La fórmula para la función objetivo es muy simple, como estamos usando macros que contengan las sumatorias actuales. Esto resulta en la función objetivo determinando cuánto maximizar la ganancia calculando la diferencia entre lo ingresos y los costos totales.;

Paso 7: Ingrese una Restricción para la Capacidad de Producción; Siguiendo la función objetivo usted necesita definir las restricciones para el modelo en la sección SUBJECT TO (Sujeto A) En la descripción del problema, se le dio la tasa de producción definida como cuántos ítems de cada producto puede producir cada día. Como también cuántos días de producción están disponibles. Puesto que esto limita a cuántos ítems puede producir, usted necesitará crear una restricción de la capacidad de producción llamada ProdCapacity; para cada producto. En el editor del modelo, agregue la cabecera SUBJECT TO (SUJETO A), seguido por la definición de; restricción: SUBJECT TO

ProdCapacity -> PCap:

SUM (product: Produce / ProdRate) <= ProdDaysAvail;

En el resumen usted divide el número de ítems producido por la tasa de producción para recibir el número total de días usados para producir cada producto. El total de días de producción usados debe ser menor que los días disponibles para la producción. Paso 8: Ingrese una Cota Superior para la Variable 'Producto'; La sección BOUNDS (COTAS) es usada para definir las cotas superior e inferior sobre las variables del modelo. Las Cotas son similares a las restricciones pero limitadas a solo una variable por cota. En la descripción del problema, especificamos que el número total de ítems producidos debe ser menor que la demanda. Además, ingrese la siguiente cota superior sobre la variable Produce (Producto) en la sección BOUNDS (COTAS). BOUNDS

Produce < Demand;

END

Por favor note que en la mayoría de modelos de programación lineal todas las variables tienen implícito una cota inferior igual a cero (Xj >= 0); Esas cotas inferiores son manejadas automáticamente por MPL y; no tiene que ser especificadas a menos que sean diferentes de cero.

Page 18: Tutorial de MPL

Al final del modelo ingrese la palabra clave END para notar que es el final del modelo. Después que ha terminado de ingresar el modelo, debe guardarlo eligiendo Save (guardar) del menú File (Archivo).

Resuelva el Modelo y Analice la Solución Resolver el Modelo El próximo paso es resolver el modelo Planning3l. Resolver el modelo implica varias tareas que son hechas automáticamente por MPL incluyendo la verificación de la sintáxis, análisis del modelo en la memoria, transferir el modelo al solver, resolver el modelo y entonces recuperar la solución desde el solver y crear el archivo solución. Todas esas tareas son hechas transparentemente para el usuario cuando él elige el comando solve de los menús. Para resolver el modelo haga los siguientes pasos:

1. Elija Solve CPLEX del menú Run o presione el botón Run Solve en la barra de herramientas. 2. En tanto está resolviendo el modelo, la ventana de estado Status Window aparece proporcionándole

información acerca del progreso de la solución.

Ventana de estado: Status Window para el modelo Planning3

Sí todo va bien, MPL visualizará el mensaje "Optimal Solution Found" (Solución Óptima fué encontrada). Si hubiera una ventana de mensaje de error por favor verifique la formulación del modelo detallado que; ingresó anteriormente en esta sección. Ver y Analizar la Solución Después que resolvió el modelo, MPL automáticamente crea un archivo estándar de la solución conteniendo varios elementos de la solución del modelo. Este incluye entre otras cosas, el valor óptimo de la función objetivo, la actividad y los costos reducidos para las variables, y las holguras y los precios sombra de las restricciones. Este archivo de la solución es creado con el mismo nombre del archivo del modelo, pero con la extensión '.sol' en su lugar. En nuestro caso el nombre del archivo de la solución es llamado 'Planning3.sol'. Después que ha resuelto el modelo, puede visualizar el archivo de la solución en una ventana View (Ver) presionando el botón View en la parte inferior de la ventana de estado Status Window. Esta visualizará la ventana ver como se muestra abajo.

Ventana View (Ver) con el archivo de la solución Planning3.sol

Page 19: Tutorial de MPL

La ventana View (Ver) almacena el archivo de la solución en la memoria, permitiendo ver rápidamente la solución con las barra de desplazamiento. Un lista completa del archivo de la solución para el modelo; Planning3 se muestra abajo: MPL Modeling System - Copyright (c) 1988-1999, Maximal Software, Inc.

-------------------------------------------------------------------------------

MODEL STATISTICS

Problem name: Producton_Planning3

Filename: Planning3.mpl1

Date: April 18, 1998

Time: 09:59

Parsing time: 0.57 sec

Solver: CPLEX

Objective value: 544566.636364

Iterations: 3

Solution time: 0.12 sec

Constraints: 1

Variables: 3

Nonzeros: 3

Density: 100 %

SOLUTION RESULT

Optimal solution found

MAX Profit = 544566.6364

MACROS

Macro Name Values

-----------------------------------------------

TotalRevenue 1298181.8182

TotalCost 753615.1818

-----------------------------------------------

DECISION VARIABLES

VARIABLE Produce [product] :

product Activity Reduced Cost

---------------------------------------------

A1 4300.0000 4.3100

A2 1611.8182 0.0000

A3 5400.0000 11.0636

---------------------------------------------

CONSTRAINTS

PLAIN CONSTRAINTS

Constraint Name Slack Shadow Price

------------------------------------------------------

ProdCapacity 0.0000 -21195.0000

------------------------------------------------------

END

Page 20: Tutorial de MPL

La primera parte del archivo de la solución contiene varias estadísticas del modelo como el nombre del archivo, fecha y hora que el modelo fué resuelto, que solver fué usado, el valor de la función objetivo, y el tamaño del modelo. La próxima parte del archivo de la solución contiene los resultados de la solución. Aquí usted puede ver sí la solución que fué encontrada, era la óptima o sí estaba acotada o era infactible. También muestra el nombre y el valor óptimo de la función objetivo. En la sección MACROS del archivo de la solución obtuvo una lista de todas las macros definidas a lo largo del modelo con los valores de la solución de ellos. Por ejemplo, en nuestro modelo Planning3, los ingresos totales son $1.298 millones y el costo total es $754,000. Esto tiene correspondencia con las ganancias de $545,000, el cual es el valor de la función objetivo. En la sección VARIABLES DE DECISION obtuvo una lista de todas las variables en el modelo, ambos variables vector y variables planas. En nuestro caso, tenemos una variable vector simple Producir, definida sobre el índice producto. Verá también que para los productos A1 y A3 la solución sugiere que usted produce 4300 y 5400 unidades respectivamente. Esta es la misma cantidad que la demanda para aquellos productos. Por otro lado, el producto A2 sugiere que se ha producido 1612 unidades lo cual es menor que la demanda. Claramente no tenemos la capacidad para producir lo suficiente para satisfacer la demanda para todos esos productos y; el modelo elige los productos A1 yA3 para satisfacer la demanda. Por la forma, usted debe haber notado que el valor para; A2 en la solución es actualmente 1611.8182 unidades en lugar de 1612. Esto resulta del hecho que todas las variables en modelos de programación lineal son por definición continuos. En este modelo no importa mucho y solo redondeamos a 1612, pero sino, puede restringir a que la variable solo tome valores enteros, especificando en el modelo que es una variable entera. Por favor vea; el Manual de Usuario de MPL ; para más detalles de cómo formular modelos en MPL con variables enteras.; En la sección RESTRICCIONES el archivo de la solución lista todas las restricciones del modelo, otra vez ambas restricciones, vector y plana. En nuestro modelo, hemos tenido una restricción simple plana llamada ProdCapacity. Puesto que la holgura para la restricción es 0.0 esto significa que estamos trabajando a capacidad total. Los precios sombra nos dice que el costo marginal debe estar sí usted necesita reducir el límite de la restricción a una unidad. Puesto que la restricción de la capacidad de producción tiene días de producción como unidad, reducir los días disponibles por un día, la ganancia decrecerá en $21,195.

Sesión 4: Un Modelo de Planificación de la Producción con Períodos de Tiempo Múltiples Ahora usted ampliará el modelo de la sesión previa para incluir períodos de tiempo múltiples. Un nuevo índice de períodos es introducido en el modelo para cubrir esos períodos de tiempo y luego actualizar los varios vectores que han sido afectados para responder por el nuevo dominio.

Nuevos Conceptos en esta Sesión

Descripción del Problema: Un Modelo de Planificación con Períodos Múltiples

Formulación del Modelo con MPL

Ingrese Nuevos Elementos al Modelo, paso a paso.

Resuelva el Modelo y Analice la Solución

Nuevos Conceptos en esta Sesión Índices de Períodos Para actualizar su modelo que incluya un período múltiple, necesitará crear un índice que represente el período de tiempo. Este tipo de índice es llamado Índice Período. Después que ha definido su índice período, puede usarlo para actualizar los vectores de datos, de variables y de restricciones para incluir un período de tiempo específico. Ejemplos de índices períodos podrían incluir: meses, trimestres, y años. Variables de Ventas e Inventarios Cuando usted hace crecer un modelo de un simple período a múltiples períodos, las ventas para un período específico pueden ser diferentes de la cantidad producida en el mismo período. Como resultado, una nueva variable es requerida para representar cuánto necesita vender, y una nueva variable para representar el nivel de inventario para cada período.

Page 21: Tutorial de MPL

En muchos casos, hay un costo fijo por período involucrado con el almacenamiento de inventario. En otros casos, sin embargo, el costo podría no estar asociado al almacenamiento actual del inventario, sino más bien con el abastecimiento y retiro de los productos del inventario, a través de los costos de mano de obra involucrados. Esto significa que necesitará más variables en el modelo, uno por el abastecimiento de los productos y otro por retirarlos del inventario. Restricciones de Equilibrio del Inventario Como no es posible vender más de los productos que usted tiene, la variable inventario es usada para asociar las variables de producción a las variables de ventas. Esto es hecho a través de una restricción, comúnmente llamada Restricción de Equilibrio. Las restricciones de equilibrio son usadas para asegurar que las cantidades que ingresan sean iguales a las cantidades que salen. Una restricción de equilibrio común, estipula que la producción total, más el nivel de inventario del período anterior, es igual a la cantidad vendida, más lo que salió del inventario. Ejemplo de una restricción de equilibrio es: Produce + Inventory[month-1] = Sales + Inventory

En este caso, la entidad que está siendo equilibrada es el inventario. Invt[month-1] es una notación usada en MPL para representar el período anterior. Cuando trabajamos con un inventario donde los costos necesitan ser aplicados al abastecimiento y retiro de los inventarios, usted necesitará definir dos restricciones de equilibrio. Por ejemplo:

Produce + OutInvt = Sales + PutInvt

PutInvt + Inventory[month-1] = OutInvt + Inventory

Sí piensa que la planta es una entidad, en la primera restricción estamos equilibrando lo que entra con lo que sale de la planta. De la misma forma, la segunda restricción de equilibrio indica que estamos equilibrando lo que entra con lo que sale del inventario. Inventario Inicial e Inventario Final En muchos casos el modelador necesita especificar un inventario inicial o un inventario final para el período planificado. Por defecto, MPL excluye las entradas de Inventory[month-1] para el mes igual a cero. Hay varias formas que usted puede especificar un inventario inicial, por ejemplo puede ingresar la restricción en dos partes como sigue:

INDEX

month := (Jan, Feb, Mar, Apr)

DATA

StartInvt := 450

SUBJECT TO

InitInvt[month=Jan]:

produce + StartInvt = sales + Inventory

InvtBal [month>Jan]:

produce + Inventory[month-1] = sales + Inventory

Esto creará una restricción de equilibrio para el mes de Enero empezando con 450 unidades. Hay otras formas de incluir el inventario inicial en MPL que no requieren duplicar la restricción, por ejemplo con subíndices, pero esta es la forma más sencilla de formular esa clase de restricciones.

Descripción del Problema: Un Modelo de Planificación de la Producción Multi-Periodo En esta sesión, creará la formulación de un nuevo modelo de planificación de la producción multi-período. Usará el modelo que usted creó en la sesión 3, y hará las adiciones necesarias y luego lo actualizará. En este nuevo problema, tendrá un período de planificación de cuatro meses, de Enero a Abril. Necesita crear un índice que contenga los cuatro meses mencionados y luego actualice el resto del modelo, agregando el índice a los vectores definidos. Como en el problema de la sesión 3, los precios de venta para cada producto son todavía $120.00, $100.00, $115.00, respectivamente. Ahora, en lugar de tener una demanda simple para cada producto, usted tiene una demanda separada para cada producto y para cada mes, como se puede ver en la tabla de abajo.

Page 22: Tutorial de MPL

Producción Demandada Jan Feb Mar Apr

A1 4300 4200 6400 5300

A2 4500 5400 6500 7200

A3 5400 6700 7800 8200

La tasa de producción y el costo de producción permanecen iguales, como fueron dados en la tabla de la sesión 3. Note que los días de producción disponibles son diferentes para cada uno de los meses con 23 días para Enero, 20 para Febrero, 23 para Marzo y 22 para Abril. Introducirá el inventario al modelo, además, tiene los costos de inventario para cada producto con A1 - $3.50/month, A2 - $4.00/month and A3 - $3.00/month, respectivamente. Cada uno de los productos toma la misma cantidad de espacio, pero la capacidad total de inventario es ahora 800 unidades por mes.

Formulación del Modelo con MPL La formulación completa del modelo Planning4 es como se lista abajo. Como puede ver el modelo ha crecido respecto al de la sesión 3. Las adiciones al modelo están resaltadas en rojo para hacer más fácil que usted vea los cambios. TITLE

Production_Planning4;

INDEX

product := (A1, A2, A3);

month := (Jan, Feb, Mar, Apr);

DATA

Price[product] := (120.00, 100.00, 115.00);

Demand[product, month] := (4300, 4200, 6400, 5300,

4500, 5400, 6500, 7200,

5400, 6700, 7800, 8200);

ProdCost[product] := (73.30, 52.90, 65.40);

ProdRate[product] := (500, 450, 550);

ProdDaysAvail[month] := (23, 20, 23, 22);

InvtCost[product] := (3.50, 4.00, 3.00);

InvtCapacity := 800;

VARIABLES

Produce[product, month] -> Prod;

Inventory[product,month] -> Invt;

Sales[product, month] -> Sale;

MACROS

TotalRevenue := SUM(product, month: Price * Sales);

TotalProdCost := SUM(product, month: ProdCost * Produce);

TotalInvtCost := SUM(product, month: InvtCost * Inventory);

TotalCost := TotalProdCost + TotalInvtCost;

MODEL

MAX Profit = TotalRevenue - TotalCost;

SUBJECT TO

ProdCapacity[month] -> PCap:

SUM(product: Produce / ProdRate) <= ProdDaysAvail;

InvtBal[product, month] -> IBal:

Produce + Inventory[month-1] = Sales + Inventory;

MaxInventory[month] -> MaxI:

SUM(product: Inventory) <= InvtCapacity;

Page 23: Tutorial de MPL

BOUNDS

Sales <= Demand;

END

Ingrese Nuevos Elementos al Modelo Paso a Paso Paso 1: Inicie MPL y Cree un Nuevo Modelo

1. Inicie la aplicación MPL. 2. Elija File | Open (Archivo| Abrir) y abra el modelo de la sesión anterior Planning3.mpl. 3. Elija File | Save As (Archivo | Guardar como) para guardarlo como un nuevo archivo del modelo

de Planning4.mpl. Paso 2: Cambie el Título del Modelo Cambie el título del modelo para reflejar que usted está trabajando con el modelo Planning4: TITLE

Production_Planning4;

Paso 3: Agregue el Índice 'month' al Modelo En este ejemplo, hay una planificación de cuatro períodos. Cree un nuevo índice llamado month (mes). Este índice tendrá cuatro elementos Jan, Feb, Mar, y Apr, para representar los cuatro meses de períodos planificados. Agregue la siguiente definición al índice mes, que están resaltadas en negrita en la sección INDEX (índice): INDEX

product := (A1, A2, A3);

month := (Jan, Feb, Mar, Apr);

Paso 4: Actualice el Vector de Datos 'Demand' para incluir el Índice 'month' En la sección DATA (DATOS), muchas de las definiciones de datos son las mismas como en la sesión 3. Uno de los vectores de datos; Demand, necesita ser ampliada para incluir el índice month, como ahora que tiene diferentes valores para cada mes. Los valores para este vector están dados en la tabla de la sesión anterior en la descripción del problema. Agregue el índice month a la declaración para el vector de datos Demand, seguido con una lista de valores de datos como se muestra abajo: DATA

Price[product] := (120.00, 100.00, 115.00);

Demand[product, month] := (4300, 4200, 6400, 5300,

4500, 5400, 6500, 7200,

5400, 6700, 7800, 8200);

Paso 5: Actualice la constante 'ProdDaysAvail' al Vector de Datos sobre el Índice 'month' La constante ProdDaysAvail (días de producción disponible) ahora tiene un valor diferente para cada mes, como en el vector de datosdemand. Esto significa que necesita ser ampliado con un dato constante a un vector de datos dimensional, con month (mes) como índice. Usando la lista de días de producción disponible que encontró anteriormente en la descripción del problema de esta sesión, actualice ProdDaysAvail como sigue: ProdCost [product] := (73.30, 52.90, 65.40);

ProdRate [product] := (500, 450, 550);

ProdDaysAvail [month] := (23, 20, 23, 22);

Paso 6: Agregue los Vectores de Datos de Costos de Inventario y Capacidad de Inventario En la descripción del problema se definió un costo para cada producto almacenado en el inventario y un límite de cuánto puede ser almacenado en el inventario. Además, para representar esto, agregue un vector de datos más al modelo; InvtCost, y también un nuevo dato constante InvtCapacity. Al final de la sección DATA agregue las siguientes definiciones: InvtCost [product]:= (3.50, 4.00, 3.00);

InvtCapacity := 800;

Page 24: Tutorial de MPL

Paso 7: Agregue al Modelo Variables de Ventas e Inventarios En este modelo hay dos nuevas variables, Sales and Inventory (Ventas e Inventarios), que necesitan ser introducidas al modelo. La variable Sales (Ventas) es usada para representar cuánto de cada producto es vendido en cada mes. La Variable Inventory (Inventario) es usada para representar cuánto de cada producto es almacenado, en cada mes. La variable Produce (Producción) necesita ser aumentada para incluir el índice month (mes) que son las diferentes cantidades de cada producto que son producidas, en cada mes. En el modelo agregue las siguientes definiciones a la sección VARIABLES:

VARIABLES

Produce[product, month] -> Prod;

Inventory[product,month] -> Invt;

Sales[product, month] -> Sale;

Como en el modelo anterior, el nombre que aparece después del signo '->' (se lee: se hace) es una abreviación opcional del nombre del vector. Este es usado para compensar las limitaciones del tamaño del nombre de la variable de muchos solvers de PL. Paso 8: Agregue el Costo de Inventario a la Función Objetivo En el modelo de la sesión anterior, las ganancias totales y el costo total de producción son incluidos en la función objetivo. Ahora necesita actualizar esta función objetivo con el índice, month (mes), y agregue una entrada para el costo total de inventario. Como en la sesión anterior, usted usara macros que representen cada sumatoria. Cuando calcula la ganancia total, necesitará referirse a la variables Sales (Ventas) en lugar de la variable Produce (Producción) y agregue el índice month (mes) a la suma. Para el costo total de producción, necesitará también agregar la suma para incluirlo al índice month (mes). El costo total de inventario será definido como el costo de inventario por unidad por el nivel del inventario. Para hacer cambios en la sección MACROS, reemplace la variable Produce (Producción) con la variable Sales (Ventas), actualice la ganancia total y súmelo al costo de producción para incluirlo en el índice month, y agregue una nueva definición de macro al costo del inventario total, como sigue: MACROS

TotalRevenue := SUM(product, month: Price * Sales);

TotalProdCost := SUM(product, month: ProdCost * Produce);

TotalInvtCost := SUM(product, month: InvtCost * Inventory);

TotalCost := TotalProdCost + TotalInvtCost;

Por favor note que la macro para el costo total de producción ha sido renombrada a TotalProdCost. Otra nueva macro; TotalCost, ha sido agregada donde usted puede sumar estas dos nuevas macros para obtener el costo total. Esto permite que la función objetivo permanezca sin cambios:

MODEL

MAX Profit = TotalRevenue - TotalCost;

Paso 9: Actualice la restricción de la Capacidad de Producción para múltiples meses En la restricción production capacity(Capacidad de la producción), agregue el índice month a la definición de la restricción y el resto de la restricción permanece igual. SUBJECT TO

ProdCapacity[month] -> PCap:

SUM(product: Produce / ProdRate) <= ProdDaysAvail;

Por favor note que en MPL usted no tiene que ingresar subíndices para cada índice cuando se refiera a los vectores de datos y vectores de variables. Esto significa que usted puede fácilmente agregar más índices a las restricciones sin tener que cambiar de acuerdo a como usted se refería de cada vector. Paso 10: Agregue al Modelo una Restricción de Equilibrio de Inventario Para agregar la variable Inventory (Inventario) al modelo necesita incluir una restricción de equilibrio de inventario estándar. Esta restricción fluctúa para cada producto y cada mes, especificando que la producción, más el inventario del mes anterior, es igual a la cantidad vendida, más el inventario del mes actual. Agregue la siguiente restricción InvtBal debajo de la restricción anterior ProdCapacity:

Page 25: Tutorial de MPL

InvtBal[product, month] -> IBal:

Produce + Inventory[month-1] = Sales + Inventory;

Cuando se ingresa períodos de tiempo anteriores, como en este caso el mes anterior, MPL, le permite usar expresiones tales como [month-1]. Paso 11: Agregue al Modelo una Restricción de Capacidad de Inventario Hay un límite sobre cuánto espacio disponible hay para el inventario. Además, usted necesita agregar al modelo una restricción de capacidad de inventario. En la descripción del problema, se le dijo que cada producto toma una cantidad igual de espacio para el inventario y que puede agregar o sumar sobre él, todos los productos para obtener el espacio de inventario total usado. Agregue al modelo la siguiente definición de la restricción: MaxInventory[month] -> MaxI:

SUM(product: Inventory) <= InvtCapacity;

Paso 12: Actualice la Cota Superior de la Demanda Máxima para usar la Variable 'Ventas' En la cota superior de la demanda máxima usted necesita actualizarla incluyendo la variable Sales (Ventas) en lugar de Produce (Producción) como se muestra abajo: BOUNDS

Sales <= Demand;

Después que usted ha terminado de ingresar el modelo, debe guardarlo, eligiendo Save(Guardar) del menú File(Archivo).

Resolver el Modelo y Analizar la Solución El próximo paso es resolver el modelo Planning4, eligiendo Solve CPLEX del menú Run (Ejecutar). Sí usted ha ingresado los datos correctamente, MPL visualizará el mensaje Optimal Solution Found (la solución óptima fué encontrada). Si hay algún mensaje de error de sintáxis, por favor verifique la formulación del modelo detallado que ingreso anteriormente en esta sesión. Después de resolver el modelo, MPL automáticamente creará un archivo estándar de la solución llamado 'Planning4.sol'. Puede visualizar el archivo de la solución en una ventana View (Ver) presionando el botón View en la parte inferior de la ventana de estado Status Window. Un listado completo de la solución es mostrado a continuación. MPL Modeling System - Copyright (c) 1988-2001, Maximal Software, Inc.

-------------------------------------------------------------------------------

MODEL STATISTICS

Problem name: Production_Planning4

Filename: Planning4.mpl

Date: April 17, 1998

Time: 22:52

Parsing time: 0.15 sec

Solver: CPLEX

Objective value: 2246007.27273

Iterations: 26

Solution time: 0.04 sec

Constraints: 20

Variables: 36

Nonzeros: 69

Density: 10 %

SOLUTION RESULT

Optimal solution found

MAX Profit = 2246007.2727

Page 26: Tutorial de MPL

MACROS

Macro Name Values

-----------------------------------------------

TotalRevenue 5386045.4545

TotalProdCost 3139078.1818

TotalInvtCost 960.0000

TotalCost 3140038.1818

-----------------------------------------------

DECISION VARIABLES

VARIABLE Produce [product,month] :

product month Activity Reduced Cost

----------------------------------------------------

A1 Jan 4300.0000 0.0000

A1 Feb 4200.0000 0.0000

A1 Mar 4409.0909 0.0000

A1 Apr 3545.4545 0.0000

A2 Jan 1800.0000 0.0000

A2 Feb 0.0000 -3.6667

A2 Mar 0.0000 -4.7889

A2 Apr 0.0000 -0.7889

A3 Jan 5720.0000 0.0000

A3 Feb 6380.0000 0.0000

A3 Mar 7800.0000 0.0000

A3 Apr 8200.0000 0.0000

----------------------------------------------------

VARIABLE Inventory[product,month] :

product month Activity Reduced Cost

----------------------------------------------------

A1 Jan 0.0000 -0.2000

A1 Feb 0.0000 -2.4900

A1 Mar 0.0000 -3.5000

A1 Apr 0.0000 -123.5000

A2 Jan 0.0000 -4.0000

A2 Feb 0.0000 -4.0000

A2 Mar 0.0000 0.0000

A2 Apr 0.0000 -108.0000

A3 Jan 320.0000 0.0000

A3 Feb 0.0000 -2.0818

A3 Mar 0.0000 -3.0000

A3 Apr 0.0000 -110.8545

----------------------------------------------------

VARIABLE Sales[product,month] :

product month Activity Reduced Cost

----------------------------------------------------

A1 Jan 4300.0000 4.3100

A1 Feb 4200.0000 1.0100

A1 Mar 4409.0909 0.0000

A1 Apr 3545.4545 0.0000

A2 Jan 1800.0000 0.0000

A2 Feb 0.0000 0.0000

A2 Mar 0.0000 0.0000

A2 Apr 0.0000 -4.0000

A3 Jan 5400.0000 11.0636

A3 Feb 6700.0000 8.0636

A3 Mar 7800.0000 7.1455

A3 Apr 8200.0000 7.1455

----------------------------------------------------

Page 27: Tutorial de MPL

CONSTRAINTS

CONSTRAINT ProdCapacity[month] :

month Slack Shadow Price

-------------------------------------------

Jan 0.0000 -21195.0000

Feb 0.0000 -22845.0000

Mar 0.0000 -23350.0000

Apr 0.0000 -23350.0000

-------------------------------------------

CONSTRAINT InvtBal[product,month] :

product month Slack Shadow Price

----------------------------------------------------

A1 Jan 0.0000 115.6900

A1 Feb 0.0000 118.9900

A1 Mar 0.0000 120.0000

A1 Apr 0.0000 120.0000

A2 Jan 0.0000 100.0000

A2 Feb 0.0000 100.0000

A2 Mar 0.0000 100.0000

A2 Apr 0.0000 104.0000

A3 Jan 0.0000 103.9364

A3 Feb 0.0000 106.9364

A3 Mar 0.0000 107.8545

A3 Apr 0.0000 107.8545

----------------------------------------------------

CONSTRAINT MaxInventory[month] :

month Slack Shadow Price

-------------------------------------------

Jan 480.0000 0.0000

Feb 800.0000 0.0000

Mar 800.0000 0.0000

Apr 800.0000 0.0000

-------------------------------------------

END

De acuerdo a la solución, la ganancia es ahora $2.2M lo cual es considerablemente mayor que en el modelo Planning3, debido a que ahora estamos trabajando con cuatro meses. Esto viene de un total de Ingresos de $5.4M y un costo total de $3.1M, mucho de lo cual viene del costo de producción, ya que nosotros mantenemos un Inventario bajo justo para Enero. Sí usted mira la variable Produce (Producción) en la solución, notará que estamos produciendo los productos A1 y A3 para el período completo que fué planificado, aunque no siempre satisfaga la demanda. El Producto A2, por el otro lado, es producido solamente con 1800 unidades en January (Enero),ya que no tiene suficiente capacidad para producir los tres productos. En Enero, el Modelo decidió producir 320 unidades extras de A3, como fueron requeridas por la demanda, para poner suficiente en el inventario tal de satisfaga la demanda de Febrero.

Sesión 5: Un Modelo de Planificación de la Producción con Múltiples Plantas Cuando formulamos un modelo para compañías grandes, frecuentemente encontrará que no están limitadas a una sola planta para producir los productos. Además en esta sesión usted creará un modelo de planificación de la producción que incluye múltiples plantas. Tomará el modelo de la sesión previa y le agregará otros índices plantas, los cuales representan a todas las plantas disponibles para producir los productos. Luego irá a través del modelo, paso a paso y actualizará todos los vectores variables y restricciones para explicar el nuevo índice.

Nuevos Conceptos en esta Sesión

Descripción del Problema: Un Modelo de Planificación de la Producción con Múltiples Plantas

Formulación del Modelo con MPL

Page 28: Tutorial de MPL

Ingrese Nuevos Elementos al Modelo, paso a paso

Resuelva el Modelo y Analice la Solución

Nuevos Conceptos en esta Sesión Índices de Plantas y otras Localizaciones Los Índices de Localización son bastante comunes cuando se formula modelos de planificación de la producción. Un ejemplo de un Índice de Localización, debe ser para representar las plantas donde la compañía produce los productos. Otros ejemplos deben incluir Almacenes, Fábricas, Centros de Distribución, etc. Esto es común, cuando se trabaja con modelos que incluyen índices de localización, donde el embarque es permitido entre localizaciones. Esos modelos a menudo son llamados modelos de Distribución o modelos de transporte y serán cubiertos más tarde en otras sesiones. Archivos Externos de Datos Cuando se formula modelos pequeños y sencillos, es razonable dejar las definiciones de datos dentro del modelo. Tan pronto como empiece a trabajar con modelos multidimensionales, llegan las dificultades de su manejo y es necesario mover los datos a archivos separados. Mantenga los datos separados del modelo, mejore la legibilidad del modelo y haga más fácil el mantenimiento de los datos. El modelo que está creando en esta sesión tiene múltiples índices, producto, mes y planta, y vectores de datos tal como la demanda, que es bidimensional y puede ser movido a un archivo de datos separado. En el modelo, en lugar de listar todos los elementos para el vector de datos, puede usar la palabra clave DATAFILE y luego usar el nombre de los archivos de datos como se muestran abajo: Demand [product, month] := DATAFILE(&quot;Demand.dat&quot;);

Descripción del Problema: Un Modelo de Planificación de la Producción con Múltiples Plantas En esta sesión, usted creará la formulación de un nuevo modelo de Planificación de la Producción que incluye múltiples plantas así como períodos múltiples, los cuales fueron presentados en la sesión 4. Lo que usted quiere, es decidir cuánto producir de cada producto, para cada mes, en cada planta, así como cuánto almacenar y cuánto vender, para cada mes, en cada planta. En este nuevo problema tendrá cuatro diferentes plantas p1, p2, p3, and p4. Cualquiera de esas plantas puede producir los tres productos. Cree un índice llamado plants (Plantas) que contiene las cuatro diferentes plantas, y luego actualice el modelo de acuerdo a como vaya agregando al índice los vectores aplicables. Como en la sesión previa, los precios de venta permanecen iguales para cada producto $120.00, $100.00, y $150.00, respectivamente. La demanda de los productos también permanece igual como en la sesión previa. Refiérase a la tabla de demanda en la Sesión 3 para los datos necesarios. Ahora que tiene múltiples plantas, los costos de producción son diferentes para cada planta. Estos datos se presentan en la tabla de abajo.

Costos de producción A1 A2 A3

planta 1 $73.30 $52.90 $65.40

planta 2 $79.00 $52.00 $66.80

planta 3 $75.80 $52.10 $50.90

planta 4 $82.70 $63.30 $53.80

Page 29: Tutorial de MPL

La rata de producción para cada producto es diferente en cada planta y se muestra en la tabla siguiente:

Rata de producción A1 A2 A3

planta 1 500 450 450

planta 2 550 450 300

planta 3 450 350 300

planta 4 550 400 350

Formulación del Modelo en MPL El listado de abajo es el modelo completo de la formulación para Planning 5. Los agregados al modelo son resaltados en negritas para hacerle más fácil ver los cambios con respecto al modelo de la sesión 4. TITLE

Production_Planning5;

INDEX

product := (A1, A2, A3);

month := (Jan, Feb, Mar, Apr);

plant := (p1, p2, p3, p4);

DATA

Price[product] := (120.00, 100.00, 115.00);

Demand[product, month] := DATAFILE("Demand.dat");

ProdCost[plant, product] := DATAFILE("ProdCost.dat");

ProdRate[plant, product] := DATAFILE("ProdRate.dat");

ProdDaysAvail[month] := (23, 20, 23, 22);

InvtCost[product] := (3.50, 4.00, 3.00);

InvtCapacity := 800;

VARIABLES

Produce[plant, product, month] -> Prod;

Inventory[product, month] -> Invt;

Sales[product, month] -> Sale;

MACROS

TotalRevenue := SUM(product, month: Price * Sales);

TotalProdCost := SUM(plant, product, month: ProdCost * Produce);

TotalInvtCost := SUM(product, month: InvtCost * Inventory);

TotalCost := TotalProdCost + TotalInvtCost;

MODEL

MAX Profit = TotalRevenue - TotalCost;

SUBJECT TO

ProdCapacity[plant, month] -> PCap:

SUM(product: Produce / ProdRate) <= ProdDaysAvail;

InvtBal[product, month] -> IBal:

SUM(plant: Produce) + Inventory[month-1] = Sales + Inventory;

MaxInventory[month] -> MaxI:

SUM(product: Inventory) <= InvtCapacity;

BOUNDS

Sales <= Demand;

END

Ingrese Nuevos Elementos al Modelo Paso a Paso Paso 1: Empiece MPL y Cree un Nuevo Modelo

1. Inicie la aplicación MPL. 2. Elija File (Archivo) | Open (Abrir) y abra el modelo de la sesión previa Planning4.mpl. 3. Elija File (Archivo) | Save As (Guardar Como) para guardar el nuevo modelo Planning5.mpl.

Page 30: Tutorial de MPL

Paso 2: Cambie el Título del Modelo Cambie el Título del modelo para que se refleje que usted trabajando con el modelo Planning5:

TITLE

Production_Planning5;

Paso 3: Agregue al Modelo el Índice de localización 'plant' (planta) En este ejemplo, tiene cuatro localizaciones de planta diferentes. Cree un nuevo índice al que llamará plant (planta). Este índice tendrá cuatro elementos p1, p2, p3, y p4 para representar cada período de los cuatro meses planificados como períodos. Agregue la siguiente definición para el índice plant (planta) a la sección INDEX (INDICE): INDEX

product := (A1, A2, A3);

month := (Jan, Feb, Mar, Apr);

plant := (p1, p2, p3, p4);

Paso 4: Cambie la definición del Vector de Datos 'Demand'(Demanda) Para leer Datos desde un Archivo Externo de Datos En esta sesión, moverá los valores de los datos del vector de datos bidimensional al archivo externo de datos. Cuando se trabaja con vectores de datos que tienen dos dimensiones o más, a menudo es buena idea mover los valores de los datos a un archivo externo de datos en lugar de listar todos los números directamente en el archivo del modelo. Esto mantiene los datos separados del modelo, mejorando la legibilidad del modelo, y hace más fácil el mantenimiento de los datos. El primer vector de datos que usted quiere mover a un archivo externo de datos es el vector Demand. En la sección DATA (DATOS), use el comando Cut (Cortar) del menú Edit para remover la lista de los números para el vector demanda y luego ingrese la palabra clave DATAFILE (Archivo de Datos) y el archivo Demand.dat se colocará como sigue: DATA

Price [product] :=(120.00, 100.00, 115.00);

Demand [product, month] :=DATAFILE("Demand.dat");

Paso 5: Cree el Archivo de Datos 'Demand.dat' El próximo paso es crear el archivo de datos Demand.dat. Primero, abra una nueva ventana del editor del modelo eligiendo New (Nuevo) en el menú File (Archivo). Sí usted usó el comando Edit (Editar) | Cut (Cortar) en el Paso 4 anterior para retirar los valores de datos, ahora puede usar el comando Edit(Editar) | Paste(Pegar) para colocar nuevamente los datos dentro del archivo de datos. De otra manera, usted puede usar la tabla de datos de la demanda de la descripción del problema en la sesión 3 para ingresar los valores de los datos dentro del archivo de datos como sigue: ! Demand.dat - Demand per month for each product

!

! Demand [product,month]:

!

! Jan Feb Mar Apr

! ----------------------------

4300, 4200, 6400, 5300,

4500, 5400, 6500, 7200,

5400, 6700, 7800, 8200

Las líneas que empiezan con marcas de exclamación "!" son comentarios usados para mejorar su lectura. Los números en el archivo de datos pueden ser separados por una coma o espacio o ambos. Después que ha ingresado todos los datos guarde el archivo como Demand.dat en el folder del tutor.

Paso 6: Aumente los vectores de Datos 'ProdCost' y 'ProdRate' para incluir el Índice 'plant' Dos de los Vectores de Datos, ProdCost y ProdRate, necesitan aumentarse para incluir el índice plant. El vector de datos ProdCost es definido ahora por dos índices dominio, plant (planta) y product (producto) y los valores de los datos serán obtenidos desde un archivo de datos externo. Los valores del vector de datos ProdRate también se obtendrán desde un archivo de datos. En el editor del modelo, agregue el índice,

Page 31: Tutorial de MPL

plant, para ambas declaraciones de los vectores de datos ProdCost y ProdRate, y siga con los nombres de archivos de datos ProdCost.dat yProdRate.dat respectivamente como sigue: ProdCost[plant, product] := DATAFILE("ProdCost.dat");

ProdRate[plant, product] := DATAFILE("ProdRate.dat");

ProdDaysAvail[month] := (23, 20, 23, 22);

InvtCost[product] := (3.50, 4.00 3.00);

InvtCapacity := 800;

Paso 7: Cree los archivos de Datos para los Vectores de Datos 'ProdCost' y 'ProdRate' Ahora abra una nueva ventana del editor seleccionando en el menú File (Archivo) | New (Nuevo) para ingresar el archivo de datos. Escriba los datos desde la tabla Production Cost en la descripción del problema como sigue: !

! ProdRate.dat - Items produced per day

!

! ProdRate[plant, product]:

!

! A1 A2 A3

! ------------------

500, 450, 450,

550, 450, 300,

450, 350, 300,

550, 400, 350

Otra vez, las líneas que empiezan con las marcas de exclamación "!", son comentarios usados para facilitar su lectura. Después que ha ingresado todos los datos, guarde el archivo usando el nombre ProdCost.dat. Para la tasa de producción cree un nuevo archivo de datos llamado ProdRate.dat, usando los valores de la tabla en la descripción del problema.

!

! ProdRate.dat - Items produced per day

!

! ProdRate[plant, product]:

!

! A1 A2 A3

! ------------------

500, 450, 450,

550, 450, 300,

450, 350, 300,

550, 400, 350

Paso 8: Actualice la Variable 'Produce'(Producción) para incluir el Índice 'plant'(Planta) Para determinar cuánto quiere producir de cada producto, en cada planta, usted necesita agregar el índice plant (planta) a la definición del vector de la variable Produce (producción) como sigue:

VARIABLES

Produce[plant, product, month] -> Prod;

Inventory[product, month] -> Invt;

Sales[product, month] -> Sale;

Paso 9: Agregue el Índice 'plant'(planta) a la sumatoria 'TotalProdCost' Puesto que la variable vector Produce (producción) ahora incluye el nuevo índice plant, el cálculo del costo total de producción en la sección MACROS necesita también ser actualizada para incluir el índice plant: MACROS

TotalRevenue := SUM(product, month: Price * Sales);

TotalProdCost := SUM(plant, product, month: ProdCost * Produce) ;

TotalInvtCost := SUM(product, month: InvtCost * Inventory);

TotalCost := TotalProdCost + TotalInvtCost;

Page 32: Tutorial de MPL

La función objetivo no cambia por si misma cuando usted está usando la misma macro de la sesión anterior. Paso 10: Agregue el Índice 'plant' a la Restricción 'ProdCapacity' El cambio para la restricción capacidad de producción es muy sencillo. Agregue el índice plant a la declaración de la capacidad de producción y el resto de la restricción permanece igual. SUBJECT TO

ProdCapacity[plant, month] -> PCap:

SUM(product: Produce / ProdRate) <= ProdDaysAvail;

Paso 11: Agregue la Sumatoria de la Variable 'Produce'(Producción) sobre el Indice 'plant'(Planta) a la Restricción de Equilibrio de Inventario Ahora usted puede producir los productos en cualquiera de las cuatro plantas, además, usted necesita actualizar la restricción de equilibrio del inventario para incluir una sumatoria, sobre todas las plantas, de la variable vector Produce. InvtBal[product, month] -> IBal:

SUM(plant: Produce) + Inventory[month-1] = Sales + Inventory;

Después que ha terminado de ingresar el modelo, usted debe guardarlo eligiendo Save(Guardar) del menú File(Archivo).

Resuelva el Modelo y Analice la Solución Puesto que hemos agregado más índices al modelo, el número de variables ha incrementado considerablemente. Normalmente, cuando se trabaja con modelos grandes, el modelador quiere incluir solo algunos de los valores en la solución. En nuestro caso, para reducir el resultado, incluiremos solo las variables que tienen valor en la solución diferente de cero. MPL tiene un número de cuadro de diálogos de opciones en el menú Options (Opciones) donde usted puede cambiar los parámetros preestablecidos del programa. Uno de los cuadros de diálogo es el Solution File Options (Opciones del Archivo de Soluciones) donde usted puede ajustar lo que está incluido en el archivo de la solución. Para cambiar lo pre establecido, tal que incluya solo valores diferentes de cero en el archivo de la solución, haga lo siguiente:

1. Del menú Options(Opciones) elija Solution File(Archivo de Soluciones) para abrir el cuadro de diálogo Options mostrado abajo:

Cuadro de Diálogo Opciones del Archivo de soluciones

2. Marque la opción Nonzero Values Only (Solo valores diferentes de cero) haciendo Clic sobre él. 3. Cierre el Cuadro de Diálogo, presionando el botón OK.

Después que ha cambiado la opción Nonzero Values Only (Solo Valores diferentes de cero), el próximo paso es resolver el modelo eligiendo Solve CPLEX del menú Run (Ejecutar). Si todo está bien MPL visualizará el mensaje "Optimal Solution Found" (Solución Óptima Encontrada). Si hubiera algún mensaje de error de sintáxis, por favor verifique la formulación del modelo ingresado anteriormente en esta sesión.

Page 33: Tutorial de MPL

Como los modelos que está trabajando serán muy grandes, usted tenderá a ver ciertas partes de la solución en lugar del archivo completo de la solución. Esta vez, en lugar de listar el archivo completo de la solución, estaremos usando la ventana del árbol de definiciones del modelo para ver solo las partes de la solución que nos interesa. La ventana de definiciones del modelo le permite ver todos los ítems definidos en la formulación del modelo en un árbol jerárquico donde cada rama corresponde a la sección en el modelo. En MPL normalmente es una buena idea dejar la ventana de árbol abierta todo el tiempo. MPL actualizará automáticamente su contenido cada vez que usted guarda su modelo. Para ver las definiciones del modelo Planning5, elija Model Definitions (Definiciones del Modelo) del menú View (Ver).

Ventana Definiciones del Modelo Planning5

Desde la ventana de árbol usted puede seleccionar alguno de los items definidos en el modelo para ver sus valores actuales de ese item. Por ejemplo, para ver los valores de la variable Produce, haga doble click sobre el item Produce en el árbol, o seleccionelo y presione el botónView(Ver). Esto visualizará una ventana conteniendo solo los valores de la variable Produce(Producción). VARIABLE Produce[plant,product,month] :

plant product month Activity Reduced Cost

-----------------------------------------------------------

p1 A1 Jan 4300.0000 0.0000

p1 A1 Feb 4200.0000 0.0000

p1 A1 Mar 6400.0000 0.0000

p1 A1 Apr 5300.0000 0.0000

p2 A2 Jan 4500.0000 0.0000

p2 A2 Feb 5400.0000 0.0000

p2 A2 Mar 6500.0000 0.0000

p2 A2 Apr 7200.0000 0.0000

p3 A3 Jan 5400.0000 0.0000

p3 A3 Feb 6000.0000 0.0000

p3 A3 Mar 6900.0000 0.0000

p3 A3 Apr 6600.0000 0.0000

p4 A3 Feb 700.0000 0.0000

p4 A3 Mar 900.0000 0.0000

p4 A3 Apr 1600.0000 0.0000

-----------------------------------------------------------

Sí usted está mirando los valores de las actividades para la variable Produce (Producción), verá que esta vez estamos satisfaciendo la demanda para todos los productos, puesto que ahora tenemos suficiente capacidad. El modelo decide qué plantas y para qué productos son usadas. Por ejemplo, la planta p1 es usada para producir el producto A1, la planta p2 es usada para el producto A2, y la planta p3 y p4 son usadas para el producto A3.

Page 34: Tutorial de MPL

Sí usted va a la ventana de árbol otra vez y abre una ventana para la restricción ProdCapacity usted obtendrá los siguientes valores como solución. CONSTRAINT ProdCapacity[plant,month] :

plant month Slack Shadow Price

--------------------------------------------------

p1 Jan 14.4000 0.0000

p1 Feb 11.6000 0.0000

p1 Mar 10.2000 0.0000

p1 Apr 11.4000 0.0000

p2 Feb 8.0000 0.0000

p2 Mar 8.5556 0.0000

p2 Apr 6.0000 0.0000

p3 Jan 5.0000 0.0000

p4 Jan 23.0000 0.0000

p4 Feb 18.0000 0.0000

p4 Mar 20.4286 0.0000

p4 Apr 17.4286 0.0000

--------------------------------------------------

Aquí hay mucha holgura para cada planta y cada mes en la restricción de la capacidad de producción. Esto puede ser interpretado como que nosotros podemos producir una cantidad más de los productos, pero ello no es necesario cuando ya estamos satisfaciendo la demanda. Puesto que la restricción de la capacidad de la producción usa los días de producción como una unidad de medida, los valores de holgura representan cuántos días por mes cada una de las plantas está inactiva u ociosa.

Sesión 6: Aumentando el Modelo para Permitir Embarques entre las Plantas En la sesión 5, usted encontró un modelo para una compañía de producción que usa múltiples plantas para producir sus productos. Lo que usted debe notar acerca del modelo es que mientras que cada una de las diferentes plantas puede ser usada para producir individualmente, todas las ventas e inventarios fueron manejadas colectivamente, desde un origen común para toda la compañía. Ahora ampliará ese modelo para permitir que cada planta venda los productos y mantenga inventario individualmente. Además, para satisfacer la demanda en la manera más eficiente, los productos pueden ser embarcados entre las plantas, según se necesite. Para ampliar el modelo usted necesitará incluir dos nuevos índices ficticios, fromplant, y toplant, los cuales representan las plantas origen y las plantas destino. También actualizará las variables Inventory y Sales para incluirlas en el índice plant, así como cada planta puede ahora vender los productos y mantener inventario cada uno independientemente del otro.

Nuevos Conceptos en esta Sesión

Descripción del Problema: Permite Embarques entre las Plantas

Formulación del Modelo con MPL

Ingrese nuevos Elementos al Modelo Paso a Paso

Resuelva el Modelo y Analice la Solución

Nuevos Conceptos en esta Sesión Modelos de Transporte Los Modelos que permiten embarques entre localizaciones son algunas veces llamados Modelos de Distribución o de Transporte. Normalmente, en modelos de transporte, usted tiene orígenes con cierta disponibilidad, destinos con ciertos requerimientos, y usted necesita embarcar los productos desde esos orígenes a esos destinos. En algunos casos, usted tiene modelos de transporte con múltiples niveles. Por ejemplo, pueden haber embarques desde las plantas hacia los depósitos, y desde esos depósitos a las tiendas de ventas al por menor. Modelos de Transbordo Otro grupo de modelos de distribución son los modelos de transbordo. Esos modelos típicamente surgen cuando usted tiene múltiples localizaciones, donde se producen bienes y también son centros de demanda.

Page 35: Tutorial de MPL

Puesto que no hay orígenes ni destinos específicos, usted puede embarcar desde una localización a cualquier otra localización. Índices Ficticios Los índices Ficticios son muy usados cuando usted necesita definir un vector, el cual usa el mismo índice más de una vez, como un subíndice. Cuando se embarcan los productos entre plantas usted necesita crear una variable vector, que representa cuánto embarcar entre las plantas. Puesto que las plantas origen y plantas destino vienen del mismo conjunto de plantas, usted necesita dos índices ficticios para las plantas. El primer índice ficticio es requerido para representar las plantas origen, y el segundo índice ficticio es requerido para representar las plantas destino. Usando Condiciones Where (Dónde) sobre las Variables Vector Algunas veces, cuando se trabaja con variables vector multidimensionales encontrará casos donde no todos los elementos del vector son válidos, o tienen algún significado. Por ejemplo, en los modelos de transbordo tendría poco sentido embarcar un producto de cierta parte de la planta a esa misma planta. En esos casos, se usa la condición WHERE (Dónde) sobre la variable para eliminar elementos innecesarios. Por ejemplo, en un modelo de transbordo puede eliminar la posibilidad de embarcar a la misma localización, definiendo la variable como sigue: VARIABLES

Ship[fromplant,toplant] WHERE (fromplant <> toplant);

En este caso, la condición (fromplant <> toplant) elimina todos los elementos del vector, donde la planta origen es la misma que la planta destino.

En algunos casos, hay elementos que necesitan ser excluidos cuando no están basados sobre los valores de los índices. Ellos deben estar basados en algún vector de datos en el modelo. Normalmente, se tiene un vector costo conteniendo cuánto es el costo de embarcar entre las plantas. Para esas plantas, sí el embarque entre ellas no es factible, puede ingresar un valor especial para el costo, tal como cero, para usarlo como un identificador. Luego, en la definición de la variable, puede usar este vector de datos para excluir las rutas de embarque que no son factibles, como sigue: VARIABLES

Ship[fromplant,toplant]

WHERE (ShipCost[fromplant,toplant] > 0);

Restricciones de Equilibrio de Plantas Cuando se trabaja con modelo de transbordo, necesita asegurarse que la cantidad de productos embarcados a una planta, más cuánto es producido y cuánto es retirado del inventario, debe ser igual a cuánto es embarcado desde la planta, más cuánto es vendido y cuánto ha quedado en inventario. En pocas palabras, cada cosa que llega a la planta debe ser igual a lo que sale de la planta. Esta clase de restricciones es normalmente llamada Restricciones de Equilibrio de plantas. A continuación vemos un ejemplo simple de una restricción de equilibrio de planta: PlantBal[plant, product, month]:

Produce + Inventory[month-1]

+ SUM(fromplant: Ship[fromplant, toplant:=plant])

=

Sales + Inventory

+ SUM(toplant: Ship[fromplant:=plant, toplant]);

Notará que esta restricción es similar a la restricción de equilibrio de inventario que usted encontró en sesiones anteriores. La única diferencia es que ahora tiene que tomar en cuenta que estamos embarcando a y desde cada una de las plantas ingresando una suma sobre cada una de las plantas para la variable Ship (Embarque). La asignación del índice 'toplant:=plant', en la primera suma, nos permite especificar que el subíndice toplant debe tomar el valor del subíndice plant para la restricción PlantBal. Esta suma adiciona todos los embarques de cada una de las plantas a una planta en particular en esa restricción. De manera similar, la asignación del índice 'fromplant:=plant', en la segunda suma, especifica que el subíndice fromplant debe tomar el valor del subíndice plant.

Page 36: Tutorial de MPL

Descripción del Problema: Adiciones para Permitir Embarques entre Plantas En esta sesión, un nuevo modelo será creado donde cada planta actúa ahora separadamente como un centro de demanda para esos productos, y puede también mantener inventario. Usará el modelo creado en la Sesión 5, y haga las adiciones necesarias y luego actualícelo. Puesto que cada planta puede vender los productos, ahora tenemos una demanda diferente para cada planta, así como también para cada producto y cada mes. La demanda está dada en la siguiente tabla:

Tabla de Demanda

Plant Product Jan Feb Mar Apr

p1

A1 4300 4200 6400 5300

A2 4500 5400 6500 7200

A3 5400 6700 7800 8200

p2

A1 5100 6200 5400 7600

A2 6300 7100 5200 6300

A3 4800 6500 5000 7200

p3

A1 4100 6100 4700 5800

A2 5300 5200 5700 4100

A3 4200 4100 5200 6300

p4

A1 4300 4100 5300 4500

A2 5300 6400 4200 6200

A3 5600 5200 3800 4100

Estos datos tienen tres dimensiones, plantas, productos y meses. En modelos de programación Lineal es muy típico tener datos con dimensiones múltiples, posiblemente hasta ocho o más. En la próxima sesión, actualizaremos los datos de la demanda para incluir una dimensión más; máquinas, creando así un vector de cuatro dimensiones. La capacidad del inventario es ahora diferente para cada planta. Tenemos cuatro valores para la capacidad del inventario, uno para cada planta, 800, 400, 500, y 400 respectivamente. Puesto que ahora tenemos múltiples plantas, cada una de las cuales puede mantener su inventario, ahora tenemos diferentes costos de inventario para cada planta y cada producto. Los nuevos valores de costos para el inventario se muestran a continuación:

Inventory Cost A1 A2 A3

p1 $8.50 $7.00 $6.50

p2 $9.80 $9.80 $9.80

p3 $7.50 $7.50 $7.50

p4 $9.30 $8.00 $6.50

Finalmente, puesto que estamos permitiendo embarques entre las plantas, hay ciertos costos involucrados para embarcar un producto, como se muestra en la tabla que sigue:

Shipping Cost p1 p2 p3 p4

Page 37: Tutorial de MPL

p1 - $15.00 $21.00 $13.00

p2 $16.00 - $12.00 $12.00

p3 $14.00 $17.00 - $15.00

p4 $21.00 $13.00 $10.00 -

Como usted puede ver, no hay valores en la tabla donde la planta origen es la misma que la planta destino. Esto es porque no hay ningún beneficio embarcar a la misma planta.

Formulación del Modelo en MPL El listado de abajo es la formulación del modelo completo para Planning6. Las adiciones al modelo están resaltadas en negrita para hacer más fácil que se vean los cambios respecto al modelo de la Sesión 5. TITLE

Production_Planning6;

INDEX

product := (A1, A2, A3);

month := (Jan, Feb, Mar, Apr);

plant := (p1, p2, p3, p4);

fromplant := plant;

toplant := plant;

DATA

Price[product] := (120.00, 100.00, 115.00);

Demand[plant, product, month] := DATAFILE("Demand6.dat");

ProdCost[plant, product] := DATAFILE("ProdCost.dat");

ProdRate[plant, product] := DATAFILE("ProdRate.dat");

ProdDaysAvail[month] := (23, 20, 23, 22);

InvtCost[plant, product] := DATAFILE("InvtCost.dat");

InvtCapacity[plant] := (800, 400, 500, 400);

ShipCost[fromplant, toplant] := DATAFILE ("ShipCost.dat");

VARIABLES

Produce[plant, product,month] -> Prod;

Inventory[plant, product, month] -> Invt;

Sales[plant,product, month] -> Sale;

Ship[product, month, fromplant, toplant]

WHERE (fromplant <> toplant);

MACROS

TotalRevenue := SUM(plant, product,month: Price * Sales);

TotalProdCost := SUM(plant, product, month: ProdCost* Produce);

TotalInvtCost := SUM(plant, product, month: InvtCost * Inventory);

TotalShipCost := SUM(product, month, fromplant,toplant: ShipCost *

Ship);

TotalCost := TotalProdCost + TotalInvtCost + TotalShipCost;

MODEL

MAX Profit= TotalRevenue - TotalCost;

SUBJECT TO

ProdCapacity[plant, month] -> PCap:

SUM(product: Produce / ProdRate) <= ProdDaysAvail;

PlantBal[plant, product, month] -> PBal:

Page 38: Tutorial de MPL

Produce + Inventory[month-1]

+ SUM(fromplant:Ship[fromplant, toplant:=plant])

=

Sales + Inventory

+ SUM(toplant: Ship[fromplant:=plant,toplant]);

MaxInventory[plant, month] -> MaxI:

SUM(product: Inventory) <= InvtCapacity;

BOUNDS

Sales < Demand ;

END

Ingrese Nuevos Elementos al Modelo Paso a Paso Paso 1: Inicie MPL y Cree un Modelo Nuevo

1. Inicie la aplicación MPL. 2. Elija File(Archivo) | Open (Abrir) y abra el modelo de la sesión anterior Planning5.mpl. 3. Elija File(Archivo) | Save As(Guardar Como) para guardarlo como un nuevo archivo del

modelo Planning6.mpl. Paso 2: Cambie el Título al Modelo Cambie el Título al modelo para que refleje que se está trabajando con el modelo Planning6: TITLE

Production_Planning6;

Paso 3: Agregue al Modelo Índices Ficticios para las Plantas Origen y Plantas Destino En esta sesión, expandiremos el modelo para permitir embarques entre las plantas. Los Alias indexes (índices ficticios) son usados cuando se necesita definir un vector, el cual se refiere al mismo índice más de una vez, como un subíndice. Los índices ficticios son una copia exacta del índice definido previamente.

En este caso, está creando una variable vector representando cuánto embarcar entre las plantas. Lo que significa que necesita dos índices ficticios para representar las plantas origen y las plantas destino. Agregue las siguientes definiciones para los nuevos índices ficticios que se llamarán fromplant y toplant al final de la sección INDEX: INDEX

product := (A1, A2, A3);

month := (Jan, Feb, Mar, Apr);

plant := (p1, p2,p3, p4);

fromplant := plant;

toplant := plant;

Paso 4: Actualice el Vector de Datos 'Demand' para incluir el Índice 'plant' Ahora tenemos una demanda diferente para cada planta. La definición para el vector de datos Demand necesita ser aumentado para incluir el índice plant. En el editor del modelo, agregue el índice plant al vector de datos Demand y cambie el nombre del archivo a Demand6.dat. DATA

Price[product] := (120.00, 100.00, 115.00);

Demand[plant, product, month] := DATAFILE("Demand6.dat");

Puesto que el vector Demand tiene tres índices, el archivo de datos necesita ser actualizado. Además, usted está creando un nuevo archivo de datos llamado 'Demand6.dat' usando los valores de datos de la tabla en la descripción del problema dado anteriormente en esta sesión. Ingrese los valores de los datos al archivo de datos, como sigue:

Page 39: Tutorial de MPL

!

! Demand6.dat - Demand for each product and each plant

!

! Demand[plant,product,month]:

!

! Jan Feb Mar Apr

! ---------------------------

!plant 1:

4300, 4200, 6400, 5300,

4500, 5400, 6500, 7200,

5400, 6700, 7800, 8200,

!plant 2:

5100, 6200, 5400, 7600,

6300, 7100, 5200, 6300,

4800, 6500, 5000, 7200,

!plant 3:

4100, 6100, 4700, 5800,

5300, 5200, 5700, 4100,

4200, 4100, 5200, 6300,

!plant 4:

4300, 4100, 5300, 4500,

5300, 6400, 4200, 6200,

5600, 5200, 3800, 4100

Cuando se tiene tres dimensiones de datos en los archivos de datos, liste los valores de los datos en el mismo orden que los índices fueron definidos en el vector de datos del modelo. Por ejemplo, en el archivo de datos de arriba Demand6, el índice que está más a la izquierda es el índice plant, seguido por el índice product y el índice month. Paso 5: Aumente el Vector de Datos 'InvtCost' y el Dato Constante 'InvtCapacity' Para Incluir el Indice 'plant' Puesto que ahora se puede almacenar inventarios en cada planta, se necesita actualizar el costo del inventario y los datos de la capacidad del inventario para incluir el índice plant. En el editor del modelo, agregue el índice plant en la declaración del vector de datos InvtCost y el dato constante InvtCapacity. Luego, para el vector de datos InvtCost elimine la lista de números y reemplácelo con la palabra clave DATAFILE y el nombre de archivo 'InvtCost.dat.' Para el InvtCapacity elimine el valor 800 y reemplácelo con la lista de cuatro valores, uno por cada planta, tomándolo de la descripción del problema anterior de esta sesión. InvtCost[plant, product] := DATAFILE("InvtCost.dat");

InvtCapacity[plant] := (800, 400, 500, 400);

Después, necesita crear un nuevo archivo de datos llamado 'InvtCost.dat' usando los valores de costos de la tabla de costos del inventario de la descripción del problema. Ingrese los valores de los datos al archivo de datos, como sigue: !

! InvtCost.dat - Inventory cost per item a month

!

! InvtCost [plant,product]:

!

! A1 A2 A3

! -----------------------

8.50, 7.00, 6.50

9.80, 9.80, 9.80

7.50, 7.50, 7.50

9.30, 8.00, 6.50

Paso 6: Agregue un Vector de Datos para los Costos de Embarque Hay ciertos costos involucrados en embarcar productos entre plantas. En el editor del modelo, agregue un nuevo vector de datos llamadoShipCost definido sobre los índices ficticios fromplant y toplant seguido por la palabra clave DATAFILE y el nombre de archivo ShipCost.dat. ShipCost[fromplant, toplant] := DATAFILE("ShipCost.dat");

Page 40: Tutorial de MPL

Después, necesita crear un nuevo archivo de datos llamado ShipCost.dat conteniendo los costos figurados de embarque entre las plantas proporcionados en la descripción del problema. Ingrese los valores de los datos para el archivo de datos, como sigue: !

! ShipCost.dat - Shipping costs from plant to plant

!

! ShipCost [fromplant, toplant]

!

0, 15.00, 21.00, 13.00,

16.00, 0, 12.00, 12.00,

14.00, 17.00, 0, 15.00,

21.00, 13.00, 10.00, 0,

Paso 7: Agregue una Variable Vector para Embarques entre Plantas Estamos permitiendo embarques entre plantas, además, se necesita crear una nueva variable que decida cuánto debe ser embarcado de cada producto por cada mes. Esta variable vector será definida sobre los índices ficticios fromplant y toplant como también los índices product y month. Agregue la siguiente definición a la variable vector Ship de la sección VARIABLES: Ship[product, month, fromplant, toplant]

WHERE (fromplant <> toplant);

Puesto que no queremos embarcar un producto de una planta a la misma planta, estamos usando la condición WHERE para eliminar todos los elementos del vector donde la planta origen es la misma que la planta destino. Paso 8: Agregue el costo Total de Embarque a la Función Objetivo En la sección MACROS agregue una nueva definición para el costo total de embarque llamada TotalShipCost y actualice la macro TotalCost para incluir la nueva macro como sigue: TotalShipCost := SUM(product, month, fromplant, toplant: ShipCost * Ship);

TotalCost := TotalProdCost + TotalInvtCost + TotalShipCost;

Note que la actual función objetivo no necesita ser cambiada a la macro TotalCost que contiene todos los cambios. Paso 9: Aumente la Restricción de Equilibrio de Inventario a la Restricción de Equilibrio de Planta, Agregando la Variable 'Ship' Puesto que ahora se permiten embarques entre las plantas, se necesita aumentar la restricción de equilibrio de inventario del modelo anterior a la restricción de equilibrio de planta. Primero, cambie el nombre de la restricción de InvtBal a PlantBal y agregue el índice Plant a la declaración. Luego, puesto que la restricción está ahora declarada sobre el índice Plant no tenemos que sumar sobre el índice Plant para la variable Produce una vez más. PlantBal[plant, product, month] -> PBal:

Produce + Inventory[month-1]

+ SUM (fromplant:Ship[fromplant, toplant:=plant])

=

Sales + Inventory

+ SUM(toplant: Ship[fromplant:=plant, toplant]);

Sobre el lado izquierdo, donde estamos poniendo junto todo lo que está llegando a la planta, agregue una suma para agregar todos los embarques desde cada una de las plantas a la planta actual de la restricción. Dentro de la suma, ingrese la variable Ship con la planta destino tomando el valor del actual índice plant. Por el lado derecho, donde estamos poniendo junto todo lo que está saliendo de la planta, agregue otra suma para agregar todos los embarques de la planta actual a cada una de las otras plantas. Dentro de la suma ingrese la variable Ship esta vez con la planta origen tomando el valor del índice actual plant de la restricción.

Page 41: Tutorial de MPL

Resuelva el Modelo y Analice la Solución El próximo paso es resolver el modelo Planning6 eligiendo Solve CPLEX del menú Run. Sí todo está bien MPL visualizará el mensaje "Optimal Solution Found"(Solución Óptima Encontrada). Si hubiera algún error de sintáxis, por favor verifique y compare la formulación que ingresó con el modelo detallado anteriormente en esta sesión. Usará la ventana de definiciones otra vez como en la Sesión 5 para mirar las partes de la solución en que estamos interesados. Para abrir la ventana de definición del modelo para el modelo Planning6 elija Model Definitions (Definiciones del Modelo) del menú View (Ver).

Ventana Árbol de Definición del Modelo Planning6 Model

Para mirar los valores de la variable Produce, haga doble clic sobre el item Produce en el árbol, o seleccione el item y presione el botón View. Esto visualizará una ventana conteniendo solo los valores de la variable Produce como se muestra a continuación. VARIABLE Produce[plant,product,month] :

plant product month Activity Reduced Cost

-----------------------------------------------------------

p1 A1 Jan 4300.0 0.0

p1 A1 Feb 4200.0 0.0

p1 A1 Mar 6400.0 0.0

p1 A1 Apr 5300.0 0.0

p1 A2 Jan 1080.0 0.0

p1 A3 Jan 5400.0 0.0

p1 A3 Feb 5220.0 0.0

p1 A3 Mar 4590.0 0.0

p1 A3 Apr 5130.0 0.0

p2 A1 Jan 5100.0 0.0

p2 A1 Feb 6200.0 0.0

p2 A1 Mar 5400.0 0.0

p2 A1 Apr 7600.0 0.0

p2 A2 Jan 6177.3 0.0

p2 A2 Feb 3927.3 0.0

p2 A2 Mar 5931.8 0.0

p2 A2 Apr 3681.8 0.0

p3 A1 Jan 4100.0 0.0

p3 A1 Feb 6100.0 0.0

p3 A1 Mar 4700.0 0.0

p3 A1 Apr 5800.0 0.0

p3 A3 Jan 4166.7 0.0

p3 A3 Feb 1933.3 0.0

Page 42: Tutorial de MPL

p3 A3 Mar 3766.7 0.0

p3 A3 Apr 2733.3 0.0

p4 A1 Jan 3850.0 0.0

p4 A1 Feb 2828.6 0.0

p4 A1 Mar 5300.0 0.0

p4 A1 Apr 4500.0 0.0

p4 A3 Jan 5600.0 0.0

p4 A3 Feb 5200.0 0.0

p4 A3 Mar 4677.3 0.0

p4 A3 Apr 4836.4 0.0

-----------------------------------------------------------

Como puede ver, la producción está ahora distribuida entre las plantas de una manera más efectiva. Ciertos productos son claramente mejores de producir en una planta en particular debido a que se toma en cuenta el costo de producción y el costo de embarque. Por ejemplo, el producto A2 es producido en las plantas p1 y p2, pero no en p3 y p4, mientras que el producto A3 es producido en las plantas p1, p3 y p4. El producto A1 es más económicamente producido en todas plantas. Si va a la ventana del árbol otra vez y abre una ventana para la variable Ship obtendrá los siguientes valores en la solución: VARIABLE Ship[product,month,fromplant,toplant] :

product month fromplant toplant Activity Reduced Cost

------------------------------------------------------------------------

A2 Mar p2 p4 331.8 0.0

A3 Mar p4 p3 877.3 0.0

A3 Apr p4 p3 736.4 0.0

------------------------------------------------------------------------

Como se puede ver, el modelo propone que debemos embarcar el producto A2 desde la planta p2 a la planta p4. De manera similar, A3 es embarcado desde la planta p4 a la planta p3. Claramente, las plantas p2 y p4 tienen capacidad extra a un costo bajo que puede ser usado para producir bienes que las plantas p4 y p3 necesitan.

Sesión 7: Formulando Modelos con Datos Dispersos en MPL A menudo, cuando se trabaja con modelos grandes, los datos del modelo tienden a no ser compactos como fueron trabajados en el modelo anterior, sino más bien en un formato disperso. Los datos compactos pueden ser percibidos de la misma manera como los datos en una hoja de cálculo. Ordinariamente, este es usado para vectores de datos con no más de dos dimensiones, donde cada columna y cada fila es llenada con datos. Los datos Dispersos, por otro lado, típicamente involucra múltiples dimensiones, pero no necesariamente contienen valores para cada combinación de los índices. Los datos dispersos son usualmente almacenados en formato de tabla, donde cada columna representa un índice o un valor de dato. Cuando se trabaja con grandes conjunto de datos dispersos, es común trabajar con los datos en un formato de tabla. Esto le permite fácilmente saltarse ciertas combinaciones de los índices, que no son válidos, omitiéndolos en la tabla.

Nuevos Conceptos en esta Sesión

Descripción del Problema: Un Modelo de Planificación con Múltiples Máquinas en cada Planta

Formulación del Model con MPL

Ingrese Nuevos Elementos al Modelo Paso a Paso

Resuelva el Modelo y Analice la solución

Nuevos Conceptos en esta Sesión Índices de Equipos Algunas veces, cuando formulamos modelos de planificación de la producción, la decisión involucra cuáles máquinas usar para producir los productos. Como todas las máquinas no están disponibles en cada planta, este presenta una dispersión en el modelo. Cunado definimos los datos y los vectores de las variables del modelo, utilizamos esa dispersión para asegurar que el tamaño del modelo no sea tan grande. Esto puede

Page 43: Tutorial de MPL

ser logrado, usando un comando estándar WHERE (Dónde) sobre el vector de datos, o usando el operador IN para asociar los índices relevantes.

Usando el Operador IN El operador IN en MPL le permite seleccionar uno de los índices dominio de un índice multidimensional. Por ejemplo, si tiene un índice multidimensional que especifique cuáles máquinas están disponibles y en qué plantas, usted puede usar el operador IN para sumar sobre todas las máquinas para esa planta en particular. INDEX

plant := (p1, p2, p3, p4);

machine := (m11, m12, m13, m21, m22, m31, m32, m41);

PlantMach[plant,machine] :=

(p1.m11, p1.m12, p1.m13,

p2.m21, p2.m22,

p3.m31, p3.m32,

p4.m41);

En el ejemplo de arriba, hemos definido un índice multidimensional llamado PlantMach que asocia a las plantas con las correspondientes máquinas. El índice PlantMach puede ser usado selectivamente, para elegir sólo las máquinas que están disponibles en una planta en particular. Por ejemplo: SUBJECT TO

PlantCapacity[plant] :

SUM(machine IN PlantMach: Produce[machine]) <= MaxCapacity[plant];

En el ejemplo de arriba, sumamos todo cuánto es producido en cada máquina para una planta en particular. Luego nos aseguramos que la producción total esté limitada a la capacidad máxima. Archivos Índices Así como puede almacenar datos en un archivo externo de datos, también puede almacenar índices en archivos de índices externos. Los archivos de índices le permiten almacenar los elementos de un índice en un archivo, en lugar de especificarlos directamente en el modelo. Cuando está definiendo un índice con un archivo índice use la palabra clave INDEXFILE con un nombre de archivo en lugar del listado usual de los elementos. Por ejemplo: INDEX

product := INDEXFILE("Product.idx");

month := INDEXFILE("Month.idx");

plant := INDEXFILE("Plant.idx");

El archivo índice es justamente un archivo de texto estándar que contiene un listado de los elementos índices para un índice particular. Usted puede separar los elementos en el archivo con una coma, un espacio o ambos. Por ejemplo aquí hay un archivo de índice de muestra para el índice product (producto). ! Product.idx - Index element for the product index

A1, A2, A3

Archivo de Datos Dispersos Generalmente, cuando se trabaja con modelos dispersos, los datos involucrados son muy grandes y vienen de otras aplicaciones, tal como base de datos corporativos o de escritorio. En las sesiones anteriores, los datos fueron tecleados en el archivo del modelo o almacenados en un archivo de datos compactos. Cuando trabajamos con conjuntos de datos grandes, se necesita un método más eficiente para importar los datos a MPL desde otras aplicaciones. Para este propósito, MPL tiene la habilidad de leer los datos desde un archivo de datos dispersos. Este archivo le permite ingresar los datos en un formato de tabla estándar, el cual es más cercano a las actuales características de los datos, por ejemplo, desde una base de datos relacional. Un ejemplo de un archivo de datos disperso puede ser como sigue:

ProdCost[plant, machine, product] := SPARSEFILE("ProdCost.dat");

Page 44: Tutorial de MPL

El archivo ProdCost.dat contiene los datos en el formato de columnas orientadas con los índices en las tres primeras columnas y los correspondientes valores de datos al final de cada fila, como sigue: p1, m11, A1, 73.30,

p1, m11, A2, 52.90,

p1, m12, A3, 65.40,

.

p4, m41, A2, 63.30,

p4, m41, A3, 53.80

Por favor note, que MPL le permite también almacenar múltiples columnas de datos en un simple archivo de datos dispersos. Puede especificar cuál columna, agregando una coma y el número de columna de los datos después del nombre de archivo que está dentro del paréntesis. ProdCost [plant, machine, product] := SPARSEFILE("ProdCost.dat", 2);

El uso de archivos de datos dispersos es común en el modelado del mundo real. Esos archivos pueden terminar siendo muy grandes, con múltiples índices y contener cantidades de datos. Frecuentemente, se tendrá múltiples archivos índices y archivos de datos dispersos almacenando todos los datos y dejando que el archivo del modelo sólo tenga las sentencias actuales del modelo, tal como las variables, función objetivo y las restricciones.

Descripción del Problema: Un Modelo de Planificación con Múltiples Máquinas para cada Planta En esta sesión, actualizará el modelo para tener múltiples máquinas distribuidas entre las plantas. Usará el modelo creado en la sesión 6, y haga las adiciones y actualizaciones necesarias. Puesto que ahora tenemos diferentes máquinas dentro de cada planta, el costo de producción y la tasa de producción tienen ahora diferentes valores para cada máquina. La siguiente es una tabla con una sola fila para cada planta, combinación de productos y máquinas que son aplicables.

Tabla de Demanda

Plant Product Product ProdCost ProdRate

p1

m11 A1 $73.30 500

m11 A2 $52.90 450

m12 A3 $65.40 550

m13 A3 $47.60 350

p2

m21 A1 $79.00 550

m21 A3 $66.80 450

m22 A2 $52.00 300

p3

m31 A1 $75.80 450

m31 A3 $50.90 300

m32 A1 $79.90 400

m32 A2 $52.10 350

p4

m41 A1 $82.70 550

m41 A2 $63.30 400

m41 A3 $53.80 350

La decisión de Producción, cuánto producir de cada producto, necesita tomarse en cuenta que ahora tenemos múltiples máquinas. Además, se actualizará la variable Produce(Producción) para incluir el índice machine (Máquina) y luego usará la condición WHERE para excluir los elementos que no son aplicables, tal como la planta p1, máquina m11, y producto A3.

Formulación del Modelo con MPL El listado de abajo es la formulación del modelo completo Planning7. Las adiciones al modelo son resaltadas en negritas para hacer más fácil ver los cambios con respecto al modelo de la sesión 6.

Page 45: Tutorial de MPL

TITLE

Production_Planning7;

INDEX

product := (A1, A2, A3);

month := (Jan, Feb, Mar, Apr);

plant := (p1, p2, p3, p4);

toplant := plant;

fromplant := plant;

machine := (m11, m12, m13, m21, m22, m31, m32, m41);

DATA

Price[product] := (120.00, 100.00, 115.00);

Demand[plant, product, month] := DATAFILE("Demand6.dat");

ProdCost[plant, machine, product] := SPARSEFILE("Produce.dat", 1);

ProdRate[plant, machine, product] := SPARSEFILE("Produce.dat", 2);

ProdDaysAvail[month] := (23, 20, 23, 22);

InvtCost[plant, product] := DATAFILE("InvtCost.dat");

InvtCapacity[plant] := (800, 400, 500, 400);

ShipCost[fromplant, toplant] := DATAFILE ("ShipCost.dat");

VARIABLES

Produce[plant, machine, product, month] -> Prod

WHERE (ProdCost > 0);

Inventory[plant, product, month] -> Invt;

Sales[plant, product, month] -> Sale;

Ship[product, month, fromplant, toplant]

WHERE (fromplant <> toplant);

MACROS

TotalRevenue := SUM(plant, product, month: Price * Sales);

TotalProdCost := SUM(plant, machine, product,month: ProdCost * Produce);

TotalInvtCost := SUM(plant, product, month: InvtCost * Inventory);

TotalShipCost := SUM(product, month, fromplant, toplant: ShipCost *

Ship);

TotalCost := TotalProdCost + TotalInvtCost + TotalShipCost;

MODEL

MAX Profit = TotalRevenue - TotalCost;

SUBJECT TO

ProdCapacity[plant, machine, month] -> PCap:

SUM(product: Produce / ProdRate) <= ProdDaysAvail;

PlantBal[plant, product, month] -> PBal:

SUM(machine: Produce) + Inventory[month-1]

+ SUM(fromplant: Ship[fromplant, toplant:=plant])

=

Sales + Inventory

+ SUM(toplant: Ship[fromplant:=plant, toplant]);

MaxInventory[plant, month] -> MaxI:

SUM(product: Inventory) <= InvtCapacity;

BOUNDS

Sales < Demand;

END

Ingrese Nuevos Elementos al Modelo Paso a Paso Paso 1: Inicie MPL y Cree un Nuevo Modelo

1. Inicie la aplicación MPL. 2. Elija File (Archivo) | Open (Abrir) y abra el modelo de la sesión anterior Planning6.mpl. 3. Elija File (Archivo) | Save As (Guardar Cómo) para guardarlo como un nuevo archivo del

modelo Planning7.mpl. Paso 2: Cambie el Título del Modelo Cambie el título del modelo para que refleje que se está trabajando con el modelo Planning7.

Page 46: Tutorial de MPL

TITLE

Production_Planning7;

Paso 3: Agregue al Modelo el Índice 'machine' En este modelo, cada planta tiene ahora múltiples máquinas. Para crear un índice para las máquinas agregue la siguiente definición para el índice machine (máquina) en la sección INDEX. INDEX

product := (A1, A2, A3);

month := (Jan, Feb, Mar, Apr);

plant := (p1, p2, p3, p4);

toplant := plant;

fromplant := plant;

machine := (m11, m12, m13, m21, m22, m31, m32, m41);

Paso 4: Actualice los Vectores de Datos 'ProdCost' y 'ProdRate' para ser Incluidos en el Índice 'machine' El costo de producción y la tasa de producción necesitan ahora ser incluidos al índice de máquinas puesto que tienen diferentes valores para cada máquina. También, puesto que ahora los datos están dispersos, esto es, cada planta no tiene asociado sus máquinas, estaremos almacenando los datos en un archivo de datos dispersos. MPL le permite almacenar múltiples columnas de datos en un archivo sencillo de datos dispersos. Especifique cuál columna va a leer agregando una coma y el número de columna después del nombre del archivo. Actualice las definiciones para los vectores de datos ProdCost y ProdRate para ser incluidos en el índice machine y cambiar el nombre de archivo a un nuevo archivo de datos dispersos llamado Produce.dat. Para el costo de producción especifique el número de columna 1después del nombre de archivo y para la tasa de producción especifique el número de columna 2. DATA

Price[product] := (120.00, 100.00, 115.00);

Demand[plant, product, month] := DATAFILE("Demand6.dat");

ProdCost[plant, machine, product] := SPARSEFILE("Produce.dat", 1);

ProdRate[plant, machine, product] := SPARSEFILE("Produce.dat", 2);

ProdDaysAvail[month] := (23, 20, 23, 22);

InvtCost[product] := DATAFILE("InvtCost.dat");

InvtCapacity[plant] := (800, 400, 500, 400);

ShipCost[fromplant, toplant] := DATAFILE("ShipCost.dat");

Paso 5: Creando Archivos de Datos Dispersos para el Costo de Producción y la Tasa de Producción Ahora necesita crear el archivo de datos dispersos Produce.dat de los datos en la descripción del problema anterior dados en esta sesión. Para crear el archivo de datos para el costo de producción abra una nueva ventana del editor para el archivo de datos llamado Produce.dat y escriba lo siguiente:

! Produce.dat - Production Cost and Rate

!

! ProdCost[plant, machine, product]:

! ProdRate[plant, machine, product]:

!

p1, m11, A1, 73.30, 500,

p1, m11, A2, 52.90, 450,

p1, m12, A3, 65.40, 550,

p1, m13, A3, 47.60, 350,

p2, m21, A1, 79.00, 550,

p2, m21, A3, 66.80, 450,

p2, m22, A2, 52.00, 300,

p3, m31, A1, 75.80, 450,

p3, m31, A3, 50.90, 300,

p3, m32, A1, 79.90, 400,

Page 47: Tutorial de MPL

p3, m32, A2, 52.10, 350,

p4, m41, A1, 82.70, 550,

p4, m41, A2, 63.30, 400,

p4, m41, A3, 53.80, 350,

Paso 6: Actualice el Vector de la Variable Produce para incluirla en el Índice 'machine' La variable Produce necesita ahora tener el índice machine en las declaraciones como necesitamos saber en qué máquina es producido cada producto. Además, puesto que no todas la máquinas están en cada planta necesitamos excluir las combinaciones que no son válidas. Esto es hecho usando la condición where sobre el vector de datos ProdCost. Las combinaciones de índices son usados sólo cuando ProdCost es mayor que cero o cuando la variable Produce es ampliada. Ingrese los cambios a la variable produce como sigue: VARIABLES

Produce[plant, machine, product, month] -> Prod

WHERE (ProdCost > 0);

Paso 7: Agregue el Índice 'machine' a la Macro del Costo Total de Producción En la macro del costo total de producción, agregue el índice machine para que refleje que la variable produce contiene ahora el índice machine. MACROS

TotalRevenue := SUM(plant, product, month: Price * Sales);

TotalProdCost := SUM(plant, machine, product,month: ProdCost * Produce);

TotalInvtCost := SUM(plant, product, month: InvtCost * Inventory);

TotalShipCost := SUM(product, month, fromplant, toplant: ShipCost * Ship);

TotalCost := TotalProdCost + TotalInvtCost + TotalShipCost;

Paso 8: Actualice la Restricción 'ProdCapacity' para ser Incluida en el Índice 'machine' En la declaración de la restricción de la capacidad de la producción, el índice machine debe ser incluido puesto que ahora tiene un límite de capacidad separada para cada máquina en la planta. Ingrese los cambios a la restricción ProdCapacity como sigue: SUBJECT TO

ProdCapacity[plant, machine, month] -> PCap:

SUM(product: Produce / ProdRate) <= ProdDaysAvail;

Paso 9: Actualice la Restricción de Equilibrio de Planta para Sumar la Variable Produce a Todas las Máquinas En la restricción de equilibrio de planta hay una variable produce separada para cada máquina. Como necesitamos agregar junto al total de producción para una planta en particular, necesitamos ahora sumar sobre el índice máquina cuando se refiera a la variables Produce. Para hacer esto agregue la siguiente sumatoria a la restricción PlantBal: PlantBal[plant, product, month] -> PBal:

SUM(machine: Produce) + Inventory[month-1]

+ SUM(fromplant: Ship[fromplant, toplant:=plant])

=

Sales + Inventory

+ SUM(toplant: Ship[fromplant:=plant, toplant]);

Resuelva el Modelo y Analice la Solución El próximo paso es resolver el modelo 'Planning7.mpl' eligiendo Solve CPLEX del menú Run. Sí todo está bien MPL visualizará el mensaje 'Optimal Solution Found' (Solución Óptima Encontrada). Sí subiera algún error de sintáxis, por favor verifique la formulación ingresada anteriormente en esta sesión del modelo detallado. Usará la ventana de definición del modelo otra vez, como en la sesión 6, para mirar las partes de la solución que sean de su interés. Para abrir la ventana de definición del Planning7 elija Model Definitions del menú View (Ver).

Page 48: Tutorial de MPL

Ventana Árbol de Definición del Modelo Planning7

Para ver los valores de la variable Produce haga doble clic sobre el icono produce del árbol o selecciónelo y presione el botón View (ver). Este visualizará la ventana View (Ver) conteniendo los valores de la solución solo para la variable produce tal como se muestra más abajo. VARIABLE Produce[plant,machine,product,month] :

plant machine product month Activity Reduced Cost

--------------------------------------------------------------------

p1 m11 A1 Jan 4300.0000 0.0000

p1 m11 A1 Feb 4200.0000 0.0000

p1 m11 A1 Mar 5487.5000 0.0000

p1 m11 A1 Apr 5300.0000 0.0000

p1 m11 A2 Jan 6480.0000 0.0000

p1 m11 A2 Feb 5220.0000 0.0000

p1 m11 A2 Mar 5411.2500 0.0000

p1 m11 A2 Apr 5130.0000 0.0000

p1 m12 A3 Feb 9049.3506 0.0000

p1 m12 A3 Mar 916.1616 0.0000

p1 m12 A3 Apr 10803.1169 0.0000

p1 m13 A3 Jan 8050.0000 0.0000

p1 m13 A3 Feb 7000.0000 0.0000

p1 m13 A3 Mar 8050.0000 0.0000

p1 m13 A3 Apr 7700.0000 0.0000

p2 m21 A1 Jan 5100.0000 0.0000

p2 m21 A1 Feb 6200.0000 0.0000

p2 m21 A1 Mar 6538.8889 0.0000

p2 m21 A1 Apr 7600.0000 0.0000

p2 m21 A3 Jan 4422.6136 0.0000

p2 m21 A3 Feb 3927.2727 0.0000

p2 m21 A3 Mar 5000.0000 0.0000

p2 m21 A3 Apr 3681.8182 0.0000

p2 m22 A2 Jan 6900.0000 0.0000

p2 m22 A2 Feb 6000.0000 0.0000

p2 m22 A2 Mar 6900.0000 0.0000

p2 m22 A2 Apr 6600.0000 0.0000

p3 m31 A1 Jan 3300.0000 0.0000

p3 m31 A1 Feb 5964.9351 0.0000

p3 m31 A1 Mar 2550.0000 0.0000

p3 m31 A1 Apr 4477.4026 0.0000

p3 m31 A3 Jan 4700.0000 0.0000

p3 m31 A3 Feb 2023.3766 0.0000

p3 m31 A3 Mar 5200.0000 0.0000

p3 m31 A3 Apr 3615.0649 0.0000

p3 m32 A1 Jan 800.0000 0.0000

p3 m32 A1 Feb 135.0649 0.0000

Page 49: Tutorial de MPL

p3 m32 A1 Mar 2150.0000 0.0000

p3 m32 A1 Apr 1322.5974 0.0000

p3 m32 A2 Jan 7350.0000 0.0000

p3 m32 A2 Feb 6881.8182 0.0000

p3 m32 A2 Mar 6168.7500 0.0000

p3 m32 A2 Apr 6542.7273 0.0000

p4 m41 A1 Jan 4300.0000 0.0000

p4 m41 A1 Feb 4100.0000 0.0000

p4 m41 A1 Mar 5073.6111 0.0000

p4 m41 A1 Apr 4500.0000 0.0000

p4 m41 A2 Jan 2270.0000 0.0000

p4 m41 A2 Feb 5018.1818 0.0000

p4 m41 A2 Mar 2500.0000 0.0000

p4 m41 A2 Apr 5527.2727 0.0000

p4 m41 A3 Jan 3327.3864 0.0000

p4 m41 A3 Mar 2633.8384 0.0000

--------------------------------------------------------------------

La variable Produce está ahora definida sobre cuatro índices: plant planta), machine (máquina), product (producto) y month (mes). Para cada planta el modelo decide qué máquina es la más eficiente para producir los productos en una planta en particular. Esta tabla puede ser usada como base para un programa de producción para la compañía completa. La otra variable que es interesante en este modelo es la variable Inventory. Sí va a la ventana del árbol otra vez y abre la ventana View (Ver) para la variable Inventory obtendrá los siguientes valores de la solución: VARIABLE Inventory[plant, product, month] :

plant product month Activity Reduced Cost

-----------------------------------------------------------

p1 A2 Jan 800.0000 0.0000

p2 A2 Jan 400.0000 0.0000

p3 A3 Jan 500.0000 0.0000

p4 A3 Jan 400.0000 0.0000

-----------------------------------------------------------

Como usted ve, el modelo ha decidido producir los productos A2 y A3 durante el mes de Enero para asegurar tener lo suficiente en el mes de Febrero. Muchas de las plantas ahora están trabajando a su capacidad total. Sí usted va a la ventana del árbol y abre otra vez la ventana View (Ver) para la restricción ProdCapacity obtendrá los siguientes valores de la solución: CONSTRAINT ProdCapacity[plant, machine, month] :

plant machine month Slack Shadow Price

-----------------------------------------------------------

p1 m12 Jan 23.0000 0.0000

p1 m12 Feb 3.9595 0.0000

p1 m12 Mar 20.2682 0.0000

p1 m12 Apr 1.2033 0.0000

p2 m21 Jan 3.6947 0.0000

-----------------------------------------------------------

Como usted puede ver la planta p1 tiene alguna capacidad extra en la máquina m12 y la planta p2 tiene alguna capacidad extra para la máquina m21. Otra cosa también es que todas las máquinas en cada planta están trabajando a su capacidad total para satisfacer la demanda.