Introducción

En este taller se presentan tres ejercicios aplicados de técnicas de validación y simulación en procesos industriales.
El objetivo es demostrar el uso de la simulación Monte Carlo para analizar la variabilidad de los procesos,
evaluar índices de capacidad y estimar rendimientos esperados en distintos escenarios.

Cada problema aborda un contexto diferente:
1. Control dimensional en un proceso de soldadura.
2. Modelado de una estación de reproceso con colas.
3. Evaluación del rendimiento de un sistema logístico.


Problema 1: Soldadura de Barras

1.1. Planteamiento del Problema

Se simulará la soldadura de 500 barras. La longitud total \(L\) es la suma de dos componentes:

  • \(x_1 \sim N(\mu=30, \sigma^2=0.81)\)
  • \(x_2 \sim N(\mu=18, \sigma=0.3)\)

La longitud total (\(L = x_1 + x_2\)) debe cumplir con las especificaciones de diseño: \(50 \pm 5\) cm.

Límites: - Límite Inferior (LSL) = 45 cm
- Límite Superior (USL) = 55 cm

1.2. Simulación

set.seed(42)
n_sim <- 500
media_x1 <- 30
sd_x1 <- sqrt(0.81)
media_x2 <- 18
sd_x2 <- 0.3
LSL <- 45
USL <- 55

x1 <- rnorm(n_sim, mean = media_x1, sd = sd_x1)
x2 <- rnorm(n_sim, mean = media_x2, sd = sd_x2)
L_total <- x1 + x2

datos_simulados <- data.frame(
  Simulacion = 1:n_sim,
  x1 = round(x1, 4),
  x2 = round(x2, 4),
  L_total = round(L_total, 4)
)

kable(head(datos_simulados), caption = "Primeras 6 simulaciones del Problema 1")
Primeras 6 simulaciones del Problema 1
Simulacion x1 x2 L_total
1 31.2339 18.3087 49.5426
2 29.4918 18.2744 47.7662
3 30.3268 17.9993 48.3261
4 30.5696 18.0408 48.6104
5 30.3638 17.7840 48.1478
6 29.9045 17.9406 47.8451

1.3. Cálculos de Capacidad

fuera_spec <- sum(L_total < LSL | L_total > USL)
prob_fuera_spec <- fuera_spec / n_sim

mu_proceso <- mean(L_total)
sigma_proceso <- sd(L_total)

Cp <- (USL - LSL) / (6 * sigma_proceso)
Cpk <- min((USL - mu_proceso) / (3 * sigma_proceso),
           (mu_proceso - LSL) / (3 * sigma_proceso))

cat("Probabilidad fuera de especificación:", round(prob_fuera_spec * 100, 2), "%\n")
## Probabilidad fuera de especificación: 0 %
cat("Cp =", round(Cp, 3), " | Cpk =", round(Cpk, 3), "\n")
## Cp = 1.8  | Cpk = 1.068

1.4. Histograma

ggplot(datos_simulados, aes(x = L_total)) +
  geom_histogram(binwidth = 0.2, fill = "#74c476", color = "#00441b") +
  geom_vline(xintercept = c(LSL, USL), color = "#e41a1c", linetype = "dashed", size = 1) +
  geom_vline(xintercept = mu_proceso, color = "#2171b5", linetype = "dotted", size = 1.2) +
  labs(title = "Distribución de Longitudes Simuladas",
       x = "Longitud total (cm)", y = "Frecuencia")


Problema 2: Estación de Reproceso

2.1. Planteamiento

Se simula una estación de reproceso con llegadas determinísticas cada 20 minutos y 200 piezas totales.

2.2. Simulación

set.seed(42)
n_replicas <- 10
n_piezas <- 200
tasa_llegada <- 20
lambda_defecto <- 0.2

resultados_tiempo <- numeric(n_replicas)

for (i in 1:n_replicas) {
  tiempo_salida <- 0
  for (j in 1:n_piezas) {
    llegada <- j * tasa_llegada
    defectos <- rbinom(1, 3, 0.8)
    tiempo_reparacion <- if (defectos == 0) 0 else rexp(1, rate = 1 / (defectos * 5))
    inicio <- max(llegada, tiempo_salida)
    salida <- inicio + tiempo_reparacion
    tiempo_salida <- salida
  }
  resultados_tiempo[i] <- tiempo_salida
}

kable(data.frame(Replica = 1:n_replicas, Tiempo_Total = resultados_tiempo),
      caption = "Tiempos Totales por Réplica")
Tiempos Totales por Réplica
Replica Tiempo_Total
1 4018.832
2 4009.640
3 4015.576
4 4003.336
5 4012.002
6 4040.395
7 4000.801
8 4023.879
9 4012.420
10 4009.118

Problema 3: Camión de Reparto

3.1. Planteamiento

Se simula el trabajo de un camión durante 10 horas (600 minutos) para estimar el número de viajes completados.


3.2. Simulación y Registro de Datos

set.seed(42)
n_replicas <- 5
tiempo_total <- 600

