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.
Se simulará la soldadura de 500 barras. La longitud total \(L\) es la suma de dos componentes:
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
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")
| 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 |
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
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")
Se simula una estación de reproceso con llegadas determinísticas cada 20 minutos y 200 piezas totales.
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")
| 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 |
Se simula el trabajo de un camión durante 10 horas (600 minutos) para estimar el número de viajes completados.
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)
| 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 |
tabla_resumen <- data.frame(
Replica = 1:n_replicas,
Viajes_Completados = viajes_por_replica
)
kable(tabla_resumen, caption = "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
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)
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.