Análisis determinista de inventarios

El análisis de inventarios trata del mantenimiento de bienes almacenados y dispuestos para ser usados o vendidos. Entran en juego diferentes tipos de costes económicos, como los que se derivan del propio almacenamiento, la compra de nuevas remesas para reponer en el almacén, o los gastos en que se incurre cuando una demanda no puede ser satisfecha por falta de existencias.

El responsable del almacén debe decidir cuándo ordenar una nueva remesa y en qué cantidades con el fin de minimizar los costes.

Los modelos de inventarios pueden ser deterministas o estocásticos, dependiendo del conocimiento que se tenga del comportamiento de la demanda.

Tratamos aquí la situación en la que almacenamos un solo producto con demanda constante en el tiempo. También supondremos que la revisión del inventario se hace de forma continua, y no a intervalos, de modo que podemos ordenar el pedido de nuevas remesas para el almacén en cualquier momento.

El modelo sigue el siguiente esquema: suponemos que partimos de un almacén vacío y hacemos un primer pedido de una cantidad determinada, a partir del cual van llegando los bienes siguiendo un patrón lineal; justo a partir del instante inicial, empieza también la demanda del producto de forma constante. En nuestro modelo permitiremos quedarnos sin existencias en el almacén, de manera que las demandas que se sigan produciendo serán satisfechas de forma diferida cuando vuelva a haber unidades disponibles. Cuando las demandas no satisfechas, que contabilizan como unidades negativas en el inventario, alcancen un nivel crítico, entonces ordenaremos un nuevo pedido; según vayan llegando las nuevas unidades, se va haciendo entrega de ellas hasta que las demandas no satisfechas queden cubiertas, a partir de ahí, las que continúen llegando serán almacenadas.

Las variables que forman parte de este modelo son las siguientes:

\(c_1\):
Coste unitario de mantenimiento por unidad de tiempo.
\(c_2\):
Coste unitario de penalización por demanda no satisfecha.
\(c_3\):
Coste fijo de producción o pedido de nuevas existencias.
\(r\):
Tasa de demanda. Durante el tiempo t se demandan \(r \cdot t\) unidades.
\(k\):
Tasa de producción o de pedido. Durante el tiempo t se producen \(k \cdot t\) unidades. Siempre se cumple \(k \gt r\).
\(t_1\):
Partiendo de un nivel cero en inventario, tiempo necesario hasta alcanzar un nivel máximo S a determinar, \(S=k t_1-r t_1\).
\(t_2\):
Una vez alcanzado el nivel S en inventario, tiempo durante el cual se para la producción hasta que el inventario se agota, de modo que \(S=r t_2\).
\(t_3\):
Agotado el inventario, tiempo durante el cual se siguen recibiendo demandas que no se pueden satisfacer de forma inmediata (o diferidas) hasta un monto total de \(D=r t_3\) unidades.
\(t_4\):
Alcanzado el máximo nivel de demandas insatisfechas D, tiempo durante el cual se vuelven a producir unidades hasta que el inventario comienza a almacenar unidades, de modo que \(D=k t_4-r t_4\).
\(q\):
Cantidad total satisfecha durante el ciclo, \(q= r(t_1+t_2+t_3+t_4)\) unidades.

El coste total del ciclo viene dado por la suma de los siguientes costes: en primer lugar, el coste de mantenimiento de bienes en el inventario durante el intervalo de tiempo \(t_1+t_2\), que es \(c_1(t_1+t_2)S/2\); en segundo lugar, el coste de penalización de demandas no satisfechas durante el intervalo \(t_3+t_4\), que es \(c_2(t_3+t_4)D/2\); por último, los costes fijos de producción, \(c_3\). Sin extendernos en más detalles, el coste total por unidad de tiempo para el ciclo completo es

C: (c1*(t1+t2)*S/2 + c2*(t3+t4)*D/2 + c3) / (t1+t2+t3+t4);

\[{{{{D\,{\it c_2}\,\left({\it t_4}+{\it t_3}\right)}\over{2}}+{{S\, {\it c_1}\,\left({\it t_2}+{\it t_1}\right)}\over{2}}+{\it c_3} }\over{{\it t_4}+{\it t_3}+{\it t_2}+{\it t_1}}}\]

