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:
Demanda
D = 1 con d, 0 si no. Vende mín(X, D); lo no vendido queda.
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).
| s | Quiebre π₀ | 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:
- 1Kiosco: d = 0,6.
s = 2 para quiebre < 5 % con K = 5.
- 2Repuestos: d = 0,1.
s = 0 alcanza: demanda mansa.
- 3Farmacia crítica.
s alto aunque guarde de más: faltar cuesta vidas.
- 4Perecederos.
K chico + s medio: guardar de más vence.
- 5Sin 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.
Curva quiebre vs guardado
Xₙ ∈ {0…5} · pedir si ≤ s
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
- Con d = 0,4, ¿qué s deja el quiebre bajo 5 %? ¿Y el medio cuánto da?
- Subí d a 0,8 con s = 1. ¿El quiebre se dispara? ¿Qué s lo contiene?
- ¿Pedir más seguido (s alto) cuesta pedidos o stock? ¿Cuál pesa?
Ver respuestas sugeridas
- s = 2 (≈ 3 % con medio ≈ 3,9). s = 1 queda en ≈ 8 %.
- Sí (≈ 25 %+); hace falta s = 3–4. Demanda brava pide colchón.
- 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.