Ahora usted ampliará el modelo de la sesión previa para incluir períodos de tiempo multiple. 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 afectado para responder por el nuevo dominio.
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 Indice 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.
Cuando usted hace crecer un modelo de un simple período a múltiples períodos, las ventas para un período específico puede ser diferente 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.
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.
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, comunmente 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.
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 peude 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 de formular esa clase de restricciones.
En esta sesión, creará la formulación de un nuevo modelo de planificación de la producción muli-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.
Production Demand | 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.
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 negrita 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; BOUNDS Sales <= Demand; END
Inicie la aplicación MPL.
Elija File | Open (Archivo| Abrir ) y abra el modelo de la sesión anterior Planning3.mpl.
Elija File | Save As (Archivo | Guardar como) para guardarlo como un nuevo archivo del modelo de Planning4.mpl.
Cambie el título del modelo para reflejar que usted está trabajando con el modelo Planning4:
TITLE Production_Planning4;
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);
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 de 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);
La constante ProdDaysAvail(días de producción disponible) ahora tiene un valor diferente para cada mes, como en el vector de datos demand. 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);
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;
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 incluír 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.
En el modelo de la sesión anterior, las ganancias totales y el costo total de producción son incluídos 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 continuará para usar 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 la cantidad de veces, el nivel de inventario.
Para hacer cambios en la sección MACROS, reemplaze la variable Produce (Producción) con la variable Sales(Ventas), actualice la ganancia total y sumelo 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 renombrado a TotalProdCost. Otra nueva macro; TotalCost, ha sido agregada donde usted puede sumar junto a esas dos nuevas macros para obtener el costo total. Esto permite que la función objetivo permanezca sin cambios:
MODEL MAX Profit = TotalRevenue - TotalCost;
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.
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:
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].
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 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;
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).
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( 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 automaticamente 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 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 ---------------------------------------------------- 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 es 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 1800 unidades en January(Enero),ya que no tiene suficiente capacidad para producir los tres productos.
En Enero, el Modelo decidió producir 320 unidaes extras de A3, como fueron requeridas por la demanda, para poner suficiente en el inventario tal de satisfacer la demanda de Febrero.