Simulación tienda de reparaciones con R

Marín García, Juan Antonio


Introducción

Una pequeña tienda de reparaciones. Los clientes llegan y esperan en la fila para ser atendidos. Un empleado recoge el equipo y el encargo de reparación por parte del cliente. Luego pasa el equipo a la sección de reparación (mientras el cliente espera). Cuando esta reparado, el cliente pasa por caja para pagar la reparación y recoger su equipo. Después de pagar, los clientes se retiran de la tienda.

Datos:

  1. Llegada de clientes:
    • Distribución: Exponencial.
    • Tiempo medio de interarribo: 0.5 minutos.
    • Tiempo de desplazamiento al siguiente proceso: 15 segundos.

  2. Entrega del equipo:
    • Atendido por: Un empleado.
    • Distribución: Normal.
    • Tiempo medio: 8 minutos.
    • Desviacion estandard: 3 minutos.
    • Tiempo de desplazamiento al siguiente proceso: 15 segundos.

  3. Reparación:
    • Atendido por: Un empleado.
    • Distribución: Normal.
    • Tiempo medio: 18 minutos.
    • Desviacion estandard: 0.4 minutos.
    • Tiempo de desplazamiento al siguiente proceso: 15 segundos.

  4. Pagar:
    • Atendido por: Un empleado.
    • Distribución: Normal.
    • Tiempo medio: 2 minutos.
    • Desviacion estandard: 3 minutos.
    • Tiempo de desplazamiento salir de la tienda: 15 segundos.
El cliente se retira de la tienda después de pagar.

En este problema, asumimos que sabemos lo siguiente:


Objetivos

El objetivo de este objeto de aprendizaje es que los/as estudiantes puedan comprender y analizar el comportamiento de un sistema de colas, aplicando conceptos de ingeniería de organización, como distribuciones de probabilidad, tiempos de servicio, filas de espera y utilización de recursos.


Instrucciones

Puedes ejecutar el codigo en https://rdrr.io/snippets/ (en este caso, las dos primeras líneas de código deben omitirse). Tambien se puede instalar en ordenador R y R-Studio con soft gratuito.

Las/os estudiantes deberán utilizar la información proporcionada sobre las distribuciones de probabilidad, tiempos de servicio y desplazamientos para ejecutar un modelo de simulación del sistema de la tienda de reparaciones. A partir de este modelo, podrán calcular indicadores clave como el tiempo promedio de espera de los clientes, la utilización de los empleados y la longitud de las filas. Con estos datos, podrán evaluar el desempeño del sistema y proponer mejoras.

Se pueden modificar los parámetros del modelo.


Código en R

install.packages("simmer")
install.packages("dplyr")

library(simmer)
library(dplyr)

# Parámetros del modelo
MEAN_INTERARRIVAL_TIME <- 0.5  # Tiempo medio entre llegadas (minutos)
DELIVERY_TIME_MEAN <- 8  # Tiempo medio para la entrega del equipo (minutos)
DELIVERY_TIME_SD <- 3  # Desviación estándar para la entrega del equipo (minutos)
REPAIR_TIME_MEAN <- 18  # Tiempo medio para la reparación (minutos)
REPAIR_TIME_SD <- 12  # Desviación estándar para la reparación (minutos)
PAYMENT_TIME_MEAN <- 2  # Tiempo medio para el pago (minutos)
PAYMENT_TIME_SD <- 3  # Desviación estándar para el pago (minutos)
TRAVEL_TIME <- 15 / 60  # Tiempo de desplazamiento (15 segundos a minutos)
SIMULATION_TIME <- 100  # Tiempo de simulación (minutos)

run_simulation <- function() {
  env <- simmer("RepairShop")
  
  # Crear trayectoria para los clientes
  customer_trajectory <- trajectory("customer path") %>%
    seize("employee_delivery", 1) %>%
    timeout(function() { rnorm(1, DELIVERY_TIME_MEAN, DELIVERY_TIME_SD) }) %>%
    release("employee_delivery", 1) %>%
    timeout(TRAVEL_TIME) %>%
    seize("employee_repair", 1) %>%
    timeout(function() { rnorm(1, REPAIR_TIME_MEAN, REPAIR_TIME_SD) }) %>%
    release("employee_repair", 1) %>%
    timeout(TRAVEL_TIME) %>%
    seize("employee_payment", 1) %>%
    timeout(function() { rnorm(1, PAYMENT_TIME_MEAN, PAYMENT_TIME_SD) }) %>%
    release("employee_payment", 1) %>%
    timeout(TRAVEL_TIME)
  
  # Añadir recursos y generadores al entorno de simulación
  env %>%
    add_resource("employee_delivery", 1) %>%
    add_resource("employee_repair", 1) %>%
    add_resource("employee_payment", 1) %>%
    add_generator("customer", customer_trajectory, function() { rexp(1, 1 / MEAN_INTERARRIVAL_TIME) }) %>%
    run(until = SIMULATION_TIME)
  
  arrivals <- get_mon_arrivals(env)
  resources <- get_mon_resources(env)
  
  # Resultados
  avg_num_in_system <- mean(resources$queue + resources$server)
  delivery_utilization <- resources %>% filter(resource == "employee_delivery") %>% summarize(utilization = mean(server / capacity)) %>% .$utilization
  repair_utilization <- resources %>% filter(resource == "employee_repair") %>% summarize(utilization = mean(server / capacity)) %>% .$utilization
  payment_utilization <- resources %>% filter(resource == "employee_payment") %>% summarize(utilization = mean(server / capacity)) %>% .$utilization
  
  results <- list(
    "Tiempo promedio en el sistema (minutos)" = mean(arrivals$activity_time),
    "Tiempo máximo en el sistema (minutos)" = max(arrivals$activity_time),
    "Tiempo mínimo en el sistema (minutos)" = min(arrivals$activity_time),
    "Número de clientes atendidos" = nrow(arrivals),
    "Número promedio en el sistema" = avg_num_in_system,
    "Utilización de empleados de entrega" = delivery_utilization,
    "Utilización de empleados de reparación" = repair_utilization,
    "Utilización de empleados de pago" = payment_utilization
  )
  return(results)
}

# Ejecutar la simulación y mostrar los resultados
results <- run_simulation()
results_df <- as.data.frame(t(unlist(results)))
print(results_df)


Conclusiones

Este objeto de aprendizaje permite a los/as estudiantes aplicar conceptos de ingeniería de organización, como análisis de sistemas de colas, en un entorno práctico y realista. Al construir y analizar el modelo de simulación, los/as estudiantes desarrollarán habilidades para comprender, diseñar y optimizar procesos de negocio, lo cual es fundamental en la gestión de operaciones y la mejora de la eficiencia organizacional.