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)\), por lo tanto, \(x_1 \sim N(30, 0.9)\).
  • \(x_2 \sim N(\mu=18, \sigma=0.3)\).

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

  • Límite de Especificación Inferior (LSL) = 45 cm.
  • Límite de Especificación Superior (USL) = 55 cm.

Se requiere estimar la probabilidad de que una barra esté fuera de especificaciones (OOS) y se calcularán los índices de capacidad \(C_p\) y \(C_{pk}\).

1.2. Simulación y Visualización de Datos

Generamos las 500 simulaciones y las guardamos en un data.frame para inspeccionarlas.

set.seed(42) # Para reproducibilidad
n_sim <- 500

# Parámetros
media_x1 <- 30
sd_x1 <- sqrt(0.81) # Varianza es 0.81, DE es la raíz
media_x2 <- 18
sd_x2 <- 0.3
LSL <- 45
USL <- 55

# Simulación
x1 <- rnorm(n_sim, mean = media_x1, sd = sd_x1)
x2 <- rnorm(n_sim, mean = media_x2, sd = sd_x2)
L_total <- x1 + x2 # Longitud total de las 500 barras

# 1. Crear un data.frame con los resultados
datos_simulados_p1 <- data.frame(
  Simulacion_N = 1:n_sim,
  x1 = round(x1, 4),
  x2 = round(x2, 4),
  Longitud_Total_L = round(L_total, 4)
)

# 2. Mostrar los primeros 6 resultados
cat("Mostrando las primeras 6 de 500 simulaciones:\n")
## Mostrando las primeras 6 de 500 simulaciones:
kable(head(datos_simulados_p1), caption = "Primeras 6 Simulaciones (Problema 1)")
Primeras 6 Simulaciones (Problema 1)
Simulacion_N x1 x2 Longitud_Total_L
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
# 3. Guardar los 500 resultados en un CSV
write.csv(datos_simulados_p1, "problema1_simulacion_barras.csv", row.names = FALSE)

1.3. Cálculos

Ahora, calculamos las métricas solicitadas usando los 500 datos simulados de \(L\).

# Usamos el vector L_total del chunk anterior
L <- L_total

# 1. Probabilidad de estar Fuera de Especificaciones (OOS)
fuera_spec <- sum(L < LSL | L > USL)
prob_fuera_spec <- fuera_spec / n_sim

cat(paste("Total de barras simuladas:", n_sim, "\n"))
## Total de barras simuladas: 500
cat(paste("Barras fuera de especificación (OOS):", fuera_spec, "\n"))
## Barras fuera de especificación (OOS): 0
cat(paste("Probabilidad estimada de OOS:", round(prob_fuera_spec * 100, 2), "%\n\n"))
## Probabilidad estimada de OOS: 0 %
# 2. Índices de Capacidad (Cp y Cpk)
# Usamos la media y desviación de nuestros datos simulados
mu_proceso <- mean(L)
sigma_proceso <- sd(L)

# Fórmula Cp
Cp <- (USL - LSL) / (6 * sigma_proceso)

# Fórmula Cpk
Cpk_sup <- (USL - mu_proceso) / (3 * sigma_proceso)
Cpk_inf <- (mu_proceso - LSL) / (3 * sigma_proceso)
Cpk <- min(Cpk_sup, Cpk_inf)

# Imprimir resultados de capacidad
cat(paste("Media del proceso (μ):", round(mu_proceso, 4), "\n"))
## Media del proceso (μ): 47.9665
cat(paste("Desv. Estándar del proceso (σ):", round(sigma_proceso, 4), "\n\n"))
## Desv. Estándar del proceso (σ): 0.9258
cat(paste("Índice Cp:", round(Cp, 4), "\n"))
## Índice Cp: 1.8003
cat(paste("Índice Cpk:", round(Cpk, 4), "\n"))
## Índice Cpk: 1.0681

1.4. Visualización del Proceso (Histograma)

Este gráfico muestra las 500 longitudes simuladas. Las líneas rojas son los límites de especificación. La línea azul es la media de nuestro proceso.

