Descripción del modelo de simulación

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:

# ==========================================================
# 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
)

Desarrollo del modelo

1. Función de simulación diaria

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
  ))
}

2. Bucle de simulación

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

3. Resumen final

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

3. Gráficos finales

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()