Untitled
unknown
python
a year ago
5.7 kB
4
Indexable
Never
import numpy as np from classes import usuario # hay que hacer una acumulador a partir de los tiempos de llegada para sacar # HORA de llegada def crear_usuarios(tipo: usuario, nUsuarios: int, tEspera: int) -> np.array: ''' Crea una lista de nUsuarios usuarios según su media de tiempo entre usuario, teniendo en cuenta el tiempo de descanso (tEspera) del servicio. ''' tiempos_entre_usuarios: np.array = np.random.exponential(tipo.media, size=nUsuarios) tiempos_llegada: np.array = np.cumsum(tiempos_entre_usuarios) tiempos_servicio: np.array = tEspera + np.random.uniform(low=tipo.low, high=tipo.high, size=nUsuarios) usuarios: np.array = np.array([tipo(tiempo_llegada, tiempo_servicio) for tiempo_llegada, tiempo_servicio in zip(tiempos_llegada, tiempos_servicio) ]) return usuarios def insertar_salida(user: usuario, # t: int, # previousnUsers: int, previous_tSalida: int, nUsers: int, events: dict[str:np.array], anyQueue: bool ): ''' Inserta salidas en el diccionario de eventos de salida. ''' # + tEspera # instante servicio será el mayor entre la hora de llegada del siguiente # usuario y previous_tSalida. # si len(cola = 0), entonces ponemos que user.instante_servicio = 0. # sino, ponemos que es igual a previoustSalida user.instante_servicio = user.t_llegada if anyQueue else previous_tSalida # insert exit time # events['hour'] = np.insert(events['hour'], -1, # previous_tSalida) # events['hour'] = np.append(events['hour'], previous_tSalida # + user.t_servicio) events['hour'] = np.append(events['hour'], user.instante_servicio + user.t_servicio) # habrá que quitar tantos usuarios en cola de los eventos de entrada como # eventos de salida haya habido previamente, pues enter_events acumulativo # sin tener en cuenta las salidas. # n: int = i - len(events['nUsers']) - 1 # insert nUsers # events['nUsers'] = np.insert(events['nUsers'], -1, n) events['nUsers'] = np.append(events['nUsers'], nUsers) return events def insertar_entrada(user: usuario, events: dict[str:np.array]): ''' Inserta entradas en el diccionario de eventos de entrada. ''' events['hour'] = np.append(events['hour'], user.t_llegada) previousnUsers: int = events['nUsers'][-1] if events['nUsers'].any() else 0 events['nUsers'] = np.append(events['nUsers'], previousnUsers + 1) return events # def calcular_meritos(usuarios: usuario, jornada_laboral: int): # # tiempos_llegada: np.array = np.fromiter( # # (usuario.t_llegada for usuario in usuarios), # # dtype=int # # ) # # instantes_servicio: np.array = np.fromiter( # # (usuario.instante_servicio for usuario in usuarios), # # dtype=int # # ) # # tiempos_espera: np.array = tiempos_llegada - instantes_servicio # # medi_espera: float = np.mean(tiempos_espera) # tiempos_servicio: np.array = np.fromiter( # (usuario.t_servicio for usuario in usuarios), # dtype=int # ) # porcentaje_servido: float = (np.sum(tiempos_servicio) / jornada_laboral) \ # * 100 def calc_tmean_jornada(usuarios: usuario, jornada_laboral: int) -> float: ''' Calcula el tiempo medio de espera en ola de un usuario promediado en una jornada diaria. ''' # ESTO VA A DAR ERROR: NO TODOS LOS USUARIOS HAN SIDO SERVIDOR, POR LO QUE # NO TODOS TENDRÁN EL ATRIBUTO instante_servicio # ## error solucionado ## tiempos_llegada: np.array = np.fromiter( (usuario.t_llegada for usuario in usuarios), dtype=int ) instantes_servicio: np.array = np.fromiter( (usuario.instante_servicio for usuario in usuarios), dtype=int ) tiempos_espera: np.array = instantes_servicio - tiempos_llegada medi_espera: float = np.mean(tiempos_espera) return medi_espera def calc_pct_ocupation(usuarios: usuario, jornada_laboral: int) -> float: ''' Calcula el tanto por ciento de ocupación del servidor. ''' tiempos_servicio: np.array = np.fromiter( (usuario.t_servicio for usuario in usuarios), dtype=int ) # porcentaje_servido: float = (np.sum(tiempos_servicio) / jornada_laboral) \ # * 100 porcentaje_servido: float = (np.sum(tiempos_servicio[:-1]) / jornada_laboral) \ * 100 pc_ocupation2: float = (np.sum(tiempos_servicio) / jornada_laboral) \ * 100 return porcentaje_servido, pc_ocupation2 def calc_meanUsers(events: dict, jornada_laboral: int) -> float: ''' Calcula el número medio de usuarios en la cola en una jornada diaria. ''' time_increments: np.array = np.diff(events['hour']) out_mean: np.array = np.sum(np.multiply( events['nUsers'][:-1], time_increments) ) / jornada_laboral return out_mean