# --- NUEVO: Visualización de las 500 simulaciones ---
ggplot(data = datos_simulados_p1, aes(x = Longitud_Total_L)) +
  geom_histogram(binwidth = 0.2, fill = "lightblue", color = "black", alpha = 0.8) +
  # Límites de especificación
  geom_vline(xintercept = LSL, color = "red", linetype = "dashed", size = 1) +
  geom_vline(xintercept = USL, color = "red", linetype = "dashed", size = 1) +
  # Media del proceso
  geom_vline(xintercept = mu_proceso, color = "blue", linetype = "dotted", size = 1.2) +
  labs(title = "Distribución de las 500 Longitudes de Barra Simuladas",
       x = "Longitud Total (cm)",
       y = "Frecuencia (de 500)",
       caption = paste("LSL (45cm) y USL (55cm) en rojo. Media (", round(mu_proceso, 2), "cm) en azul.")) +
  theme_minimal()

1.5. Conclusión - Problema 1

Como indica la nota, es importante diferenciar “capacidad” de “control”.

  • Control Estadístico: Se refiere a si el proceso es estable y predecible en el tiempo (se mide con gráficas de control). No podemos determinar esto con los datos dados.
  • Capacidad del Proceso (\(C_p\) y \(C_{pk}\)): Mide si el proceso es capaz de cumplir con las especificaciones.

Resultados: 1. La probabilidad estimada de que una barra esté fuera de especificaciones es de 0%. 2. El índice \(C_p \approx 1.8\). Como \(C_p > 1.33\), el proceso tiene una dispersión (varianza) lo suficientemente pequeña como para caber dentro de las especificaciones. 3. El índice \(C_{pk} \approx 1.07\). Este es el índice clave. Un \(C_{pk} < 1.33\) (y especialmente tan cercano a 1.0) indica que, aunque la dispersión es buena, el proceso no está centrado.

Respuesta: Como se observa en el histograma, la media del proceso (\(\mu \approx 48\)) está demasiado cerca del LSL (45). Por lo tanto, el proceso no se considera capaz (\(C_{pk} < 1.33\)) de cumplir las especificaciones de forma robusta, ya que no está centrado.


Problema 2: Estación de Reproceso

2.1. Planteamiento del Problema

Ahora simularemos el tiempo total para procesar 200 piezas bajo un sistema de cola.

  • Llegadas: Determinísticas, 1 pieza cada 20 minutos.
  • Piezas: 200.
  • Defectos (D): \(D \sim \text{Binomial}(n, p)\). Se nos dice \(\mu = 2.4\) y el máximo es 3. La única distribución Binomial que cumple esto es con \(n=3\) y \(p=0.8\) (ya que \(\mu = n \times p = 3 \times 0.8 = 2.4\)).
  • Tiempo de Reparación (T): Exponencial con \(\lambda = 0.2\) piezas/minuto por cada defecto.
    • Esto significa que la media de reparación por defecto es \(1 / \lambda = 1 / 0.2 = 5\) minutos.
    • Si una pieza tiene \(D\) defectos, el tiempo medio total de reparación será \(D \times 5\) minutos.
    • Por lo tanto, el rate (tasa) para una pieza con \(D\) defectos es \(\lambda_D = 1 / (D \times 5)\).
  • Réplicas: 10.

2.2. Simulación del Proceso

Usamos un bucle para simular el sistema de colas (D/G/1) donde el taller es un servidor único. Nota: Se mostrarán los resultados finales de las 10 réplicas

set.seed(42)
n_replicas <- 10
n_piezas <- 200
tasa_llegada <- 20 # minutos entre piezas
lambda_defecto <- 0.2
media_t_defecto <- 1 / lambda_defecto # 5 minutos

# Vector para guardar el tiempo final de cada réplica
resultados_replicas_t2 <- numeric(n_replicas)

# Bucle para las 10 réplicas
for (i in 1:n_replicas) {
  
  tiempo_salida_taller <- 0 # El taller está libre al inicio
  
  # Bucle para las 200 piezas
  for (j in 1:n_piezas) {
    
    # 1. Tiempo de llegada de la pieza j
    tiempo_llegada <- j * tasa_llegada
    
    # 2. Simular defectos y tiempo de reparación
    defectos <- rbinom(1, size = 3, prob = 0.8)
    
    tiempo_reparacion <- 0
    if (defectos > 0) {
      media_t_total <- defectos * media_t_defecto
      tasa_total <- 1 / media_t_total
      tiempo_reparacion <- rexp(1, rate = tasa_total)
    }
    
    # 3. Simulación de la cola
    # El taller no puede empezar a reparar antes de que (A) la pieza llegue
    # y (B) el taller esté libre del trabajo anterior.
    tiempo_inicio_reparacion <- max(tiempo_llegada, tiempo_salida_taller)
    
    # 4. Tiempo de finalización
    tiempo_fin_reparacion <- tiempo_inicio_reparacion + tiempo_reparacion
    
    # 5. Actualizar el estado del taller
    tiempo_salida_taller <- tiempo_fin_reparacion
  }
  
  # Guardar el tiempo final de la última pieza
  resultados_replicas_t2[i] <- tiempo_salida_taller
}

