1. Ejercicio: Simulación de longitudes de barras soldadas

** Fijar semilla para reproducibilidad **

set.seed(42)

** Parámetros del problema **

n <- 500               # número de simulaciones
mu_x1 <- 30            # media de x1
sd_x1 <- sqrt(0.81)    # desviación estándar de x1 = 0.9
mu_x2 <- 18            # media de x2
sd_x2 <- 0.3           # desviación estándar de x2

** Especificaciones de diseño **

LSL <- 45  # límite inferior
USL <- 55  # límite superior

** Simulación de las longitudes **

x1 <- rnorm(n, mean = mu_x1, sd = sd_x1)
x2 <- rnorm(n, mean = mu_x2, sd = sd_x2)
longitud_total <- x1 + x2

** Estadísticos muestrales **

media <- mean(longitud_total)
desv <- sd(longitud_total)
prop_fuera <- mean(longitud_total < LSL | longitud_total > USL)

** Cálculo de Cp y Cpk **

Cp <- (USL - LSL) / (6 * desv)
Cpk <- min(USL - media, media - LSL) / (3 * desv)

** Mostrar resultados **

cat(" Resultados de simulacion \n")
##  Resultados de simulacion
cat("n =", n, "\n")
## n = 500
cat("Media estimada =", round(media, 4), "cm\n")
## Media estimada = 47.9665 cm
cat("Desviación estándar =", round(desv, 4), "cm\n")
## Desviación estándar = 0.9258 cm
cat("Proporción fuera de especificaciones =", round(prop_fuera, 4), "\n")
## Proporción fuera de especificaciones = 0
cat("Cp =", round(Cp, 4), "\n")
## Cp = 1.8003
cat("Cpk =", round(Cpk, 4), "\n")
## Cpk = 1.0681
cat("LSL =", LSL, " | USL =", USL, "\n\n")
## LSL = 45  | USL = 55

Graficos

** Histograma **

hist(longitud_total,
     breaks = 25,
     col = "lightblue",
     main = "Distribución de longitudes totales (x1 + x2)",
     xlab = "Longitud (cm)",
     border = "gray")
abline(v = c(LSL, USL), col = "red", lty = 2, lwd = 2)
abline(v = media, col = "blue", lwd = 2)
legend("topright", legend = c("LSL", "USL", "Media"),
       col = c("red", "red", "blue"), lty = c(2, 2, 1), bty = "n")

** Boxplot **

boxplot(longitud_total,
        horizontal = TRUE,
        main = "Boxplot de longitudes totales",
        xlab = "Longitud (cm)",
        col = "lightgreen")
abline(v = c(LSL, USL), col = "red", lty = 2, lwd = 2)

2. Ejercicio: Simulación de reproceso de piezas

set.seed(123)  # reproducibilidad

** Parámetros **

n_piezas <- 200
replicas <- 10
inter_arrival <- 20        # minutos entre llegadas
n_def_max <- 3             # máximo de defectos
p_def <- 2.4 / n_def_max   # p = 0.8 para media 2.4
lambda <- 0.2              # tasa exponencial (1/min) 

** Función para simular una réplica **

simular_reproceso <- function(n_piezas, inter_arrival, n_def_max, p_def, lambda) {
  
  # Tiempos de llegada
  arrivals <- seq(0, by = inter_arrival, length.out = n_piezas)
  
  # Número de defectos por pieza
  defects <- rbinom(n_piezas, size = n_def_max, prob = p_def)
  
  # Tiempos de servicio según los defectos
  service_times <- sapply(defects, function(d) {
    if (d > 0) sum(rexp(d, rate = lambda)) else 0
  })
  
  # Simulación del proceso (una sola estación de trabajo)
  start <- numeric(n_piezas)
  finish <- numeric(n_piezas)
  
  for (i in 1:n_piezas) {
    if (i == 1) {
      start[i] <- arrivals[i]
    } else {
      start[i] <- max(arrivals[i], finish[i - 1])
    }
    finish[i] <- start[i] + service_times[i]
  }
  
  total_time <- finish[n_piezas]  # tiempo total para 200 piezas
  return(list(
    tiempo_total_min = total_time,
    tiempo_total_horas = total_time / 60,
    media_defectos = mean(defects),
    prop_sin_defectos = mean(defects == 0)
  ))
}

** Ejecutar las 10 réplicas **

resultados <- replicate(replicas,
                        simular_reproceso(n_piezas, inter_arrival, n_def_max, p_def, lambda),
                        simplify = FALSE)

** Convertir lista a data frame **

