Procesos Estocásticos y Cadenas de Markov · Tema 44

Inventarios con Markov

Stock, demanda y reposición: punto de pedido s, quiebres π₀ y costo de guardar vs faltar.

01 · Punto de partida

Guardar de más cuesta; faltar cuesta más

Cada día la demanda resta y el pedido suma. Con tope K = 5 y punto de pedido s, la pregunta es: ¿qué s deja el quiebre π₀ bajo 5 % sin guardar de más?

El stock Xₙ es Markov: demanda aleatoria + regla (s, K) = matriz P implícita.

  • ¿Qué estados: stock 0…K al inicio del día?
  • ¿Qué demanda D por día: Bernoulli(d)?
  • ¿Cuándo pedir: si queda ≤ s, completar a K?
  • ¿Qué s equilibra quiebre y stock medio?

02 · Definición

Demanda, regla e indicadores

Tres piezas del modelo:

D

Demanda

D = 1 con d, 0 si no. Vende mín(X, D); lo no vendido queda.

s

Regla (s, K)

Si tras vender queda ≤ s, pedir hasta K (llega ya). s = K−1 casi siempre lleno.

π

Indicadores

Quiebre π₀, medio Σiπᵢ, pedidos/periodo. Todo de π.

Con K = 5, d = 0,4 y s = 1: quiebre ≈ 8 %, medio ≈ 3,2 y pedidos ≈ 0,35/día (laboratorio).

Subir s: menos quiebre, más guardado (d = 0,4).
sQuiebre π₀Medio
0~18 %~2,4
1~8 %~3,2
2~3 %~3,9

03 · Anatomía

Quiebre, guardado y pedidos

Cuatro lecturas del mismo π:

Quiebre π₀
Fracción de días en 0 (venta perdida si D = 1). El SLA del inventario.
Stock medio
Σ i·πᵢ: capital inmovilizado. Sube con s.
Pedidos
Fracción de días que se pide: costo de ordenar y fletes.
Demanda d
Presión externa: con d alta ni s = K−1 evita quiebres.

s bajo

Ahorra guardado

Poco stock medio, muchos quiebres. Para demanda mansa.

s alto

Asegura venta

Quiebre chico, guardado grande. Para demanda brava.

04 · Ejemplos

Stocks que se modelan igual

Cambia el producto, no la matriz:

Demanda d→(s, K)→π₀ y medio
  1. 1
    Kiosco: d = 0,6.

    s = 2 para quiebre < 5 % con K = 5.

  2. 2
    Repuestos: d = 0,1.

    s = 0 alcanza: demanda mansa.

  3. 3
    Farmacia crítica.

    s alto aunque guarde de más: faltar cuesta vidas.

  4. 4
    Perecederos.

    K chico + s medio: guardar de más vence.

  5. 5
    Sin tope.

    K grande ≈ numerable: el tope deja de mandar.

05 · Representación en Python

Stock como cadena con regla (s, K)

En Python, el paso es vender y reponer: venta = mín(X, D), y si queda ≤ s se completa a K. Con eso se simula y se estima π.

Python en tu navegador. Estos bloques se ejecutan localmente con Pyodide, sin instalar nada. Cambiá s y mirá quiebres.

import random

def paso(x, d=0.4, s=1, K=5):
    # Demanda Bernoulli(d), reposición instantánea a K si queda <= s.
    D = 1 if random.random() < d else 0
    x = x - min(x, D)
    pedido = 1 if x <= s else 0
    if pedido:
        x = K
    return x, pedido

random.seed(7)
x = 5
for _ in range(8):
    x, p = paso(x)
    print(x, "pidió" if p else "")

El stock baja de a 1 con demanda y salta a 5 al pedir: dientes de sierra aleatorios.

Quiebre y medio simulados

R réplicas con burn-in, como en el Tema 41:

import random

def paso(x, d=0.4, s=1, K=5):
    D = 1 if random.random() < d else 0
    x = x - min(x, D)
    if x <= s:
        x = K
    return x

random.seed(3)
K, N, burn = 5, 300, 60
x, tot = K, [0] * (K + 1)
for n in range(N):
    x = paso(x)
    if n >= burn:
        tot[x] += 1