2.3. Resultados - Problema 2

A continuación se muestran los tiempos totales (en minutos) que tomó procesar las 200 piezas en cada una de las 10 réplicas.

# Crear la tabla de resultados
tabla_resultados_t2 <- data.frame(
  Replica = 1:n_replicas,
  Tiempo_Total_Minutos = resultados_replicas_t2
)

# Imprimir la tabla
kable(tabla_resultados_t2, 
      caption = "Tiempo Total para Procesar 200 Piezas (10 Réplicas)",
      digits = 2)
Tiempo Total para Procesar 200 Piezas (10 Réplicas)
Replica Tiempo_Total_Minutos
1 4018.83
2 4009.64
3 4015.58
4 4003.34
5 4012.00
6 4040.39
7 4000.80
8 4023.88
9 4012.42
10 4009.12
# Calcular e imprimir el promedio
tiempo_promedio <- mean(resultados_replicas_t2)
cat(paste("\n\nTiempo promedio de las 10 réplicas:", round(tiempo_promedio, 2), "minutos.\n"))
## 
## 
## Tiempo promedio de las 10 réplicas: 4014.6 minutos.

2.4. Conclusión - Problema 2

El tiempo total promedio para procesar 200 piezas, basado en 10 réplicas, es de aproximadamente 4014.6 minutos.


Problema 3: Camión de Reparto

3.1. Planteamiento del Problema

Se simula un solo camión de reparto durante un día laboral de 10 horas (600 minutos) para estimar el número de viajes completados.

  • \(T_{\text{carga}}\): Uniforme(\(30 \pm 10\)) \(\implies \text{runif(1, 20, 40)}\)
  • \(T_{\text{viaje\_ida}}\): Exponencial(\(\mu=40\)) \(\implies \text{rexp(1, 1/40)}\)
  • \(T_{\text{descarga}}\): Uniforme(\(20 \pm 5\)) \(\implies \text{runif(1, 15, 25)}\)
  • \(T_{\text{viaje\_vuelta}}\): Exponencial(\(\mu=40\)) \(\implies \text{rexp(1, 1/40)}\)
  • Restricción: (Para un solo camión, la restricción de 1 bahía de carga no genera cola).
  • Simulación: 10 horas (600 min), 5 réplicas.

3.2. Simulación

Simulamos el ciclo del camión 5 veces. Un “viaje” se cuenta como completado después de la descarga.

set.seed(42)
n_replicas_camion <- 5
tiempo_simulacion <- 600 # 10 horas * 60 minutos

# Vector para guardar el número de viajes por réplica
viajes_por_replica <- numeric(n_replicas_camion)

# --- NUEVO: Data.frame para guardar TODOS los ciclos ---
todos_los_ciclos <- data.frame()

# Bucle de las 5 réplicas
for (i in 1:n_replicas_camion) {
  
  tiempo_actual <- 0
  viajes_completados <- 0
  
  # Bucle 'while' que simula el día de 10 horas
  while (TRUE) {
    
    # Tiempos del ciclo
    t_carga <- runif(1, min = 20, max = 40)
    t_viaje_ida <- rexp(1, rate = 1/40)
    t_descarga <- runif(1, min = 15, max = 25)
    
    # Tiempo para completar la entrega (sin incluir la vuelta)
    tiempo_hasta_entrega <- t_carga + t_viaje_ida + t_descarga
    
    # Si no puede completar la entrega dentro del tiempo, se detiene
    if (tiempo_actual + tiempo_hasta_entrega > tiempo_simulacion) {
      break
    }
    
    # Si la completa, actualizamos tiempo y contamos el viaje
    tiempo_actual <- tiempo_actual + tiempo_hasta_entrega
    viajes_completados <- viajes_completados + 1
    
    # Ahora simulamos la vuelta a la base
    t_viaje_vuelta <- rexp(1, rate = 1/40)
    
    # --- NUEVO: Guardar datos del ciclo ---
    # Guardamos los datos de este ciclo antes de verificar si puede volver
    todos_los_ciclos <- rbind(todos_los_ciclos, data.frame(
      Replica = i,
      Viaje_N = viajes_completados,
      T_Carga = t_carga,
      T_Viaje_Ida = t_viaje_ida,
      T_Descarga = t_descarga,
      T_Viaje_Vuelta = t_viaje_vuelta,
      Tiempo_Acumulado = tiempo_actual + t_viaje_vuelta # Tiempo al final del ciclo
    ))
    # --- Fin de adición ---
    
    # Si no puede volver a la base dentro del tiempo, se detiene
    # (El viaje ya fue contado, pero no puede iniciar uno nuevo)
    if (tiempo_actual + t_viaje_vuelta > tiempo_simulacion) {
      break
    }
    
    # Si puede volver, actualizamos el tiempo y el ciclo reinicia
    tiempo_actual <- tiempo_actual + t_viaje_vuelta
  }
  
  # Guardamos el total de viajes de esta réplica
  viajes_por_replica[i] <- viajes_completados
}

