generar_pacientes <- function(n) {
  data.frame(
    salud = sample(c("buena", "regular", "mala"), n, replace = TRUE),
    satisfaccion = NA,
    tipo_paciente = sample(c("ambulatorio", "hospitalizado"), n, replace = TRUE),
    edad = sample(18:80, n, replace = TRUE),
    genero = sample(c("masculino", "femenino"), n, replace = TRUE)
  )
}

#Esta función genera un dataframe de pacientes con características como salud, satisfacción, tipo de paciente, edad y género.
generar_personal_medico <- function(n) {
  data.frame(
    capacitacion = sample(c("básico", "intermedio", "avanzado"), n, replace = TRUE),
    satisfaccion_laboral = NA,
    especialidad = sample(c("general", "especialista"), n, replace = TRUE),
    anos_experiencia = sample(1:30, n, replace = TRUE),
    salario = runif(n, 30000, 100000)
  )
}

#Genera un dataframe de personal médico con características como nivel de capacitación, satisfacción laboral, especialidad, años de experiencia y salario.
generar_administradores <- function(n) {
  data.frame(
    eficiencia_gestion = sample(c("alta", "media", "baja"), n, replace = TRUE),
    confianza_equipo = runif(n, 0, 1),
    nivel_estudios = sample(c("licenciatura", "maestría", "doctorado"), n, replace = TRUE)
  )
}

#Crea un dataframe de administradores con características como eficiencia en la gestión, confianza del equipo y nivel de estudios.
generar_inversores <- function(n) {
  data.frame(
    inversion = runif(n, 100000, 1000000),
    ROI = runif(n, 0, 10),
    confianza_proyecto = runif(n, 0, 1),
    tipo_inversor = sample(c("individual", "corporativo"), n, replace = TRUE)
  )
}

#Genera un dataframe de inversores con características como inversión, ROI (retorno de la inversión), confianza en el proyecto y tipo de inversor.
# Función para simular un paso de tiempo
simular_paso_tiempo <- function(pacientes, personal_medico, administradores, inversores, entorno) {
  # Actualizar satisfacción de pacientes
  pacientes$satisfaccion <- ifelse(pacientes$salud == "mala", "baja", ifelse(pacientes$salud == "regular", "media", "alta"))
  
  # Actualizar satisfacción laboral del personal médico
  personal_medico$satisfaccion_laboral <- ifelse(personal_medico$capacitacion == "avanzado", "alta", ifelse(personal_medico$capacitacion == "intermedio", "media", "baja"))
  
  # Actualizar eficiencia en la gestión de los administradores
  administradores$eficiencia_gestion <- ifelse(runif(nrow(administradores)) > 0.5, "alta", "media")
  
  # Actualizar ROI de los inversores
  inversores$ROI <- runif(nrow(inversores), 0, 10)
  
  # Actualizar variables del entorno
  entorno$tasa_inflacion <- entorno$tasa_inflacion + 0.01  # Incrementar tasa de inflación en cada paso
  entorno$estado_hospital <- ifelse(runif(1) > 0.5, "asegurado", "no asegurado")  # Cambiar estado del hospital aleatoriamente
  
  return(list(pacientes = pacientes, personal_medico = personal_medico, administradores = administradores, inversores = inversores, entorno = entorno))
}

#Esta función simula un paso de tiempo en el modelo. Actualiza las características de los agentes y del entorno en función de ciertas reglas. Por ejemplo, actualiza la satisfacción de los pacientes según su salud, la satisfacción laboral del personal médico según su nivel de capacitación, etc.
# Definición de variables del entorno
entorno <- list(
  tasa_inflacion = 0.05,
  estado_hospital = "no asegurado",
  incremento_pacientes = 0.606,
  impuesto_ministerio = 0.1
)

# Parámetros del entorno
num_pacientes <- 100
num_personal_medico <- 30
num_administradores <- 5
num_inversores <- 10

#Se definen varios parámetros del entorno en un listado llamado entorno. Estos incluyen la tasa de inflación, el estado del hospital, el incremento de pacientes y el impuesto del ministerio.
pacientes <- generar_pacientes(num_pacientes)
personal_medico <- generar_personal_medico(num_personal_medico)
administradores <- generar_administradores(num_administradores)
inversores <- generar_inversores(num_inversores)

#Se generan los agentes iniciales llamando a las funciones generar_pacientes, generar_personal_medico, generar_administradores y generar_inversores con el número correspondiente de agentes.
num_steps <- 10
for (step in 1:num_steps) {
  cat("Paso de tiempo:", step, "\n")
  agentes_actualizados <- simular_paso_tiempo(pacientes, personal_medico, administradores, inversores, entorno)
  
  # Actualizar agentes y entorno para el siguiente paso de tiempo
  pacientes <- agentes_actualizados$pacientes
  personal_medico <- agentes_actualizados$personal_medico
  administradores <- agentes_actualizados$administradores
  inversores <- agentes_actualizados$inversores
  entorno <- agentes_actualizados$entorno
}
## Paso de tiempo: 1 
## Paso de tiempo: 2 
## Paso de tiempo: 3 
## Paso de tiempo: 4 
## Paso de tiempo: 5 
## Paso de tiempo: 6 
## Paso de tiempo: 7 
## Paso de tiempo: 8 
## Paso de tiempo: 9 
## Paso de tiempo: 10
#Se ejecuta un bucle que simula múltiples pasos de tiempo. En cada paso, se llama a la función simular_paso_tiempo para actualizar el estado de los agentes y del entorno.
  cat("Satisfacción de los pacientes:\n")
## Satisfacción de los pacientes:
  print(table(pacientes$satisfaccion))
## 
##  alta  baja media 
##    42    26    32
  cat("\nSatisfacción laboral del personal médico:\n")
## 
## Satisfacción laboral del personal médico:
  print(table(personal_medico$satisfaccion_laboral))
## 
##  alta  baja media 
##    14     7     9
  cat("\nEficiencia en la gestión de los administradores:\n")
## 
## Eficiencia en la gestión de los administradores:
  print(table(administradores$eficiencia_gestion))
## 
##  alta media 
##     1     4
  cat("\nROI de los inversores:\n")
## 
## ROI de los inversores:
  print(summary(inversores$ROI))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.1657  2.6758  4.8411  4.4801  6.1443  8.6353
  cat("\n")
#Se imprimen los resultados del modelo, como la satisfacción de los pacientes, la satisfacción laboral del personal médico, la eficiencia en la gestión de los administradores y el ROI de los inversores.