Tanto \(t_1\) como \(t_4\) se pueden expresar en términos de \(t_2\) y \(t_3\),

S: r*t2 $
D: r*t3 $
t1t4: append(solve(k*t1-r*t1=S, t1) , solve(k*t4-r*t4=D, t4));

\[ \left[ {\it t_1}=-{{r\,{\it t_2}}\over{r-k}} , {\it t_4}=-{{r\, {\it t_3}}\over{r-k}} \right] \]

Las relaciones anteriores nos permiten eliminar \(t_1\) y \(t_4\) de la expresión del coste,

Cu: ''(factor(subst(t1t4, C)));

\[ {{{\it c_2}\,k\,r\,{\it t_3}^2+{\it c_1}\,k\,r\,{\it t_2}^2-2\, {\it c_3}\,r+2\,{\it c_3}\,k}\over{2\,k\,\left({\it t_3}+{\it t_2} \right)}} \]

Vemos, pues, que las variables de decisión son los tiempos \(t_2\) y \(t_3\), por lo que buscamos los valores que minimicen el coste unitario calculando derivadas parciales e igualando a cero,

sol: radcan(solve([diff(Cu, t2), diff(Cu, t3)], [t2,t3]));

\[ \left[ \left[ {\it t_2}=-{{\sqrt{2}\,\sqrt{{\it c_2}}\,\sqrt{ {\it c_3}}\,\sqrt{k-r}}\over{\sqrt{{\it c_1}}\,\sqrt{{\it c_2}+ {\it c_1}}\,\sqrt{k}\,\sqrt{r}}} , {\it t_3}=-{{\sqrt{2}\,\sqrt{ {\it c_1}}\,\sqrt{{\it c_3}}\,\sqrt{k-r}}\over{\sqrt{{\it c_2}}\, \sqrt{{\it c_2}+{\it c_1}}\,\sqrt{k}\,\sqrt{r}}} \right] , \\ \left[ {\it t_2}={{\sqrt{2}\,\sqrt{{\it c_2}}\,\sqrt{{\it c_3}}\,\sqrt{k-r} }\over{\sqrt{{\it c_1}}\,\sqrt{{\it c_2}+{\it c_1}}\,\sqrt{k}\, \sqrt{r}}} , {\it t_3}={{\sqrt{2}\,\sqrt{{\it c_1}}\,\sqrt{{\it c_3} }\,\sqrt{k-r}}\over{\sqrt{{\it c_2}}\,\sqrt{{\it c_2}+{\it c_1}}\, \sqrt{k}\,\sqrt{r}}} \right] , \\ \left[ {\it t_2}=-{{\sqrt{2}\,\sqrt{ {\it c_3}}\,\sqrt{r-k}}\over{\sqrt{{\it c_2}+{\it c_1}}\,\sqrt{k}\, \sqrt{r}}} , {\it t_3}={{\sqrt{2}\,\sqrt{{\it c_3}}\,\sqrt{r-k} }\over{\sqrt{{\it c_2}+{\it c_1}}\,\sqrt{k}\,\sqrt{r}}} \right] , \\ \left[ {\it t_2}={{\sqrt{2}\,\sqrt{{\it c_3}}\,\sqrt{r-k}}\over{ \sqrt{{\it c_2}+{\it c_1}}\,\sqrt{k}\,\sqrt{r}}} , {\it t_3}=-{{ \sqrt{2}\,\sqrt{{\it c_3}}\,\sqrt{r-k}}\over{\sqrt{{\it c_2}+ {\it c_1}}\,\sqrt{k}\,\sqrt{r}}} \right] \right] \]

De las soluciones anteriores, solo la segunda da dos valores reales positivos y es la única que tiene sentido en el contexto de nuestro problema,

opt: factor(second(sol));

\[ \left[ {\it t_2}={{\sqrt{2}\,\sqrt{{\it c_2}}\,\sqrt{{\it c_3}}\, \sqrt{k-r}}\over{\sqrt{{\it c_1}}\,\sqrt{{\it c_2}+{\it c_1}}\, \sqrt{k}\,\sqrt{r}}} , {\it t_3}={{\sqrt{2}\,\sqrt{{\it c_1}}\, \sqrt{{\it c_3}}\,\sqrt{k-r}}\over{\sqrt{{\it c_2}}\,\sqrt{{\it c_2} +{\it c_1}}\,\sqrt{k}\,\sqrt{r}}} \right] \]