todos_los_ciclos <- data.frame()
viajes_por_replica <- numeric(n_replicas)

for (i in 1:n_replicas) {
  tiempo_actual <- 0
  viajes_completados <- 0

  while (TRUE) {
    t_carga <- runif(1, 20, 40)
    t_viaje_ida <- rexp(1, 1/40)
    t_descarga <- runif(1, 15, 25)
    t_viaje_vuelta <- rexp(1, 1/40)
    tiempo_entrega <- t_carga + t_viaje_ida + t_descarga

    if (tiempo_actual + tiempo_entrega > tiempo_total) break

    tiempo_actual <- tiempo_actual + tiempo_entrega
    viajes_completados <- viajes_completados + 1

    todos_los_ciclos <- rbind(todos_los_ciclos, data.frame(
      Replica = i,
      Viaje_N = viajes_completados,
      T_Carga = round(t_carga, 2),
      T_Viaje_Ida = round(t_viaje_ida, 2),
      T_Descarga = round(t_descarga, 2),
      T_Viaje_Vuelta = round(t_viaje_vuelta, 2),
      Tiempo_Acumulado = round(tiempo_actual + t_viaje_vuelta, 2)
    ))

    if (tiempo_actual + t_viaje_vuelta > tiempo_total) break
    tiempo_actual <- tiempo_actual + t_viaje_vuelta
  }
  viajes_por_replica[i] <- viajes_completados
}

kable(todos_los_ciclos, caption = "Datos Detallados de Simulación (Problema 3)", digits = 2)
Datos Detallados de Simulación (Problema 3)
Replica Viaje_N T_Carga T_Viaje_Ida T_Descarga T_Viaje_Vuelta Tiempo_Acumulado
1 1 38.30 7.93 21.42 1.53 69.17
1 2 34.73 58.55 21.57 16.41 200.43
1 3 29.15 17.53 24.35 28.59 300.05
1 4 29.25 3.26 19.75 4.83 357.13
1 5 38.08 59.84 24.89 2.29 482.23
1 6 27.80 12.39 22.38 24.88 569.68
2 1 20.15 81.90 24.07 8.94 135.06
2 2 27.59 28.76 19.32 17.74 228.47
2 3 39.42 9.51 18.33 43.21 338.94
2 4 27.97 22.78 15.39 19.90 424.98
2 5 33.55 70.26 17.61 1.15 547.54
3 1 36.56 15.46 17.41 125.93 195.35
3 2 22.81 60.93 22.19 166.73 468.01
3 3 27.51 1.15 15.02 6.53 518.21
4 1 31.27 57.83 18.05 13.39 120.54
4 2 20.00 82.19 24.33 9.23 256.31
4 3 30.30 19.52 21.19 10.10 337.42
4 4 24.34 66.24 24.63 19.19 471.81
4 5 34.66 2.86 15.02 8.71 533.08
5 1 30.75 266.09 18.56 8.97 324.37
5 2 36.58 44.80 19.11 5.88 430.73
5 3 31.79 17.57 18.95 6.47 505.52
5 4 34.49 16.73 24.37 16.08 597.19

3.3. Resultados Resumidos y Visualización

tabla_resumen <- data.frame(
  Replica = 1:n_replicas,
  Viajes_Completados = viajes_por_replica
)
kable(tabla_resumen, caption = "Viajes completados en cada réplica")
Viajes completados en cada réplica
Replica Viajes_Completados
1 6
2 5
3 3
4 5
5 4
ic <- t.test(viajes_por_replica, conf.level = 0.95)
cat("Media de viajes:", round(mean(viajes_por_replica), 2), "\n")
## Media de viajes: 4.6
cat("Intervalo de confianza 95%:", round(ic$conf.int[1], 2), "-", round(ic$conf.int[2], 2), "\n")
## Intervalo de confianza 95%: 3.18 - 6.02

3.4. Gráfica de Viajes por Réplica

df_viajes <- data.frame(Replica = factor(1:n_replicas), Viajes = viajes_por_replica)
ggplot(df_viajes, aes(x = Replica, y = Viajes, fill = Viajes)) +
  geom_col(color = "black") +
  scale_fill_gradient(low = "#b2df8a", high = "#1b7837") +
  labs(title = "Número de Viajes Completados por Réplica",
       x = "Réplica", y = "Viajes completados") +
  theme_minimal(base_size = 13)


Conclusión General

El presente análisis permitió validar la utilidad de la simulación para modelar sistemas industriales complejos.
Se comprobó que: - En procesos de manufactura, la simulación facilita la estimación de capacidad y detección de posibles incumplimientos.
- En estaciones de servicio o colas, permite evaluar cuellos de botella y tiempos promedio.
- En logística, apoya la toma de decisiones sobre recursos (vehículos, tiempos, carga).

En conjunto, los tres ejercicios reflejan cómo la simulación Monte Carlo y las herramientas estadísticas en R ofrecen una base sólida para el control y mejora de procesos.