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.
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 (Inicialmente el stock es 0).
# ==========================================================
# SIMULACIÓN DISCRETA: CADENA DE SUMINISTRO DE BOTELLAS DE AGUA
# ==========================================================
set.seed(123)
# Parámetros editables
dias_simulacion <- 10
demanda_promedio <- 500
produccion_diaria <- 500
stock_inicial <- 0
# Variables de estado
stock_CDC <- stock_inicial
total_vendido <- 0
total_producido <- 0
# Data frame para almacenar resultados diarios
resultados_diarios <- data.frame(
Dia = integer(),
Stock_Inicial = integer(),
Produccion = integer(),
Demanda = integer(),
Vendido = integer(),
Stock_Final = integer(),
stringsAsFactors = FALSE
)
La función simular_dia()
reproduce el flujo de
materiales y decisiones durante un día:
Mostrar stock inicial en el CDC.
Etapas logísticas:
- *Supplier → Factory Plant*: transporte de materiales (botellas vacías, tapas, etiquetas y agua).
- *Factory Plant → Assembly Plant*: producción de botellas llenas, tapadas y etiquetadas.
- *Assembly Plant → CDC*: envío de cajas listas para distribución.
Producción: se incrementa el stock con la producción diaria.
Demanda: se genera aleatoriamente usando una
distribución de Poisson con media
demanda_promedio
.
Venta: se compara la demanda con el stock y se vende la cantidad disponible.
Stock final: se muestra el inventario restante al finalizar el día.
# Función para simular un día
simular_dia <- function(dia, stock_CDC, produccion_diaria) {
cat("\n--- DIA", dia, "---\n")
cat("Stock inicial en CDC --->", stock_CDC, "botellas\n")
cat("Inventario en transito ---> En proceso de transporte de Supplier a Factory...\n")
cat("Work in process ---> Produciendo botellas llenas, tapadas y etiquetadas...\n")
cat("Inventario en transito ---> Enviando cajas con botellas listas al CDC...\n")
stock_CDC <- stock_CDC + produccion_diaria
cat("Producción de hoy --->", produccion_diaria, "botellas\n")
demanda_hoy <- rpois(1, lambda = demanda_promedio)
cat("Demanda de hoy --->", demanda_hoy, "botellas\n")
cat("Inventario en transito ---> Transporte de cajas desde CDC hacia Retailers...\n")
if (stock_CDC >= demanda_hoy) {
vendido <- demanda_hoy
stock_CDC <- stock_CDC - demanda_hoy
} else {
vendido <- stock_CDC
stock_CDC <- 0
}
cat("Botellas vendidas hoy --->", vendido, "botellas\n")
cat("Lead time ---> CLIENTES RECIBEN SUS BOTELLAS.\n")
cat("Stock final en CDC --->", stock_CDC, "botellas\n")
return(list(
stock_CDC = stock_CDC,
vendido = vendido,
demanda = demanda_hoy,
produccion = produccion_diaria
))
}
Se ejecuta un ciclo for
que llama a
simular_dia()
para cada día del horizonte de
simulación.
Después de cada ejecución:
Se actualiza el stock_CDC
con el inventario final
del día.
Se acumulan las ventas y la producción.
# Simulación
for (dia in 1:dias_simulacion) {
stock_inicial_dia <- stock_CDC
resultado <- simular_dia(dia, stock_CDC, produccion_diaria)
stock_CDC <- resultado$stock_CDC
total_vendido <- total_vendido + resultado$vendido
total_producido <- total_producido + produccion_diaria
# Guardar resultados diarios
resultados_diarios <- rbind(resultados_diarios, data.frame(
Dia = dia,
Stock_Inicial = stock_inicial_dia,
Produccion = resultado$produccion,
Demanda = resultado$demanda,
Vendido = resultado$vendido,
Stock_Final = stock_CDC
))
}
##
## --- DIA 1 ---
## Stock inicial en CDC ---> 0 botellas
## Inventario en transito ---> En proceso de transporte de Supplier a Factory...
## Work in process ---> Produciendo botellas llenas, tapadas y etiquetadas...
## Inventario en transito ---> Enviando cajas con botellas listas al CDC...
## Producción de hoy ---> 500 botellas
## Demanda de hoy ---> 487 botellas
## Inventario en transito ---> Transporte de cajas desde CDC hacia Retailers...
## Botellas vendidas hoy ---> 487 botellas
## Lead time ---> CLIENTES RECIBEN SUS BOTELLAS.
## Stock final en CDC ---> 13 botellas
##
## --- DIA 2 ---
## Stock inicial en CDC ---> 13 botellas
## Inventario en transito ---> En proceso de transporte de Supplier a Factory...
## Work in process ---> Produciendo botellas llenas, tapadas y etiquetadas...
## Inventario en transito ---> Enviando cajas con botellas listas al CDC...
## Producción de hoy ---> 500 botellas
## Demanda de hoy ---> 526 botellas
## Inventario en transito ---> Transporte de cajas desde CDC hacia Retailers...
## Botellas vendidas hoy ---> 513 botellas
## Lead time ---> CLIENTES RECIBEN SUS BOTELLAS.
## Stock final en CDC ---> 0 botellas
##
## --- DIA 3 ---
## Stock inicial en CDC ---> 0 botellas
## Inventario en transito ---> En proceso de transporte de Supplier a Factory...
## Work in process ---> Produciendo botellas llenas, tapadas y etiquetadas...
## Inventario en transito ---> Enviando cajas con botellas listas al CDC...
## Producción de hoy ---> 500 botellas
## Demanda de hoy ---> 462 botellas
## Inventario en transito ---> Transporte de cajas desde CDC hacia Retailers...
## Botellas vendidas hoy ---> 462 botellas
## Lead time ---> CLIENTES RECIBEN SUS BOTELLAS.
## Stock final en CDC ---> 38 botellas
##
## --- DIA 4 ---
## Stock inicial en CDC ---> 38 botellas
## Inventario en transito ---> En proceso de transporte de Supplier a Factory...
## Work in process ---> Produciendo botellas llenas, tapadas y etiquetadas...
## Inventario en transito ---> Enviando cajas con botellas listas al CDC...
## Producción de hoy ---> 500 botellas
## Demanda de hoy ---> 502 botellas
## Inventario en transito ---> Transporte de cajas desde CDC hacia Retailers...
## Botellas vendidas hoy ---> 502 botellas
## Lead time ---> CLIENTES RECIBEN SUS BOTELLAS.
## Stock final en CDC ---> 36 botellas
##
## --- DIA 5 ---
## Stock inicial en CDC ---> 36 botellas
## Inventario en transito ---> En proceso de transporte de Supplier a Factory...
## Work in process ---> Produciendo botellas llenas, tapadas y etiquetadas...
## Inventario en transito ---> Enviando cajas con botellas listas al CDC...
## Producción de hoy ---> 500 botellas
## Demanda de hoy ---> 538 botellas
## Inventario en transito ---> Transporte de cajas desde CDC hacia Retailers...
## Botellas vendidas hoy ---> 536 botellas
## Lead time ---> CLIENTES RECIBEN SUS BOTELLAS.
## Stock final en CDC ---> 0 botellas
##
## --- DIA 6 ---
## Stock inicial en CDC ---> 0 botellas
## Inventario en transito ---> En proceso de transporte de Supplier a Factory...
## Work in process ---> Produciendo botellas llenas, tapadas y etiquetadas...
## Inventario en transito ---> Enviando cajas con botellas listas al CDC...
## Producción de hoy ---> 500 botellas
## Demanda de hoy ---> 510 botellas
## Inventario en transito ---> Transporte de cajas desde CDC hacia Retailers...
## Botellas vendidas hoy ---> 500 botellas
## Lead time ---> CLIENTES RECIBEN SUS BOTELLAS.
## Stock final en CDC ---> 0 botellas
##
## --- DIA 7 ---
## Stock inicial en CDC ---> 0 botellas
## Inventario en transito ---> En proceso de transporte de Supplier a Factory...
## Work in process ---> Produciendo botellas llenas, tapadas y etiquetadas...
## Inventario en transito ---> Enviando cajas con botellas listas al CDC...
## Producción de hoy ---> 500 botellas
## Demanda de hoy ---> 471 botellas
## Inventario en transito ---> Transporte de cajas desde CDC hacia Retailers...
## Botellas vendidas hoy ---> 471 botellas
## Lead time ---> CLIENTES RECIBEN SUS BOTELLAS.
## Stock final en CDC ---> 29 botellas
##
## --- DIA 8 ---
## Stock inicial en CDC ---> 29 botellas
## Inventario en transito ---> En proceso de transporte de Supplier a Factory...
## Work in process ---> Produciendo botellas llenas, tapadas y etiquetadas...
## Inventario en transito ---> Enviando cajas con botellas listas al CDC...
## Producción de hoy ---> 500 botellas
## Demanda de hoy ---> 461 botellas
## Inventario en transito ---> Transporte de cajas desde CDC hacia Retailers...
## Botellas vendidas hoy ---> 461 botellas
## Lead time ---> CLIENTES RECIBEN SUS BOTELLAS.
## Stock final en CDC ---> 68 botellas
##
## --- DIA 9 ---
## Stock inicial en CDC ---> 68 botellas
## Inventario en transito ---> En proceso de transporte de Supplier a Factory...
## Work in process ---> Produciendo botellas llenas, tapadas y etiquetadas...
## Inventario en transito ---> Enviando cajas con botellas listas al CDC...
## Producción de hoy ---> 500 botellas
## Demanda de hoy ---> 527 botellas
## Inventario en transito ---> Transporte de cajas desde CDC hacia Retailers...
## Botellas vendidas hoy ---> 527 botellas
## Lead time ---> CLIENTES RECIBEN SUS BOTELLAS.
## Stock final en CDC ---> 41 botellas
##
## --- DIA 10 ---
## Stock inicial en CDC ---> 41 botellas
## Inventario en transito ---> En proceso de transporte de Supplier a Factory...
## Work in process ---> Produciendo botellas llenas, tapadas y etiquetadas...
## Inventario en transito ---> Enviando cajas con botellas listas al CDC...
## Producción de hoy ---> 500 botellas
## Demanda de hoy ---> 508 botellas
## Inventario en transito ---> Transporte de cajas desde CDC hacia Retailers...
## Botellas vendidas hoy ---> 508 botellas
## Lead time ---> CLIENTES RECIBEN SUS BOTELLAS.
## Stock final en CDC ---> 33 botellas
Se imprime un resumen con:
Total producido.
Total vendido.
Stock final en el CDC después del último día.
# Resumen final
cat("\n--- RESUMEN DE LA SIMULACION ---\n")
##
## --- RESUMEN DE LA SIMULACION ---
cat(" Total producido :", total_producido, "botellas\n",
"Total vendido :", total_vendido, "botellas\n",
"Stock final en CDC:", stock_CDC, "botellas\n")
## Total producido : 5000 botellas
## Total vendido : 4967 botellas
## Stock final en CDC: 33 botellas
# Mostrar tabla resumen diaria
cat("\n--- TABLA DE RESULTADOS DIARIOS ---\n")
##
## --- TABLA DE RESULTADOS DIARIOS ---
print(resultados_diarios)
## Dia Stock_Inicial Produccion Demanda Vendido Stock_Final
## 1 1 0 500 487 487 13
## 2 2 13 500 526 513 0
## 3 3 0 500 462 462 38
## 4 4 38 500 502 502 36
## 5 5 36 500 538 536 0
## 6 6 0 500 510 500 0
## 7 7 0 500 471 471 29
## 8 8 29 500 461 461 68
## 9 9 68 500 527 527 41
## 10 10 41 500 508 508 33
Se realizan gráficos finales con:
Evolución del Stock Final en CDC.
Demandas vs Botellas vendidas.
# -------------------------------
# Gráficos de la simulación
# -------------------------------
library(ggplot2)
# Gráfico 1: Evolución del stock final
ggplot(resultados_diarios, aes(x = Dia, y = Stock_Final)) +
geom_line(color = "blue", size = 1) +
geom_point(color = "blue", size = 2) +
labs(title = "Evolución del Stock Final en CDC",
x = "Día",
y = "Stock Final (botellas)") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# Gráfico 2: Demanda vs Vendido
ggplot(resultados_diarios, aes(x = Dia)) +
geom_line(aes(y = Demanda, color = "Demanda"), size = 1) +
geom_line(aes(y = Vendido, color = "Vendido"), size = 1) +
geom_point(aes(y = Demanda, color = "Demanda"), size = 2) +
geom_point(aes(y = Vendido, color = "Vendido"), size = 2) +
labs(title = "Demanda vs Botellas Vendidas",
x = "Día",
y = "Cantidad (botellas)",
color = "Leyenda") +
theme_minimal()