Ahora que conocemos los valores óptimos de \(t_2\) y \(t_3\), podemos calcular los de \(t_1\) y \(t_4\),

t1t4: subst(opt, t1t4);

\[ \left[ {\it t_1}=-{{\sqrt{2}\,\sqrt{{\it c_2}}\,\sqrt{{\it c_3}}\, \sqrt{k-r}\,\sqrt{r}}\over{\sqrt{{\it c_1}}\,\sqrt{{\it c_2}+ {\it c_1}}\,\sqrt{k}\,\left(r-k\right)}} , \\ {\it t_4}=-{{\sqrt{2}\, \sqrt{{\it c_1}}\,\sqrt{{\it c_3}}\,\sqrt{k-r}\,\sqrt{r}}\over{ \sqrt{{\it c_2}}\,\sqrt{{\it c_2}+{\it c_1}}\,\sqrt{k}\,\left(r-k \right)}} \right] \]

Una vez conocidos los tiempos óptimos, podemos calcular todas las demás variables del modelo. Empezamos por la cantidad total de demanda satisfecha durante un ciclo completo de la gestión del inventario,

q: factor(subst(append(opt, t1t4), r*(t1+t2+t3+t4)));

\[ -{{\sqrt{2}\,\sqrt{{\it c_2}+{\it c_1}}\,\sqrt{{\it c_3}}\,\sqrt{k} \,\sqrt{k-r}\,\sqrt{r}}\over{\sqrt{{\it c_1}}\,\sqrt{{\it c_2}}\, \left(r-k\right)}} \]

Nivel máximo de inventario S,

S: subst(opt, S);

\[ {{\sqrt{2}\,\sqrt{{\it c_2}}\,\sqrt{{\it c_3}}\,\sqrt{k-r}\,\sqrt{r }}\over{\sqrt{{\it c_1}}\,\sqrt{{\it c_2}+{\it c_1}}\,\sqrt{k}}} \]

Máximo número de unidades de demanda diferida que admitimos, D,

D: subst(opt, D);

\[ {{\sqrt{2}\,\sqrt{{\it c_1}}\,\sqrt{{\it c_3}}\,\sqrt{k-r}\,\sqrt{r }}\over{\sqrt{{\it c_2}}\,\sqrt{{\it c_2}+{\it c_1}}\,\sqrt{k}}} \]

Y lo que más importa, ¿cuál es el gasto en el que incurrimos con las decisiones anteriores?

Cu: radcan(subst(opt, Cu));

\[ -{{\sqrt{{\it c_1}}\,\sqrt{{\it c_2}}\,\sqrt{{\it c_3}}\,\sqrt{r}\, \left(2\,r-2\,k\right)}\over{\sqrt{2}\,\sqrt{{\it c_2}+{\it c_1}}\, \sqrt{k}\,\sqrt{k-r}}} \]

Si prevemos que este mismo problema lo vamos a tener que resolver varias veces, con diferentes costes involucrados, lo mejor es escribir una función que empaquete todos los pasos anteriores,

define(
  inventario1(c1,c2,c3,r,k),
  block([t1, t2, t3, t4],
   t1: rhs(first(t1t4)),
   t2: rhs(first(opt)),
   t3: rhs(second(opt)),
   t4: rhs(second(t1t4)),
   [t1, t2, t3, t4,
    t1+t2+t3+t4,
    q, S, D, Cu]) )$

La función devuelve, y en este orden, el tiempo necesario para alcanzar el máximo número de unidades en el inventario, el tiempo necesario para agotar el inventario, tiempo durante el que se producen demandas insatisfechas, tiempo que transcurre hasta que se vuelven a almacenar unidades, tiempo total del ciclo de inventario, cantidad total de producto servido, máximo número de unidades que se llegan a tener almacenadas, máximo número de unidades demandadas y no satisfechas y, por último, coste mínimo por unidad de tiempo.

Ahora estamos en condiciones de resolver un problema real. En una cadena de montaje se necesitan 9000 tornillos para los próximos 15 días. El coste de mantenimiento del inventario es de 0.5 EU por día y el coste fijo de producción de tornillos es de 400 EU y la tasa de producción es de 1000 tornillos/día. Se necesita saber qué cantidad de tornillos deben producirse y cada cuánto tiempo para minimizar costes.