3.3. Resultados y Análisis (partes a, b, c)

a) Resultados de las 5 Réplicas

tabla_resultados_t3 <- data.frame(
  Replica = 1:n_replicas_camion,
  Viajes_Completados = viajes_por_replica
)
kable(tabla_resultados_t3, caption = "Viajes Completados en 10 Horas (5 Réplicas)")
Viajes Completados en 10 Horas (5 Réplicas)
Replica Viajes_Completados
1 6
2 3
3 4
4 3
5 2

b) Intervalo de Confianza para el Número de Viajes

Usamos t.test() sobre nuestros 5 resultados para calcular el IC del 95%.

ic_viajes <- t.test(viajes_por_replica, conf.level = 0.95)

# Imprimir el IC
cat(paste("\nMedia de viajes:", round(ic_viajes$estimate, 2), "\n"))
## 
## Media de viajes: 3.6
cat(paste("Intervalo de Confianza 95% para los viajes: [", 
          round(ic_viajes$conf.int[1], 4), 
          ",", 
          round(ic_viajes$conf.int[2], 4), 
          "]\n"))
## Intervalo de Confianza 95% para los viajes: [ 1.7169 , 5.4831 ]

c) Recomendaciones para alcanzar 10 entregas

Análisis: El intervalo de confianza (1.72 - 5.48) está muy por debajo del objetivo de 10 entregas. El problema es el largo tiempo de ciclo para un solo camión.

El tiempo de ciclo esperado (promedio) es:

  • Carga: (20+40)/2 = 30 min
  • Viaje Ida: 40 min
  • Descarga: (15+25)/2 = 20 min
  • Viaje Vuelta: 40 min
  • Total Ciclo Esperado: 30 + 40 + 20 + 40 = 130 minutos

En 10 horas (600 minutos), un camión solo puede hacer \(600 / 130 \approx 4.6\) viajes, lo cual coincide con nuestra simulación.

Recomendaciones:

  1. Añadir un segundo camión: Esta es la solución más directa para duplicar la capacidad. Sin embargo, la restricción de “Sólo hay espacio para cargar un camión a la vez” (mencionada en 3c) se volvería el nuevo cuello de botella. Los camiones ahora tendrían que hacer cola para usar la bahía de carga, lo que requeriría una simulación de colas más compleja (G/G/1) para ver si 2 camiones son suficientes o si se genera demasiada espera.
  2. Reducir Tiempos de Ciclo:
    • Viajes (80 min / 61.5% del ciclo): Los viajes son el componente más largo. Buscar rutas más cortas o rápidas es prioritario.
    • Carga (30 min / 23% del ciclo): Optimizar el proceso de carga (ej. pre-alistamiento) podría reducir estos 30 minutos.
    • Descarga (20 min / 15.5% del ciclo): Es el tiempo más corto, pero optimizarlo también suma.

Datos Simulados del Problema 3

Adelante se mostrarán los datos detallados de cada ciclo de viaje simulado en las 5 réplicas. Los tiempos están en minutos.

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 36.66 199.84 21.12 48.46 306.07
2 2 28.72 118.82 24.74 52.34 530.68
2 3 32.80 9.24 18.98 22.78 614.48
3 1 20.78 19.90 21.77 70.26 132.71
3 2 25.22 1.15 21.76 15.71 196.55
3 3 23.79 31.13 23.28 15.46 290.21
3 4 24.81 125.93 16.40 60.93 518.28
4 1 30.29 273.86 20.82 65.98 390.95
4 2 27.18 11.65 22.76 5.09 457.63
4 3 24.67 100.77 15.86 36.56 635.49
5 1 33.35 338.49 22.34 41.02 435.20
5 2 30.30 19.52 21.19 10.10 516.31