s = sum(tot)
print("quiebre:", round(tot[0] / s, 3))
print("medio:", round(sum(i * v for i, v in enumerate(tot)) / s, 2))

06 · Exploración

Laboratorio: elegir s sin adivinar

Stock 0…5 con demanda d y punto s (6 réplicas de 40 días + media blanca). Las métricas estiman quiebre π₀, medio y pedidos/día. Subí d: el quiebre exige más s.

EXPERIMENTO 44

Curva quiebre vs guardado

Xₙ ∈ {0…5} · pedir si ≤ s

Los resultados numéricos aparecen debajo.
Quiebre π₀0 %
Stock medio0,00
Pedidos/día0,00
LecturaOK

Con d 0,40 y s 1: quiebre ≈ 8 % y medio ≈ 3,2.

Los saltos a 5 son pedidos; los tramos en 0 son quiebres. Más s = más saltos y menos ceros.

Preguntas para explorar

  1. Con d = 0,4, ¿qué s deja el quiebre bajo 5 %? ¿Y el medio cuánto da?
  2. Subí d a 0,8 con s = 1. ¿El quiebre se dispara? ¿Qué s lo contiene?
  3. ¿Pedir más seguido (s alto) cuesta pedidos o stock? ¿Cuál pesa?
Ver respuestas sugeridas
  1. s = 2 (≈ 3 % con medio ≈ 3,9). s = 1 queda en ≈ 8 %.
  2. Sí (≈ 25 %+); hace falta s = 3–4. Demanda brava pide colchón.
  3. Ambos: más pedidos (fletes) y más medio (capital). Se optimiza costo total.

07 · Comprensión

Confusiones frecuentes

«s alto elimina quiebres»

Los reduce, no los elimina: rachas de demanda sin reposición quiebran igual.

«El pedido llega cuando quiero»

Acá llega ya (instantáneo). Con demora (lead time) hay que guardar en-camino en el estado.

«Demanda = ventas»

Ventas = mín(stock, demanda). Sin stock la demanda se pierde (o espera, según modelo).

«Medio alto siempre es malo»

Es capital vs quiebre: con faltante caro, medio alto es óptimo.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: un día de stock

Con X = 1, D = 1, s = 1 y K = 5, ¿X' y pedido? Verificá la regla.

x, D, s, K = 1, 1, 1, 5
x = x - min(x, D)
pedido = x <= s
print(x, pedido, K if pedido else x)
Ver solución razonada

Queda 0 y pide: salta a 5. Vender el último dispara el pedido.

Ejercicio 2: barrer s

Sin ejecutar primero: ¿quiebre baja o sube con s? Barré s = 0…3 simulando.

import random

def quiebre(s, d=0.4, K=5, N=2000):
    random.seed(11)
    x, q = K, 0
    for n in range(N):
        D = 1 if random.random() < d else 0
        x = x - min(x, D)
        if x <= s:
            x = K
        if n >= 200 and x == 0:
            q += 1
    return round(q / (N - 200), 3)

print([quiebre(s) for s in range(4)])
Ver solución

Baja monótona (≈ [0,18 – 0,08 – 0,03 – 0,01]). Más s, menos quiebre.

Ejercicio 3: costo total simple

Con costo guardar 1/día/unidad y faltar 10/día en 0, ¿qué s minimiza en d = 0,4?

Ver una posible respuesta
# quiebre y medio aprox. del laboratorio (d=0.4):
datos = {0: (0.18, 2.4), 1: (0.08, 3.2), 2: (0.03, 3.9), 3: (0.01, 4.4)}
for s, (q, m) in datos.items():
    print(s, round(m * 1 + q * 10, 2))

Mínimo en s = 2 (≈ 4,2): el quiebre caro justifica guardar.

09 · Síntesis

Ideas para recordar

  • Xₙ = stock con demanda D y regla (s, K).
  • Quiebre π₀ vs medio Σiπᵢ: la curva decide s.
  • En Python: vender, reponer, simular con burn-in.
  • Con demora, ampliar el estado con en-camino.
  • Optimizar costo total, no solo quiebre.

En el próximo tema seguiremos usuarios: clicks, abandono y conversión.