Este notebook en R implementa una simulación estocástica para modelar el comportamiento diario de un sistema de producción y distribución de botellas de agua durante 10 días. Se evalúa cómo varían la producción, la demanda, las ventas y el stock del Centro de Distribución (CDC) a lo largo del tiempo.
El modelo simula una situación realista en la que:
La producción diaria definida y no definina.
La demanda diaria de los clientes también varía aleatoriamente.
El stock acumulado de días anteriores puede ser utilizado para satisfacer parte de la demanda actual.
El objetivo principal es estudiar cómo se comporta el sistema bajo condiciones de incertidumbre en la producción y demanda, observando:
La evolución del stock disponible en el CDC.
La eficiencia con la que se satisface la demanda diaria.
El impacto del uso del stock acumulado en la cobertura de ventas.
La diferencia entre producción, demanda y ventas reales.
dias
: Número total de días de simulación.
produccion_diaria
: Cantidad fija de botellas que se
intentan producir cada día.
stock_cdc
: Stock de botellas en el Centro de
Distribución (inicia en 0).
inventario_tiendas
: Inventario inicial por tienda (0
para las 3 tiendas).
insumos
: Cantidad inicial de insumos necesarios para
producir las botellas:
- 1 unidad de B1 (botellas vacias)
- 1 unidad de B2 (tapas) por botella
- 50 ml de B3 (agua purificada) por botella
set.seed(123)
# Parámetros iniciales
dias <- 7
produccion_diaria <- 140
stock_cdc <- 0
inventario_tiendas <- c(0, 0, 0)
insumos <- c(B1 = 5000, B2 = 5000, B3 = 150000)
for
que recorre los días desde 1 hasta 7. Cada iteración
representa una jornada de producción, despacho y
ventas.for (dia in 1:dias) {
cat(paste0("DÍA ", dia, "\n------------------\n"))
# Generar demanda por tienda
demanda <- sample(30:50, 3)
total_demanda <- sum(demanda)
# Producción del día (puede ser ajustada si deseas variarla por día)
prod <- produccion_diaria
insumos_usados <- c(B1 = prod, B2 = prod, B3 = prod * 50)
# Verificar disponibilidad de insumos
if (all(insumos - insumos_usados >= 0)) {
insumos <- insumos - insumos_usados
stock_cdc <- stock_cdc + prod - total_demanda # ← Stock acumulado correctamente
cat("Producción:", prod, "botellas\n")
} else {
cat("No hay suficientes insumos para producir.\n")
prod <- 0
}
# Mostrar insumos restantes
cat("Insumos restantes - B1:", insumos["B1"],
" B2:", insumos["B2"],
" B3:", insumos["B3"], "ml\n")
cat("Stock en CDC:", stock_cdc, "\n")
# Clientes por tienda
clientes <- mapply(function(d) sample(20:d, 1), demanda)
for (i in 1:3) {
despacho <- demanda[i] # Despacho igual a la demanda
vendido <- max(clientes[i], sample(clientes[i]:despacho, 1)) # Vendido ≥ clientes, ≤ despacho
# Inventario final = Demanda - Vendido (nunca negativo)
inventario_final <- max(0, demanda[i] - vendido)
cat(paste0("Tienda ", i,
" - Demanda: ", demanda[i],
" | Clientes: ", clientes[i],
" → Despacho: ", despacho,
" - Vendido en tienda: ", vendido,
" | Inventario final: ", inventario_final, "\n"))
}
cat("\n")
}
## DÍA 1
## ------------------
## Producción: 140 botellas
## Insumos restantes - B1: 4860 B2: 4860 B3: 143000 ml
## Stock en CDC: 5
## Tienda 1 - Demanda: 44 | Clientes: 22 → Despacho: 44 - Vendido en tienda: 43 | Inventario final: 1
## Tienda 2 - Demanda: 48 | Clientes: 29 → Despacho: 48 - Vendido en tienda: 39 | Inventario final: 9
## Tienda 3 - Demanda: 43 | Clientes: 37 → Despacho: 43 - Vendido en tienda: 41 | Inventario final: 2
##
## DÍA 2
## ------------------
## Producción: 140 botellas
## Insumos restantes - B1: 4720 B2: 4720 B3: 136000 ml
## Stock en CDC: 19
## Tienda 1 - Demanda: 49 | Clientes: 38 → Despacho: 49 - Vendido en tienda: 40 | Inventario final: 9
## Tienda 2 - Demanda: 43 | Clientes: 28 → Despacho: 43 - Vendido en tienda: 35 | Inventario final: 8
## Tienda 3 - Demanda: 34 | Clientes: 32 → Despacho: 34 - Vendido en tienda: 33 | Inventario final: 1
##
## DÍA 3
## ------------------
## Producción: 140 botellas
## Insumos restantes - B1: 4580 B2: 4580 B3: 129000 ml
## Stock en CDC: 46
## Tienda 1 - Demanda: 36 | Clientes: 23 → Despacho: 36 - Vendido en tienda: 33 | Inventario final: 3
## Tienda 2 - Demanda: 39 | Clientes: 33 → Despacho: 39 - Vendido en tienda: 39 | Inventario final: 0
## Tienda 3 - Demanda: 38 | Clientes: 36 → Despacho: 38 - Vendido en tienda: 36 | Inventario final: 2
##
## DÍA 4
## ------------------
## Producción: 140 botellas
## Insumos restantes - B1: 4440 B2: 4440 B3: 122000 ml
## Stock en CDC: 62
## Tienda 1 - Demanda: 41 | Clientes: 32 → Despacho: 41 - Vendido en tienda: 40 | Inventario final: 1
## Tienda 2 - Demanda: 44 | Clientes: 26 → Despacho: 44 - Vendido en tienda: 35 | Inventario final: 9
## Tienda 3 - Demanda: 39 | Clientes: 28 → Despacho: 39 - Vendido en tienda: 34 | Inventario final: 5
##
## DÍA 5
## ------------------
## Producción: 140 botellas
## Insumos restantes - B1: 4300 B2: 4300 B3: 115000 ml
## Stock en CDC: 81
## Tienda 1 - Demanda: 50 | Clientes: 44 → Despacho: 50 - Vendido en tienda: 48 | Inventario final: 2
## Tienda 2 - Demanda: 36 | Clientes: 21 → Despacho: 36 - Vendido en tienda: 28 | Inventario final: 8
## Tienda 3 - Demanda: 35 | Clientes: 32 → Despacho: 35 - Vendido en tienda: 35 | Inventario final: 0
##
## DÍA 6
## ------------------
## Producción: 140 botellas
## Insumos restantes - B1: 4160 B2: 4160 B3: 108000 ml
## Stock en CDC: 102
## Tienda 1 - Demanda: 42 | Clientes: 25 → Despacho: 42 - Vendido en tienda: 39 | Inventario final: 3
## Tienda 2 - Demanda: 47 | Clientes: 40 → Despacho: 47 - Vendido en tienda: 41 | Inventario final: 6
## Tienda 3 - Demanda: 30 | Clientes: 28 → Despacho: 30 - Vendido en tienda: 30 | Inventario final: 0
##
## DÍA 7
## ------------------
## Producción: 140 botellas
## Insumos restantes - B1: 4020 B2: 4020 B3: 101000 ml
## Stock en CDC: 113
## Tienda 1 - Demanda: 45 | Clientes: 30 → Despacho: 45 - Vendido en tienda: 35 | Inventario final: 10
## Tienda 2 - Demanda: 49 | Clientes: 27 → Despacho: 49 - Vendido en tienda: 33 | Inventario final: 16
## Tienda 3 - Demanda: 35 | Clientes: 25 → Despacho: 35 - Vendido en tienda: 25 | Inventario final: 10
n_dias
) y se inicializan los vectores
necesarios para almacenar la información diaria: demanda, producción,
inventario y stock.
demanda
: vector que contendrá la
demanda diaria simulada (usamos distribución Poisson).
produccion_diaria_1
y
produccion_diaria_2
: representan dos posibles
niveles de producción por día.
inventario
: registra el número de
productos disponibles cada día.
stock
: almacena el stock restante
acumulado al final de cada día.
set.seed(123) # Para reproducibilidad
# Parámetros
dias <- 10
stock_inicial <- 0
stock <- stock_inicial
# Crear vectores
produccion <- numeric(dias)
demanda <- numeric(dias)
stock_inicial_dia <- numeric(dias)
stock_usado <- numeric(dias)
ventas <- numeric(dias)
stock_final <- numeric(dias)
for
para simular cada día:
El primer día no tiene stock inicial.
Se ajusta la producción diaria en función de la demanda anterior.
Se calcula el stock disponible, las ventas reales (limitadas por stock + producción), y los productos faltantes si no se logra cubrir toda la demanda.
Se guarda el stock restante para el siguiente día.
for (dia in 1:dias) {
# Producción aleatoria diaria entre 80 y 120 unidades
produccion[dia] <- sample(80:120, 1)
# Demanda aleatoria diaria entre 90 y 130 unidades
demanda[dia] <- sample(90:130, 1)
# Guardar el stock antes de usarlo
stock_inicial_dia[dia] <- stock
# Total disponible = stock + producción
disponible <- stock + produccion[dia]
# Determinar ventas reales (no puede superar lo disponible)
ventas[dia] <- min(disponible, demanda[dia])
# Cuánto se usó del stock
stock_usado[dia] <- min(stock, ventas[dia])
# Actualizar stock final
stock <- disponible - ventas[dia]
stock_final[dia] <- stock
# Mostrar resultados por día en formato deseado
cat(paste0("DÍA ", dia, "\n------------------\n"))
cat(paste0(
"Producción: ", produccion[dia], " botellas\n",
"Demanda: ", demanda[dia],
" | Stock inicial: ", stock_inicial_dia[dia],
" → Stock usado: ", stock_usado[dia],
" | Vendido: ", ventas[dia],
" | Stock final: ", stock_final[dia], "\n\n"
))
}
## DÍA 1
## ------------------
## Producción: 110 botellas
## Demanda: 104 | Stock inicial: 0 → Stock usado: 0 | Vendido: 104 | Stock final: 6
##
## DÍA 2
## ------------------
## Producción: 93 botellas
## Demanda: 92 | Stock inicial: 6 → Stock usado: 6 | Vendido: 92 | Stock final: 7
##
## DÍA 3
## ------------------
## Producción: 116 botellas
## Demanda: 103 | Stock inicial: 7 → Stock usado: 7 | Vendido: 103 | Stock final: 20
##
## DÍA 4
## ------------------
## Producción: 104 botellas
## Demanda: 115 | Stock inicial: 20 → Stock usado: 20 | Vendido: 115 | Stock final: 9
##
## DÍA 5
## ------------------
## Producción: 106 botellas
## Demanda: 94 | Stock inicial: 9 → Stock usado: 9 | Vendido: 94 | Stock final: 21
##
## DÍA 6
## ------------------
## Producción: 106 botellas
## Demanda: 117 | Stock inicial: 21 → Stock usado: 21 | Vendido: 117 | Stock final: 10
##
## DÍA 7
## ------------------
## Producción: 88 botellas
## Demanda: 118 | Stock inicial: 10 → Stock usado: 10 | Vendido: 98 | Stock final: 0
##
## DÍA 8
## ------------------
## Producción: 114 botellas
## Demanda: 97 | Stock inicial: 0 → Stock usado: 0 | Vendido: 97 | Stock final: 17
##
## DÍA 9
## ------------------
## Producción: 105 botellas
## Demanda: 96 | Stock inicial: 17 → Stock usado: 17 | Vendido: 96 | Stock final: 26
##
## DÍA 10
## ------------------
## Producción: 88 botellas
## Demanda: 108 | Stock inicial: 26 → Stock usado: 26 | Vendido: 108 | Stock final: 6
# Crear data frame para mostrar resultados
resultado <- data.frame(
Día = 1:dias,
Producción = produccion,
Demanda = demanda,
Stock_Inicial = stock_inicial_dia,
Stock_Usado = stock_usado,
Ventas = ventas,
Stock_Final = stock_final
)
# Mostrar tabla
print(resultado)
## Día Producción Demanda Stock_Inicial Stock_Usado Ventas Stock_Final
## 1 1 110 104 0 0 104 6
## 2 2 93 92 6 6 92 7
## 3 3 116 103 7 7 103 20
## 4 4 104 115 20 20 115 9
## 5 5 106 94 9 9 94 21
## 6 6 106 117 21 21 117 10
## 7 7 88 118 10 10 98 0
## 8 8 114 97 0 0 97 17
## 9 9 105 96 17 17 96 26
## 10 10 88 108 26 26 108 6
# Mostrar resumen final
cat("\nResumen:\n")
##
## Resumen:
cat("Stock inicial total en Centro de Distribucion:", stock_inicial, "\n")
## Stock inicial total en Centro de Distribucion: 0
cat("Stock final total en Centro de Distribucion:", stock, "\n")
## Stock final total en Centro de Distribucion: 6
cat("Total botellas de agua producidas:", sum(produccion), "\n")
## Total botellas de agua producidas: 1030
cat("Total botellas de agua demandadas en tiendas minoristas:", sum(demanda), "\n")
## Total botellas de agua demandadas en tiendas minoristas: 1044
cat("Total botellas de agua vendidas:", sum(ventas), "\n")
## Total botellas de agua vendidas: 1024