df <- data.frame(
  replica = 1:replicas,
  tiempo_total_min = sapply(resultados, function(x) x$tiempo_total_min),
  tiempo_total_horas = sapply(resultados, function(x) x$tiempo_total_horas),
  media_defectos = sapply(resultados, function(x) x$media_defectos),
  prop_sin_defectos = sapply(resultados, function(x) x$prop_sin_defectos)
)

** Resumen estadístico **

media_tiempo <- mean(df$tiempo_total_min)
desv_tiempo <- sd(df$tiempo_total_min)

resumen <- data.frame(
  estadistico = c("Réplicas", "Piezas por réplica",
                  "Media tiempo total (min)", "Desviación (min)",
                  "Media tiempo total (horas)"),
  valor = c(replicas, n_piezas,
            round(media_tiempo, 2), round(desv_tiempo, 2),
            round(media_tiempo / 60, 3))
)

print(" Resultados de las 10 replicas ")
## [1] " Resultados de las 10 replicas "
print(df)
##    replica tiempo_total_min tiempo_total_horas media_defectos prop_sin_defectos
## 1        1         3993.441           66.55736          2.425             0.005
## 2        2         3997.196           66.61993          2.440             0.010
## 3        3         3987.331           66.45551          2.360             0.010
## 4        4         3987.805           66.46342          2.355             0.010
## 5        5         4003.388           66.72313          2.485             0.005
## 6        6         3981.485           66.35808          2.440             0.005
## 7        7         3999.579           66.65965          2.430             0.005
## 8        8         4001.464           66.69107          2.415             0.005
## 9        9         3982.311           66.37185          2.415             0.015
## 10      10         3989.564           66.49273          2.465             0.010
print(" Resumen estadistico ")
## [1] " Resumen estadistico "
print(resumen)
##                  estadistico    valor
## 1                   Réplicas   10.000
## 2         Piezas por réplica  200.000
## 3   Media tiempo total (min) 3992.360
## 4           Desviación (min)    7.850
## 5 Media tiempo total (horas)   66.539

Graficos

hist(df$tiempo_total_min,
     col = "lightblue",
     main = "Tiempo total para procesar 200 piezas (10 réplicas)",
     xlab = "Tiempo total (minutos)",
     border = "gray")
abline(v = mean(df$tiempo_total_min), col = "red", lwd = 2)
legend("topright", legend = c("Media"), col = "red", lty = 1, bty = "n")

3. Ejercicio: Simulación del camión de reparto

set.seed(123)

** Parámetros **

replicas <- 5
tiempo_simulacion <- 10 * 60  # 10 horas = 600 minutos

** Distribuciones Carga: uniforme(20, 40) Descarga: uniforme(15, 25) Traslado: exponencial con media 40 (λ = 1/40) **

simular_camion <- function() {
  tiempo_total <- 0
  viajes <- 0
  
  while (tiempo_total < tiempo_simulacion) {
    carga <- runif(1, 20, 40)
    traslado1 <- rexp(1, rate = 1/40)
    descarga <- runif(1, 15, 25)
    traslado2 <- rexp(1, rate = 1/40)
    
    tiempo_viaje <- carga + traslado1 + descarga + traslado2
    
    if (tiempo_total + tiempo_viaje <= tiempo_simulacion) {
      viajes <- viajes + 1
    }
    
    tiempo_total <- tiempo_total + tiempo_viaje
  }
  return(viajes)
}

** Ejecutar 5 réplicas **

viajes <- replicate(replicas, simular_camion())

** Calcular intervalo de confianza (95%) **

media_viajes <- mean(viajes)
desv_viajes <- sd(viajes)
error <- qt(0.975, df = replicas - 1) * (desv_viajes / sqrt(replicas))
IC <- c(media_viajes - error, media_viajes + error)

** Mostrar resultados **

cat(" Resultados \n")
##  Resultados
cat("Viajes por réplica:", viajes, "\n")
## Viajes por réplica: 5 3 5 4 5
cat("Media de viajes:", round(media_viajes, 2), "\n")
## Media de viajes: 4.4
cat("Desviación estándar:", round(desv_viajes, 2), "\n")
## Desviación estándar: 0.89
cat("Intervalo de confianza 95%:", paste0("[", round(IC[1], 2), ", ", round(IC[2], 2), "]\n"))
## Intervalo de confianza 95%: [3.29, 5.51]

Grafico

barplot(viajes,
        names.arg = paste("Réplica", 1:replicas),
        col = "lightblue",
        main = "Número de viajes por réplica en 10 horas",
        ylab = "Viajes completados",
        ylim = c(0, max(viajes) + 2))
abline(h = media_viajes, col = "red", lwd = 2)
text(x = 1:replicas, y = viajes + 0.5, labels = viajes, col = "blue")
legend("topright", legend = c("Media de viajes"), col = "red", lty = 1, bty = "n")