sol: inventario1(1/2, c2, 400, 9000/15, 1000);

\[ \left[ {{2\,\sqrt{6}\,\sqrt{{\it c_2}}}\over{\sqrt{10}\,\sqrt{ {\it c_2}+{{1}\over{2}}}}} , {{8\,\sqrt{{\it c_2}}}\over{\sqrt{6}\, \sqrt{10}\,\sqrt{{\it c_2}+{{1}\over{2}}}}} , \\ {{4}\over{\sqrt{6}\, \sqrt{10}\,\sqrt{{\it c_2}}\,\sqrt{{\it c_2}+{{1}\over{2}}}}} , {{\sqrt{6}}\over{\sqrt{10}\,\sqrt{{\it c_2}}\,\sqrt{{\it c_2}+{{1 }\over{2}}}}} , \\ {{2\,\sqrt{6}\,\sqrt{{\it c_2}}}\over{\sqrt{10}\, \sqrt{{\it c_2}+{{1}\over{2}}}}}+{{8\,\sqrt{{\it c_2}}}\over{\sqrt{6 }\,\sqrt{10}\,\sqrt{{\it c_2}+{{1}\over{2}}}}}+{{\sqrt{6}}\over{ \sqrt{10}\,\sqrt{{\it c_2}}\,\sqrt{{\it c_2}+{{1}\over{2}}}}}+{{4 }\over{\sqrt{6}\,\sqrt{10}\,\sqrt{{\it c_2}}\,\sqrt{{\it c_2}+{{1 }\over{2}}}}} , \\ {{2\,\sqrt{6}\,10^{{{5}\over{2}}}\,\sqrt{{\it c_2}+ {{1}\over{2}}}}\over{\sqrt{{\it c_2}}}} , {{8\,\sqrt{6}\,10^{{{3 }\over{2}}}\,\sqrt{{\it c_2}}}\over{\sqrt{{\it c_2}+{{1}\over{2}}}}} , \\ {{4\,\sqrt{6}\,10^{{{3}\over{2}}}}\over{\sqrt{{\it c_2}}\,\sqrt{ {\it c_2}+{{1}\over{2}}}}} , {{4\,\sqrt{6}\,10^{{{3}\over{2}}}\, \sqrt{{\it c_2}}}\over{\sqrt{{\it c_2}+{{1}\over{2}}}}} \right] \]

En la expresión anterior no hemos podido darle un valor a \(c_2\), el coste por demanda no satisfecha. En el caso que nos ocupa, si en el almacén ya no quedan tornillos y se produce nueva demanda, la cadena de montaje se para. La dirección considera que esta situación es inaceptable, lo que implica asignarle un coste infinito a \(c_2\),

sol: limit(sol, c2, inf);

\[ \left[ {{2\,\sqrt{6}}\over{\sqrt{10}}} , {{8}\over{\sqrt{6}\,\sqrt{ 10}}} , 0 , 0 , {{2\,\sqrt{10}}\over{\sqrt{6}}} , 2\,\sqrt{6}\,10^{ {{5}\over{2}}} , 8\,\sqrt{6}\,10^{{{3}\over{2}}} , 0 , 4\,\sqrt{6}\, 10^{{{3}\over{2}}} \right] \]

Pasando a formato decimal,

fpprintprec: 5 $
float(sol);

\[ \left[ 1.5492 , 1.0328 , 0.0 , 0.0 , 2.582 , 1549.2 , 619.68 , 0.0, 309.84 \right] \]

Resumiendo, durante 1.55 días estaremos produciendo tornillos y luego pararemos, cuando hayan transcurrido 1.03 días se agotará el inventario y comenzaremos a producir más tornillos; la suma de estas cantidades, 2.58 días, es la duración del ciclo completo. Durante ese tiempo habremos entregado a la cadena de montaje un total de 1549 tornillos. Además, sabemos que el número máximo de tornillos que tendremos que llegar a almacenar es 620. Por último, con esta política de gestión de inventario tendremos que hacer frente a un gasto de 310 EU al día y con ella nos aseguraremos que la cadena de montaje no se parará.


© 2016, TecnoStats.