Full text
Equation Chapter 1 Section 1 Trabajo Fin de Grado en Ingeniería de las Tecnologías Industriales Modelo de inventario de productos perecederos para la industria agroalimentaria. Autor: Elvira Ortiz Martínez Tutor: Pedro Luis González Rodríguez Dpto. de Organización Industrial y Gestión de Empresas I Escuela Técnica Superior de Ingeniería Universidad de Sevilla Universidad de Sevilla j Universidad de Sevilla Sevilla, 2025
2
Trabajo Fin de Grado en Ingeniería de las Tecnologías Industriales Modelo de inventario de productos perecederos para la industria agroalimentaria. Autor: Elvira Ortiz Martínez Tutor: Pedro Luis González Rodríguez Catedrático de Universidad Dpto. de Organización Industrial y Gestión de Empresas I Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2025
4
Trabajo Fin de Grado: Modelo de inventario de productos perecederos para la industria agroalimentaria. Autor: Elvira Ortiz Martínez Tutor: Pedro Luis González Rodríguez El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2024 El Secretario del Tribunal
6
8
Agradecimientos Después de estos años de carrera tengo mucho por lo que dar las gracias. En primer lugar a mi tutor, que me ha enseñado mucho y ha hecho que verdaderamente disfrute este último tramo de la carrera. A mis padres, hermanos y en general a toda mi familia, que nunca han dejado de creer en mí, incluso ni cuando yo misma lo hacía. A todos los profesores que he tenido a lo largo de mi trayectoria. Y por último, agradecer la oportunidad de encontrar compañeros tan especiales que han estado conmigo desde el primer día y que con el tiempo se han convertido en mis mejores amigos. Elvira Ortiz Martínez Sevilla, 2025
16 ÍNDICE DE TABLAS Tabla 1. Tipos de pasteurización Error ! Bookmark not defined. Tabla 2. Información necesaria etiquetas 15 Tabla 3. Parámetros ajustados 21 Tabla 4.Test de Kolmogórov-Smirnov 22 Tabla 5. Resultados 32 Tabla 6. Resultados validación 34 Tabla 7. Análisis de sensibilidad Error ! Bookmark not defined.
18 ÍNDICE DE FIGURAS Ilustración 1. Diagrama de flujo del proceso. 16 Ilustración 2. Demanda con outliers 19 Ilustración 3. Demanda sin outliers 20 Ilustración 4. Graficas distribuciones 23 Ilustración 11. Impacto del deterioro en el inventario 30 Ilustración 5. Gráfica de pedidos realizados 33 Ilustración 6. Gráfica de productos almacenados 33 Ilustración 7. Gráfica del deterioro producido 33 Ilustración 8. Gráfica de pedidos realizados modificando datos 35 Ilustración 9. Gráfica de productos almacenados modificando datos 35 Ilustración 10. Gráfica del deterioro producido modificando datos 35 Ilustración 12. Costes individuales y total con deterioro Error ! Bookmark not defined. Ilustración 13.Costes individuales y total sin considerar deterioro 37 Ilustración 14. Función objetivo con y sin deterioro 37 Ilustración 15. Mapa de calor de los distintos valores de la función objetivo 39 Ilustración 16 40 Ilustración 17 40
20 1. JUSTIFICACIÓN Y OBJETO DEL PROYECTO 1.1. Introducción. 1.1.1. Contexto del sector agroalimentario en España La industria agroalimentaria es la encargada de proporcionar alimentación en condiciones óptimas para el consumo del humano. Sin embargo, su rol no se limita únicamente a esta labor, sino que también incluye el procesamiento, distribución y comercialización de dichos productos. Esta industria, junto con la explotación agraria, representan un pilar fundamental para la economía española, tanto desde una perspectiva social y como medioambiental. En términos económicos, el sector agroalimentario es uno de los sectores más importantes de nuestro país, con un peso relevante en la economía próximo al 10% del PIB nacional. En el caso de España el sector de agricultura y pesca ha generado un valor añadido bruto de 35.196 millones de euros en el año 2020 (Plataforma Tierra, 2022). No obstante, desde finales del año 2021 hasta principios del 2023 el sector experimentó una recesión provocada por las condiciones meteorológicas adversas y los conflictos geopolíticos, entre otros factores. Afortunadamente, según CaixaBank Research (2024), el sector agroalimentario muestra signos de recuperación, ya que en 2024 el valor añadido bruto del sector primario creció un 7,7%, superando ampliamente el crecimiento del conjunto de la economía, que fue del 3%. España se mantiene entre los principales países europeos productores, gracias al sector agroalimentario, siendo el cuarto mayor explotador agroalimentario de la Unión Europea y el octavo en el mundo, según los datos del Ministerio de Agricultura, Pesca y Alimentación (2023). 1.1.2. Innovación tecnológica y digitalización del sector El uso de las tecnologías es vital para el desarrollo de este sector, tanto para tener una gestión eficiente en los procesos de producción como para conseguir la eficiencia y sostenibilidad económica, social y medioambiental. La transformación digital permite una gestión más eficiente de los procesos productivos, al tiempo que favorece la sostenibilidad económica, social y medioambiental. Comprender el contexto en el que surgen las innovaciones y los obstáculos asociados requiere analizar cómo está estructurado el diseño de las industrias agroalimentarias, ya que esta organización influye significativamente en la facilidad con la que pueden adoptar nuevas tecnologías (Casp Vanaclocha, 2005). A pesar de sus beneficios, la adopción tecnológica enfrenta ciertas barreras. En el estudio realizado por el Ministerio de Agricultura, Pesca y Alimentación se llevó a cabo una encuesta a diferentes agentes del sector agroalimentario, registrando los siguientes datos en el pasado año 2023: Según el estudio realizado, las personas entrevistadas identifican el coste de las nuevas tecnologías como principal barrera a la digitalización. A su vez, se pueden ver otros inconvenientes como la falta de financiación,
la falta de conocimiento o el miedo a no recuperar la inversión. Curiosamente, los jóvenes están menos dispuestos a implementar nuevas tecnologías que las personas adultas, según analiza los datos de estas encuestas, en gran parte debido a que no poseen los suficientes recursos económicos para poder llevarlo a cabo. Aun así, la innovación sigue siendo clave en la política del ministerio de Agricultura Pesca y Alimentación porque garantiza mejoras económicas, sociales y medioambientales. España es considerado un innovador medio, principalmente destaca en dos aspectos que son los recursos humanos y en la digitalización. Las tendencias más recientes se centran en la sostenibilidad y la eficiencia, adoptando prácticas como el uso de energías renovables, reutilización de agua, técnicas agrícolas sostenibles, e incorporación de tecnologías como la inteligencia artificial, la robótica, Blockchain y la fermentación de precisión, una tecnología biotecnológica emergente que permite producir proteínas y otros compuestos mediante microorganismos modificados genéticamente (Plataforma Tierra, 2024). 1.1.3. Importancia de la gestión de inventario en la industria agroalimentaria La gestión de inventario desempeña un papel fundamental en el sector agroalimentario, debido a la naturaleza perecedera de muchos de los productos. Una correcta planificación y control de inventarios permite reducirlas pérdidas por caducidad, se optimiza el almacenamiento lo máximo posible, y garantiza satisfacer las necesidades del cliente. Un buen control permite ajustar la producción y distribución según la demanda, minimizando los costes. Además, en este sector es más relevante aún la buena gestión del almacenamiento porque son alimentos de los que se debe asegurar un buen estado y calidad. Unos de los principales enfoques de este proyecto será la gestión de productos perecederos y la manera en que se trabajará con ellos, dado que su naturaleza específica puede presentar ciertos desafíos debido a sus características particulares. La definición de perecedero según la RAE dice lo siguiente: Adj. Poco durable, que ha de perecer o acabarse Un producto perecedero es aquel que tiene una vida útil limitada y puede deteriorarse o caducar rápidamente si no se almacena o distribuye adecuadamente. Una mala gestión de estos productos puede provocar pérdidas económicas significativas, aumento de costes y problemas de abastecimiento.
22 1.2. Objetivo General del Proyecto. El objetivo general del proyecto es el desarrollo de un modelo de gestión de inventario para una empresa de productos de quinta gama, considerando la presencia de productos perecederos. El proyecto, aunque no es real, se basa en datos aportados por el tutor, teniendo en cuenta el conocimiento del sector y que permiten llegar a un nivel de detalle realista en la toma de decisiones. 1.3. Objetivos Específicos del proyecto Para abordar el objetivo planteado en el apartado anterior, se ha desgranado dicho objetivo general en diferentes partes que se detallan a continuación. 1.3.1. Comprender el proceso actual. Estudio de la gestión del inventario actual Inicialmente se realiza un estudio previo del proceso para comprender su funcionamiento global en su estado actual y poder trabajar con este. Este análisis incluye el estudio de la gestión de inventario actual que es fundamental para identificar oportunidades de mejora. 1.3.2. Estudio de la demanda A continuación, se realizará un análisis detallado de la demanda utilizando datos proporcionados. Dicho análisis trata de determinar el comportamiento de la demanda, y servirá de base para la toma de decisiones posterior y los modelos a aplicar en su caso. 1.3.3. Estudio del deterioro de los productos A su vez, como se ha comentado anteriormente, una de las claves del proyecto es el estudio y modelado del deterioro de los productos, el objetivo es intentar reducir los costes adicionales que estos producen. De igual modo, partiendo de datos históricos se analizará y caracterizará el deterioro con el objeto de caracterizarlo y poder ser empleado posteriormente. 1.3.4. Estudio del problema en un entorno determinista Una vez entendido el proceso y caracterizadas las demandas y el deterioro, se procede a formular un modelo determinista que sirva de base para la toma de decisiones. En este caso la demanda se considera constante y conocida en cada periodo. El modelo matemático debe incorporar todos los parámetros relevantes para su correspondiente resolución. 1.4. Estructura del documento Este proyecto está dividido en varias partes que ayudan a entender bien el problema y cómo se ha planteado la solución. Primero, se presenta una introducción sobre la empresa y el proceso con el que se trabaja, para poner en contexto el modelo de inventario que se va a desarrollar. Después, se estudia la demanda histórica, analizando su comportamiento y preparando los datos para poder trabajar con ellos dentro del modelo.
A continuación, se explica qué es el deterioro, por qué es importante tenerlo en cuenta en la gestión de inventario y cómo se puede representar matemáticamente. También se calculan los parámetros necesarios para incorporarlo al modelo. Una vez hecho esto, se construye el modelo de optimización, incluyendo las restricciones y la función objetivo. En esta parte se detallan las decisiones que se toman en cada periodo, como cuánto pedir o cuánto mantener en inventario. El código utilizado para implementar todo esto se incluye en el apartado de Anexos. El modelo se prueba con distintos valores de entrada para ver cómo se comporta en diferentes situaciones. Además, se hace un análisis de sensibilidad para estudiar cómo cambia el resultado. Finalmente, se presentan las conclusiones, donde se resume lo que se ha logrado en el proyecto y se proponen algunas ideas para mejorarlo.
2. DESCRIPCIÓN DE LA EMPRESA Y EL PROCESO 2.1. La empresa y los principales competidores Los datos utilizados en el desarrollo de este proyecto corresponden a información basada en información real proporcionada por una empresa del sector, la cual ha solicitado mantenerse en el anonimato. No obstante, aun no siendo reales, sí se garantiza su validez, permitiendo un análisis fundamentado. El análisis de la competencia se ha realizado considerando empresas del mismo sector que operan en el mercado con características similares a la empresa en estudio. Se han analizado otras empresas que se dedican también a la venta de productos de quinta gama, permitiendo establecer comparaciones relevantes. 2.2. Descripción del proceso En el presente estudio nos centramos en un producto de quinta agama, que es un vegetal asado. Para el estudio no es necesario entrar en más detalles con el objeto de guardar el anonimato de la empresa. El procedimiento genérico que se describe a continuación es similar en diferentes productos, pudiendo tratarse de productos como la berenjena asada, el pimiento asado, la escalivada, etc.… El producto final obtenido es un producto de quinta gama, es decir, está listo para consumir sin tener que preparar o con una mínima preparación o aliño por parte del consumidor. El procedimiento a seguir para la gestión de los alimentos de quinta gama es una serie de actividades ordenadas, que garantiza la calidad del producto y que estos lleguen a los consumidores de forma óptima. Este proceso implica una serie de etapas que se detallarán a continuación. El primer paso es la recepción y selección de la materia prima. En esta fase, es fundamental verificar si los productos solicitados han llegado en su totalidad y encuentran en condiciones óptimas para su procesamiento. Para ello, el personal encargado debe contar con una lista detallada de los pedidos para poder realizar una comprobación exhaustiva de los productos y para poder examinar que coincide con los pedidos solicitados. Además, se deben realizar pruebas de calidad para asegurar que los alimentos cumplen con los estándares establecidos. Entre estas pruebas se encuentra las inspecciones visuales, donde se verifica que el producto no haya sufrido ningún daño o deterioro. De igual manera, se pueden llevar a cabo pruebas de parámetros fisicoquímico, donde se puede evaluar características específicas del producto, como su pH, humedad o niveles de compuestos, garantizando de esta forma que los alimentos cumplan los requisitos exigidos para ser considerados de buena calidad. Los productos que no pasan este tipo de pruebas son desechados. Los productos que cumplen con las especificaciones de calidad pasan a la siguiente etapa. La siguiente etapa consiste en el lavado y desinfección de los productos, la higiene es fundamental en este proceso, ya que la falta de esta puede comprometer la calidad y seguridad alimenticia del producto.
18 18 3. ESTUDIO DE LA DEMANDA 3.1. Datos de demanda La estimación de la demanda, parte de un histórico de producción que nos sirve de base. En el contexto de la empresa objeto de estudio ocurre que la demanda del producto que estamos estudiando viene determinada por el uso que se le permite de las instalaciones cuello de botella explicadas en el capítulo anterior. Es decir, en el contexto objeto de estudio, la previsión de la demanda es interna, y viene fijada con antelación por parte los encargados de hacer la planificación del resto de productos. Dicho de otra manera, la producción suele ser estable a lo largo del tiempo, aunque con un con un rango de incertidumbre. Los datos de la demanda se recogen de manera diaria durante un período de un año. Los datos están recogidos en el Anexos como Datos de demanda. En la siguiente Ilustración 2 se muestra la demanda diaria según los datos aportados. * Ilustración 2. Gráfica demanda Se puede observar que la demanda se puede considerar estable y continua ya que estos datos no presentan fluctuaciones abruptas, ni tendencias significativas de crecimiento o decrecimiento. La demanda se mantiene dentro de un rango de valores durante periodos prolongados. Al hacer pedidos se pide más cantidad que la demanda estimada para tener un margen de seguridad. Esto evita pérdidas al tener aumentos de pedidos en ciertos periodos de tiempo y ayuda a la que la demanda se mantenga estable, ya que mitiga los efectos de variabilidad, lo que contribuye a una gestión más controlada y predecible. 0 500 1000 1500 2000 2500 3000 3500 1 13 25 37 49 61 73 85 97 109 121 133 145 157 169 181 193 205 217 229 241 253 265 277 289 301 313 325 337 349 361
3.2. Determinación y eliminación de outliers Primero hay que definir lo que es un outlier. Un outlier es un dato que se encuentra significativamente alejado de los demás. Tiene un comportamiento diferente al conjunto de datos restantes. La presencia de estos puede hacer que los resultados sean menos precisos y no se ajusten a la realidad. Ilustración 3. Demanda con outliers En la ilustración 3 el eje 𝑥 representa el periodo mientras que el eje 𝑦 representa la demanda. Se representa en color azul el límite superior, y en color rojo el límite inferior. Su valor está desarrollado en la ecuación (2) y (3). En la ilustración 2 se presentan los datos de la demanda en kg de producto correspondiente a un año, para valores de 𝑦 superiores a 500 kg. A partir del análisis visual de la gráfica, es posible identificar valores atípicos (outliers), los cuales se manifiestan como picos que se desvían significativamente del comportamiento central de la serie temporal. Estos valores deben ser excluidos del análisis para garantizar una interpretación más precisa y presentativa de la tendencia general de la demanda. Para la detección de outliers se ha utilizado el método de índices intercuartílicos. Este consiste en el cálculo de un límite superior y uno inferior, que sirve como frontera para los valores de la demanda. Los valores que se salgan de estas fronteras establecidas serán los outliers. El procedimiento a seguir es el siguiente: primero, se ordenan los datos de forma ascendente. A continuación, se calculan el primer cuartil (Q1) y el tercer cuartil (Q3), que representan, respectivamente, el valor por debajo del cual se encuentra el 25% inferior y el 75% inferior de los datos. Los cuartiles son medidas estadísticas que dividen un conjunto de datos ordenado en cuatro partes iguales, cada una con el 25% de los valores. Entre ellos, el primer y el tercer cuartil (Q1 y Q3) son especialmente útiles para describir la dispersión y la distribución de los datos. A continuación, se calcula el rango intercuartílico como la resta de estos dos valores citados anteriormente. (1) 𝐼𝑄𝑅=𝑄3 − 𝑄1 (1)
20 20 Gracias a este valor se pueden calcular los límites superior e inferior comentados anteriormente. Sus valores son los siguientes: (2) (3) 𝐿𝑖𝑚𝑖𝑡𝑒 𝑖𝑛𝑓𝑒𝑟𝑖𝑜𝑟= 𝑄1 − 1,5 × 𝐼𝑄𝑅 (2) 𝐿𝑖𝑚𝑖𝑡𝑒 𝑠𝑢𝑝𝑒𝑟𝑖𝑜𝑟=𝑄3 + 1,5× 𝐼𝑄𝑅 (3) Todos los datos que tengan valores mayores que el límite superior o menores que el límite inferior serán considerados outliers y se procederá a su eliminación. El valor de 1,5 se debe a que aproximadamente el 99.3 % de los datos caen dentro de los límites superior e inferior. Esto hace que los puntos fuera de estos rangos no sean valores típicos reales. Otro motivo es por su uso histórico y visual, John Tukey introdujo los boxplots (diagramas de caja), donde los "bigotes" se extienden hasta 1.5 × 𝐼𝑄𝑅. Aplicando este método en un código se han detectado los siguientes outliers: [592,667,669] Ilustración 4. Demanda sin outliers En esta Ilustración 4 se puede observar de nuevo la evolución de la demanda con el eje 𝑥 representando el periodo y el eje 𝑦 la demanda. En este caso ya se ha aplicado la eliminación de outliers como se puede ver en la Ilustración 2 ya que la gráfica no supera en ningún momento los límites superiores e inferiores representados con las líneas azul y roja. Por tanto, estos datos actualizados son más adecuados para seguir trabajando con ellos. Esta actualización logra un análisis más representativo y preciso de los datos.
3.3. Caracterización de la demanda. Test de Kolmogórov-Smirnov Posteriormente, cuando ya se han eliminado los outliers, se procede a determinar que distribución se ajusta mejor a los datos proporcionados. Para ello se emplea la librería scipy.stats de Python, la cual es capaz de estimar los parámetros de diferentes distribuciones estadística y realizar la prueba de Kolmogorov-Smirnov. Las distribuciones estudiadas son la Normal, Exponencial, Gamma, Logística, Log-Normal, Triangular y Uniforme. En la tabla se muestran los parámetros a determinar en cada modelo. Tabla 3. Parámetros ajustados Distribución Parámetros ajustados Normal Media, Desviación estándar Exponencial Ubicación, Escala Gamma Forma, Ubicación, Escala Logística Ubicación, Escala Log-Normal Forma, Ubicación, Escala Triangular Mínimo, Escala, Rango total Uniforme Mínimo, Rango total Una vez determinado cada parámetro de las distribuciones, se aplica la prueba de Kolmogórov-Smirnov. Esta prueba determina si una muestra de datos proviene de una distribución específica. Comparando la distribución acumulada empírica 𝐹𝑛(𝑥) que se calcula con los datos proporcionados. Y la distribución acumulada teórica 𝐹(𝑥) que se obtiene gracias a la distribución teórica calculada en el paso anterior. Se realiza un contraste de hipótesis que viene dado por: (1) y (2) 𝐻𝑖𝑝ó𝑡𝑒𝑠𝑖𝑠 𝑛𝑢𝑙𝑎 (𝐻0). Los datos provienen de la distribución específica. (1) 𝐻𝑖𝑝ó𝑡𝑒𝑠𝑖𝑠 𝑎𝑙𝑡𝑒𝑟𝑛𝑎𝑡𝑖𝑣𝑎 (𝐻1). Los datos no provienen de la distribución específica. (2) A continuación, se calcula el estadístico KS (D) que es el máximo valor de la diferencia entre la función de distribución empírica y la función de distribución acumulada teórica. (3) 𝐷 =max ( 𝐹𝑛(𝑥)−𝐹(𝑥)) (3) Si este valor es alto significaría que la distribución teórica no se parece a la empírica y será rechazada la hipótesis nula. Para realizar el contraste de hipótesis se parte de la comparación entre el pvalor y un parámetro establecido llamado nivel de significancia que en este caso se le ha dado un valor de 0,05.
22 22 El p-valor en la prueba nos dice qué tan probable es obtener un valor del estadístico KS (D), citado anteriormente, igual o más extremo que el calculado a partir de nuestros datos asumiendo que estos siguen la distribución teórica. Una vez calculado, se puede realizar la siguiente comparación: (4) (5) 𝑆𝑖 𝑝-valor>0,05 𝑒𝑛𝑡𝑜𝑛𝑐𝑒𝑠 𝑛𝑜 𝑠𝑒 𝑟𝑒𝑐ℎ𝑎𝑧𝑎 𝐻0 (4) 𝑆𝑖 𝑝-valor≤0,05 𝑒𝑛𝑡𝑜𝑛𝑐𝑒𝑠 𝑠𝑒 𝑟𝑒𝑐ℎ𝑎𝑧𝑎 𝑙𝑎 𝐻0 (5) En conclusión, calculando pvalor y comparando con el nivel de significación, se puede saber si los datos siguen la distribución teórica correspondiente. Este proceso se repite con todas las distribuciones para ver cual se adapta mejor. Con los datos proporcionados se obtienen los siguientes resultados representado en la Tabla 4. Distribución Parámetros ajustados 𝑝-valor ¿Rechazo H0? D Normal (2038.21 ,449.57) 0.912 NO 0.028 Exponencial (769, 1269.22) 1,56e-35 SI 0.329 Gamma (3872.72, 25938.46, 7,22) 0.917 NO 0.028 Logística (2036.76, 260.24) 0.761 NO 0.034 Log-Normal (0.012, -34316.01, 36351.45) 0.918 NO 0.028 Triangular (0.508, 753.09, 2530.80) 0.106 NO 0.063 Uniforme (769, 2491) 1,465e-11 SI 0.187 Tabla 4.Test de Kolmogórov-Smirnov Se observan en los resultados que hay varías distribuciones que no se rechazan, es decir que la distribución teórica se adapta de manera adecuada a la empírica. Se escoge la gráfica que tenga menor pvalor. En el caso que hubiesen coincidido el valor de pvalor de algunas distribuciones, se hubiese escogido la que tuviese menor valor del estadístico KS (D).
Ilustración 5. Graficas distribuciones En la ilustración 5 se puede observar un histograma de la demanda y las distribuciones dibujadas con diferentes colores para ver cuál se adapta mejor a la demanda. La distribución que tiene 𝑝-valor menor es la Log-Normal, sin embargo, la Normal también se adapta adecuadamente al histograma, tiene valores de 𝑝-valor y el estadístico KS (D) convenientes. Se empleará la distribución normal, ya que si implementación es más sencilla y su aplicación resulta más accesible en comparación con otras alternativas.
24 24 4. DETERIORO Y MERMA 4.1. Definición de deterioro y merma El deterioro es un proceso natural de descomposición o pérdida de calidad irreversible de un alimento en este caso. Esto se debe al paso del tiempo, las condiciones ambientales o factores externos. Como se ha comentado anteriormente en el proceso de desarrollo del producto, las operaciones de pelado, troceado, envasado y almacenamiento, entre otros, influyen en el deterioro. Por tanto, es un elemento clave a tener en cuenta. En cambio, la merma se refiere a la cantidad o volumen perdido de un alimento debido a procesos como el corte, el pelado, la cocción… vistos en la explicación de las etapas que siguen los alimentos. Este es un fenómeno más manejable y predecible. En la industria agroalimentaria se establecen porcentajes de merma estándar basados en la experiencia, la calidad del producto y procesos operativos. Estos porcentajes indican la cantidad de materia prima que se pierde o se reduce en las distintas etapas de producción. Son claves para controlar costos y asegurar la calidad del producto. A su vez, con estos datos es posible determinar la eficiencia del proceso productivo. Un porcentaje bajo de merma sugiere un proceso optimizado, donde los recursos se aprovechan de manera eficiente. 4.2. Modelado del Deterioro de la Calidad: Enfoque Cinético y Empírico Últimamente la industria agroalimentaria se ha estado expandiendo y cada vez tiene más demanda, por tanto, en los últimos años se ha desarrollado modelos que regulen el deterioro de los alimentos. Estos modelos predicen la vida útil de los alimentos. Puede haber cambios de distintos tipos, los fisicoquímicos, sensoriales, microbiológicos y nutricionales. 4.2.1. Cinética del deterioro En un alimento tiene lugar muchos tipos de reacciones, estas influyen en la calidad y seguridad del alimento. El objetivo final es modelar el cambio de concentraciones de los constituyentes relacionados con la calidad en función del tiempo. (Salinas-Hernández et al., 2007) Para ello se puede utilizar la siguiente ecuación (6): 𝑟 =𝑘𝑓´·[𝐴]𝑎 (6) Donde los siguientes valores indican: A: Componente del alimento a: Orden aparente o pseudo orden de la reacción para el componente A kf´: Constante aparente de reacción
Con base en la ecuación (6) se obtiene una ecuación (7) que determina la calidad de un producto en función del tiempo. (Salinas-Hernández et al., 2007) 𝑑𝑄 𝑑𝑡 =𝑘·𝑄𝑛 (7) Q: Característica de calidad n: Orden aparente de la reacción para la característica Q k: Constante aparente de reacción. 4.2.2. Modelado del deterioro Una vez caracterizado el deterioro mediante el modelo cinético, es posible complementar este enfoque con un modelo empírico que tiene la siguiente expresión (8): 𝑊𝑛≥𝜆·𝐼𝑛 𝛽 ·∆𝑡 (8) Esta ecuación modela el deterioro de los productos en función del tiempo y del nodo n. Esta depende del inventario y de la tasa de merma. Los parámetros de la ecuación indican: 𝑊𝑛: Representa la merma o el deterioro 𝜆 : Representa la tasa de merma 𝐼𝑛 : Inventario disponible β: Indica cómo la merma depende del inventario ∆𝑡 : Tiempo transcurrido La ecuación (8) es similar a la (7), ya que las dos representan un proceso de cambio no lineal. Las dos ecuaciones estudian la naturaleza del deterioro dependiendo este de la cantidad inicial y teniendo una constante multiplicando. A su vez, se puede observar que las dos tiene un parámetro que hace que se acelere o desacelere el proceso β en el caso de la ecuación (8) y n en la ecuación (7). 4.2.2.1 Distintos valores de 𝜷 𝛽 >𝟏. La merma aumenta de forma no lineal con el inventario, lo haría de forma exponencial. Esto quiere decir que a medida que el inventario crece la merma aumenta de forma acelerada. Por ejemplo, si el inventario se duplica, la merma no solo se duplicaría si no que aumentaría más. El deterioro aumenta por la acumulación de los productos, esto puede ocurrir debido al calor por descomposición, por la propagación de microorganismos o un almacenamiento deficiente, entre otros. 𝛽 <𝟏. La merma aumenta de manera desacelerada. la merma sigue creciendo cuando hay más inventario, pero cada unidad adicional de inventario genera menos merma proporcionalmente. Hay productos que se conservan mejor cuando se almacena en grandes cantidades.
26 26 𝛽 =𝟏. La merma es proporcional al inventario existente. Esto puede ocurrir cuando hay condiciones de conservación constante, productos con vida útil constante o procesos estandarizados. Se convierte en una relación lineal. 4.2.2.2. Determinación de los valores de β y λ Para calcular el valor de β y λ se realiza un proceso de regresión lineal, pero antes de realizarlo hay que preparar la ecuación usando las propiedades de los logaritmos para que sea una ecuación lineal, de la siguiente forma (9): ln(𝑊)−ln(𝑡)=ln(𝜆)+𝛽·ln(𝐼) (9) Realizamos un cambio de variable para simplificar la ecuación: 𝑦=ln(𝑤)−ln(𝑡) 𝑥 =ln(𝐼) Y queda la ecuación (10), que es la que se utilizará para realizar la regresión lineal: 𝑦=ln(𝜆)+𝛽· 𝑥 (10) Una vez preparada la ecuación se aplica la regresión lineal usando Python con la librería sklearn.linear_model. Y te devuelve un valor de la pendiente β y del intercepto ln (𝜆), a este último hay que aplicar la función exponencial para calcular el valor de λ. La regresión lineal se calculan los valores de la pendiente (β) y del intercepto (ln (𝜆)) que minimiza el error cuadrático medio. (11) 𝐸𝐶𝑀 = 1 𝑛·∑(𝑦𝑖−(ln (𝜆) + 𝛽· 𝑥𝑖)) 𝑛 1 2 (11) Se calculan los valores de β y ln (𝜆) de la siguiente forma: 𝛽 =∑(𝑥𝑖−𝑥)·(𝑦𝑖−𝑦) ∑(𝑥𝑖−𝑥)2 ln(𝜆)=𝑦−𝛽·𝑥 Siendo 𝑥 e 𝑦 los valores promedios de 𝑥 e 𝑦. Utilizando los datos y los códigos aplicando la regresión lineal aparecen en el capítulo de Anexos, se obtienen los valores 𝛼= 0.0041 y 𝛽=1.22.
5. MODELO 5.1. Objetivos Para cierto tipo de productos, puede optarse por producir en exceso en épocas de necesidades bajas y emplearlo en épocas de necesidades altas, con el consiguiente aumento del coste de posesión de inventarios según se indica Domínguez Machuca (2001). Estos costes de posesión pueden estar asociados a mantener el producto en buenas condiciones, pudiendo incurrir en costes financieros relacionados con la inversión de capital en el inventario, en vez de en otros activos. Y por último el coste de obsolescencia, que en este caso es inevitable ya que se trabaja con productos perecederos. Este tipo de previsión de la demanda también tiene beneficios notables como evitar ajustar la carga productiva, evitando retrasos y haciendo que el producto esté siempre disponible, mejorando la planificación del proceso. Para la formulación y resolución del modelo, se ha tomado como base el modelo clásico presentado por Larrañeta et al. (1988) en Métodos modernos de gestión de la producción. Se inicia con un conjunto de datos reales correspondientes a la demanda diaria registrada por una empresa. A partir de estos datos, se ha planteado un modelo de gestión de inventario que incorpora un enfoque particular de previsión de la demanda, integrando el efecto del deterioro de los productos a lo largo del tiempo. A diferencia de otros modelos más tradicionales que no contemplan esta dimensión, el modelo propuesto introduce el deterioro como una variable clave dentro de la función objetivo y las restricciones. Esta incorporación permite representar de forma más precisa el comportamiento real del inventario. Gracias a esta característica el modelo presenta un enfoque más realista y adaptable a contextos prácticos. El objetivo del modelo es minimizar los costes totales asociados al sistema de gestión de inventario. Entre estos costes se incluyen: el coste por deterioro de los productos almacenados, el coste fijo asociado a la realización de pedidos, y el coste de almacenamiento del inventario. El modelo busca encontrar los valores óptimos de las variables de decisión que permitan alcanzar el menor coste posible, garantizando al mismo tiempo el cumplimiento de las restricciones del sistema. A continuación, se presentan los parámetros, las variables de decisión, las restricciones del modelo y la función objetivo. Se explica qué representa cada variable, el propósito de cada restricción y el objetivo que busca optimizar el modelo 5.2. Parámetros 𝑇 : Número total de periodos 𝐷𝑡: Demanda en el periodo t 𝐶: Capacidad máxima de inventario 𝐼0: Inventario inicial 𝐿: Lead time
34 34 Con los datos proporcionados, se observa que lo óptimo es realizar pedidos la mayoría de los días. Esto puede deberse a que el coste asociado a realizar un pedido es relativamente bajo. En consecuencia, y teniendo en cuenta la existencia de deterioro en los productos, resulta más rentable mantener un nivel de inventario reducido y realizar pedidos frecuentes, en lugar de almacenar grandes cantidades que podrían deteriorarse con el tiempo. A continuación, se van a modificar los valores iniciales, para que haya menos días que se hagan pedidos y se aumente el inventario. Se han ajustado los parámetros del modelo con el objetivo de reflejar un escenario más realista en la gestión del inventario. En particular, se han reducido los costes asociados al almacenamiento ℎ =0.05€/unidad·día y al desperdicio 𝑤 =2 €/unidad , incentivando así la acumulación de inventario. También, se ha incrementado de forma significativa el coste fijo por pedido 𝑐 =500 €, con el propósito de disminuir la realización de pedidos en todos los periodos. Tabla 6. Resultados validación Periodo Demanda Cantidad Pedida (O[t]) Inventario (I[t]) Deterioro (W[t]) 11741 0 4151,66 107,34 21706 4241,52 2391,03 54,63 32007 0 378,31 5,72 42315 4501,79 2254 50,82 52254 0 0 0 62161 3758,53 2289 51,79 72289 0 0 0 81806 3926,87 1911 41,53 91911 0 0 0 10 1961 4749,77 1924 41,87 11 1924 0 0 0 12 2299 5119,76 2396 54,77 13 2396 0 0 0 14 2596 4261,49 2467 56,76 15 2467 0 0 0 16 2545 5017,71 1681 35,49 17 1681 0 0 0 18 2606 4524,23 2358 53,71 19 2358 0 0 0 20 1941 0 2524,83 58,4 21 955 4424,68 1538 31,83 22 1538 0 0 0 23 2200 3856,9 2176 48,68 24 2176 0 0 0 25 2244 3958,32 1580 32,9 26 1580 0 0 0 27 1598 5659,93 2308 52,32 28 2308 0 0 0 29 2490 03095 74,93 30 3095 0 0 0
Ilustración 10. Gráfica de pedidos realizados modificando datos Ilustración 11. Gráfica de productos almacenados modificando datos Ilustración 12. Gráfica del deterioro producido modificando datos
36 36 Como se puede comprobar en las Ilustraciones 10,11 y 12 y en los resultados obtenidos representados en la Tabla 6, al variar estos parámetros se ha conseguido que el inventario sea mayor en cada periodo y, en consecuencia, el deterioro. 6.2. Escenario análisis del deterioro A continuación, se resuelve el modelo sin tener en cuenta el deterioro, con el objetivo de analizar cómo influye este factor en las decisiones del modelo. Para ello, se parte de los mismos datos utilizados anteriormente, pero eliminando únicamente los elementos relacionados con el deterioro. Es decir, se omiten tanto los parámetros como las restricciones que dependen de él, como el coste por unidad desperdiciada (w), la variable que representa las unidades deterioradas (W), y la restricción que modela el deterioro. El resto de restricciones se mantienen igual y se implementan en Gurobi, permitiendo comparar los resultados con y sin deterioro para evaluar su impacto real en el modelo. Los distintos resultados de costes obtenidos en esta comparación pueden observarse en las Ilustraciones 13, 14 y 15. Ilustración 13. Costes individuales y total con deterioro
Ilustración 14.Costes individuales y total sin considerar deterioro Ilustración 15. Función objetivo con y sin deterioro Al comparar ambas soluciones, se aprecia que el coste total es inferior cuando no se considera el deterioro. Este resultado es coherente, ya que al eliminar el deterioro del modelo se está eliminando un coste adicional. Dado que la función objetivo busca minimizar la suma de todos los costes involucrados (inventario, pedidos y deterioro), es lógico que el valor total disminuya al prescindir de este último componente.
38 38 Esto refleja la importancia de que en el modelo se considere el deterioro, omitirlo implicaría ignorar un coste significativo que influye directamente en la función objetivo. El deterioro es un factor fundamental en los modelos de inventario, especialmente en el sector agroalimentario, donde su impacto es muy significativo. Incluir esta variable permite reflejar la realidad; omitirla supondría prescindir de un componente esencial para la adecuada toma de decisiones en el sector. 6.3. Análisis de sensibilidad Como se ha comentado anteriormente el deterioro es un factor clave para tener en cuenta en la gestión de inventarios. La restricción añadida para modelarlo es una función no lineal, por tanto, al variar los parámetros 𝛼 y 𝛽 el modelo varía considerablemente. Para realizar un análisis de sensibilidad se va a tomar un rango de valores de estos parámetros 𝛼 y 𝛽, que son los siguientes: 𝛼 =[0.0005,0.001,0.005,0.01,0.015] 𝛽 =[1,1.2,1.3,1.5] Se realizan combinaciones de estos nuevos valores de los parámetros y se guarda el valor de la función objetivo para comparar el impacto que tienen. Tabla 7. Análisis de sensibilidad Las combinaciones que no aparecen en la tabla 7 corresponden a casos en los que el modelo no ha encontrado una solución factible. En la tabla se recogen únicamente aquellas combinaciones de parámetros para las que el modelo ha podido resolverse de forma óptima, junto con sus respectivos valores de la función objetivo, ordenados de menor a mayor. alpha beta objetivo 0,0005 1 8717,166 0,0005 1,2 8752,519 0,0005 1,3 8805,875 0,0005 1,5 9158,626 0,001 1 8726,303 0,001 1,2 8796,296 0,001 1,3 8900,07 0,001 1,5 9534,075 0,005 1 8798,36 0,005 1,2 9121,598 0,005 1,3 9542,518 0,01 1 8885,885 0,01 1,2 9473,785 0,015 1 8970,658 0,015 1,2 9777,208
Se observa que la mejor combinación corresponde a α=0,0005 y β=1, es decir, los valores mínimos considerados en el análisis. Este resultado es coherente, ya que al reducir los parámetros que controlan el deterioro del inventario, también se reduce el impacto de los costes asociados, lo que contribuye a minimizar el valor total de la función objetivo. En la Ilustración 16 se muestran las distintas combinaciones de los parámetros α y β, donde el eje horizontal representa los valores de β y el eje vertical los de α. El objetivo de esta representación es visualizar cómo evoluciona el valor de la función objetivo a medida que estos parámetros aumentan. Las celdas con colores más claros indican valores más bajos de la función objetivo, mientras que los tonos más oscuros (especialmente el azul intenso) corresponden a costes más elevados. Esto refleja que, en general, al incrementar los valores de α y β, el coste total también tiende a aumentar, como era de esperar. Las celdas en blanco indican combinaciones de parámetros para las cuales el modelo no logró encontrar una solución factible. Este mapa ofrece una representación visual muy útil para comprender cómo afectan los cambios en los parámetros α y β al valor de la función objetivo. A continuación, se va a comparar de α y β, para comprobar que variación de estos parámetros crea más impacto en la función objetivo. Ilustración 16. Mapa de calor de los distintos valores de la función objetivo
40 40 En la Ilustración 17 se puede observar el impacto en la variación de beta cuando se mantiene el parámetro α fijo, para valores de 𝛽 ≤1.3 el deterioro afecta a la función objetivo haciéndola crecer, pero lentamente y de forma gradual, en cambio, cuando supera este valor el crecimiento se vuelve no lineal. Esto se debe a que valores altos de β hacen que el deterioro responda de forma más agresiva frente a niveles elevados de inventario. Es fundamental mantener los valores de β por debajo de este umbral, ya que superarlo puede tener consecuencias significativas en los costes totales. Cuando β es elevado, el deterioro del inventario se incrementa de manera desproporcionada, lo que repercute negativamente en la función objetivo y, por tanto, en la eficiencia del sistema de inventario. Por otro lado, en la Ilustración 18, se observa la variación de α manteniendo el parámetro β fijo. En este caso, se observa un crecimiento progresivo y prácticamente lineal de la función objetivo a medida que aumenta el parámetro α. Este comportamiento indica que el impacto de α es proporcional, lo que lo hace más predecible y, por tanto, más sencillo de gestionar en la toma de decisiones. Si se comparan ambas gráficas, se puede concluir que controlar el parámetro β es fundamental para controlar los efectos del deterioro en la gestión de inventarios. Esto se debe a que, al superar ciertos valores, β provoca un Ilustración 17 Ilustración 18
aumento acelerado y no lineal en el coste total, generando una situación menos estable y más difícil de manejar. En cambio, el parámetro α tiene un impacto más gradual y lineal sobre la función objetivo, lo cual permite una mayor flexibilidad en su ajuste sin que esto implique un riesgo significativo en el comportamiento del sistema. Como se observa anteriormente los parámetros 𝛼 y 𝛽 son claves para controlar el deterioro. En la práctica se pueden aplicar métodos para reducir estos parámetros lo máximo posible. A continuación, se detallará cómo puede llevarse esto a cabo. Para reducir α se puede mejorar las condiciones postcosecha aplicando métodos como enfriamiento rápido, atmósfera controlada y limpieza. Un factor muy importante a tener en cuenta es la humedad, de la que se debe mantener el control para evitar proliferación microbiana o pudrición. También se podrían reducir los daños físicos con una manipulación cuidadosa y embalaje adecuado. Otra posible solución sería aplicar tratamientos conservantes para contrarrestar el deterioro. Por otro lado, para reducir β, un parámetro crítico para la estabilización del modelo relacionado con la sensibilidad al inventario, se pueden aplicar distintas estrategias como evitar almacenar grandes cantidades en el mismo lugar, mejorar la ventilación y circulación de aire o distribuir el inventario en más nodos o espacios separados. Otra posible solución podría ser la rotación rápida de stock, no dejar que se acumulen los productos por mucho tiempo En el caso del transporte, también es fundamental que sea adecuado para que no potencie el deterioro. Debe ser un transporte rápido y con protección térmica.
42 42 7. CONCLUSIONES El objetivo general del proyecto era desarrollar un modelo de gestión para una empresa de productos de quinta gama, considerando la presencia de productos perecederos. Considero que este objetivo se ha logrado de forma satisfactoria, mediante la formulación y resolución de un modelo matemático que incorpora los costes asociados al deterioro, almacenamiento y pedidos. Los resultados obtenidos han sido coherentes con el comportamiento esperado y han permitido validar la funcionalidad del modelo en condiciones reales. Además, se ha llevado a cabo un análisis de sensibilidad modificando distintos parámetros del modelo. Esto ha demostrado su flexibilidad y capacidad de adaptación ante distintos escenarios. El enfoque adoptado ha permitido alcanzar un alto grado de realismo, considerando aspectos clave del entorno de la empresa, lo que refuerza el valor práctico del modelo desarrollado. Por otro lado, los objetivos específicos también se han cumplido como se detallará a continuación: El primero era comprender el proceso con el que se trabaja, esto se realiza al inicio del proyecto cuando se realiza un estudio del funcionamiento. Se ha investigado sobre el sector agroalimentario en España, y la importancia que tiene una buena gestión de inventario. Particularmente, en la conservación de los alimentos con riesgo de deterioro. También se han descrito los detalles de la empresa con la que se trabaja y se explica el proceso que sigue la realización de los pedidos. El siguiente objetivo es el estudio de la demanda. Con el test de Kolmogórov-Smirnov se ha podido determinar que distribución seguía el conjunto de datos para poder trabajar con ellos y poder aplicarlos al modelo. El análisis del deterioro ha sido un elemento central en el desarrollo del proyecto. Comprender su funcionamiento y su impacto en los alimentos resulta fundamental para evitar costes adicionales asociados al desperdicio de productos perecederos y, al mismo tiempo, optimizar el proceso de gestión de inventario. Identificar el comportamiento del deterioro permite implementar medidas de control eficaces, especialmente en un contexto donde dicho proceso es no lineal. En este tipo de sistemas, existen parámetros críticos que deben ser gestionados cuidadosamente, ya que pequeñas variaciones pueden desencadenar efectos significativos y desestabilizar la operación. Por último, se realiza el modelo y se resuelve, el modelo es del tipo determinista, esto quiere decir que la demanda es conocida y constante en cada periodo. Los datos proporcionados se meten en el modelo y te da una solución teniendo todos los parámetros relevantes en cuenta. Con el objetivo de validar la robustez del modelo, se han utilizado distintos conjuntos de datos de entrada. Esta estrategia ha permitido comprobar que los resultados generados por el modelo son coherentes y mantienen su validez bajo diferentes escenarios, lo que refuerza su aplicabilidad en entornos reales.
Asimismo, se ha implementado el modelo en dos versiones: una que considera explícitamente el deterioro de los productos perecederos, y otra que lo omite. Esta comparación ha permitido analizar el impacto real que tiene el deterioro sobre la gestión de inventario y, en particular, sobre los costos asociados. Los resultados obtenidos muestran que ignorar el deterioro conduce a una subestimación significativa de los costos totales, principalmente debido al desperdicio no contabilizado. Por tanto, incorporar esta variable en el modelo no solo mejora su precisión, sino que también permite tomar decisiones más realistas y eficientes en contextos donde los productos tienen una vida útil limitada. En conclusión, todos los objetivos planteados al inicio del proyecto, tanto generales como específicos, han sido alcanzados de manera satisfactoria. Se ha desarrollado un modelo robusto, aplicable y realista para la gestión de inventario en empresas con productos perecederos, integrando aspectos clave como el deterioro, la demanda y los costes logísticos. Este trabajo no solo valida la utilidad del modelo en condiciones reales, sino que también demuestra su capacidad de adaptación a diferentes escenarios, consolidando así su valor como herramienta de apoyo a la toma de decisiones en el ámbito de la gestión de operaciones. Finalmente, se detallarán algunas recomendaciones que se podrían aplicar en el ámbito real o en posibles extensiones del modelo. Una primera recomendación consiste en ampliar el horizonte temporal, no solo centrarse en 30 días, sino evaluar el modelo en periodos más largos como un año. Esto permitiría observar su comportamiento a largo plazo, detectar patrones de estacionalidad y evaluar la estabilidad y robustez del modelo. Otro aspecto relevante a considerar sería la inclusión del impacto logístico, particularmente los costes y restricciones asociados al transporte. Se podrían añadir los costes necesarios, una restricción de capacidad de los camiones, limitaciones en la frecuencia de pedidos o posibles retrasos. Por otro lado, también cabe añadir a la discusión un análisis de sensibilidad del Lead time (L) o tiempo de entrega que es un parámetro crítico en la gestión de inventarios. Un lead time más prolongado conlleva un mayor riesgo de desabastecimiento, lo que implica la necesidad de ajustar el inventario inicial para garantizar la continuidad del servicio. Al analizar la respuesta del modelo ante diferentes valores del lead time, es posible observar cómo se adapta a distintos escenarios logísticos. Esto permite anticipar y planificar mejor frente a las variaciones reales en los tiempos de entrega, haciendo el modelo más robusto y aplicable a contextos diversos. Por último, una extensión interesante podría ser considerar entornos con incertidumbre. En vez de tener una demanda conocida y estable, se podría incorporar incertidumbre de forma explícita. Esto permitiría anticipar la variabilidad de la demanda, lo que aumentaría la resiliencia del modelo y permitiría tomar decisiones más sólidas.
50 50 I0 = 6000 alpha= 0.00413 #resultados de la regresión lineal beta= 1.22456 # # #DATOS CAMBIADOS # alpha= 0.004 #resultados de la regresion lineal # beta= 1.224 # T=30 #Periodos # L = 2 # Lead time # h = 0.05 # Costo por mantener inventario # w = 2 # Costo por desperdicio # c = 500 # Costo fijo por pedido # C = 8000 # Capacidad máxima de inventario # I0 = 6000 #Creamos el modelo m = Model('Gestion de inventario') #Añadimos variables #Variables de decision Y = {} O = {} W = {} I = {} for t in range(T): Y[t] = m.addVar(vtype=GRB.BINARY, name=f'y[{t}]') O[t] = m.addVar(name=f'o[{t}]') W[t]= m.addVar(name=f'w[{t}]') I[t]= m.addVar(name=f'i[{t}]') m.update() #Añadimos restricciones for t in range(T): m.addConstr(I[t] >= 0, name=f"inv_nonnegative_{t}") # para que I no sea negativa m.addConstr(W[t] >= 0, name=f"w_nonnegative_{t}") # para que w no sea negativa m.addConstr(O[t] >= 0, name=f"o_nonnegative_{t}") # para que o no sea negativa #Capacidad maxima m.addConstr( I[t] <= C, name=f'Cap_{t}') #Balance de inventario if t == 0: m.addConstr(I[t] == I0 - demanda[t] - W[t], name=f"inv_{t}") elif t <=L: m.addConstr(I[t] == I[t-1] - demanda[t] - W[t], name=f"inv_{t}") else: m.addConstr(I[t] == I[t-1] - demanda[t] - W[t] + O[t-L], name=f"inv_{t}") #Restriccion de activacion de Y m.addConstr(O[t] <= C * Y[t], name=f"activacion_O_Y_{t}") # # Restricción de deterioro Power_I = m.addVar(name=f"Power_I_{t}", lb=0) m.addGenConstrPow(I[t], Power_I, beta, name=f"PowerConstr_{t}") #I elevado a beta=Power_I m.addConstr(W[t] >= alpha * Power_I, name=f"Deterioro_{t}") # funcion objetivo
m.setObjective(sum(I[t]*h+W[t]*w+Y[t]*c for t in range(T)),GRB.MINIMIZE) m.write("archivo.lp") m.optimize() print(f'El estado es {m.Status}') print(m.Status) print(f'Obj: {m.objVal}' ) for v in m.getVars(): if v.x>0: print(f'{v.varName} {v.x}') #VALORES DE PEDIDOS if m.Status == GRB.OPTIMAL: print("\nValores óptimos de la variable O (pedidos):\n") for t in range(T): valor = O[t].X if valor > 0: print(f"O[{t}]: {valor:.2f}") else: print(f"No se encontró una solución óptima. Estado del modelo: {m.Status}") #VALORES DE INVENTARIO if m.Status == GRB.OPTIMAL: print("\nValores óptimos de la variable I(pedidos):\n") for t in range(T): valor = I[t].X if valor > 0: print(f"I[{t}]: {valor:.2f}") else: print(f"No se encontró una solución óptima. Estado del modelo: {m.Status}") #VALORES DE DETERIORO if m.Status == GRB.OPTIMAL: print("\nValores óptimos de la variable W(pedidos):\n") for t in range(T): valor = W[t].X if valor > 0: print(f"W[{t}]: {valor:.2f}") else: print(f"No se encontró una solución óptima. Estado del modelo: {m.Status}") #el deterioro es no lineal, y para linealizarlo lo hacemos por trozos #DIBUJAMOS EL DETERIORO QUE AUMENTA DE FORMA EXPONENCIAL I_vals = np.linspace(0, 20000, 500) # Cálculo del deterioro W_vals = alpha * (I_vals ** beta) plt.figure(figsize=(10, 6)) plt.plot(I_vals, W_vals, color='darkred', label=f'Deterioro') plt.title("Deterioro en función del inventario") plt.xlabel("Inventario (I)") plt.ylabel("Deterioro (W)") plt.grid(True) plt.legend() plt.tight_layout() plt.show() #DIBUJAMOS LOS PEDIDOS pedidos = [O[t].x for t in range(T)]
52 52 plt.figure(figsize=(12, 6)) plt.bar(range(T), pedidos, color='steelblue') plt.xlabel('Período (t)') plt.ylabel('Cantidad Pedida (O[t])') plt.title('Pedidos realizados en cada período considerando deterioro') plt.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() plt.show() #DIBUJAMOS EL INVENTARIO inventario = [I[t].x for t in range(T)] plt.figure(figsize=(12, 6)) plt.bar(range(T), inventario, color='steelblue') plt.xlabel('Período (t)') plt.ylabel('Inventario (I[t])') plt.title('Inventario ') plt.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() plt.show() # #DIBUJAMOS EL DETERIORO deterioro = [W[t].x for t in range(T)] plt.figure(figsize=(12, 6)) plt.bar(range(T), deterioro, color='steelblue') plt.xlabel('Período (t)') plt.ylabel('deterioro (W[t])') plt.title('deterioro ') plt.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() plt.show() #ESTE ES EL VALOR MINIMO QUE TIENE QUE TENER I0: # print("Demanda acumulada en los primeros L días:", np.sum(demanda[:L+1])) # Creamos un DataFrame con los resultados resultados = pd.DataFrame({ 'Periodo': list(range(1, T + 1)), 'Demanda':[round(demanda[t],2) for t in range(T)], 'Cantidad Pedida (O[t])': [round(O[t].X, 2) for t in range(T)], 'Inventario (I[t])': [round(I[t].X,2) for t in range(T)], 'Deterioro (W[t])': [round(W[t].X ,2) for t in range(T)] }) resultados.to_excel("resultados_optimizacion.xlsx", index=False) print("Archivo Excel creado con éxito: resultados_optimizacion.xlsx") #Dibujamos los costes coste_inventario = sum(I[t].X * h for t in range(T)) coste_deterioro = sum(W[t].X * w for t in range(T)) coste_pedidos = sum(Y[t].X * c for t in range(T)) coste_total = coste_inventario + coste_deterioro + coste_pedidos # Datos para la gráfica nombres = ['Inventario', 'Deterioro', 'Pedidos', 'Total'] costes = [coste_inventario, coste_deterioro, coste_pedidos, coste_total] colores = ['skyblue', 'blue', 'skyblue', 'blue'] # Crear la gráfica
plt.figure(figsize=(8,6)) plt.title('Costes considerando deterioro') barras = plt.bar(nombres, costes, color=colores) 9.1.4. Modelo sin deterioro from gurobipy import * import numpy as np import scipy.stats import random import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import scipy.stats as stats # Leemos los datos datos = pd.read_excel("demanda_diaria.xlsx", engine="openpyxl") datos.columns = ['Demanda'] demanda = datos['Demanda'].head(30).to_numpy() #solo cojo los 30 primeros valores (mes) # #DATOS CAMBIADOS alpha= 0.004 #resultados de la regresion lineal beta= 1.224 T=30 #Periodos L = 2 # Lead time h = 0.05 # Costo por mantener inventario c = 500 # Costo fijo por pedido C = 8000 # Capacidad máxima de inventario I0 = 6000 #Creamos el modelo m = Model('Gestion de inventario') #Añadimos variables #Variables de decision Y = {} O = {} I = {} for t in range(T): Y[t] = m.addVar(vtype=GRB.BINARY, name=f'y[{t}]') O[t] = m.addVar(name=f'o[{t}]') I[t]= m.addVar(name=f'i[{t}]') m.update() #Añadimos restricciones for t in range(T): m.addConstr(I[t] >= 0, name=f"inv_nonnegative_{t}") # para que I no sea negativa m.addConstr(O[t] >= 0, name=f"o_nonnegative_{t}") # para que o no sea negativa #Capacidad maxima m.addConstr( I[t] <= C, name=f'Cap_{t}') #Balance de inventario if t == 0: m.addConstr(I[t] == I0 - demanda[t] , name=f"inv_{t}") elif t <= L: m.addConstr(I[t] == I[t-1] - demanda[t] , name=f"inv_{t}") else: m.addConstr(I[t] == I[t-1] - demanda[t] + O[t-L], name=f"inv_{t}") #Restriccion de activacion de Y
54 54 m.addConstr(O[t] <= C * Y[t], name=f"activacion_O_Y_{t}") # funcion objetivo m.setObjective(sum(I[t]*h+Y[t]*c for t in range(T)),GRB.MINIMIZE) m.write("archivo.lp") m.optimize() print(f'El estado es {m.Status}') print(m.Status) print(f'Obj: {m.objVal}' ) for v in m.getVars(): if v.x>0: print(f'{v.varName} {v.x}') #VALORES DE PEDIDOS if m.Status == GRB.OPTIMAL: print("\nValores óptimos de la variable O (pedidos):\n") for t in range(T): valor = O[t].X if valor > 0: print(f"O[{t}]: {valor:.2f}") else: print(f"No se encontró una solución óptima. Estado del modelo: {m.Status}") #VALORES DE INVENTARIO if m.Status == GRB.OPTIMAL: print("\nValores óptimos de la variable I(pedidos):\n") for t in range(T): valor = I[t].X if valor > 0: print(f"I[{t}]: {valor:.2f}") else: print(f"No se encontró una solución óptima. Estado del modelo: {m.Status}") #DIBUJAMOS LOS PEDIDOS pedidos = [O[t].x for t in range(T)] plt.figure(figsize=(12, 6)) plt.bar(range(T), pedidos, color='steelblue') plt.xlabel('Período (t)') plt.ylabel('Cantidad Pedida (O[t])') plt.title('Pedidos realizados en cada período sin deterioro') plt.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() plt.show() #DIBUJAMOS EL INVENTARIO inventario = [I[t].x for t in range(T)] plt.figure(figsize=(12, 6)) plt.bar(range(T), inventario, color='steelblue') plt.xlabel('Período (t)') plt.ylabel('Inventario (I[t])') plt.title('Inventario ') plt.grid(axis='y', linestyle='--', alpha=0.7) plt.tight_layout() plt.show()
#Dibujamos los costes coste_inventario = sum(I[t].X * h for t in range(T)) coste_pedidos = sum(Y[t].X * c for t in range(T)) coste_total = coste_inventario + coste_pedidos # Datos para la gráfica nombres = ['Inventario', 'Pedidos', 'Total'] costes = [coste_inventario, coste_pedidos, coste_total] colores = ['skyblue', 'blue', 'skyblue'] # Crear la gráfica plt.figure(figsize=(8,6)) plt.title('Costes sin considerar deterioro') barras = plt.bar(nombres, costes, color=colores) obj_sin_deterioro = 7685 # reemplaza con el valor real sin deterioro obj_con_deterioro = 10078 # reemplaza con el valor real con deterioro # Datos para la gráfica labels = ['Sin Deterioro', 'Con Deterioro'] valores = [obj_sin_deterioro, obj_con_deterioro] colores = ['blue', 'skyblue'] # Crear la gráfica plt.figure(figsize=(8,6)) barras = plt.bar(labels, valores, color=colores) plt.title('Comparación de la Función Objetivo') plt.ylabel('Coste Total (Función Objetivo)') plt.tight_layout() plt.show()
56 56 9.1.5. Análisis de sensibilidad from gurobipy import * import numpy as np import scipy.stats import random import matplotlib.pyplot as plt import seaborn as sns import pandas as pd import scipy.stats as stats import seaborn as sns # Leemos los datos datos = pd.read_excel("demanda_diaria.xlsx", engine="openpyxl") datos.columns = ['Demanda'] demanda = datos['Demanda'].head(30).to_numpy() #solo cojo los 30 primeros valores (mes) ##DATOS ORIGINALES T = 30 # Número de días L = 2 # Lead time h = 1 # Costo por mantener inventario w = 5 # Costo por desperdicio c = 50 # Costo fijo por pedido C = 8000 # Capacidad máxima de inventario I0 = 6000 resultados_fobj = [] alphas = [0.0005, 0.001, 0.005, 0.01, 0.015] betas = [1, 1.2, 1.3, 1.5] for i in range(len(alphas)): for j in range(len(betas)): alpha_val=alphas[i] beta_val=betas[j] #Creamos el modelo m = Model('Gestion de inventario') m.setParam('OutputFlag', 0) # Para que no imprima cada iteración #Añadimos variables #Variables de decision Y = {} O = {} W = {} I = {} for t in range(T): Y[t] = m.addVar(vtype=GRB.BINARY, name=f'y[{t}]') O[t] = m.addVar(name=f'o[{t}]') W[t]= m.addVar(name=f'w[{t}]') I[t]= m.addVar(name=f'i[{t}]') m.update() for t in range(T): m.addConstr(I[t] >= 0, name=f"inv_nonnegative_{t}") # para que I no sea negativa m.addConstr(W[t] >= 0, name=f"w_nonnegative_{t}") # para que w no sea negativa
m.addConstr(O[t] >= 0, name=f"o_nonnegative_{t}") # para que o no sea negativa #Capacidad maxima m.addConstr( I[t] <= C, name=f'Cap_{t}') #Balance de inventario if t == 0: m.addConstr(I[t] == I0 - demanda[t] - W[t], name=f"inv_{t}") elif t <= L: m.addConstr(I[t] == I[t-1] - demanda[t] - W[t], name=f"inv_{t}") else: m.addConstr(I[t] == I[t-1] - demanda[t] - W[t] + O[t-L], name=f"inv_{t}") #Restriccion de activacion de Y m.addConstr(O[t] <= C * Y[t], name=f"activacion_O_Y_{t}") # # Restricción de deterioro Power_I = m.addVar(name=f"Power_I_{t}_{i}_{j}", lb=0) m.addGenConstrPow(I[t], Power_I, beta_val, name=f"_{t}_{i}_{j}") #I elevado a beta=Power_I m.addConstr(W[t] >= alpha_val * Power_I, name=f"Deterioro_{t}_{i}_{j}") # funcion objetivo m.setObjective(sum(I[t]*h+W[t]*w+Y[t]*c for t in range(T)),GRB.MINIMIZE) m.write("archivo.lp") m.optimize() # Guardar resultados si el modelo es óptimo if m.Status == GRB.OPTIMAL: resultados_fobj.append({ 'alpha': alpha_val, 'beta': beta_val, 'objetivo': m.ObjVal #Esto hace que las combinaciones que no tengan solucion no aparezcan }) # Convertimos en DataFrame df_resultados = pd.DataFrame(resultados_fobj) print(df_resultados) print(df_resultados.sort_values(by="objetivo")) # # Guardar a Excel si lo deseas # df_resultados.to_excel("analisis_sensibilidad_deterioro.xlsx", index=False) # # Crear tabla pivote pivot = df_resultados.pivot(index="alpha", columns="beta", values="objetivo") # Graficar plt.figure(figsize=(8,6)) sns.heatmap(pivot, cmap="YlGnBu") # <- sin annot=True plt.title("Coste total en función de alpha y beta") plt.xlabel("Beta") plt.ylabel("Alpha") plt.show() # Fijamos un valor de alpha alpha_fija = 0.0005 df1 = df_resultados[df_resultados['alpha'] == alpha_fija]
58 58 # Ordenamos para ver mejor la evolucion df_filtrado = df1.sort_values('beta') # Graficamos plt.figure(figsize=(8, 5)) plt.plot(df_filtrado['beta'], df1['objetivo'], marker='o', label=f'α = {alpha_fija}') plt.title(f"Variación de la función objetivo al cambiar β (α = {alpha_fija})") plt.xlabel("Beta") plt.ylabel("Función objetivo") plt.grid(True) plt.legend() plt.show() # Fijamos un valor de beta beta_fija = 1 df2 = df_resultados[df_resultados['beta'] == beta_fija] # Ordenamos para ver mejor la evolucion df_filtrado2 = df2.sort_values('alpha') # Graficamos plt.figure(figsize=(8, 5)) plt.plot(df_filtrado2['alpha'], df2['objetivo'], marker='o', label=f'β = {beta_fija}') plt.title(f"Variación de la función objetivo al cambiar α ( β= {beta_fija})") plt.xlabel("alpha") plt.ylabel("Función objetivo") plt.grid(True) plt.legend() plt.show()
9.2. Datos 9.2.1. Datos de demanda días demanda_diaria 11741 21706 32007 42315 52254 62161 72289 81806 91911 10 1961 11 1924 12 2299 13 2396 14 2596 15 2467 16 2545 17 1681 18 2606 19 2358 20 1941 21 955 22 1538 23 2200 24 2176 25 2244 26 1580 27 1598 28 2308 29 2490 30 3095