#Linear Congruential Generator (LCG)
lcg <- function(n, seed=12345, a=1103515245, c=12345, m=2^31){
  x <- seed
  numbers <- numeric(n)
  
  for(i in 1:n){
    x <- (a * x + c) %% m
    numbers[i] <- x / m
  }
  
  return(numbers)
}

n <- 50

arrival_random <- lcg(n, seed=101)
service_random <- lcg(n, seed=202)
# Map Random Numbers to Probability Distributions
map_interarrival <- function(r){
  if(r < 0.15) return(2)
  else if(r < 0.40) return(3)
  else if(r < 0.60) return(4)
  else if(r < 0.85) return(5)
  else return(6)
}

map_service <- function(r){
  if(r < 0.10) return(2)
  else if(r < 0.35) return(3)
  else if(r < 0.65) return(4)
  else if(r < 0.85) return(5)
  else return(6)
}

inter_arrival <- sapply(arrival_random, map_interarrival)
service_time  <- sapply(service_random, map_service)
#Compute Arrival Times
arrival_time <- cumsum(inter_arrival)
#  Queue Simulation (Single Server)
service_start <- numeric(n)
service_end   <- numeric(n)
waiting_time  <- numeric(n)
idle_time     <- numeric(n)
time_in_system <- numeric(n)

for(i in 1:n){
  
  if(i == 1){
    service_start[i] <- arrival_time[i]
    waiting_time[i]  <- 0
    idle_time[i]     <- arrival_time[i]
  } else {
    service_start[i] <- max(arrival_time[i], service_end[i-1])
    waiting_time[i]  <- service_start[i] - arrival_time[i]
    idle_time[i]     <- max(0, arrival_time[i] - service_end[i-1])
  }
  
  service_end[i] <- service_start[i] + service_time[i]
  time_in_system[i] <- waiting_time[i] + service_time[i]
}
# Performance Measures

mean_waiting_time     <- mean(waiting_time)
average_service_time  <- mean(service_time)
average_idle_time     <- mean(idle_time)
average_time_in_system <- mean(time_in_system)
#Results Table
results <- data.frame(
  Inter_Arrival = inter_arrival,
  Arrival_Time = arrival_time,
  Service_Time = service_time,
  Service_Start = service_start,
  Service_End = service_end,
  Waiting_Time = waiting_time,
  Idle_Time = idle_time,
  Time_in_System = time_in_system
)
#  Output
cat("\n----- PERFORMANCE MEASURES -----\n")
## 
## ----- PERFORMANCE MEASURES -----
cat("Mean Waiting Time:", round(mean_waiting_time,3), "minutes\n")
## Mean Waiting Time: 6.14 minutes
cat("Average Service Time:", round(average_service_time,3), "minutes\n")
## Average Service Time: 3.94 minutes
cat("Average Idle Time:", round(average_idle_time,3), "minutes\n")
## Average Idle Time: 0.18 minutes
cat("Average Time in System:", round(average_time_in_system,3), "minutes\n")
## Average Time in System: 10.08 minutes
cat("\nDecision Rule: Implement if Mean Waiting Time < 5 minutes\n")
## 
## Decision Rule: Implement if Mean Waiting Time < 5 minutes
if(mean_waiting_time < 5){
  cat("Decision: IMPLEMENT the plan\n")
} else {
  cat("Decision: DO NOT implement the plan\n")
}
## Decision: DO NOT implement the plan
# View all the 50 customers
head(results, 50)